VirtualBox

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

Last change on this file since 45113 was 43214, checked in by vboxsync, 12 years ago

RTStrIsIpAddr[46] -> RTNetIsIpv\1AddrStr; made the buggers return bool like predicate functions shall.

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