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