xref: /haiku/headers/posix/netinet/in.h (revision 0b6361ef3afbbf22554bf00fa6f13ac44c4cd49d)
1*0b6361efSAxel Dörfler /*
2*0b6361efSAxel Dörfler  * Copyright 2002-2008, Haiku, Inc. All Rights Reserved.
3*0b6361efSAxel Dörfler  * Distributed under the terms of the MIT License.
4*0b6361efSAxel Dörfler  */
552a38012Sejakowatz #ifndef _NETINET_IN_H_
652a38012Sejakowatz #define _NETINET_IN_H_
752a38012Sejakowatz 
8*0b6361efSAxel Dörfler 
94fc67516SDavid Reid #include <net/if.h>
1042415555Sbeveloper #include <endian.h>
115adca30aSAxel Dörfler #include <stdint.h>
12*0b6361efSAxel Dörfler #include <sys/types.h>
1352a38012Sejakowatz 
1475f1f9e0SHugo Santos /* RFC 2553 states that these must be available through <netinet/in.h> */
1575f1f9e0SHugo Santos #include <netinet6/in6.h>
1675f1f9e0SHugo Santos 
17*0b6361efSAxel Dörfler 
187d31ea94SPhilippe Houdoin #ifdef __cplusplus
197d31ea94SPhilippe Houdoin extern "C" {
207d31ea94SPhilippe Houdoin #endif
217d31ea94SPhilippe Houdoin 
225adca30aSAxel Dörfler typedef uint16_t in_port_t;
235adca30aSAxel Dörfler typedef uint32_t in_addr_t;
2442415555Sbeveloper 
2542415555Sbeveloper /* We can't include <ByteOrder.h> since we are a posix file,
2642415555Sbeveloper  * and we are not allowed to import all the BeOS types here.
2742415555Sbeveloper  */
2842415555Sbeveloper #ifndef htonl
29b9320128SIngo Weinhold /*	extern uint32_t __swap_int32(uint32_t); */	/* private */
3015ab0bcfSAxel Dörfler 	extern unsigned long __swap_int32(unsigned long);	/* private */
315adca30aSAxel Dörfler 	extern uint16_t __swap_int16(uint16_t);	/* private */
3242415555Sbeveloper 	#if 	BYTE_ORDER == LITTLE_ENDIAN
3342415555Sbeveloper 		#define htonl(x) __swap_int32(x)
3442415555Sbeveloper 		#define ntohl(x) __swap_int32(x)
3542415555Sbeveloper 		#define htons(x) __swap_int16(x)
3642415555Sbeveloper 		#define ntohs(x) __swap_int16(x)
3742415555Sbeveloper 	#elif	BYTE_ORDER == BIG_ENDIAN
3842415555Sbeveloper 		#define htonl(x) (x)
3942415555Sbeveloper 		#define ntohl(x) (x)
4042415555Sbeveloper 		#define htons(x) (x)
4142415555Sbeveloper 		#define ntohs(x) (x)
4242415555Sbeveloper 	#else
4342415555Sbeveloper 		#error Unknown byte order.
4442415555Sbeveloper 	#endif
4542415555Sbeveloper #endif
4642415555Sbeveloper 
470b5170a4Sbeveloper 
48*0b6361efSAxel Dörfler /* Protocol definitions */
496181d22fSFrançois Revol #define IPPROTO_IP				0	/* 0, IPv4 */
506181d22fSFrançois Revol #define IPPROTO_ICMP			1	/* 1, ICMP (v4) */
516181d22fSFrançois Revol #define IPPROTO_IGMP			2	/* 2, IGMP (group management) */
526181d22fSFrançois Revol #define IPPROTO_TCP				6	/* 6, tcp */
536181d22fSFrançois Revol #define IPPROTO_UDP				17	/* 17, UDP */
546181d22fSFrançois Revol #define IPPROTO_IPV6			41	/* 41, IPv6 in IPv6 */
556181d22fSFrançois Revol #define IPPROTO_ROUTING			43	/* 43, Routing */
566181d22fSFrançois Revol #define IPPROTO_ICMPV6			58	/* 58, IPv6 ICMP */
576181d22fSFrançois Revol #define IPPROTO_ETHERIP			97	/* 97, Ethernet in IPv4 */
586181d22fSFrançois Revol #define IPPROTO_RAW				255	/* 255 */
5952a38012Sejakowatz 
6052a38012Sejakowatz #define IPPROTO_MAX				256
6152a38012Sejakowatz 
62*0b6361efSAxel Dörfler 
63*0b6361efSAxel Dörfler /* Port numbers */
6452a38012Sejakowatz 
6552a38012Sejakowatz #define IPPORT_RESERVED			1024
66*0b6361efSAxel Dörfler 	/* < IPPORT_RESERVED are privileged and should be accessible only by root */
6752a38012Sejakowatz #define IPPORT_USERRESERVED		49151
68*0b6361efSAxel Dörfler 	/* > IPPORT_USERRESERVED are reserved for servers, though not requiring
69*0b6361efSAxel Dörfler 	 * privileged status
7052a38012Sejakowatz 	 */
71*0b6361efSAxel Dörfler 
72*0b6361efSAxel Dörfler /* IP Version 4 address */
7352a38012Sejakowatz struct in_addr {
7452a38012Sejakowatz 	in_addr_t s_addr;
7552a38012Sejakowatz };
7652a38012Sejakowatz 
77*0b6361efSAxel Dörfler /* IP Version 4 socket address */
7852a38012Sejakowatz struct sockaddr_in {
795adca30aSAxel Dörfler 	uint8_t		sin_len;
805adca30aSAxel Dörfler 	uint8_t		sin_family;
815adca30aSAxel Dörfler 	uint16_t	sin_port;
8252a38012Sejakowatz 	struct in_addr 	sin_addr;
835adca30aSAxel Dörfler 	int8_t		sin_zero[24];
8452a38012Sejakowatz };
85*0b6361efSAxel Dörfler 
8652a38012Sejakowatz 
8746527f68SHugo Santos /* RFC 3678 - Socket Interface Extensions for Multicast Source Filters */
8846527f68SHugo Santos 
8946527f68SHugo Santos struct ip_mreq {
9046527f68SHugo Santos 	struct in_addr imr_multiaddr; /* IP address of group */
9146527f68SHugo Santos 	struct in_addr imr_interface; /* IP address of interface */
9246527f68SHugo Santos };
9346527f68SHugo Santos 
9446527f68SHugo Santos struct ip_mreq_source {
9546527f68SHugo Santos 	struct in_addr imr_multiaddr;	/* IP address of group */
9646527f68SHugo Santos 	struct in_addr imr_sourceaddr;	/* IP address of source */
9746527f68SHugo Santos 	struct in_addr imr_interface;	/* IP address of interface */
9846527f68SHugo Santos };
9946527f68SHugo Santos 
10046527f68SHugo Santos struct group_req {
10146527f68SHugo Santos 	uint32_t                gr_interface; /* interface index */
10246527f68SHugo Santos 	struct sockaddr_storage gr_group;     /* group address */
10346527f68SHugo Santos };
10446527f68SHugo Santos 
10546527f68SHugo Santos struct group_source_req {
10646527f68SHugo Santos 	uint32_t                gsr_interface; /* interface index */
10746527f68SHugo Santos 	struct sockaddr_storage gsr_group;     /* group address */
10846527f68SHugo Santos 	struct sockaddr_storage gsr_source;    /* source address */
10946527f68SHugo Santos };
11046527f68SHugo Santos 
11152a38012Sejakowatz /*
11252a38012Sejakowatz  * Options for use with [gs]etsockopt at the IP level.
11352a38012Sejakowatz  * First word of comment is data type; bool is stored in int.
11452a38012Sejakowatz  */
11552a38012Sejakowatz #define IP_OPTIONS					1	/* buf/ip_opts; set/get IP options */
11652a38012Sejakowatz #define IP_HDRINCL					2	/* int; header is included with data */
117*0b6361efSAxel Dörfler #define IP_TOS						3
118*0b6361efSAxel Dörfler 	/* int; IP type of service and preced. */
11952a38012Sejakowatz #define IP_TTL						4	/* int; IP time to live */
12052a38012Sejakowatz #define IP_RECVOPTS					5	/* bool; receive all IP opts w/dgram */
12152a38012Sejakowatz #define IP_RECVRETOPTS				6	/* bool; receive IP opts for response */
12252a38012Sejakowatz #define IP_RECVDSTADDR				7	/* bool; receive IP dst addr w/dgram */
12352a38012Sejakowatz #define IP_RETOPTS					8	/* ip_opts; set/get IP options */
12452a38012Sejakowatz #define IP_MULTICAST_IF				9	/* in_addr; set/get IP multicast i/f  */
12552a38012Sejakowatz #define IP_MULTICAST_TTL			10	/* u_char; set/get IP multicast ttl */
126*0b6361efSAxel Dörfler #define IP_MULTICAST_LOOP			11
127*0b6361efSAxel Dörfler 	/* u_char; set/get IP multicast loopback */
128*0b6361efSAxel Dörfler #define IP_ADD_MEMBERSHIP			12
129*0b6361efSAxel Dörfler 	/* ip_mreq; add an IP group membership */
130*0b6361efSAxel Dörfler #define IP_DROP_MEMBERSHIP			13
131*0b6361efSAxel Dörfler 	/* ip_mreq; drop an IP group membership */
13246527f68SHugo Santos #define IP_BLOCK_SOURCE				14	/* ip_mreq_source */
13346527f68SHugo Santos #define IP_UNBLOCK_SOURCE			15	/* ip_mreq_source */
13446527f68SHugo Santos #define IP_ADD_SOURCE_MEMBERSHIP	16	/* ip_mreq_source */
13546527f68SHugo Santos #define IP_DROP_SOURCE_MEMBERSHIP	17	/* ip_mreq_source */
13646527f68SHugo Santos #define MCAST_JOIN_GROUP			18	/* group_req */
13746527f68SHugo Santos #define MCAST_BLOCK_SOURCE			19	/* group_source_req */
13846527f68SHugo Santos #define MCAST_UNBLOCK_SOURCE		20	/* group_source_req */
13946527f68SHugo Santos #define MCAST_LEAVE_GROUP			21	/* group_req */
14046527f68SHugo Santos #define MCAST_JOIN_SOURCE_GROUP		22	/* group_source_req */
14146527f68SHugo Santos #define MCAST_LEAVE_SOURCE_GROUP	23	/* group_source_req */
14252a38012Sejakowatz 
14375f1f9e0SHugo Santos #define IPV6_MULTICAST_IF			24	/* int */
14475f1f9e0SHugo Santos #define IPV6_MULTICAST_HOPS			25	/* int */
14575f1f9e0SHugo Santos #define IPV6_MULTICAST_LOOP			26	/* int */
14675f1f9e0SHugo Santos 
1475adca30aSAxel Dörfler #define __IPADDR(x)				((uint32_t)htonl((uint32_t)(x)))
14852a38012Sejakowatz 
149*0b6361efSAxel Dörfler #define INADDR_ANY				0x00000000
15052a38012Sejakowatz #define INADDR_LOOPBACK			__IPADDR(0x7f000001)
151*0b6361efSAxel Dörfler #define INADDR_BROADCAST		0xffffffff				/* must be masked */
15252a38012Sejakowatz 
15352a38012Sejakowatz #define INADDR_UNSPEC_GROUP		__IPADDR(0xe0000000)	/* 224.0.0.0 */
15452a38012Sejakowatz #define INADDR_ALLHOSTS_GROUP	__IPADDR(0xe0000001)	/* 224.0.0.1 */
15552a38012Sejakowatz #define INADDR_ALLROUTERS_GROUP	__IPADDR(0xe0000002)	/* 224.0.0.2 */
15652a38012Sejakowatz #define INADDR_MAX_LOCAL_GROUP	__IPADDR(0xe00000ff)	/* 224.0.0.255 */
15752a38012Sejakowatz 
15852a38012Sejakowatz #define IN_LOOPBACKNET			127						/* official! */
15952a38012Sejakowatz 
160*0b6361efSAxel Dörfler #define INADDR_NONE				0xffffffff
16152a38012Sejakowatz 
1625adca30aSAxel Dörfler #define IN_CLASSA(i)			(((uint32_t)(i) & __IPADDR(0x80000000)) == \
16352a38012Sejakowatz 									__IPADDR(0x00000000))
16452a38012Sejakowatz #define IN_CLASSA_NET			__IPADDR(0xff000000)
16552a38012Sejakowatz #define IN_CLASSA_NSHIFT		24
16652a38012Sejakowatz #define IN_CLASSA_HOST			__IPADDR(0x00ffffff)
16752a38012Sejakowatz #define IN_CLASSA_MAX			128
16852a38012Sejakowatz 
1695adca30aSAxel Dörfler #define IN_CLASSB(i)			(((uint32_t)(i) & __IPADDR(0xc0000000)) == \
17052a38012Sejakowatz 									__IPADDR(0x80000000))
17152a38012Sejakowatz #define IN_CLASSB_NET			__IPADDR(0xffff0000)
17252a38012Sejakowatz #define IN_CLASSB_NSHIFT		16
17352a38012Sejakowatz #define IN_CLASSB_HOST			__IPADDR(0x0000ffff)
17452a38012Sejakowatz #define IN_CLASSB_MAX			65536
17552a38012Sejakowatz 
1765adca30aSAxel Dörfler #define IN_CLASSC(i)			(((uint32_t)(i) & __IPADDR(0xe0000000)) == \
17752a38012Sejakowatz 									__IPADDR(0xc0000000))
17852a38012Sejakowatz #define IN_CLASSC_NET			__IPADDR(0xffffff00)
17952a38012Sejakowatz #define IN_CLASSC_NSHIFT		8
18052a38012Sejakowatz #define IN_CLASSC_HOST			__IPADDR(0x000000ff)
18152a38012Sejakowatz 
1825adca30aSAxel Dörfler #define IN_CLASSD(i)			(((uint32_t)(i) & __IPADDR(0xf0000000)) == \
18352a38012Sejakowatz 									__IPADDR(0xe0000000))
18452a38012Sejakowatz /* These ones aren't really net and host fields, but routing needn't know. */
18552a38012Sejakowatz #define IN_CLASSD_NET			__IPADDR(0xf0000000)
18652a38012Sejakowatz #define IN_CLASSD_NSHIFT		28
18752a38012Sejakowatz #define IN_CLASSD_HOST			__IPADDR(0x0fffffff)
18852a38012Sejakowatz 
18952a38012Sejakowatz #define IN_MULTICAST(i)			IN_CLASSD(i)
19052a38012Sejakowatz 
1915adca30aSAxel Dörfler #define IN_EXPERIMENTAL(i)		(((uint32_t)(i) & 0xf0000000) == 0xf0000000)
1925adca30aSAxel Dörfler #define IN_BADCLASS(i)			(((uint32_t)(i) & 0xf0000000) == 0xf0000000)
19352a38012Sejakowatz 
19452a38012Sejakowatz #define IP_MAX_MEMBERSHIPS		20
19552a38012Sejakowatz 
196f3917584SIngo Weinhold /* maximal length of the string representation of an IPv4 address */
197f3917584SIngo Weinhold #define INET_ADDRSTRLEN			16
198f3917584SIngo Weinhold 
19952a38012Sejakowatz /* some helpful macro's :) */
20052a38012Sejakowatz #define in_hosteq(s, t)			((s).s_addr == (t).s_addr)
20152a38012Sejakowatz #define in_nullhost(x)			((x).s_addr == INADDR_ANY)
20252a38012Sejakowatz #define satosin(sa)				((struct sockaddr_in *)(sa))
20352a38012Sejakowatz #define sintosa(sin)			((struct sockaddr *)(sin))
20452a38012Sejakowatz 
2057d31ea94SPhilippe Houdoin #ifdef __cplusplus
2067d31ea94SPhilippe Houdoin }
207c2c739ceSAxel Dörfler #endif
2087d31ea94SPhilippe Houdoin 
209*0b6361efSAxel Dörfler #endif	/* _NETINET_IN_H_ */
210