ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/device.h
Revision: 1.21
Committed: Sun Dec 2 00:09:36 2007 UTC (16 years, 6 months ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.20: +8 -4 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 /*
2 device.h -- generic header for device.c
3 Copyright (C) 2003-2005 Marc Lehmann <gvpe@schmorp.de>
4
5 This file is part of GVPE.
6
7 GVPE is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
11
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16
17 You should have received a copy of the GNU General Public License
18 along with gvpe; if not, write to the Free Software
19 Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #ifndef GVPE_DEVICE_H__
23 #define GVPE_DEVICE_H__
24
25 #include "config.h"
26
27 #define IFNAMESIZE 256 // be conservative
28
29 #include "global.h"
30 #include "util.h"
31
32 struct net_packet
33 {
34 u32 len; // actually u16, but padding...
35
36 u8 &operator[] (u16 offset) const;
37 u8 *at (u16 offset) const;
38
39 void unshift_hdr (u16 hdrsize)
40 {
41 memmove ((void *)&(*this)[hdrsize], (void *)&(*this)[0], len);
42 len += hdrsize;
43 }
44
45 void skip_hdr (u16 hdrsize)
46 {
47 len -= hdrsize;
48 memmove ((void *)&(*this)[0], (void *)&(*this)[hdrsize], len);
49 }
50
51 void set (const net_packet &pkt)
52 {
53 len = pkt.len;
54 memcpy (&((*this)[0]), &(pkt[0]), len);
55 }
56
57 bool is_ipv4 () const
58 {
59 return (*this)[12] == 0x08 && (*this)[13] == 0x00 // IP
60 && ((*this)[14] & 0xf0) == 0x40; // IPv4
61 }
62
63 u32 &ipv4_src () const
64 {
65 return *(u32 *)&(*this)[26];
66 }
67
68 u32 &ipv4_dst () const
69 {
70 return *(u32 *)&(*this)[30];
71 }
72
73 bool is_arp () const
74 {
75 return (*this)[12] == 0x08 && (*this)[13] == 0x06 // 0806 protocol
76 && (*this)[14] == 0x00 && (*this)[15] == 0x01 // 0001 hw_format
77 && (*this)[16] == 0x08 && (*this)[17] == 0x00 // 0800 prot_format
78 && (*this)[18] == 0x06 && (*this)[19] == 0x04; // 06 hw_len 04 prot_len
79 }
80
81 void *operator new (size_t s);
82 void operator delete (void *p);
83 };
84
85 struct data_packet : net_packet
86 {
87 u8 data_[MAXSIZE];
88 };
89
90 inline
91 u8 &net_packet::operator[] (u16 offset) const
92 {
93 return ((data_packet *)this)->data_[offset];
94 }
95
96 inline
97 u8 *net_packet::at (u16 offset) const
98 {
99 return &((*this)[offset]);
100 }
101
102 struct tap_packet : net_packet
103 {
104 mac dst;
105 mac src;
106 u8 data[MAXSIZE - 12];
107 };
108
109 struct tap_device
110 {
111 int fd;
112
113 // network interface name or identifier
114 char ifrname[IFNAMESIZE + 1];
115
116 char *device;
117
118 tap_device ();
119 ~tap_device ();
120
121 //bool open ();
122 //void close ();
123
124 const char *interface () { return ifrname; }
125 const char *info ();
126 const char *if_up ();
127
128 tap_packet *recv ();
129 void send (tap_packet *pkt);
130 };
131
132 //extern tap_device *tap_device ();
133
134 #endif
135