ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/device.h
Revision: 1.15
Committed: Sat Jan 17 01:18:36 2004 UTC (20 years, 4 months ago) by pcg
Content type: text/plain
Branch: MAIN
CVS Tags: VPE_1_4, VPE_1_6, rel-1_7, VPE-1_6_1
Changes since 1.14: +1 -1 lines
Log Message:
*** empty log message ***

File Contents

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