1*52a38012Sejakowatz /* in.h */ 2*52a38012Sejakowatz #ifndef _NETINET_IN_H_ 3*52a38012Sejakowatz #define _NETINET_IN_H_ 4*52a38012Sejakowatz 5*52a38012Sejakowatz #include <ByteOrder.h> /* for htonl */ 6*52a38012Sejakowatz 7*52a38012Sejakowatz #ifdef _NETWORK_STACK 8*52a38012Sejakowatz #include "net_misc.h" 9*52a38012Sejakowatz #endif 10*52a38012Sejakowatz #include "net/if.h" 11*52a38012Sejakowatz 12*52a38012Sejakowatz /* XXX - This really doesn't belong in here... */ 13*52a38012Sejakowatz /* XXX - move these to sys/param.h */ 14*52a38012Sejakowatz typedef uint32 in_addr_t; 15*52a38012Sejakowatz typedef uint16 in_port_t; 16*52a38012Sejakowatz 17*52a38012Sejakowatz /* Protocol definitions - add to as required... */ 18*52a38012Sejakowatz 19*52a38012Sejakowatz enum { 20*52a38012Sejakowatz IPPROTO_IP = 0, /* 0, IPv4 */ 21*52a38012Sejakowatz IPPROTO_ICMP = 1, /* 1, ICMP (v4) */ 22*52a38012Sejakowatz IPPROTO_IGMP = 2, /* 2, IGMP (group management) */ 23*52a38012Sejakowatz IPPROTO_TCP = 6, /* 6, tcp */ 24*52a38012Sejakowatz IPPROTO_UDP = 17, /* 17, UDP */ 25*52a38012Sejakowatz IPPROTO_IPV6 = 41, /* 41, IPv6 in IPv6 */ 26*52a38012Sejakowatz IPPROTO_ROUTING = 43, /* 43, Routing */ 27*52a38012Sejakowatz IPPROTO_ICMPV6 = 58, /* 58, IPv6 ICMP */ 28*52a38012Sejakowatz IPPROTO_ETHERIP = 97, /* 97, Ethernet in IPv4 */ 29*52a38012Sejakowatz IPPROTO_RAW = 255 /* 255 */ 30*52a38012Sejakowatz }; 31*52a38012Sejakowatz 32*52a38012Sejakowatz #define IPPROTO_MAX 256 33*52a38012Sejakowatz 34*52a38012Sejakowatz /* Port numbers... 35*52a38012Sejakowatz * < IPPORT_RESERVED are privileged and should be 36*52a38012Sejakowatz * accessible only by root 37*52a38012Sejakowatz * > IPPORT_USERRESERVED are reserved for servers, though 38*52a38012Sejakowatz * not requiring privileged status 39*52a38012Sejakowatz */ 40*52a38012Sejakowatz 41*52a38012Sejakowatz #define IPPORT_RESERVED 1024 42*52a38012Sejakowatz #define IPPORT_USERRESERVED 49151 43*52a38012Sejakowatz 44*52a38012Sejakowatz /* This is an IPv4 address structure. Why is it a structure? 45*52a38012Sejakowatz * Historical reasons. 46*52a38012Sejakowatz */ 47*52a38012Sejakowatz struct in_addr { 48*52a38012Sejakowatz in_addr_t s_addr; 49*52a38012Sejakowatz }; 50*52a38012Sejakowatz 51*52a38012Sejakowatz /* 52*52a38012Sejakowatz * IP Version 4 socket address. 53*52a38012Sejakowatz */ 54*52a38012Sejakowatz struct sockaddr_in { 55*52a38012Sejakowatz uint8 sin_len; 56*52a38012Sejakowatz uint8 sin_family; 57*52a38012Sejakowatz uint16 sin_port; 58*52a38012Sejakowatz struct in_addr sin_addr; 59*52a38012Sejakowatz int8 sin_zero[8]; 60*52a38012Sejakowatz }; 61*52a38012Sejakowatz /* the address is therefore at sin_addr.s_addr */ 62*52a38012Sejakowatz 63*52a38012Sejakowatz /* 64*52a38012Sejakowatz * Options for use with [gs]etsockopt at the IP level. 65*52a38012Sejakowatz * First word of comment is data type; bool is stored in int. 66*52a38012Sejakowatz */ 67*52a38012Sejakowatz #define IP_OPTIONS 1 /* buf/ip_opts; set/get IP options */ 68*52a38012Sejakowatz #define IP_HDRINCL 2 /* int; header is included with data */ 69*52a38012Sejakowatz #define IP_TOS 3 /* int; IP type of service and preced. */ 70*52a38012Sejakowatz #define IP_TTL 4 /* int; IP time to live */ 71*52a38012Sejakowatz #define IP_RECVOPTS 5 /* bool; receive all IP opts w/dgram */ 72*52a38012Sejakowatz #define IP_RECVRETOPTS 6 /* bool; receive IP opts for response */ 73*52a38012Sejakowatz #define IP_RECVDSTADDR 7 /* bool; receive IP dst addr w/dgram */ 74*52a38012Sejakowatz #define IP_RETOPTS 8 /* ip_opts; set/get IP options */ 75*52a38012Sejakowatz #define IP_MULTICAST_IF 9 /* in_addr; set/get IP multicast i/f */ 76*52a38012Sejakowatz #define IP_MULTICAST_TTL 10 /* u_char; set/get IP multicast ttl */ 77*52a38012Sejakowatz #define IP_MULTICAST_LOOP 11 /* u_char; set/get IP multicast loopback */ 78*52a38012Sejakowatz #define IP_ADD_MEMBERSHIP 12 /* ip_mreq; add an IP group membership */ 79*52a38012Sejakowatz #define IP_DROP_MEMBERSHIP 13 /* ip_mreq; drop an IP group membership */ 80*52a38012Sejakowatz 81*52a38012Sejakowatz #ifdef _NETWORK_STACK 82*52a38012Sejakowatz #define __IPADDR(x) ((uint32) htonl((uint32)(x))) 83*52a38012Sejakowatz #else 84*52a38012Sejakowatz #define __IPADDR(x) ((uint32)(x)) 85*52a38012Sejakowatz #endif 86*52a38012Sejakowatz 87*52a38012Sejakowatz #define INADDR_ANY __IPADDR(0x00000000) 88*52a38012Sejakowatz #define INADDR_LOOPBACK __IPADDR(0x7f000001) 89*52a38012Sejakowatz #define INADDR_BROADCAST __IPADDR(0xffffffff) /* must be masked */ 90*52a38012Sejakowatz 91*52a38012Sejakowatz #define INADDR_UNSPEC_GROUP __IPADDR(0xe0000000) /* 224.0.0.0 */ 92*52a38012Sejakowatz #define INADDR_ALLHOSTS_GROUP __IPADDR(0xe0000001) /* 224.0.0.1 */ 93*52a38012Sejakowatz #define INADDR_ALLROUTERS_GROUP __IPADDR(0xe0000002) /* 224.0.0.2 */ 94*52a38012Sejakowatz #define INADDR_MAX_LOCAL_GROUP __IPADDR(0xe00000ff) /* 224.0.0.255 */ 95*52a38012Sejakowatz 96*52a38012Sejakowatz #define IN_LOOPBACKNET 127 /* official! */ 97*52a38012Sejakowatz 98*52a38012Sejakowatz #ifndef _NETWORK_STACK 99*52a38012Sejakowatz #define INADDR_NONE __IPADDR(0xffffffff) 100*52a38012Sejakowatz #endif 101*52a38012Sejakowatz 102*52a38012Sejakowatz #define IN_CLASSA(i) (((uint32)(i) & __IPADDR(0x80000000)) == \ 103*52a38012Sejakowatz __IPADDR(0x00000000)) 104*52a38012Sejakowatz #define IN_CLASSA_NET __IPADDR(0xff000000) 105*52a38012Sejakowatz #define IN_CLASSA_NSHIFT 24 106*52a38012Sejakowatz #define IN_CLASSA_HOST __IPADDR(0x00ffffff) 107*52a38012Sejakowatz #define IN_CLASSA_MAX 128 108*52a38012Sejakowatz 109*52a38012Sejakowatz #define IN_CLASSB(i) (((uint32)(i) & __IPADDR(0xc0000000)) == \ 110*52a38012Sejakowatz __IPADDR(0x80000000)) 111*52a38012Sejakowatz #define IN_CLASSB_NET __IPADDR(0xffff0000) 112*52a38012Sejakowatz #define IN_CLASSB_NSHIFT 16 113*52a38012Sejakowatz #define IN_CLASSB_HOST __IPADDR(0x0000ffff) 114*52a38012Sejakowatz #define IN_CLASSB_MAX 65536 115*52a38012Sejakowatz 116*52a38012Sejakowatz #define IN_CLASSC(i) (((uint32)(i) & __IPADDR(0xe0000000)) == \ 117*52a38012Sejakowatz __IPADDR(0xc0000000)) 118*52a38012Sejakowatz #define IN_CLASSC_NET __IPADDR(0xffffff00) 119*52a38012Sejakowatz #define IN_CLASSC_NSHIFT 8 120*52a38012Sejakowatz #define IN_CLASSC_HOST __IPADDR(0x000000ff) 121*52a38012Sejakowatz 122*52a38012Sejakowatz #define IN_CLASSD(i) (((uint32)(i) & __IPADDR(0xf0000000)) == \ 123*52a38012Sejakowatz __IPADDR(0xe0000000)) 124*52a38012Sejakowatz /* These ones aren't really net and host fields, but routing needn't know. */ 125*52a38012Sejakowatz #define IN_CLASSD_NET __IPADDR(0xf0000000) 126*52a38012Sejakowatz #define IN_CLASSD_NSHIFT 28 127*52a38012Sejakowatz #define IN_CLASSD_HOST __IPADDR(0x0fffffff) 128*52a38012Sejakowatz 129*52a38012Sejakowatz #define IN_MULTICAST(i) IN_CLASSD(i) 130*52a38012Sejakowatz 131*52a38012Sejakowatz #define IN_EXPERIMENTAL(i) (((uint32)(i) & 0xf0000000) == 0xf0000000) 132*52a38012Sejakowatz #define IN_BADCLASS(i) (((uint32)(i) & 0xf0000000) == 0xf0000000) 133*52a38012Sejakowatz 134*52a38012Sejakowatz #define IP_MAX_MEMBERSHIPS 20 135*52a38012Sejakowatz 136*52a38012Sejakowatz /* some helpful macro's :) */ 137*52a38012Sejakowatz #define in_hosteq(s,t) ((s).s_addr == (t).s_addr) 138*52a38012Sejakowatz #define in_nullhost(x) ((x).s_addr == INADDR_ANY) 139*52a38012Sejakowatz #define satosin(sa) ((struct sockaddr_in *)(sa)) 140*52a38012Sejakowatz #define sintosa(sin) ((struct sockaddr *)(sin)) 141*52a38012Sejakowatz 142*52a38012Sejakowatz /* Prototypes... */ 143*52a38012Sejakowatz int in_broadcast (struct in_addr, struct ifnet *); 144*52a38012Sejakowatz int in_canforward (struct in_addr); 145*52a38012Sejakowatz int in_localaddr (struct in_addr); 146*52a38012Sejakowatz void in_socktrim (struct sockaddr_in*); 147*52a38012Sejakowatz 148*52a38012Sejakowatz #endif /* NETINET_IN_H */ 149