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, 5 months ago) by pcg
Content type: text/plain
Branch: MAIN
Changes since 1.20: +8 -4 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 pcg 1.1 /*
2     device.h -- generic header for device.c
3 pcg 1.17 Copyright (C) 2003-2005 Marc Lehmann <gvpe@schmorp.de>
4 pcg 1.1
5 pcg 1.17 This file is part of GVPE.
6    
7     GVPE is free software; you can redistribute it and/or modify
8 pcg 1.1 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 pcg 1.17 along with gvpe; if not, write to the Free Software
19 pcg 1.20 Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 pcg 1.1 */
21    
22 pcg 1.18 #ifndef GVPE_DEVICE_H__
23     #define GVPE_DEVICE_H__
24    
25     #include "config.h"
26 pcg 1.1
27 pcg 1.7 #define IFNAMESIZE 256 // be conservative
28 pcg 1.1
29     #include "global.h"
30 pcg 1.12 #include "util.h"
31 pcg 1.1
32 pcg 1.21 struct net_packet
33     {
34 pcg 1.1 u32 len; // actually u16, but padding...
35    
36 pcg 1.4 u8 &operator[] (u16 offset) const;
37 pcg 1.16 u8 *at (u16 offset) const;
38 pcg 1.2
39 pcg 1.5 void unshift_hdr (u16 hdrsize)
40     {
41     memmove ((void *)&(*this)[hdrsize], (void *)&(*this)[0], len);
42     len += hdrsize;
43     }
44    
45 pcg 1.2 void skip_hdr (u16 hdrsize)
46     {
47 pcg 1.5 len -= hdrsize;
48     memmove ((void *)&(*this)[0], (void *)&(*this)[hdrsize], len);
49 pcg 1.2 }
50 pcg 1.1
51 pcg 1.4 void set (const net_packet &pkt)
52     {
53     len = pkt.len;
54     memcpy (&((*this)[0]), &(pkt[0]), len);
55     }
56    
57 pcg 1.10 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 pcg 1.1 {
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 pcg 1.21 struct data_packet : net_packet
86     {
87 pcg 1.1 u8 data_[MAXSIZE];
88     };
89    
90     inline
91 pcg 1.4 u8 &net_packet::operator[] (u16 offset) const
92 pcg 1.1 {
93     return ((data_packet *)this)->data_[offset];
94     }
95    
96 pcg 1.16 inline
97     u8 *net_packet::at (u16 offset) const
98     {
99     return &((*this)[offset]);
100     }
101    
102 pcg 1.21 struct tap_packet : net_packet
103     {
104 pcg 1.1 mac dst;
105     mac src;
106     u8 data[MAXSIZE - 12];
107     };
108    
109 pcg 1.21 struct tap_device
110     {
111 pcg 1.1 int fd;
112    
113 pcg 1.7 // network interface name or identifier
114 pcg 1.6 char ifrname[IFNAMESIZE + 1];
115 pcg 1.1
116 pcg 1.14 char *device;
117    
118 pcg 1.8 tap_device ();
119     ~tap_device ();
120    
121     //bool open ();
122     //void close ();
123 pcg 1.1
124     const char *interface () { return ifrname; }
125 pcg 1.6 const char *info ();
126 pcg 1.19 const char *if_up ();
127 pcg 1.1
128     tap_packet *recv ();
129     void send (tap_packet *pkt);
130     };
131 pcg 1.7
132 pcg 1.8 //extern tap_device *tap_device ();
133 pcg 1.1
134     #endif
135