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