1/* 2 * Copyright 2002-2012 Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _NETINET_IN_H_ 6#define _NETINET_IN_H_ 7 8 9#include <net/if.h> 10#include <endian.h> 11#include <stdint.h> 12#include <sys/types.h> 13 14/* RFC 2553 states that these must be available through <netinet/in.h> */ 15#include <netinet6/in6.h> 16 17 18#ifdef __cplusplus 19extern "C" { 20#endif 21 22typedef uint16_t in_port_t; 23typedef uint32_t in_addr_t; 24 25/* We can't include <ByteOrder.h> since we are a posix file, 26 * and we are not allowed to import all the BeOS types here. 27 */ 28#ifndef htonl 29# ifdef __HAIKU_BEOS_COMPATIBLE_TYPES 30 extern unsigned long __swap_int32(unsigned long); /* private */ 31# else 32 extern unsigned int __swap_int32(unsigned int); /* private */ 33# endif 34 extern uint16_t __swap_int16(uint16_t); /* private */ 35# if BYTE_ORDER == LITTLE_ENDIAN 36# define htonl(x) ((uint32_t)__swap_int32(x)) 37# define ntohl(x) ((uint32_t)__swap_int32(x)) 38# define htons(x) __swap_int16(x) 39# define ntohs(x) __swap_int16(x) 40# elif BYTE_ORDER == BIG_ENDIAN 41# define htonl(x) (x) 42# define ntohl(x) (x) 43# define htons(x) (x) 44# define ntohs(x) (x) 45# else 46# error Unknown byte order. 47# endif 48#endif 49 50 51/* Protocol definitions */ 52#define IPPROTO_IP 0 /* 0, IPv4 */ 53#define IPPROTO_HOPOPTS 0 /* 0, IPv6 hop-by-hop options */ 54#define IPPROTO_ICMP 1 /* 1, ICMP (v4) */ 55#define IPPROTO_IGMP 2 /* 2, IGMP (group management) */ 56#define IPPROTO_TCP 6 /* 6, tcp */ 57#define IPPROTO_UDP 17 /* 17, UDP */ 58#define IPPROTO_IPV6 41 /* 41, IPv6 in IPv6 */ 59#define IPPROTO_ROUTING 43 /* 43, Routing */ 60#define IPPROTO_FRAGMENT 44 /* 44, IPv6 fragmentation header */ 61#define IPPROTO_ESP 50 /* 50, Encap Sec. Payload */ 62#define IPPROTO_AH 51 /* 51, Auth Header */ 63#define IPPROTO_ICMPV6 58 /* 58, IPv6 ICMP */ 64#define IPPROTO_NONE 59 /* 59, IPv6 no next header */ 65#define IPPROTO_DSTOPTS 60 /* 60, IPv6 destination option */ 66#define IPPROTO_ETHERIP 97 /* 97, Ethernet in IPv4 */ 67#define IPPROTO_RAW 255 /* 255 */ 68 69#define IPPROTO_MAX 256 70 71 72/* Port numbers */ 73 74#define IPPORT_RESERVED 1024 75 /* < IPPORT_RESERVED are privileged and should be accessible only by root */ 76#define IPPORT_USERRESERVED 49151 77 /* > IPPORT_USERRESERVED are reserved for servers, though not requiring 78 * privileged status 79 */ 80 81/* IP Version 4 address */ 82struct in_addr { 83 in_addr_t s_addr; 84}; 85 86/* IP Version 4 socket address */ 87struct sockaddr_in { 88 uint8_t sin_len; 89 uint8_t sin_family; 90 uint16_t sin_port; 91 struct in_addr sin_addr; 92 int8_t sin_zero[24]; 93}; 94 95 96/* RFC 3678 - Socket Interface Extensions for Multicast Source Filters */ 97 98struct ip_mreq { 99 struct in_addr imr_multiaddr; /* IP address of group */ 100 struct in_addr imr_interface; /* IP address of interface */ 101}; 102 103struct ip_mreq_source { 104 struct in_addr imr_multiaddr; /* IP address of group */ 105 struct in_addr imr_sourceaddr; /* IP address of source */ 106 struct in_addr imr_interface; /* IP address of interface */ 107}; 108 109struct group_req { 110 uint32_t gr_interface; /* interface index */ 111 struct sockaddr_storage gr_group; /* group address */ 112}; 113 114struct group_source_req { 115 uint32_t gsr_interface; /* interface index */ 116 struct sockaddr_storage gsr_group; /* group address */ 117 struct sockaddr_storage gsr_source; /* source address */ 118}; 119 120/* 121 * Options for use with [gs]etsockopt at the IP level. 122 * First word of comment is data type; bool is stored in int. 123 */ 124#define IP_OPTIONS 1 /* buf/ip_opts; set/get IP options */ 125#define IP_HDRINCL 2 /* int; header is included with data */ 126#define IP_TOS 3 127 /* int; IP type of service and preced. */ 128#define IP_TTL 4 /* int; IP time to live */ 129#define IP_RECVOPTS 5 /* bool; receive all IP opts w/dgram */ 130#define IP_RECVRETOPTS 6 /* bool; receive IP opts for response */ 131#define IP_RECVDSTADDR 7 /* bool; receive IP dst addr w/dgram */ 132#define IP_RETOPTS 8 /* ip_opts; set/get IP options */ 133#define IP_MULTICAST_IF 9 /* in_addr; set/get IP multicast i/f */ 134#define IP_MULTICAST_TTL 10 /* u_char; set/get IP multicast ttl */ 135#define IP_MULTICAST_LOOP 11 136 /* u_char; set/get IP multicast loopback */ 137#define IP_ADD_MEMBERSHIP 12 138 /* ip_mreq; add an IP group membership */ 139#define IP_DROP_MEMBERSHIP 13 140 /* ip_mreq; drop an IP group membership */ 141#define IP_BLOCK_SOURCE 14 /* ip_mreq_source */ 142#define IP_UNBLOCK_SOURCE 15 /* ip_mreq_source */ 143#define IP_ADD_SOURCE_MEMBERSHIP 16 /* ip_mreq_source */ 144#define IP_DROP_SOURCE_MEMBERSHIP 17 /* ip_mreq_source */ 145#define MCAST_JOIN_GROUP 18 /* group_req */ 146#define MCAST_BLOCK_SOURCE 19 /* group_source_req */ 147#define MCAST_UNBLOCK_SOURCE 20 /* group_source_req */ 148#define MCAST_LEAVE_GROUP 21 /* group_req */ 149#define MCAST_JOIN_SOURCE_GROUP 22 /* group_source_req */ 150#define MCAST_LEAVE_SOURCE_GROUP 23 /* group_source_req */ 151 152/* IPPROTO_IPV6 options */ 153#define IPV6_MULTICAST_IF 24 /* int */ 154#define IPV6_MULTICAST_HOPS 25 /* int */ 155#define IPV6_MULTICAST_LOOP 26 /* int */ 156 157#define IPV6_UNICAST_HOPS 27 /* int */ 158#define IPV6_JOIN_GROUP 28 /* struct ipv6_mreq */ 159#define IPV6_LEAVE_GROUP 29 /* struct ipv6_mreq */ 160#define IPV6_V6ONLY 30 /* int */ 161 162#define IPV6_PKTINFO 31 /* struct ipv6_pktinfo */ 163#define IPV6_RECVPKTINFO 32 /* struct ipv6_pktinfo */ 164#define IPV6_HOPLIMIT 33 /* int */ 165#define IPV6_RECVHOPLIMIT 34 /* int */ 166 167#define IPV6_HOPOPTS 35 /* struct ip6_hbh */ 168#define IPV6_DSTOPTS 36 /* struct ip6_dest */ 169#define IPV6_RTHDR 37 /* struct ip6_rthdr */ 170 171#define INADDR_ANY ((in_addr_t)0x00000000) 172#define INADDR_LOOPBACK ((in_addr_t)0x7f000001) 173#define INADDR_BROADCAST ((in_addr_t)0xffffffff) /* must be masked */ 174 175#define INADDR_UNSPEC_GROUP ((in_addr_t)0xe0000000) /* 224.0.0.0 */ 176#define INADDR_ALLHOSTS_GROUP ((in_addr_t)0xe0000001) /* 224.0.0.1 */ 177#define INADDR_ALLROUTERS_GROUP ((in_addr_t)0xe0000002) /* 224.0.0.2 */ 178#define INADDR_MAX_LOCAL_GROUP ((in_addr_t)0xe00000ff) /* 224.0.0.255 */ 179 180#define IN_LOOPBACKNET 127 181 182#define INADDR_NONE ((in_addr_t)0xffffffff) 183 184#define IN_CLASSA(i) (((in_addr_t)(i) & 0x80000000) == 0) 185#define IN_CLASSA_NET 0xff000000 186#define IN_CLASSA_NSHIFT 24 187#define IN_CLASSA_HOST 0x00ffffff 188#define IN_CLASSA_MAX 128 189 190#define IN_CLASSB(i) (((in_addr_t)(i) & 0xc0000000) == 0x80000000) 191#define IN_CLASSB_NET 0xffff0000 192#define IN_CLASSB_NSHIFT 16 193#define IN_CLASSB_HOST 0x0000ffff 194#define IN_CLASSB_MAX 65536 195 196#define IN_CLASSC(i) (((in_addr_t)(i) & 0xe0000000) == 0xc0000000) 197#define IN_CLASSC_NET 0xffffff00 198#define IN_CLASSC_NSHIFT 8 199#define IN_CLASSC_HOST 0x000000ff 200 201#define IN_CLASSD(i) (((in_addr_t)(i) & 0xf0000000) == 0xe0000000) 202/* These ones aren't really net and host fields, but routing needn't know. */ 203#define IN_CLASSD_NET 0xf0000000 204#define IN_CLASSD_NSHIFT 28 205#define IN_CLASSD_HOST 0x0fffffff 206 207#define IN_MULTICAST(i) IN_CLASSD(i) 208 209#define IN_EXPERIMENTAL(i) (((in_addr_t)(i) & 0xf0000000) == 0xf0000000) 210#define IN_BADCLASS(i) (((in_addr_t)(i) & 0xf0000000) == 0xf0000000) 211 212#define IP_MAX_MEMBERSHIPS 20 213 214/* maximal length of the string representation of an IPv4 address */ 215#define INET_ADDRSTRLEN 16 216 217/* some helpful macro's :) */ 218#define in_hosteq(s, t) ((s).s_addr == (t).s_addr) 219#define in_nullhost(x) ((x).s_addr == INADDR_ANY) 220#define satosin(sa) ((struct sockaddr_in *)(sa)) 221#define sintosa(sin) ((struct sockaddr *)(sin)) 222 223#ifdef __cplusplus 224} 225#endif 226 227#endif /* _NETINET_IN_H_ */ 228