ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/gvpe/src/device.h
Revision: 1.18
Committed: Fri Mar 18 01:53:05 2005 UTC (19 years, 2 months ago) by pcg
Content type: text/plain
Branch: MAIN
CVS Tags: rel-1_8
Changes since 1.17: +4 -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.1 Foundation, Inc. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20     */
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     struct net_packet {
33     u32 len; // actually u16, but padding...
34    
35 pcg 1.4 u8 &operator[] (u16 offset) const;
36 pcg 1.16 u8 *at (u16 offset) const;
37 pcg 1.2
38 pcg 1.5 void unshift_hdr (u16 hdrsize)
39     {
40     memmove ((void *)&(*this)[hdrsize], (void *)&(*this)[0], len);
41     len += hdrsize;
42     }
43    
44 pcg 1.2 void skip_hdr (u16 hdrsize)
45     {
46 pcg 1.5 len -= hdrsize;
47     memmove ((void *)&(*this)[0], (void *)&(*this)[hdrsize], len);
48 pcg 1.2 }
49 pcg 1.1
50 pcg 1.4 void set (const net_packet &pkt)
51     {
52     len = pkt.len;
53     memcpy (&((*this)[0]), &(pkt[0]), len);
54     }
55    
56 pcg 1.10 bool is_ipv4 () const
57     {
58     return (*this)[12] == 0x08 && (*this)[13] == 0x00 // IP
59     && ((*this)[14] & 0xf0) == 0x40; // IPv4
60     }
61    
62     u32 &ipv4_src () const
63     {
64     return *(u32 *)&(*this)[26];
65     }
66    
67     u32 &ipv4_dst () const
68     {
69     return *(u32 *)&(*this)[30];
70     }
71    
72     bool is_arp () const
73 pcg 1.1 {
74     return (*this)[12] == 0x08 && (*this)[13] == 0x06 // 0806 protocol
75     && (*this)[14] == 0x00 && (*this)[15] == 0x01 // 0001 hw_format
76     && (*this)[16] == 0x08 && (*this)[17] == 0x00 // 0800 prot_format
77     && (*this)[18] == 0x06 && (*this)[19] == 0x04; // 06 hw_len 04 prot_len
78     }
79    
80     void *operator new (size_t s);
81     void operator delete (void *p);
82     };
83    
84     struct data_packet : net_packet {
85     u8 data_[MAXSIZE];
86     };
87    
88     inline
89 pcg 1.4 u8 &net_packet::operator[] (u16 offset) const
90 pcg 1.1 {
91     return ((data_packet *)this)->data_[offset];
92     }
93    
94 pcg 1.16 inline
95     u8 *net_packet::at (u16 offset) const
96     {
97     return &((*this)[offset]);
98     }
99    
100 pcg 1.1 struct tap_packet : net_packet {
101     mac dst;
102     mac src;
103     u8 data[MAXSIZE - 12];
104     };
105    
106 pcg 1.9 struct tap_device {
107 pcg 1.1 int fd;
108    
109 pcg 1.7 // network interface name or identifier
110 pcg 1.6 char ifrname[IFNAMESIZE + 1];
111 pcg 1.1
112 pcg 1.14 char *device;
113    
114 pcg 1.8 tap_device ();
115     ~tap_device ();
116    
117     //bool open ();
118     //void close ();
119 pcg 1.1
120     const char *interface () { return ifrname; }
121 pcg 1.6 const char *info ();
122 pcg 1.1
123     tap_packet *recv ();
124     void send (tap_packet *pkt);
125     };
126 pcg 1.7
127 pcg 1.8 //extern tap_device *tap_device ();
128 pcg 1.1
129     #endif
130