VirtualBox

source: vbox/trunk/include/iprt/net.h@ 28800

Last change on this file since 28800 was 28800, checked in by vboxsync, 15 years ago

Automated rebranding to Oracle copyright/license strings via filemuncher

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 23.5 KB
Line 
1/** @file
2 * IPRT - Network Protocols.
3 */
4
5/*
6 * Copyright (C) 2008 Oracle Corporation
7 *
8 * This file is part of VirtualBox Open Source Edition (OSE), as
9 * available from http://www.virtualbox.org. This file is free software;
10 * you can redistribute it and/or modify it under the terms of the GNU
11 * General Public License (GPL) as published by the Free Software
12 * Foundation, in version 2 as it comes in the "COPYING" file of the
13 * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
14 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
15 *
16 * The contents of this file may alternatively be used under the terms
17 * of the Common Development and Distribution License Version 1.0
18 * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
19 * VirtualBox OSE distribution, in which case the provisions of the
20 * CDDL are applicable instead of those of the GPL.
21 *
22 * You may elect to license modified versions of this file under the
23 * terms and conditions of either the GPL or the CDDL or both.
24 */
25
26#ifndef ___iprt_net_h
27#define ___iprt_net_h
28
29#include <iprt/cdefs.h>
30#include <iprt/types.h>
31#include <iprt/assert.h>
32
33
34RT_C_DECLS_BEGIN
35
36/** @defgroup grp_rt_net RTNet - Network Protocols
37 * @ingroup grp_rt
38 * @{
39 */
40
41/**
42 * IPv4 address.
43 */
44typedef RTUINT32U RTNETADDRIPV4;
45AssertCompileSize(RTNETADDRIPV4, 4);
46/** Pointer to a IPv4 address. */
47typedef RTNETADDRIPV4 *PRTNETADDRIPV4;
48/** Pointer to a const IPv4 address. */
49typedef RTNETADDRIPV4 const *PCRTNETADDRIPV4;
50
51/**
52 * IPv6 address.
53 */
54typedef RTUINT128U RTNETADDRIPV6;
55AssertCompileSize(RTNETADDRIPV6, 16);
56/** Pointer to a IPv6 address. */
57typedef RTNETADDRIPV6 *PRTNETADDRIPV6;
58/** Pointer to a const IPv6 address. */
59typedef RTNETADDRIPV6 const *PCRTNETADDRIPV6;
60
61/**
62 * IPX address.
63 */
64#pragma pack(1)
65typedef struct RTNETADDRIPX
66{
67 /** The network ID. */
68 uint32_t Network;
69 /** The node ID. (Defaults to the MAC address apparently.) */
70 RTMAC Node;
71} RTNETADDRIPX;
72#pragma pack()
73AssertCompileSize(RTNETADDRIPX, 4+6);
74/** Pointer to an IPX address. */
75typedef RTNETADDRIPX *PRTNETADDRIPX;
76/** Pointer to a const IPX address. */
77typedef RTNETADDRIPX const *PCRTNETADDRIPX;
78
79/**
80 * Network address union.
81 *
82 * @remarks The size of this structure may change in the future.
83 */
84typedef union RTNETADDRU
85{
86 /** 64-bit view. */
87 uint64_t au64[2];
88 /** 32-bit view. */
89 uint32_t au32[4];
90 /** 16-bit view. */
91 uint16_t au16[8];
92 /** 8-bit view. */
93 uint8_t au8[16];
94 /** IPv4 view. */
95 RTNETADDRIPV4 IPv4;
96 /** IPv6 view. */
97 RTNETADDRIPV6 IPv6;
98 /** IPX view. */
99 RTNETADDRIPX Ipx;
100 /** MAC address view. */
101 RTMAC Mac;
102} RTNETADDRU;
103AssertCompileSize(RTNETADDRU, 16);
104/** Pointer to an address union. */
105typedef RTNETADDRU *PRTNETADDRU;
106/** Pointer to a const address union. */
107typedef RTNETADDRU const *PCRTNETADDRU;
108
109/**
110 * Network address type.
111 *
112 * @remarks The value assignments may change in the future.
113 */
114typedef enum RTNETADDRTYPE
115{
116 /** The invalid 0 entry. */
117 RTNETADDRTYPE_INVALID = 0,
118 /** IP version 4. */
119 RTNETADDRTYPE_IPV4,
120 /** IP version 6. */
121 RTNETADDRTYPE_IPV6,
122 /** IPX. */
123 RTNETADDRTYPE_IPX,
124 /** MAC address. */
125 RTNETADDRTYPE_MAC,
126 /** The end of the valid values. */
127 RTNETADDRTYPE_END,
128 /** The usual 32-bit hack. */
129 RTNETADDRTYPE_32_BIT_HACK = 0x7fffffff
130} RTNETADDRTYPE;
131/** Pointer to a network address type. */
132typedef RTNETADDRTYPE *PRTNETADDRTYPE;
133/** Pointer to a const network address type. */
134typedef RTNETADDRTYPE const *PCRTNETADDRTYPE;
135
136/**
137 * Network address.
138 *
139 * @remarks The size and type values may change.
140 */
141typedef struct RTNETADDR
142{
143 /** The address union. */
144 RTNETADDRU uAddr;
145 /** Indicates which view of @a u that is valid. */
146 RTNETADDRTYPE enmType;
147 /** The port number for IPv4 and IPv6 addresses. This is set to
148 * RTNETADDR_NA_PORT if not applicable. */
149 uint32_t uPort;
150} RTNETADDR;
151/** Pointer to a network address. */
152typedef RTNETADDR *PRTNETADDR;
153/** Pointer to a const network address. */
154typedef RTNETADDR const *PCRTNETADDR;
155
156/** The not applicable value of RTNETADDR::uPort value use to inid. */
157#define RTNETADDR_PORT_NA UINT32_MAX
158
159/**
160 * Ethernet header.
161 */
162#pragma pack(1)
163typedef struct RTNETETHERHDR
164{
165 RTMAC DstMac;
166 RTMAC SrcMac;
167 /** Ethernet frame type or frame size, depending on the kind of ethernet.
168 * This is big endian on the wire. */
169 uint16_t EtherType;
170} RTNETETHERHDR;
171#pragma pack()
172AssertCompileSize(RTNETETHERHDR, 14);
173/** Pointer to an ethernet header. */
174typedef RTNETETHERHDR *PRTNETETHERHDR;
175/** Pointer to a const ethernet header. */
176typedef RTNETETHERHDR const *PCRTNETETHERHDR;
177
178/** @name EtherType (RTNETETHERHDR::EtherType)
179 * @{ */
180#define RTNET_ETHERTYPE_IPV4 UINT16_C(0x0800)
181#define RTNET_ETHERTYPE_ARP UINT16_C(0x0806)
182#define RTNET_ETHERTYPE_IPV6 UINT16_C(0x86dd)
183#define RTNET_ETHERTYPE_VLAN UINT16_C(0x8100)
184#define RTNET_ETHERTYPE_IPX_1 UINT16_C(0x8037)
185#define RTNET_ETHERTYPE_IPX_2 UINT16_C(0x8137)
186#define RTNET_ETHERTYPE_IPX_3 UINT16_C(0x8138)
187/** @} */
188
189
190/**
191 * IPv4 header.
192 * All is bigendian on the wire.
193 */
194#pragma pack(1)
195typedef struct RTNETIPV4
196{
197#ifdef RT_BIG_ENDIAN
198 unsigned int ip_v : 4;
199 unsigned int ip_hl : 4;
200 unsigned int ip_tos : 8;
201 unsigned int ip_len : 16;
202#else
203 /** 00:0 - Header length given as a 32-bit word count. */
204 unsigned int ip_hl : 4;
205 /** 00:4 - Header version. */
206 unsigned int ip_v : 4;
207 /** 01 - Type of service. */
208 unsigned int ip_tos : 8;
209 /** 02 - Total length (header + data). */
210 unsigned int ip_len : 16;
211#endif
212 /** 04 - Packet idenficiation. */
213 uint16_t ip_id;
214 /** 06 - Offset if fragmented. */
215 uint16_t ip_off;
216 /** 08 - Time to live. */
217 uint8_t ip_ttl;
218 /** 09 - Protocol. */
219 uint8_t ip_p;
220 /** 0a - Header check sum. */
221 uint16_t ip_sum;
222 /** 0c - Source address. */
223 RTNETADDRIPV4 ip_src;
224 /** 10 - Destination address. */
225 RTNETADDRIPV4 ip_dst;
226 /** 14 - Options (optional). */
227 uint32_t ip_options[1];
228} RTNETIPV4;
229#pragma pack()
230AssertCompileSize(RTNETIPV4, 6 * 4);
231/** Pointer to a IPv4 header. */
232typedef RTNETIPV4 *PRTNETIPV4;
233/** Pointer to a const IPv4 header. */
234typedef RTNETIPV4 const *PCRTNETIPV4;
235
236/** The minimum IPv4 header length (in bytes).
237 * Up to and including RTNETIPV4::ip_dst. */
238#define RTNETIPV4_MIN_LEN (20)
239
240
241/** @name IPv4 Protocol Numbers
242 * @{ */
243/** IPv4: ICMP */
244#define RTNETIPV4_PROT_ICMP (1)
245/** IPv4: TCP */
246#define RTNETIPV4_PROT_TCP (6)
247/** IPv4: UDP */
248#define RTNETIPV4_PROT_UDP (17)
249/** @} */
250
251/** @name Common IPv4 Port Assignments
252 * @{
253 */
254/** Boostrap Protocol / DHCP) Server. */
255#define RTNETIPV4_PORT_BOOTPS (67)
256/** Boostrap Protocol / DHCP) Client. */
257#define RTNETIPV4_PORT_BOOTPC (68)
258/** @} */
259
260RTDECL(uint16_t) RTNetIPv4HdrChecksum(PCRTNETIPV4 pIpHdr);
261RTDECL(bool) RTNetIPv4IsHdrValid(PCRTNETIPV4 pIpHdr, size_t cbHdrMax, size_t cbPktMax, bool fChecksum);
262RTDECL(uint32_t) RTNetIPv4PseudoChecksum(PCRTNETIPV4 pIpHdr);
263RTDECL(uint32_t) RTNetIPv4PseudoChecksumBits(RTNETADDRIPV4 SrcAddr, RTNETADDRIPV4 DstAddr, uint8_t bProtocol, uint16_t cbPkt);
264RTDECL(uint32_t) RTNetIPv4AddDataChecksum(void const *pvData, size_t cbData, uint32_t u32Sum, bool *pfOdd);
265RTDECL(uint16_t) RTNetIPv4FinalizeChecksum(uint32_t u32Sum);
266
267
268/**
269 * IPv6 header.
270 * All is bigendian on the wire.
271 */
272#pragma pack(1)
273typedef struct RTNETIPV6
274{
275 /** Version (4 bits), Traffic Class (8 bits) and Flow Lable (20 bits).
276 * @todo this is probably mislabeled - ip6_flow vs. ip6_vfc, fix later. */
277 uint32_t ip6_vfc;
278 /** 04 - Payload length, including extension headers. */
279 uint16_t ip6_plen;
280 /** 06 - Next header type (RTNETIPV4_PROT_XXX). */
281 uint8_t ip6_nxt;
282 /** 07 - Hop limit. */
283 uint8_t ip6_hlim;
284 /** xx - Source address. */
285 RTNETADDRIPV6 ip6_src;
286 /** xx - Destination address. */
287 RTNETADDRIPV6 ip6_dst;
288} RTNETIPV6;
289#pragma pack()
290AssertCompileSize(RTNETIPV6, 8 + 16 + 16);
291/** Pointer to a IPv6 header. */
292typedef RTNETIPV6 *PRTNETIPV6;
293/** Pointer to a const IPv6 header. */
294typedef RTNETIPV6 const *PCRTNETIPV6;
295
296/** The minimum IPv6 header length (in bytes).
297 * Up to and including RTNETIPV6::ip6_dst. */
298#define RTNETIPV6_MIN_LEN (40)
299
300RTDECL(uint32_t) RTNetIPv6PseudoChecksum(PCRTNETIPV6 pIpHdr);
301RTDECL(uint32_t) RTNetIPv6PseudoChecksumEx(PCRTNETIPV6 pIpHdr, uint8_t bProtocol, uint16_t cbPkt);
302RTDECL(uint32_t) RTNetIPv6PseudoChecksumBits(PCRTNETADDRIPV6 pSrcAddr, PCRTNETADDRIPV6 pDstAddr,
303 uint8_t bProtocol, uint16_t cbPkt);
304
305
306/**
307 * UDP header.
308 */
309#pragma pack(1)
310typedef struct RTNETUDP
311{
312 /** The source port. */
313 uint16_t uh_sport;
314 /** The destination port. */
315 uint16_t uh_dport;
316 /** The length of the UDP header and associated data. */
317 uint16_t uh_ulen;
318 /** The checksum of the pseudo header, the UDP header and the data. */
319 uint16_t uh_sum;
320} RTNETUDP;
321#pragma pack()
322AssertCompileSize(RTNETUDP, 8);
323/** Pointer to an UDP header. */
324typedef RTNETUDP *PRTNETUDP;
325/** Pointer to a const UDP header. */
326typedef RTNETUDP const *PCRTNETUDP;
327
328/** The minimum UDP packet length (in bytes). (RTNETUDP::uh_ulen) */
329#define RTNETUDP_MIN_LEN (8)
330
331RTDECL(uint16_t) RTNetUDPChecksum(uint32_t u32Sum, PCRTNETUDP pUdpHdr);
332RTDECL(uint32_t) RTNetIPv4AddUDPChecksum(PCRTNETUDP pUdpHdr, uint32_t u32Sum);
333RTDECL(uint16_t) RTNetIPv4UDPChecksum(PCRTNETIPV4 pIpHdr, PCRTNETUDP pUdpHdr, void const *pvData);
334RTDECL(bool) RTNetIPv4IsUDPSizeValid(PCRTNETIPV4 pIpHdr, PCRTNETUDP pUdpHdr, size_t cbPktMax);
335RTDECL(bool) RTNetIPv4IsUDPValid(PCRTNETIPV4 pIpHdr, PCRTNETUDP pUdpHdr, void const *pvData, size_t cbPktMax, bool fChecksum);
336
337/**
338 * IPv4 BOOTP / DHCP packet.
339 */
340#pragma pack(1)
341typedef struct RTNETBOOTP
342{
343 /** 00 - The packet opcode (RTNETBOOTP_OP_*). */
344 uint8_t bp_op;
345 /** 01 - Hardware address type. Same as RTNETARPHDR::ar_htype. */
346 uint8_t bp_htype;
347 /** 02 - Hardware address length. */
348 uint8_t bp_hlen;
349 /** 03 - Gateway hops. */
350 uint8_t bp_hops;
351 /** 04 - Transaction ID. */
352 uint32_t bp_xid;
353 /** 08 - Seconds since boot started. */
354 uint16_t bp_secs;
355 /** 0a - Unused (BOOTP) / Flags (DHCP) (RTNET_DHCP_FLAGS_*). */
356 uint16_t bp_flags;
357 /** 0c - Client IPv4 address. */
358 RTNETADDRIPV4 bp_ciaddr;
359 /** 10 - Your IPv4 address. */
360 RTNETADDRIPV4 bp_yiaddr;
361 /** 14 - Server IPv4 address. */
362 RTNETADDRIPV4 bp_siaddr;
363 /** 18 - Gateway IPv4 address. */
364 RTNETADDRIPV4 bp_giaddr;
365 /** 1c - Client hardware address. */
366 union
367 {
368 uint8_t au8[16];
369 RTMAC Mac;
370 } bp_chaddr;
371 /** 2c - Server name. */
372 uint8_t bp_sname[64];
373 /** 6c - File name / more DHCP options. */
374 uint8_t bp_file[128];
375 /** ec - Vendor specific area (BOOTP) / Options (DHCP).
376 * @remark This is really 312 bytes in the DHCP version. */
377 union
378 {
379 uint8_t au8[128];
380 struct DHCP
381 {
382 /** ec - The DHCP cookie (RTNET_DHCP_COOKIE). */
383 uint32_t dhcp_cookie;
384 /** f0 - The DHCP options. */
385 uint8_t dhcp_opts[124];
386 } Dhcp;
387 } bp_vend;
388
389} RTNETBOOTP;
390#pragma pack()
391AssertCompileSize(RTNETBOOTP, 0xec + 128);
392/** Pointer to a BOOTP / DHCP packet. */
393typedef RTNETBOOTP *PRTNETBOOTP;
394/** Pointer to a const BOOTP / DHCP packet. */
395typedef RTNETBOOTP const *PCRTNETBOOTP;
396
397/** Minimum BOOTP packet length. For quick validation, no standard thing really. */
398#define RTNETBOOTP_MIN_LEN 0xec
399/** Minimum DHCP packet length. For quick validation, no standard thing really. */
400#define RTNETBOOTP_DHCP_MIN_LEN 0xf1
401
402/** The normal size of the a DHCP packet (i.e. a RTNETBOOTP).
403 * Same as RTNET_DHCP_OPT_SIZE, just expressed differently. */
404#define RTNET_DHCP_NORMAL_SIZE (0xec + 4 + RTNET_DHCP_OPT_SIZE)
405/** The normal size of RTNETBOOTP::bp_vend::Dhcp::dhcp_opts. */
406#define RTNET_DHCP_OPT_SIZE (312 - 4)
407
408/** @name BOOTP packet opcode values
409 * @{ */
410#define RTNETBOOTP_OP_REQUEST 1
411#define RTNETBOOTP_OP_REPLY 2
412/** @} */
413
414/** @name DHCP flags (RTNETBOOTP::bp_flags)
415 * @{ */
416#define RTNET_DHCP_FLAGS_NO_BROADCAST UINT16_C(0x8000) /** @todo check test!!! */
417/** @} */
418
419/** The DHCP cookie (network endian). */
420#define RTNET_DHCP_COOKIE UINT32_C(0x63825363)
421
422/**
423 * An IPv4 DHCP option header.
424 */
425typedef struct RTNETDHCPOPT
426{
427 /** 00 - The DHCP option. */
428 uint8_t dhcp_opt;
429 /** 01 - The data length (excluding this header). */
430 uint8_t dhcp_len;
431 /* 02 - The option data follows here, optional and of variable length. */
432} RTNETDHCPOPT;
433AssertCompileSize(RTNETDHCPOPT, 2);
434/** Pointer to a DHCP option header. */
435typedef RTNETDHCPOPT *PRTNETDHCPOPT;
436/** Pointer to a const DHCP option header. */
437typedef RTNETDHCPOPT const *PCRTNETDHCPOPT;
438
439/** @name DHCP options
440 * @{ */
441/** 1 byte padding, this has no dhcp_len field. */
442#define RTNET_DHCP_OPT_PAD 0
443
444/** The subnet mask. */
445#define RTNET_DHCP_OPT_SUBNET_MASK 1
446/** The time offset. */
447#define RTNET_DHCP_OPT_TIME_OFFSET 2
448/** The routers for the subnet. */
449#define RTNET_DHCP_OPT_ROUTERS 3
450/** Domain Name Server. */
451#define RTNET_DHCP_OPT_DNS 6
452/** Host name. */
453#define RTNET_DHCP_OPT_HOST_NAME 12
454/** Domain name. */
455#define RTNET_DHCP_OPT_DOMAIN_NAME 15
456
457/** The requested address. */
458#define RTNET_DHCP_OPT_REQ_ADDR 50
459/** The lease time in seconds. */
460#define RTNET_DHCP_OPT_LEASE_TIME 51
461/** Option overload.
462 * Indicates that the bp_file and/or bp_sname holds contains DHCP options. */
463#define RTNET_DHCP_OPT_OPTION_OVERLOAD 52
464/** Have a 8-bit message type value as data, see RTNET_DHCP_MT_*. */
465#define RTNET_DHCP_OPT_MSG_TYPE 53
466/** Server ID. */
467#define RTNET_DHCP_OPT_SERVER_ID 54
468/** Parameter request list. */
469#define RTNET_DHCP_OPT_PARAM_REQ_LIST 55
470/** The maximum DHCP message size a client is willing to accept. */
471#define RTNET_DHCP_OPT_MAX_DHCP_MSG_SIZE 57
472/** Client ID. */
473#define RTNET_DHCP_OPT_CLIENT_ID 61
474/** TFTP server name. */
475#define RTNET_DHCP_OPT_TFTP_SERVER_NAME 66
476/** Bootfile name. */
477#define RTNET_DHCP_OPT_BOOTFILE_NAME 67
478
479/** Marks the end of the DHCP options, this has no dhcp_len field. */
480#define RTNET_DHCP_OPT_END 255
481/** @} */
482
483/** @name DHCP Message Types (option 53)
484 * @{ */
485#define RTNET_DHCP_MT_DISCOVER 1
486#define RTNET_DHCP_MT_OFFER 2
487#define RTNET_DHCP_MT_REQUEST 3
488#define RTNET_DHCP_MT_DECLINE 4
489#define RTNET_DHCP_MT_ACK 5
490#define RTNET_DHCP_MT_NAC 6
491#define RTNET_DHCP_MT_RELEASE 7
492#define RTNET_DHCP_MT_INFORM 8
493/** @} */
494
495/** @name DHCP Flags
496 * @{ */
497#define RTNET_DHCP_FLAG_BROADCAST 0x8000
498/** @} */
499
500RTDECL(bool) RTNetIPv4IsDHCPValid(PCRTNETUDP pUdpHdr, PCRTNETBOOTP pDhcp, size_t cbDhcp, uint8_t *pMsgType);
501
502
503/**
504 * IPv4 DHCP packet.
505 * @deprecated Use RTNETBOOTP.
506 */
507#pragma pack(1)
508typedef struct RTNETDHCP
509{
510 /** 00 - The packet opcode. */
511 uint8_t Op;
512 /** Hardware address type. */
513 uint8_t HType;
514 /** Hardware address length. */
515 uint8_t HLen;
516 uint8_t Hops;
517 uint32_t XID;
518 uint16_t Secs;
519 uint16_t Flags;
520 /** Client IPv4 address. */
521 RTNETADDRIPV4 CIAddr;
522 /** Your IPv4 address. */
523 RTNETADDRIPV4 YIAddr;
524 /** Server IPv4 address. */
525 RTNETADDRIPV4 SIAddr;
526 /** Gateway IPv4 address. */
527 RTNETADDRIPV4 GIAddr;
528 /** Client hardware address. */
529 uint8_t CHAddr[16];
530 /** Server name. */
531 uint8_t SName[64];
532 uint8_t File[128];
533 uint8_t abMagic[4];
534 uint8_t DhcpOpt;
535 uint8_t DhcpLen; /* 1 */
536 uint8_t DhcpReq;
537 uint8_t abOptions[57];
538} RTNETDHCP;
539#pragma pack()
540/** @todo AssertCompileSize(RTNETDHCP, ); */
541/** Pointer to a DHCP packet. */
542typedef RTNETDHCP *PRTNETDHCP;
543/** Pointer to a const DHCP packet. */
544typedef RTNETDHCP const *PCRTNETDHCP;
545
546
547/**
548 * TCP packet.
549 */
550#pragma pack(1)
551typedef struct RTNETTCP
552{
553 /** 00 - The source port. */
554 uint16_t th_sport;
555 /** 02 - The destination port. */
556 uint16_t th_dport;
557 /** 04 - The sequence number. */
558 uint32_t th_seq;
559 /** 08 - The acknowledgement number. */
560 uint32_t th_ack;
561#ifdef RT_BIG_ENDIAN
562 unsigned int th_win : 16;
563 unsigned int th_flags : 8;
564 unsigned int th_off : 4;
565 unsigned int th_x2 : 4;
566#else
567 /** 0c:0 - Reserved. */
568 unsigned int th_x2 : 4;
569 /** 0c:4 - The data offset given as a dword count from the start of this header. */
570 unsigned int th_off : 4;
571 /** 0d - flags. */
572 unsigned int th_flags : 8;
573 /** 0e - The window. */
574 unsigned int th_win : 16;
575#endif
576 /** 10 - The checksum of the pseudo header, the TCP header and the data. */
577 uint16_t th_sum;
578 /** 12 - The urgent pointer. */
579 uint16_t th_urp;
580 /* (options follows here and then the data (aka text).) */
581} RTNETTCP;
582#pragma pack()
583AssertCompileSize(RTNETTCP, 20);
584/** Pointer to a TCP packet. */
585typedef RTNETTCP *PRTNETTCP;
586/** Pointer to a const TCP packet. */
587typedef RTNETTCP const *PCRTNETTCP;
588
589/** The minimum TCP header length (in bytes). (RTNETTCP::th_off * 4) */
590#define RTNETTCP_MIN_LEN (20)
591
592/** @name TCP flags (RTNETTCP::th_flags)
593 * @{ */
594#define RTNETTCP_F_FIN 0x01
595#define RTNETTCP_F_SYN 0x02
596#define RTNETTCP_F_RST 0x04
597#define RTNETTCP_F_PSH 0x08
598#define RTNETTCP_F_ACK 0x10
599#define RTNETTCP_F_URG 0x20
600#define RTNETTCP_F_ECE 0x40
601#define RTNETTCP_F_CWR 0x80
602/** @} */
603
604RTDECL(uint16_t) RTNetTCPChecksum(uint32_t u32Sum, PCRTNETTCP pTcpHdr, void const *pvData, size_t cbData);
605RTDECL(uint32_t) RTNetIPv4AddTCPChecksum(PCRTNETTCP pTcpHdr, uint32_t u32Sum);
606RTDECL(uint16_t) RTNetIPv4TCPChecksum(PCRTNETIPV4 pIpHdr, PCRTNETTCP pTcpHdr, void const *pvData);
607RTDECL(bool) RTNetIPv4IsTCPSizeValid(PCRTNETIPV4 pIpHdr, PCRTNETTCP pTcpHdr, size_t cbHdrMax, size_t cbPktMax);
608RTDECL(bool) RTNetIPv4IsTCPValid(PCRTNETIPV4 pIpHdr, PCRTNETTCP pTcpHdr, size_t cbHdrMax, void const *pvData,
609 size_t cbPktMax, bool fChecksum);
610
611
612/**
613 * IPv4 ICMP packet header.
614 */
615#pragma pack(1)
616typedef struct RTNETICMPV4HDR
617{
618 /** 00 - The ICMP message type. */
619 uint8_t icmp_type;
620 /** 01 - Type specific code that further qualifies the message. */
621 uint8_t icmp_code;
622 /** 02 - Checksum of the ICMP message. */
623 uint16_t icmp_cksum;
624} RTNETICMPV4HDR;
625#pragma pack()
626AssertCompileSize(RTNETICMPV4HDR, 4);
627/** Pointer to an ICMP packet header. */
628typedef RTNETICMPV4HDR *PRTNETICMPV4HDR;
629/** Pointer to a const ICMP packet header. */
630typedef RTNETICMPV4HDR const *PCRTNETICMPV4HDR;
631
632/** @name ICMP (v4) message types.
633 * @{ */
634#define RTNETICMPV4_TYPE_ECHO_REPLY 0
635#define RTNETICMPV4_TYPE_ECHO_REQUEST 8
636#define RTNETICMPV4_TYPE_TRACEROUTE 30
637/** @} */
638
639/**
640 * IPv4 ICMP ECHO Reply & Request packet.
641 */
642#pragma pack(1)
643typedef struct RTNETICMPV4ECHO
644{
645 /** 00 - The ICMP header. */
646 RTNETICMPV4HDR Hdr;
647 /** 04 - The identifier to help the requestor match up the reply.
648 * Can be 0. Typically fixed value. */
649 uint16_t icmp_id;
650 /** 06 - The sequence number to help the requestor match up the reply.
651 * Can be 0. Typically incrementing between requests. */
652 uint16_t icmp_seq;
653 /** 08 - Variable length data that is to be returned unmodified in the reply. */
654 uint8_t icmp_data[1];
655} RTNETICMPV4ECHO;
656#pragma pack()
657AssertCompileSize(RTNETICMPV4ECHO, 9);
658/** Pointer to an ICMP ECHO packet. */
659typedef RTNETICMPV4ECHO *PRTNETICMPV4ECHO;
660/** Pointer to a const ICMP ECHO packet. */
661typedef RTNETICMPV4ECHO const *PCRTNETICMPV4ECHO;
662
663/**
664 * IPv4 ICMP TRACEROUTE packet.
665 * This is an reply to an IP packet with the traceroute option set.
666 */
667#pragma pack(1)
668typedef struct RTNETICMPV4TRACEROUTE
669{
670 /** 00 - The ICMP header. */
671 RTNETICMPV4HDR Hdr;
672 /** 04 - Identifier copied from the traceroute option's ID number. */
673 uint16_t icmp_id;
674 /** 06 - Unused. (Possibly an icmp_seq?) */
675 uint16_t icmp_void;
676 /** 08 - Outbound hop count. From the IP packet causing this message. */
677 uint16_t icmp_ohc;
678 /** 0a - Return hop count. From the IP packet causing this message. */
679 uint16_t icmp_rhc;
680 /** 0c - Output link speed, 0 if not known. */
681 uint32_t icmp_speed;
682 /** 10 - Output link MTU, 0 if not known. */
683 uint32_t icmp_mtu;
684} RTNETICMPV4TRACEROUTE;
685#pragma pack()
686AssertCompileSize(RTNETICMPV4TRACEROUTE, 20);
687/** Pointer to an ICMP TRACEROUTE packet. */
688typedef RTNETICMPV4TRACEROUTE *PRTNETICMPV4TRACEROUTE;
689/** Pointer to a const ICMP TRACEROUTE packet. */
690typedef RTNETICMPV4TRACEROUTE const *PCRTNETICMPV4TRACEROUTE;
691
692/** @todo add more ICMPv4 as needed. */
693
694/**
695 * IPv4 ICMP union packet.
696 */
697typedef union RTNETICMPV4
698{
699 RTNETICMPV4HDR Hdr;
700 RTNETICMPV4ECHO Echo;
701 RTNETICMPV4TRACEROUTE Traceroute;
702} RTNETICMPV4;
703/** Pointer to an ICMP union packet. */
704typedef RTNETICMPV4 *PRTNETICMPV4;
705/** Pointer to a const ICMP union packet. */
706typedef RTNETICMPV4 const *PCRTNETICMPV4;
707
708
709/** @todo add ICMPv6 when needed. */
710
711
712/**
713 * Ethernet ARP header.
714 */
715#pragma pack(1)
716typedef struct RTNETARPHDR
717{
718 /** The hardware type. */
719 uint16_t ar_htype;
720 /** The protocol type (ethertype). */
721 uint16_t ar_ptype;
722 /** The hardware address length. */
723 uint8_t ar_hlen;
724 /** The protocol address length. */
725 uint8_t ar_plen;
726 /** The operation. */
727 uint16_t ar_oper;
728} RTNETARPHDR;
729#pragma pack()
730AssertCompileSize(RTNETARPHDR, 8);
731/** Pointer to an ethernet ARP header. */
732typedef RTNETARPHDR *PRTNETARPHDR;
733/** Pointer to a const ethernet ARP header. */
734typedef RTNETARPHDR const *PCRTNETARPHDR;
735
736/** ARP hardware type - ethernet. */
737#define RTNET_ARP_ETHER UINT16_C(1)
738
739/** @name ARP operations
740 * @{ */
741#define RTNET_ARPOP_REQUEST UINT16_C(1) /**< Request hardware address given a protocol address (ARP). */
742#define RTNET_ARPOP_REPLY UINT16_C(2)
743#define RTNET_ARPOP_REVREQUEST UINT16_C(3) /**< Request protocol address given a hardware address (RARP). */
744#define RTNET_ARPOP_REVREPLY UINT16_C(4)
745#define RTNET_ARPOP_INVREQUEST UINT16_C(8) /**< Inverse ARP. */
746#define RTNET_ARPOP_INVREPLY UINT16_C(9)
747/** Check if an ARP operation is a request or not. */
748#define RTNET_ARPOP_IS_REQUEST(Op) ((Op) & 1)
749/** Check if an ARP operation is a reply or not. */
750#define RTNET_ARPOP_IS_REPLY(Op) (!RTNET_ARPOP_IS_REQUEST(Op))
751/** @} */
752
753
754/**
755 * Ethernet IPv4 + 6-byte MAC ARP request packet.
756 */
757#pragma pack(1)
758typedef struct RTNETARPIPV4
759{
760 /** ARP header. */
761 RTNETARPHDR Hdr;
762 /** The sender hardware address. */
763 RTMAC ar_sha;
764 /** The sender protocol address. */
765 RTNETADDRIPV4 ar_spa;
766 /** The target hardware address. */
767 RTMAC ar_tha;
768 /** The arget protocol address. */
769 RTNETADDRIPV4 ar_tpa;
770} RTNETARPIPV4;
771#pragma pack()
772AssertCompileSize(RTNETARPIPV4, 8+6+4+6+4);
773/** Pointer to an ethernet IPv4+MAC ARP request packet. */
774typedef RTNETARPIPV4 *PRTNETARPIPV4;
775/** Pointer to a const ethernet IPv4+MAC ARP request packet. */
776typedef RTNETARPIPV4 const *PCRTNETARPIPV4;
777
778
779/** @todo RTNETNDP (IPv6)*/
780
781
782/** @} */
783
784RT_C_DECLS_END
785
786#endif
787
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette