1 
2 /*-------------------------------------------------------------*/
3 /* Ethernet header (NETWIB_DEVICE_DLTTYPE_EN10MB) */
4 typedef enum {
5   NETWIB_ETHERHDRTYPE_IP4 =    0x0800,
6   NETWIB_ETHERHDRTYPE_ARP =    0x0806,
7   NETWIB_ETHERHDRTYPE_VINES =  0x0bad,
8   NETWIB_ETHERHDRTYPE_TRAIN =  0x1984,
9   NETWIB_ETHERHDRTYPE_CDP =    0x2000,
10   NETWIB_ETHERHDRTYPE_RARP =   0x8035,
11   NETWIB_ETHERHDRTYPE_ATALK =  0x809b,
12   NETWIB_ETHERHDRTYPE_AARP =   0x80f3,
13   NETWIB_ETHERHDRTYPE_VLAN =   0x8100,
14   NETWIB_ETHERHDRTYPE_IPX =    0x8137,
15   NETWIB_ETHERHDRTYPE_IP6 =    0x86DD,
16   NETWIB_ETHERHDRTYPE_PPPOED = 0x8863,
17   NETWIB_ETHERHDRTYPE_PPPOES = 0x8864,
18   NETWIB_ETHERHDRTYPE_LOOP =   0x9000
19 } netwib_etherhdrtype;
20 typedef struct {
21   netwib_eth dst;
22   netwib_eth src;
23   netwib_etherhdrtype type;
24 } netwib_etherhdr;
25 typedef const netwib_etherhdr netwib_constetherhdr;
26 #define NETWIB_ETHERHDR_LEN 14
27 
28 /*-------------------------------------------------------------*/
29 /* NULL header (NETWIB_DEVICE_DLTTYPE_NULL) */
30 typedef struct {
31   netwib_etherhdrtype type;
32 } netwib_nullhdr;
33 typedef const netwib_nullhdr netwib_constnullhdr;
34 #define NETWIB_NULLHDR_LEN 4
35 
36 /*-------------------------------------------------------------*/
37 /* LOOP header (NETWIB_DEVICE_DLTTYPE_LOOP) */
38 typedef struct {
39   netwib_etherhdrtype type;
40 } netwib_loophdr;
41 typedef const netwib_loophdr netwib_constloophdr;
42 #define NETWIB_LOOPHDR_LEN 4
43 
44 /*-------------------------------------------------------------*/
45 /* RAW header (NETWIB_DEVICE_DLTTYPE_RAW) */
46 #define NETWIB_RAWHDR_LEN 0
47 
48 /*-------------------------------------------------------------*/
49 /* PPP header (NETWIB_DEVICE_DLTTYPE_PPP) */
50 typedef enum {
51   NETWIB_PPPHDRPROTO_IP4 =     0x0021, /* Internet Protocol */
52   NETWIB_PPPHDRPROTO_AT =      0x0029, /* AppleTalk Protocol */
53   NETWIB_PPPHDRPROTO_IPX =     0x002b, /* IPX protocol */
54   NETWIB_PPPHDRPROTO_VJC_COMP =   0x002d, /* VJ compressed TCP */
55   NETWIB_PPPHDRPROTO_VJC_UNCOMP = 0x002f, /* VJ uncompressed TCP */
56   NETWIB_PPPHDRPROTO_IP6 =     0x0057, /* Internet Protocol Version 6 */
57   NETWIB_PPPHDRPROTO_COMP =    0x00fd, /* compressed packet */
58   NETWIB_PPPHDRPROTO_IPCP =    0x8021, /* IP Control Protocol */
59   NETWIB_PPPHDRPROTO_ATCP =    0x8029, /* AppleTalk Control Protocol */
60   NETWIB_PPPHDRPROTO_IPXCP =   0x802b, /* IPX Control Protocol */
61   NETWIB_PPPHDRPROTO_IP6CP =   0x8057, /* IPv6 Control Protocol */
62   NETWIB_PPPHDRPROTO_CCP =     0x80fd, /* Compression Control Protocol */
63   NETWIB_PPPHDRPROTO_LCP =     0xc021, /* Link Control Protocol */
64   NETWIB_PPPHDRPROTO_PAP =     0xc023, /* Password Authentication Proto */
65   NETWIB_PPPHDRPROTO_LQR =     0xc025, /* Link Quality Report protocol */
66   NETWIB_PPPHDRPROTO_CHAP =    0xc223, /* Crypto. Handshake Auth. P. */
67   NETWIB_PPPHDRPROTO_CBCP =    0xc029  /* Callback Control Protocol */
68 } netwib_ppphdrproto;
69 typedef struct {
70   netwib_byte address;
71   netwib_byte control;
72   netwib_ppphdrproto protocol;
73 } netwib_ppphdr;
74 typedef const netwib_ppphdr netwib_constppphdr;
75 #define NETWIB_PPPHDR_LEN 4
76 
77 /*-------------------------------------------------------------*/
78 /* LINUX_SLL header (NETWIB_DEVICE_DLTTYPE_LINUX_SLL) */
79 typedef enum {
80   NETWIB_LINUXSLLHDRPKTTYPE_HOST = 0,
81   NETWIB_LINUXSLLHDRPKTTYPE_BROADCAST = 1,
82   NETWIB_LINUXSLLHDRPKTTYPE_MULTICAST = 2,
83   NETWIB_LINUXSLLHDRPKTTYPE_OTHERHOST = 3,
84   NETWIB_LINUXSLLHDRPKTTYPE_OUTGOING = 4
85 } netwib_linuxsllhdrpkttype;
86 typedef enum {
87   NETWIB_LINUXSLLHDRHATYPE_NETROM = 0,
88   NETWIB_LINUXSLLHDRHATYPE_ETHER = 1
89 } netwib_linuxsllhdrhatype;
90 typedef struct {
91   netwib_linuxsllhdrpkttype pkttype;   /* packet type */
92   netwib_linuxsllhdrhatype hatype;     /* link-layer address type */
93   netwib_uint16 halen;                 /* link-layer address length */
94   netwib_byte srcaddr[8];              /* link-layer address */
95   netwib_etherhdrtype protocol;        /* protocol */
96 } netwib_linuxsllhdr;
97 typedef const netwib_linuxsllhdr netwib_constlinuxsllhdr;
98 #define NETWIB_LINUXSLLHDR_LEN 16
99 
100 /*-------------------------------------------------------------*/
101 /* Link header */
102 typedef struct {
103   netwib_device_dlttype type;
104   union {
105     netwib_etherhdr    ether;
106     netwib_nullhdr     null;
107     netwib_loophdr     loop;
108     /* no netwib_rawhdr needed */
109     netwib_ppphdr      ppp;
110     netwib_linuxsllhdr linuxsll;
111   } hdr;
112 } netwib_linkhdr;
113 typedef const netwib_linkhdr netwib_constlinkhdr;
114 #define NETWIB_LINKHDR_MAXLEN NETWIB_LINUXSLLHDR_LEN
115 
116 /*-------------------------------------------------------------*/
117 /* Name : netwib_linkhdr_initdefault
118    Description :
119      Initialize a netwib_linkhdr with default values.
120    Input parameter(s) :
121      type : header type
122    Input/output parameter(s) :
123    Output parameter(s) :
124      *plinkhdr : netwib_linkhdr to initialize
125    Normal return values :
126      NETWIB_ERR_OK : ok
127 */
128 netwib_err netwib_linkhdr_initdefault(netwib_device_dlttype type,
129                                       netwib_linkhdr *plinkhdr);
130 
131 /*-------------------------------------------------------------*/
132 /* Name : netwib_pkt_append_linkhdr
133    Description :
134      Initialize physical data from a netwib_linkhdr.
135    Input parameter(s) :
136      linkhdr : netwib_linkhdr
137    Input/output parameter(s) :
138      *ppht : buffer to initialize
139    Output parameter(s) :
140    Normal return values :
141      NETWIB_ERR_OK : ok
142 */
143 netwib_err netwib_pkt_append_linkhdr(netwib_constlinkhdr *plinkhdr,
144                                      netwib_buf *ppkt);
145 netwib_err netwib_pkt_prepend_linkhdr(netwib_constlinkhdr *plinkhdr,
146                                       netwib_buf *ppkt);
147 
148 /*-------------------------------------------------------------*/
149 /* Name : netwib_pkt_decode_linkhdr
150    Description :
151      Decode a netwib_linkhdr from data coming from wire.
152    Input parameter(s) :
153      dlttype : DLT type of packet
154      *ppkt : buffer containing physical data
155    Input/output parameter(s) :
156    Output parameter(s) :
157      *plinkhdr : netwib_linkhdr to initialize
158      *pskipsize : size to skip this header
159    Normal return values :
160      NETWIB_ERR_OK : ok
161 */
162 netwib_err netwib_pkt_decode_linkhdr(netwib_device_dlttype dlttype,
163                                      netwib_constbuf *ppkt,
164                                      netwib_linkhdr *plinkhdr,
165                                      netwib_uint32 *pskipsize);
166 
167 /*-------------------------------------------------------------*/
168 /***************************************************************
169  * Link headers are horribly incompatible. The only field      *
170  * which can be considered as compatible is the type/protocol. *
171  * Following functions permit to set/get it from header.       *
172  * Type netwib_linkhdrproto is the generic type.               *
173  ***************************************************************/
174 typedef enum {
175   NETWIB_LINKHDRPROTO_UNKNOWN = 0,
176   NETWIB_LINKHDRPROTO_IP4,
177   NETWIB_LINKHDRPROTO_IP6,
178   NETWIB_LINKHDRPROTO_ARP,
179   NETWIB_LINKHDRPROTO_RARP,
180   NETWIB_LINKHDRPROTO_IPX
181 } netwib_linkhdrproto;
182 netwib_err netwib_linkhdr_set_proto(netwib_linkhdr *plinkhdr,
183                                     netwib_linkhdrproto linkhdrproto);
184 netwib_err netwib_linkhdr_get_proto(netwib_constlinkhdr *plinkhdr,
185                                     netwib_linkhdrproto *plinkhdrproto);
186