481cb9c1354074491a1e590ff2705faf60a30955
[mirror/winof/.git] / inc / kernel / ip_packet.h
1 /*\r
2  * Copyright (c) 2005 SilverStorm Technologies.  All rights reserved.\r
3  *\r
4  * This software is available to you under the OpenIB.org BSD license\r
5  * below:\r
6  *\r
7  *     Redistribution and use in source and binary forms, with or\r
8  *     without modification, are permitted provided that the following\r
9  *     conditions are met:\r
10  *\r
11  *      - Redistributions of source code must retain the above\r
12  *        copyright notice, this list of conditions and the following\r
13  *        disclaimer.\r
14  *\r
15  *      - Redistributions in binary form must reproduce the above\r
16  *        copyright notice, this list of conditions and the following\r
17  *        disclaimer in the documentation and/or other materials\r
18  *        provided with the distribution.\r
19  *\r
20  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
21  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
22  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\r
23  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS\r
24  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\r
25  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
26  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\r
27  * SOFTWARE.\r
28  *\r
29  * $Id$\r
30  */\r
31 \r
32 \r
33 #ifndef _IP_PACKET_H_\r
34 #define _IP_PACKET_H_\r
35 \r
36 \r
37 #include <complib/cl_types.h>\r
38 #include <complib/cl_byteswap.h>\r
39 \r
40 \r
41 #ifndef HW_ADDR_LEN\r
42 #define HW_ADDR_LEN             6\r
43 #endif  /* HW_ADDR_LEN */\r
44 \r
45 \r
46 #define ETH_PROT_TYPE_IP        CL_HTON16(0x800)\r
47 #define ETH_PROT_TYPE_ARP       CL_HTON16(0x806)\r
48 #define ETH_PROT_VLAN_TAG       CL_HTON16(0x8100)\r
49 \r
50 \r
51 #define ETH_IS_LOCALLY_ADMINISTERED(addr) \\r
52         (BOOLEAN)(((PUCHAR)(addr))[0] & ((UCHAR)0x02))\r
53 \r
54 \r
55 #include <complib/cl_packon.h>\r
56 /****s* IB Network Drivers/mac_addr_t\r
57 * NAME\r
58 *       mac_addr_t\r
59 *\r
60 * DESCRIPTION\r
61 *       Defines the ehternet MAC address.\r
62 *\r
63 * SYNOPSIS\r
64 */\r
65 typedef struct _mac_addr\r
66 {\r
67         uint8_t         addr[HW_ADDR_LEN];\r
68 \r
69 }       PACK_SUFFIX mac_addr_t;\r
70 /*\r
71 * FIELDS\r
72 *       addr\r
73 *               Byte array representing the MAC address.\r
74 *\r
75 * NOTES\r
76 *       The HW_ADDR_LEN value must be defined before including this header in order\r
77 *       to support various address lengths.  If not defined, the default length for\r
78 *       ethernet (6 bytes) is used.\r
79 *\r
80 *       addr[0] & 0x1 indicates multicast\r
81 *       addr[0] & 0x2 indicates LAA if not multicast\r
82 *\r
83 * SEE ALSO\r
84 *       IB Network Drivers, arp_pkt_t, ip_hdr_t, tcp_hdr_t, udp_hdr_t\r
85 *********/\r
86 #include <complib/cl_packoff.h>\r
87 \r
88 \r
89 #include <complib/cl_packon.h>\r
90 /****s* IB Network Drivers/eth_hdr_t\r
91 * NAME\r
92 *       eth_hdr_t\r
93 *\r
94 * DESCRIPTION\r
95 *       Defines the ehternet header for IP packets.\r
96 *\r
97 * SYNOPSIS\r
98 */\r
99 typedef struct _eth_hdr\r
100 {\r
101         mac_addr_t      dst;\r
102         mac_addr_t      src;\r
103         net16_t         type;\r
104 \r
105 }       PACK_SUFFIX eth_hdr_t;\r
106 /*\r
107 * FIELDS\r
108 *       dst\r
109 *               Destination address\r
110 *\r
111 *       src\r
112 *               Source address\r
113 *\r
114 *       type\r
115 *               Ethernet protocol type\r
116 *\r
117 * NOTES\r
118 *       The HW_ADDR_LEN value must be defined before including this header in order\r
119 *       to support various address lengths.\r
120 *\r
121 * SEE ALSO\r
122 *       IB Network Drivers, arp_pkt_t, ip_hdr_t, tcp_hdr_t, udp_hdr_t\r
123 *********/\r
124 #include <complib/cl_packoff.h>\r
125 \r
126 \r
127 #define ARP_HW_TYPE_ETH         CL_HTON16(1)\r
128 #define ARP_HW_TYPE_IB          CL_HTON16(32)\r
129 \r
130 #define ARP_OP_REQ                      CL_HTON16(1)\r
131 #define ARP_OP_REP                      CL_HTON16(2)\r
132 \r
133 \r
134 #include <complib/cl_packon.h>\r
135 /****s* IB Network Drivers/arp_pkt_t\r
136 * NAME\r
137 *       arp_pkt_t\r
138 *\r
139 * DESCRIPTION\r
140 *       Defines the ARP packet for IP packets.\r
141 *\r
142 * SYNOPSIS\r
143 */\r
144 typedef struct _arp_pkt\r
145 {\r
146         net16_t         hw_type;\r
147         net16_t         prot_type;\r
148         uint8_t         hw_size;\r
149         uint8_t         prot_size;\r
150         net16_t         op;\r
151         mac_addr_t      src_hw;\r
152         net32_t         src_ip;\r
153         mac_addr_t      dst_hw;\r
154         net32_t         dst_ip;\r
155 \r
156 }       PACK_SUFFIX arp_pkt_t;\r
157 /*\r
158 * FIELDS\r
159 *       hw_type\r
160 *               Hardware type\r
161 *\r
162 *       prot_type\r
163 *               Protocol type.  See ETH_PROT_TYPE_XXX definitions.\r
164 *\r
165 *       hw_size\r
166 *               Size of the hardware address\r
167 *\r
168 *       prot_size\r
169 *               Size of the protocol address\r
170 *\r
171 *       op\r
172 *               ARP operation\r
173 *\r
174 *       src_hw\r
175 *               Source HW (MAC) address\r
176 *\r
177 *       src_ip\r
178 *               Source IP address\r
179 *\r
180 *       dst_hw\r
181 *               Destination HW (MAC) address\r
182 *\r
183 *       dst_ip\r
184 *               Destination IP address\r
185 *\r
186 * NOTES\r
187 *       The HW_ADDR_LEN value must be defined before including this header in order\r
188 *       to support various MAC address lengths.\r
189 *\r
190 * SEE ALSO\r
191 *       IB Network Drivers, eth_hdr_t, ip_hdr_t, tcp_hdr_t, udp_hdr_t\r
192 *********/\r
193 #include <complib/cl_packoff.h>\r
194 \r
195 \r
196 #define IP_PROT_IP                      4\r
197 #define IP_PROT_TCP                     6\r
198 #define IP_PROT_UDP                     17\r
199 \r
200 \r
201 #include <complib/cl_packon.h>\r
202 /****s* IB Network Drivers/ip_hdr_t\r
203 * NAME\r
204 *       ip_hdr_t\r
205 *\r
206 * DESCRIPTION\r
207 *       Defines the IP header for IP packets.\r
208 *\r
209 * SYNOPSIS\r
210 */\r
211 typedef struct _ip_hdr\r
212 {\r
213         uint8_t         ver_hl;\r
214         uint8_t         svc_type;\r
215         net16_t         length;\r
216         net16_t         id;\r
217         net16_t         offset;\r
218         uint8_t         ttl;\r
219         uint8_t         prot;\r
220         net16_t         chksum;\r
221         net32_t         src_ip;\r
222         net32_t         dst_ip;\r
223 \r
224 }       PACK_SUFFIX ip_hdr_t;\r
225 /*\r
226 * FIELDS\r
227 *       ver_hl\r
228 *               Header version and length.\r
229 *\r
230 *       svc_type\r
231 *               Service type.\r
232 *\r
233 *       length\r
234 *               Total length.\r
235 *\r
236 *       id\r
237 *               Packet identification.\r
238 *\r
239 *       offset\r
240 *               Fragment offset.\r
241 *\r
242 *       ttl\r
243 *               Time to live.\r
244 *\r
245 *       prot\r
246 *               Protocol.\r
247 *\r
248 *       chksum\r
249 *               Checksum.\r
250 *\r
251 *       src_ip\r
252 *               Source IP address\r
253 *\r
254 *       dst_ip\r
255 *               Destination IP address\r
256 *\r
257 * SEE ALSO\r
258 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, tcp_hdr_t, udp_hdr_t\r
259 *********/\r
260 #include <complib/cl_packoff.h>\r
261 \r
262 \r
263 #include <complib/cl_packon.h>\r
264 /****s* IB Network Drivers/tcp_hdr_t\r
265 * NAME\r
266 *       tcp_hdr_t\r
267 *\r
268 * DESCRIPTION\r
269 *       Defines the IP header for IP packets.\r
270 *\r
271 * SYNOPSIS\r
272 */\r
273 typedef struct _tcp_hdr\r
274 {\r
275         net16_t         src_port;\r
276         net16_t         dst_port;\r
277         net32_t         seq_num;\r
278         net32_t         ack_num;\r
279         uint8_t         offset;\r
280         uint8_t         flags;\r
281         net16_t         window;\r
282         net16_t         chksum;\r
283         net16_t         urp;\r
284 \r
285 }       PACK_SUFFIX tcp_hdr_t;\r
286 /*\r
287 * FIELDS\r
288 *       src_port\r
289 *               Source port.\r
290 *\r
291 *       dst_port\r
292 *               Destination port.\r
293 *\r
294 *       seq_num\r
295 *               Sequence number.\r
296 *\r
297 *       ack_num\r
298 *               Acknowledge number.\r
299 *\r
300 *       offset\r
301 *               data offset.\r
302 *\r
303 *       flags\r
304 *               TCP flags.\r
305 *\r
306 *       window\r
307 *               Window number.\r
308 *\r
309 *       chksum\r
310 *               Checksum.\r
311 *\r
312 *       urp\r
313 *               Urgent pointer.\r
314 *\r
315 * SEE ALSO\r
316 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, ip_hdr_t, udp_hdr_t\r
317 *********/\r
318 #include <complib/cl_packoff.h>\r
319 \r
320 \r
321 #include <complib/cl_packon.h>\r
322 /****s* IB Network Drivers/udp_hdr_t\r
323 * NAME\r
324 *       udp_hdr_t\r
325 *\r
326 * DESCRIPTION\r
327 *       Defines the IP header for IP packets.\r
328 *\r
329 * SYNOPSIS\r
330 */\r
331 typedef struct _udp_hdr\r
332 {\r
333         net16_t         src_port;\r
334         net16_t         dst_port;\r
335         net16_t         length;\r
336         net16_t         chksum;\r
337 \r
338 }       PACK_SUFFIX udp_hdr_t;\r
339 /*\r
340 * FIELDS\r
341 *       src_port\r
342 *               Source port.\r
343 *\r
344 *       dst_port\r
345 *               Destination port.\r
346 *\r
347 *       length\r
348 *               Length of datagram.\r
349 *\r
350 *       chksum\r
351 *               Checksum.\r
352 *\r
353 * SEE ALSO\r
354 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, ip_hdr_t, tcp_hdr_t\r
355 *********/\r
356 #include <complib/cl_packoff.h>\r
357 \r
358 \r
359 #define DHCP_PORT_SERVER                CL_HTON16(67)\r
360 #define DHCP_PORT_CLIENT                CL_HTON16(68)\r
361 \r
362 #define DHCP_REQUEST                    1\r
363 #define DHCP_REPLY                              2\r
364 #define DHCP_HW_TYPE_ETH                1\r
365 #define DHCP_HW_TYPE_IB                 32\r
366 #define DHCP_OPT_PAD                    0\r
367 #define DHCP_OPT_END                    255\r
368 #define DHCP_OPT_MSG                    53\r
369 #define DHCP_OPT_CLIENT_ID              61\r
370 \r
371 #define DHCPDISCOVER                    1\r
372 #define DHCPOFFER                               2\r
373 #define DHCPREQUEST                             3\r
374 #define DHCPDECLINE                             4\r
375 #define DHCPACK                                 5\r
376 #define DHCPNAK                                 6\r
377 #define DHCPRELEASE                             7\r
378 #define DHCPINFORM                              8\r
379 \r
380 #define DHCP_FLAGS_BROADCAST    CL_HTON16(0x8000)\r
381 #define DHCP_COOKIE                             0x63538263\r
382 #define DHCP_OPTIONS_SIZE               312\r
383 #define DHCP_COOKIE_SIZE                4\r
384 \r
385 \r
386 /* Minimum DHCP size is without options (but with 4-byte magic cookie). */\r
387 #define DHCP_MIN_SIZE                   (sizeof(dhcp_pkt_t) + DHCP_COOKIE_SIZE - DHCP_OPTIONS_SIZE )\r
388 \r
389 #include <complib/cl_packon.h>\r
390 /****s* IB Network Drivers/dhcp_pkt_t\r
391 * NAME\r
392 *       dhcp_pkt_t\r
393 *\r
394 * DESCRIPTION\r
395 *       Defines the DHCP packet format as documented in RFC 2131\r
396 *       http://www.zvon.org/tmRFC/RFC2131/Output/index.html\r
397 *\r
398 * SYNOPSIS\r
399 */\r
400 typedef struct _dhcp_pkt\r
401 {\r
402         uint8_t         op;\r
403         uint8_t         htype;\r
404         uint8_t         hlen;\r
405         uint8_t         hops;\r
406         net32_t         xid;\r
407         net16_t         secs;\r
408         net16_t         flags;\r
409         net32_t         ciaddr;\r
410         net32_t         yiaddr;\r
411         net32_t         siaddr;\r
412         net32_t         giaddr;\r
413         uint8_t         chaddr[16];\r
414         uint8_t         sname[64];\r
415         uint8_t         file[128];\r
416         uint8_t         options[312];\r
417 \r
418 }       PACK_SUFFIX dhcp_pkt_t;\r
419 /*\r
420 * SEE ALSO\r
421 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, ip_hdr_t, udp_hdr_t\r
422 *********/\r
423 #include <complib/cl_packoff.h>\r
424 \r
425 \r
426 #include <complib/cl_packon.h>\r
427 typedef struct _udp_pkt\r
428 {\r
429         udp_hdr_t       hdr;\r
430         dhcp_pkt_t      dhcp;\r
431 \r
432 }       PACK_SUFFIX udp_pkt_t;\r
433 \r
434 typedef struct _ip_pkt\r
435 {\r
436         ip_hdr_t                hdr;\r
437         union _ip_payload\r
438         {\r
439                 tcp_hdr_t       tcp;\r
440                 udp_pkt_t       udp;\r
441 \r
442         }       PACK_SUFFIX prot;\r
443 \r
444 }       PACK_SUFFIX ip_pkt_t;\r
445 \r
446 typedef struct _eth_pkt\r
447 {\r
448         eth_hdr_t       hdr;\r
449         union _eth_payload\r
450         {\r
451                 arp_pkt_t       arp;\r
452                 ip_pkt_t        ip;\r
453 \r
454         }       PACK_SUFFIX type;\r
455 \r
456 }       PACK_SUFFIX eth_pkt_t;\r
457 #include <complib/cl_packoff.h>\r
458 \r
459 \r
460 #endif  /* _IP_PACKET_H_ */\r