xref: /haiku/headers/posix/netinet/in.h (revision 4fc6751684fa9d716a898e11869b024fa891c709)
152a38012Sejakowatz /* in.h */
2*4fc67516SDavid Reid 
352a38012Sejakowatz #ifndef _NETINET_IN_H_
452a38012Sejakowatz #define _NETINET_IN_H_
552a38012Sejakowatz 
6*4fc67516SDavid Reid //#include <ByteOrder.h> /* for htonl */
752a38012Sejakowatz 
8*4fc67516SDavid Reid #include <net/if.h>
952a38012Sejakowatz 
1052a38012Sejakowatz /* Protocol definitions - add to as required... */
1152a38012Sejakowatz 
1252a38012Sejakowatz enum {
1352a38012Sejakowatz 	IPPROTO_IP      =   0,	/* 0, IPv4 */
1452a38012Sejakowatz 	IPPROTO_ICMP    =   1,	/* 1, ICMP (v4) */
1552a38012Sejakowatz 	IPPROTO_IGMP    =   2,	/* 2, IGMP (group management) */
1652a38012Sejakowatz 	IPPROTO_TCP	    =   6,	/* 6, tcp */
1752a38012Sejakowatz 	IPPROTO_UDP	    =  17,	/* 17, UDP */
1852a38012Sejakowatz 	IPPROTO_IPV6    =  41,   /* 41, IPv6 in IPv6 */
1952a38012Sejakowatz 	IPPROTO_ROUTING =  43,	/* 43, Routing */
2052a38012Sejakowatz 	IPPROTO_ICMPV6  =  58,	/* 58, IPv6 ICMP */
2152a38012Sejakowatz 	IPPROTO_ETHERIP =  97,	/* 97, Ethernet in IPv4 */
2252a38012Sejakowatz 	IPPROTO_RAW	    = 255    /* 255 */
2352a38012Sejakowatz };
2452a38012Sejakowatz 
2552a38012Sejakowatz #define IPPROTO_MAX	256
2652a38012Sejakowatz 
2752a38012Sejakowatz /* Port numbers...
2852a38012Sejakowatz  * < IPPORT_RESERVED are privileged and should be
2952a38012Sejakowatz  * accessible only by root
3052a38012Sejakowatz  * > IPPORT_USERRESERVED are reserved for servers, though
3152a38012Sejakowatz  * not requiring privileged status
3252a38012Sejakowatz  */
3352a38012Sejakowatz 
3452a38012Sejakowatz #define IPPORT_RESERVED         1024
3552a38012Sejakowatz #define IPPORT_USERRESERVED     49151
3652a38012Sejakowatz 
3752a38012Sejakowatz /* This is an IPv4 address structure. Why is it a structure?
3852a38012Sejakowatz  * Historical reasons.
3952a38012Sejakowatz  */
4052a38012Sejakowatz struct in_addr {
4152a38012Sejakowatz 	in_addr_t s_addr;
4252a38012Sejakowatz };
4352a38012Sejakowatz 
4452a38012Sejakowatz /*
4552a38012Sejakowatz  * IP Version 4 socket address.
4652a38012Sejakowatz  */
4752a38012Sejakowatz struct sockaddr_in {
4852a38012Sejakowatz 	uint8		sin_len;
4952a38012Sejakowatz 	uint8		sin_family;
5052a38012Sejakowatz 	uint16		sin_port;
5152a38012Sejakowatz 	struct in_addr 	sin_addr;
5252a38012Sejakowatz 	int8		sin_zero[8];
5352a38012Sejakowatz };
5452a38012Sejakowatz /* the address is therefore at sin_addr.s_addr */
5552a38012Sejakowatz 
5652a38012Sejakowatz /*
5752a38012Sejakowatz  * Options for use with [gs]etsockopt at the IP level.
5852a38012Sejakowatz  * First word of comment is data type; bool is stored in int.
5952a38012Sejakowatz  */
6052a38012Sejakowatz #define IP_OPTIONS               1   /* buf/ip_opts; set/get IP options */
6152a38012Sejakowatz #define IP_HDRINCL               2   /* int; header is included with data */
6252a38012Sejakowatz #define IP_TOS                   3   /* int; IP type of service and preced. */
6352a38012Sejakowatz #define IP_TTL                   4   /* int; IP time to live */
6452a38012Sejakowatz #define IP_RECVOPTS              5   /* bool; receive all IP opts w/dgram */
6552a38012Sejakowatz #define IP_RECVRETOPTS           6   /* bool; receive IP opts for response */
6652a38012Sejakowatz #define IP_RECVDSTADDR           7   /* bool; receive IP dst addr w/dgram */
6752a38012Sejakowatz #define IP_RETOPTS               8   /* ip_opts; set/get IP options */
6852a38012Sejakowatz #define IP_MULTICAST_IF          9   /* in_addr; set/get IP multicast i/f  */
6952a38012Sejakowatz #define IP_MULTICAST_TTL        10   /* u_char; set/get IP multicast ttl */
7052a38012Sejakowatz #define IP_MULTICAST_LOOP       11   /* u_char; set/get IP multicast loopback */
7152a38012Sejakowatz #define IP_ADD_MEMBERSHIP       12   /* ip_mreq; add an IP group membership */
7252a38012Sejakowatz #define IP_DROP_MEMBERSHIP      13   /* ip_mreq; drop an IP group membership */
7352a38012Sejakowatz 
74*4fc67516SDavid Reid #ifdef _KERNEL_MODE
7552a38012Sejakowatz #define __IPADDR(x)     ((uint32) htonl((uint32)(x)))
7652a38012Sejakowatz #else
7752a38012Sejakowatz #define __IPADDR(x)     ((uint32)(x))
7852a38012Sejakowatz #endif
7952a38012Sejakowatz 
8052a38012Sejakowatz #define INADDR_ANY              __IPADDR(0x00000000)
8152a38012Sejakowatz #define INADDR_LOOPBACK         __IPADDR(0x7f000001)
8252a38012Sejakowatz #define INADDR_BROADCAST        __IPADDR(0xffffffff) /* must be masked */
8352a38012Sejakowatz 
8452a38012Sejakowatz #define INADDR_UNSPEC_GROUP     __IPADDR(0xe0000000)    /* 224.0.0.0 */
8552a38012Sejakowatz #define INADDR_ALLHOSTS_GROUP   __IPADDR(0xe0000001)    /* 224.0.0.1 */
8652a38012Sejakowatz #define INADDR_ALLROUTERS_GROUP __IPADDR(0xe0000002)    /* 224.0.0.2 */
8752a38012Sejakowatz #define INADDR_MAX_LOCAL_GROUP  __IPADDR(0xe00000ff)    /* 224.0.0.255 */
8852a38012Sejakowatz 
8952a38012Sejakowatz #define IN_LOOPBACKNET          127                     /* official! */
9052a38012Sejakowatz 
91*4fc67516SDavid Reid #ifndef _KERNEL_MODE
9252a38012Sejakowatz #define INADDR_NONE             __IPADDR(0xffffffff)
9352a38012Sejakowatz #endif
9452a38012Sejakowatz 
9552a38012Sejakowatz #define IN_CLASSA(i)            (((uint32)(i) & __IPADDR(0x80000000)) == \
9652a38012Sejakowatz                                  __IPADDR(0x00000000))
9752a38012Sejakowatz #define IN_CLASSA_NET           __IPADDR(0xff000000)
9852a38012Sejakowatz #define IN_CLASSA_NSHIFT        24
9952a38012Sejakowatz #define IN_CLASSA_HOST          __IPADDR(0x00ffffff)
10052a38012Sejakowatz #define IN_CLASSA_MAX           128
10152a38012Sejakowatz 
10252a38012Sejakowatz #define IN_CLASSB(i)            (((uint32)(i) & __IPADDR(0xc0000000)) == \
10352a38012Sejakowatz                                  __IPADDR(0x80000000))
10452a38012Sejakowatz #define IN_CLASSB_NET           __IPADDR(0xffff0000)
10552a38012Sejakowatz #define IN_CLASSB_NSHIFT        16
10652a38012Sejakowatz #define IN_CLASSB_HOST          __IPADDR(0x0000ffff)
10752a38012Sejakowatz #define IN_CLASSB_MAX           65536
10852a38012Sejakowatz 
10952a38012Sejakowatz #define IN_CLASSC(i)            (((uint32)(i) & __IPADDR(0xe0000000)) == \
11052a38012Sejakowatz                                  __IPADDR(0xc0000000))
11152a38012Sejakowatz #define IN_CLASSC_NET           __IPADDR(0xffffff00)
11252a38012Sejakowatz #define IN_CLASSC_NSHIFT        8
11352a38012Sejakowatz #define IN_CLASSC_HOST          __IPADDR(0x000000ff)
11452a38012Sejakowatz 
11552a38012Sejakowatz #define IN_CLASSD(i)            (((uint32)(i) & __IPADDR(0xf0000000)) == \
11652a38012Sejakowatz                                  __IPADDR(0xe0000000))
11752a38012Sejakowatz /* These ones aren't really net and host fields, but routing needn't know. */
11852a38012Sejakowatz #define IN_CLASSD_NET           __IPADDR(0xf0000000)
11952a38012Sejakowatz #define IN_CLASSD_NSHIFT        28
12052a38012Sejakowatz #define IN_CLASSD_HOST          __IPADDR(0x0fffffff)
12152a38012Sejakowatz 
12252a38012Sejakowatz #define IN_MULTICAST(i)	        IN_CLASSD(i)
12352a38012Sejakowatz 
12452a38012Sejakowatz #define IN_EXPERIMENTAL(i)      (((uint32)(i) & 0xf0000000) == 0xf0000000)
12552a38012Sejakowatz #define IN_BADCLASS(i)          (((uint32)(i) & 0xf0000000) == 0xf0000000)
12652a38012Sejakowatz 
12752a38012Sejakowatz #define IP_MAX_MEMBERSHIPS      20
12852a38012Sejakowatz 
129*4fc67516SDavid Reid #ifdef _KERNEL_MODE
13052a38012Sejakowatz   /* some helpful macro's :) */
13152a38012Sejakowatz   #define in_hosteq(s,t)  ((s).s_addr == (t).s_addr)
13252a38012Sejakowatz   #define in_nullhost(x)  ((x).s_addr == INADDR_ANY)
13352a38012Sejakowatz   #define satosin(sa)     ((struct sockaddr_in *)(sa))
13452a38012Sejakowatz   #define sintosa(sin)    ((struct sockaddr *)(sin))
13552a38012Sejakowatz 
13652a38012Sejakowatz   /* Prototypes... */
13752a38012Sejakowatz   int    in_broadcast  (struct in_addr, struct ifnet *);
13852a38012Sejakowatz   int    in_canforward (struct in_addr);
13952a38012Sejakowatz   int    in_localaddr  (struct in_addr);
14052a38012Sejakowatz   void   in_socktrim   (struct sockaddr_in*);
141*4fc67516SDavid Reid   uint16 in_cksum      (struct mbuf *, int);
14252a38012Sejakowatz 
143*4fc67516SDavid Reid #endif /* _KERNEL_MODE */
14452a38012Sejakowatz #endif /* NETINET_IN_H */
145