[DAPL2] sync with WinOF 2.1 branch
[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 #define IP_PROT_IGMP            2\r
200 #define IP_PROT_ICMP            1\r
201 \r
202 \r
203 #include <complib/cl_packon.h>\r
204 /****s* IB Network Drivers/ip_hdr_t\r
205 * NAME\r
206 *       ip_hdr_t\r
207 *\r
208 * DESCRIPTION\r
209 *       Defines the IP header for IP packets.\r
210 *\r
211 * SYNOPSIS\r
212 */\r
213 typedef struct _ip_hdr\r
214 {\r
215         uint8_t         ver_hl;\r
216         uint8_t         svc_type;\r
217         net16_t         length;\r
218         net16_t         id;\r
219         net16_t         offset;\r
220         uint8_t         ttl;\r
221         uint8_t         prot;\r
222         net16_t         chksum;\r
223         net32_t         src_ip;\r
224         net32_t         dst_ip;\r
225 \r
226 }       PACK_SUFFIX ip_hdr_t;\r
227 /*\r
228 * FIELDS\r
229 *       ver_hl\r
230 *               Header version and length.\r
231 *\r
232 *       svc_type\r
233 *               Service type.\r
234 *\r
235 *       length\r
236 *               Total length.\r
237 *\r
238 *       id\r
239 *               Packet identification.\r
240 *\r
241 *       offset\r
242 *               Fragment offset.\r
243 *\r
244 *       ttl\r
245 *               Time to live.\r
246 *\r
247 *       prot\r
248 *               Protocol.\r
249 *\r
250 *       chksum\r
251 *               Checksum.\r
252 *\r
253 *       src_ip\r
254 *               Source IP address\r
255 *\r
256 *       dst_ip\r
257 *               Destination IP address\r
258 *\r
259 * SEE ALSO\r
260 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, tcp_hdr_t, udp_hdr_t\r
261 *********/\r
262 #include <complib/cl_packoff.h>\r
263 \r
264 \r
265 #include <complib/cl_packon.h>\r
266 /****s* IB Network Drivers/tcp_hdr_t\r
267 * NAME\r
268 *       tcp_hdr_t\r
269 *\r
270 * DESCRIPTION\r
271 *       Defines the IP header for IP packets.\r
272 *\r
273 * SYNOPSIS\r
274 */\r
275 typedef struct _tcp_hdr\r
276 {\r
277         net16_t         src_port;\r
278         net16_t         dst_port;\r
279         net32_t         seq_num;\r
280         net32_t         ack_num;\r
281         uint8_t         offset;\r
282         uint8_t         flags;\r
283         net16_t         window;\r
284         net16_t         chksum;\r
285         net16_t         urp;\r
286 \r
287 }       PACK_SUFFIX tcp_hdr_t;\r
288 /*\r
289 * FIELDS\r
290 *       src_port\r
291 *               Source port.\r
292 *\r
293 *       dst_port\r
294 *               Destination port.\r
295 *\r
296 *       seq_num\r
297 *               Sequence number.\r
298 *\r
299 *       ack_num\r
300 *               Acknowledge number.\r
301 *\r
302 *       offset\r
303 *               data offset.\r
304 *\r
305 *       flags\r
306 *               TCP flags.\r
307 *\r
308 *       window\r
309 *               Window number.\r
310 *\r
311 *       chksum\r
312 *               Checksum.\r
313 *\r
314 *       urp\r
315 *               Urgent pointer.\r
316 *\r
317 * SEE ALSO\r
318 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, ip_hdr_t, udp_hdr_t\r
319 *********/\r
320 #include <complib/cl_packoff.h>\r
321 \r
322 \r
323 #include <complib/cl_packon.h>\r
324 /****s* IB Network Drivers/udp_hdr_t\r
325 * NAME\r
326 *       udp_hdr_t\r
327 *\r
328 * DESCRIPTION\r
329 *       Defines the IP header for IP packets.\r
330 *\r
331 * SYNOPSIS\r
332 */\r
333 typedef struct _udp_hdr\r
334 {\r
335         net16_t         src_port;\r
336         net16_t         dst_port;\r
337         net16_t         length;\r
338         net16_t         chksum;\r
339 \r
340 }       PACK_SUFFIX udp_hdr_t;\r
341 /*\r
342 * FIELDS\r
343 *       src_port\r
344 *               Source port.\r
345 *\r
346 *       dst_port\r
347 *               Destination port.\r
348 *\r
349 *       length\r
350 *               Length of datagram.\r
351 *\r
352 *       chksum\r
353 *               Checksum.\r
354 *\r
355 * SEE ALSO\r
356 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, ip_hdr_t, tcp_hdr_t\r
357 *********/\r
358 #include <complib/cl_packoff.h>\r
359 \r
360 #define IP_HEADER_LENGTH(pIpHdr)   \\r
361         ( (ULONG)((pIpHdr->ver_hl & 0x0F) << 2) )\r
362 \r
363 #define TCP_HEADER_LENGTH(pTcpHdr) \\r
364                 ((pTcpHdr->offset & 0xF0) >> 2)\r
365 \r
366 #define IP_FRAGMENT_OFFSET(p_ip_hdr) \\r
367                 ( cl_ntoh16( p_ip_hdr->offset & CL_HTON16(0x1fff) ) )\r
368 \r
369 #define IP_DONT_FRAGMENT(p_ip_hdr) \\r
370                 ( (BOOLEAN)( p_ip_hdr->offset & CL_HTON16(0x4000 ) ) )\r
371                 \r
372 #define IP_MORE_FRAGMENTS( p_ip_hdr ) \\r
373                 ( (BOOLEAN)( p_ip_hdr->offset & CL_HTON16(0x2000) ) )\r
374 \r
375 #define IP_SET_MORE_FRAGMENTS( p_ip_hdr ) \\r
376                 ( p_ip_hdr->offset |= CL_HTON16(0x2000) )\r
377 \r
378 #define IP_SET_LAST_FRAGMENT( p_ip_hdr ) \\r
379                 ( p_ip_hdr->offset &= (CL_HTON16(~0x2000) ) )\r
380 \r
381 #define PROTOCOL_TCP         IP_PROT_TCP\r
382 \r
383 #define IGMP_V2_MEMBERSHIP_QUERY        0x11\r
384 #define IGMP_V2_MEMBERSHIP_REPORT       0x16\r
385 #define IGMP_V1_MEMBERSHIP_REPORT       0x12    // for backward compatibility with IGMPv1\r
386 #define IGMP_V2_LEAVE_GROUP                     0x17\r
387 #include <complib/cl_packon.h>\r
388 /****s* IB Network Drivers/igmp__v2_hdr_t\r
389 * NAME\r
390 *       igmp_v2_hdr_t\r
391 *\r
392 * DESCRIPTION\r
393 *       Defines the IGMPv2 header for IP packets.\r
394 *\r
395 * SYNOPSIS\r
396 */\r
397 typedef struct _igmp_v2_hdr\r
398 {\r
399         uint8_t         type;\r
400         uint8_t         max_resp_time;\r
401         net16_t         chksum;\r
402         net32_t         group_address;\r
403 }       PACK_SUFFIX igmp_v2_hdr_t;\r
404 /*\r
405 * FIELDS\r
406 *       type\r
407 *               type of IGMPv2 message: query/report/leave\r
408 *\r
409 *       max_resp_time\r
410 *               The Max Response Time field is meaningful only in Membership Query\r
411 *               messages, and specifies the maximum allowed time before sending a\r
412 *               responding report in units of 1/10 second.  In all other messages, it\r
413 *               is set to zero by the sender and ignored by receivers.\r
414 *\r
415 *       checksum\r
416 *               The checksum is the 16-bit one's complement of the one's complement\r
417 *       sum of the whole IGMP message (the entire IP payload).  \r
418 *\r
419 *       group_address\r
420 *               In a Membership Query message, the group address field is set to zero\r
421 *       when sending a General Query, and set to the group address being\r
422 *       queried when sending a Group-Specific Query.\r
423 *\r
424 *       In a Membership Report or Leave Group message, the group address\r
425 *       field holds the IP multicast group address of the group being\r
426 *       reported or left.\r
427 *\r
428 * SEE ALSO\r
429 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, ip_hdr_t, tcp_hdr_t\r
430 *********/\r
431 #include <complib/cl_packoff.h>\r
432 \r
433 #define DHCP_PORT_SERVER                CL_HTON16(67)\r
434 #define DHCP_PORT_CLIENT                CL_HTON16(68)\r
435 #define DHCP_PORT_PROXY_SERVER  CL_HTON16(4011)\r
436 \r
437 #define DHCP_REQUEST                    1\r
438 #define DHCP_REPLY                              2\r
439 #define DHCP_HW_TYPE_ETH                1\r
440 #define DHCP_HW_TYPE_IB                 32\r
441 #define DHCP_OPT_PAD                    0\r
442 #define DHCP_OPT_END                    255\r
443 #define DHCP_OPT_MSG                    53\r
444 #define DHCP_OPT_CLIENT_ID              61\r
445 \r
446 #define DHCPDISCOVER                    1\r
447 #define DHCPOFFER                               2\r
448 #define DHCPREQUEST                             3\r
449 #define DHCPDECLINE                             4\r
450 #define DHCPACK                                 5\r
451 #define DHCPNAK                                 6\r
452 #define DHCPRELEASE                             7\r
453 #define DHCPINFORM                              8\r
454 \r
455 #define DHCP_FLAGS_BROADCAST    CL_HTON16(0x8000)\r
456 #define DHCP_COOKIE                             0x63538263\r
457 #define DHCP_OPTIONS_SIZE               312\r
458 #define DHCP_COOKIE_SIZE                4\r
459 \r
460 \r
461 /* Minimum DHCP size is without options (but with 4-byte magic cookie). */\r
462 #define DHCP_MIN_SIZE                   (sizeof(dhcp_pkt_t) + DHCP_COOKIE_SIZE - DHCP_OPTIONS_SIZE )\r
463 \r
464 #include <complib/cl_packon.h>\r
465 /****s* IB Network Drivers/dhcp_pkt_t\r
466 * NAME\r
467 *       dhcp_pkt_t\r
468 *\r
469 * DESCRIPTION\r
470 *       Defines the DHCP packet format as documented in RFC 2131\r
471 *       http://www.zvon.org/tmRFC/RFC2131/Output/index.html\r
472 *\r
473 * SYNOPSIS\r
474 */\r
475 typedef struct _dhcp_pkt\r
476 {\r
477         uint8_t         op;\r
478         uint8_t         htype;\r
479         uint8_t         hlen;\r
480         uint8_t         hops;\r
481         net32_t         xid;\r
482         net16_t         secs;\r
483         net16_t         flags;\r
484         net32_t         ciaddr;\r
485         net32_t         yiaddr;\r
486         net32_t         siaddr;\r
487         net32_t         giaddr;\r
488         uint8_t         chaddr[16];\r
489         uint8_t         sname[64];\r
490         uint8_t         file[128];\r
491         uint8_t         options[312];\r
492 \r
493 }       PACK_SUFFIX dhcp_pkt_t;\r
494 /*\r
495 * SEE ALSO\r
496 *       IB Network Drivers, eth_hdr_t, arp_pkt_t, ip_hdr_t, udp_hdr_t\r
497 *********/\r
498 #include <complib/cl_packoff.h>\r
499 \r
500 \r
501 #include <complib/cl_packon.h>\r
502 typedef struct _udp_pkt\r
503 {\r
504         udp_hdr_t       hdr;\r
505         dhcp_pkt_t      dhcp;\r
506 \r
507 }       PACK_SUFFIX udp_pkt_t;\r
508 \r
509 typedef struct _ip_pkt\r
510 {\r
511         ip_hdr_t                hdr;\r
512         union _ip_payload\r
513         {\r
514                 tcp_hdr_t       tcp;\r
515                 udp_pkt_t       udp;\r
516 \r
517         }       PACK_SUFFIX prot;\r
518 \r
519 }       PACK_SUFFIX ip_pkt_t;\r
520 \r
521 typedef struct _eth_pkt\r
522 {\r
523         eth_hdr_t       hdr;\r
524         union _eth_payload\r
525         {\r
526                 arp_pkt_t       arp;\r
527                 ip_pkt_t        ip;\r
528 \r
529         }       PACK_SUFFIX type;\r
530 \r
531 }       PACK_SUFFIX eth_pkt_t;\r
532 #include <complib/cl_packoff.h>\r
533 \r
534 \r
535 #endif  /* _IP_PACKET_H_ */\r