--- gvpe/src/device.h 2003/03/28 04:05:10 1.2 +++ gvpe/src/device.h 2003/10/16 20:13:21 1.13 @@ -1,5 +1,6 @@ /* device.h -- generic header for device.c + Copyright (C) 2003 Marc Lehmann This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -19,28 +20,53 @@ #ifndef VPE_DEVICE_H__ #define VPE_DEVICE_H__ -#include "config.h" - -#include -#include - -#include +#define IFNAMESIZE 256 // be conservative #include "gettext.h" #include "global.h" +#include "util.h" struct net_packet { u32 len; // actually u16, but padding... - u8 &operator[] (u16 offset); + u8 &operator[] (u16 offset) const; + + void unshift_hdr (u16 hdrsize) + { + memmove ((void *)&(*this)[hdrsize], (void *)&(*this)[0], len); + len += hdrsize; + } void skip_hdr (u16 hdrsize) { - memmove ((void *)&(*this)[0], (void *)&(*this)[hdrsize], len -= hdrsize); + len -= hdrsize; + memmove ((void *)&(*this)[0], (void *)&(*this)[hdrsize], len); } - bool is_arp () + void set (const net_packet &pkt) + { + len = pkt.len; + memcpy (&((*this)[0]), &(pkt[0]), len); + } + + bool is_ipv4 () const + { + return (*this)[12] == 0x08 && (*this)[13] == 0x00 // IP + && ((*this)[14] & 0xf0) == 0x40; // IPv4 + } + + u32 &ipv4_src () const + { + return *(u32 *)&(*this)[26]; + } + + u32 &ipv4_dst () const + { + return *(u32 *)&(*this)[30]; + } + + bool is_arp () const { return (*this)[12] == 0x08 && (*this)[13] == 0x06 // 0806 protocol && (*this)[14] == 0x00 && (*this)[15] == 0x01 // 0001 hw_format @@ -57,13 +83,11 @@ }; inline -u8 &net_packet::operator[] (u16 offset) +u8 &net_packet::operator[] (u16 offset) const { return ((data_packet *)this)->data_[offset]; } -typedef u8 mac[6]; - struct tap_packet : net_packet { mac dst; mac src; @@ -73,20 +97,23 @@ struct tap_device { int fd; - // linux tuntap - char ifrname[IFNAMSIZ + 1]; - - char *device; + // network interface name or identifier + char ifrname[IFNAMESIZE + 1]; tap_device (); ~tap_device (); + //bool open (); + //void close (); + const char *interface () { return ifrname; } - const char *info () { return _("Linux tun/tap device"); } + const char *info (); tap_packet *recv (); void send (tap_packet *pkt); }; +//extern tap_device *tap_device (); + #endif