diff options
Diffstat (limited to 'inet/netinet')
-rw-r--r-- | inet/netinet/icmp6.h | 270 | ||||
-rw-r--r-- | inet/netinet/in.h | 96 | ||||
-rw-r--r-- | inet/netinet/ip6.h | 101 |
3 files changed, 292 insertions, 175 deletions
diff --git a/inet/netinet/icmp6.h b/inet/netinet/icmp6.h index 224fb64f08..38c1bc19dd 100644 --- a/inet/netinet/icmp6.h +++ b/inet/netinet/icmp6.h @@ -19,6 +19,8 @@ #ifndef _NETINET_ICMP6_H #define _NETINET_ICMP6_H 1 +#include <inttypes.h> +#include <string.h> #include <sys/types.h> #include <netinet/in.h> @@ -29,160 +31,202 @@ #define ICMPV6_FILTER_BLOCKOTHERS 3 #define ICMPV6_FILTER_PASSONLY 4 -struct icmpv6_filter +struct icmp6_filter { - u_int32_t data[8]; + uint32_t data[8]; }; -struct icmpv6hdr +struct icmp6_hdr { - u_int8_t icmpv6_type; /* type field */ - u_int8_t icmpv6_code; /* code field */ - u_int16_t icmpv6_cksum; /* checksum field */ - union + uint8_t icmp6_type; /* type field */ + uint8_t icmp6_code; /* code field */ + uint16_t icmp6_cksum; /* checksum field */ + union { - u_int32_t un_data32[1]; /* type-specific field */ - u_int16_t un_data16[2]; /* type-specific field */ - u_int8_t un_data8[4]; /* type-specific field */ - } icmpv6_dataun; - }; - -#define icmpv6_data32 icmpv6_dataun.un_data32 -#define icmpv6_data16 icmpv6_dataun.un_data16 -#define icmpv6_data8 icmpv6_dataun.un_data8 -#define icmpv6_pptr icmpv6_data32[0] /* parameter prob */ -#define icmpv6_mtu icmpv6_data32[0] /* packet too big */ -#define icmpv6_id icmpv6_data16[0] /* echo request/reply */ -#define icmpv6_seq icmpv6_data16[1] /* echo request/reply */ -#define icmpv6_maxdelay icmpv6_data16[0] /* mcast group membership */ - -#define ICMPV6_DEST_UNREACH 1 -#define ICMPV6_PACKET_TOOBIG 2 -#define ICMPV6_TIME_EXCEEDED 3 -#define ICMPV6_PARAMETER_PROBLEM 4 -#define ICMPV6_INFOMSG_MASK 128 /* message is info if bit set */ -#define ICMPV6_ECHOREQUEST 128 -#define ICMPV6_ECHOREPLY 129 -#define ICMPV6_MGM_QUERY 130 -#define ICMPV6_MGM_REPORT 131 -#define ICMPV6_MGM_REDUCTION 132 - -#define ICMPV6_DEST_UNREACH_NOROUTE 0 -#define ICMPV6_DEST_UNREACH_ADMIN 1 /* administratively prohibited */ -#define ICMPV6_DEST_UNREACH_NOTNEIGHBOR 2 /* not a neighbor (and must be) */ -#define ICMPV6_DEST_UNREACH_ADDR 3 -#define ICMPV6_DEST_UNREACH_NOPORT 4 -#define ICMPV6_TIME_EXCEED_HOPS 0 /* Hop Limit == 0 in transit */ -#define ICMPV6_TIME_EXCEED_REASSEMBLY 1 /* Reassembly time out */ -#define ICMPV6_PARAMPROB_HEADER 0 /* erroneous header field */ -#define ICMPV6_PARAMPROB_NEXTHEADER 1 /* unrecognized Next Header */ -#define ICMPV6_PARAMPROB_OPTION 2 /* unrecognized option */ - -#define ICMPV6_FILTER_WILLPASS(type, filterp) \ + uint32_t icmp6_un_data32[1]; /* type-specific field */ + uint16_t icmp6_un_data16[2]; /* type-specific field */ + uint8_t icmp6_un_data8[4]; /* type-specific field */ + } icmp6_dataun; + }; + +#define icmp6_data32 icmp6_dataun.icmp6_un_data32 +#define icmp6_data16 icmp6_dataun.icmp6_un_data16 +#define icmp6_data8 icmp6_dataun.icmp6_un_data8 +#define icmp6_pptr icmp6_data32[0] /* parameter prob */ +#define icmp6_mtu icmp6_data32[0] /* packet too big */ +#define icmp6_id icmp6_data16[0] /* echo request/reply */ +#define icmp6_seq icmp6_data16[1] /* echo request/reply */ +#define icmp6_maxdelay icmp6_data16[0] /* mcast group membership */ + +#define ICMP6_DST_UNREACH 1 +#define ICMP6_PACKET_TOO_BIG 2 +#define ICMP6_TIME_EXCEEDED 3 +#define ICMP6_PARAM_PROB 4 + +#define ICMP6_INFOMSG_MASK 0x80 /* all informational messages */ + +#define ICMP6_ECHO_REQUEST 128 +#define ICMP6_ECHO_REPLY 129 +#define ICMP6_MEMBERSHIP_QUERY 130 +#define ICMP6_MEMBERSHIP_REPORT 131 +#define ICMP6_MEMBERSHIP_REDUCTION 132 + +#define ICMP6_DST_UNREACH_NOROUTE 0 /* no route to destination */ +#define ICMP6_DST_UNREACH_ADMIN 1 /* communication with destination */ + /* administratively prohibited */ +#define ICMP6_DST_UNREACH_NOTNEIGHBOR 2 /* not a neighbor */ +#define ICMP6_DST_UNREACH_ADDR 3 /* address unreachable */ +#define ICMP6_DST_UNREACH_NOPORT 4 /* bad port */ + +#define ICMP6_TIME_EXCEED_TRANSIT 0 /* Hop Limit == 0 in transit */ +#define ICMP6_TIME_EXCEED_REASSEMBLY 1 /* Reassembly time out */ + +#define ICMP6_PARAMPROB_HEADER 0 /* erroneous header field */ +#define ICMP6_PARAMPROB_NEXTHEADER 1 /* unrecognized Next Header */ +#define ICMP6_PARAMPROB_OPTION 2 /* unrecognized IPv6 option */ + +#define ICMP6_FILTER_WILLPASS(type, filterp) \ ((((filterp)->data[(type) >> 5]) & (1 << ((type) & 31))) == 0) -#define ICMPV6_FILTER_WILLBLOCK(type, filterp) \ +#define ICMP6_FILTER_WILLBLOCK(type, filterp) \ ((((filterp)->data[(type) >> 5]) & (1 << ((type) & 31))) != 0) -#define ICMPV6_FILTER_SETPASS(type, filterp) \ +#define ICMP6_FILTER_SETPASS(type, filterp) \ ((((filterp)->data[(type) >> 5]) &= ~(1 << ((type) & 31)))) -#define ICMPV6_FILTER_SETBLOCK(type, filterp) \ +#define ICMP6_FILTER_SETBLOCK(type, filterp) \ ((((filterp)->data[(type) >> 5]) |= (1 << ((type) & 31)))) -#define ICMPV6_FILTER_SETPASSALL(filterp) \ - memset (filterp, 0, sizeof (struct icmpv6_filter)); +#define ICMP6_FILTER_SETPASSALL(filterp) \ + memset (filterp, 0, sizeof (struct icmp6_filter)); -#define ICMPV6_FILTER_SETBLOCKALL(filterp) \ - memset (filterp, 0xFF, sizeof (struct icmpv6_filter)); +#define ICMP6_FILTER_SETBLOCKALL(filterp) \ + memset (filterp, 0xFF, sizeof (struct icmp6_filter)); -#define ND6_ROUTER_SOLICITATION 133 -#define ND6_ROUTER_ADVERTISEMENT 134 -#define ND6_NEIGHBOR_SOLICITATION 135 -#define ND6_NEIGHBOR_ADVERTISEMENT 136 -#define ND6_REDIRECT 137 +#define ND_ROUTER_SOLICIT 133 +#define ND_ROUTER_ADVERT 134 +#define ND_NEIGHBOR_SOLICIT 135 +#define ND_NEIGHBOR_ADVERT 136 +#define ND_REDIRECT 137 -enum nd6_option +struct nd_router_solicit /* router solicitation */ { - ND6_OPT_SOURCE_LINKADDR=1, - ND6_OPT_TARGET_LINKADDR=2, - ND6_OPT_PREFIX_INFORMATION=3, - ND6_OPT_REDIRECTED_HEADER=4, - ND6_OPT_MTU=5, - ND6_OPT_ENDOFLIST=256 + struct icmp6_hdr nd_rs_hdr; + /* could be followed by options */ }; -struct nd6_router_solicit /* router solicitation */ +#define nd_rs_type nd_rs_hdr.icmp6_type +#define nd_rs_code nd_rs_hdr.icmp6_code +#define nd_rs_cksum nd_rs_hdr.icmp6_cksum +#define nd_rs_reserved nd_rs_hdr.icmp6_data32[0] + +struct nd_router_advert /* router advertisement */ { - struct icmpv6hdr rsol_hdr; + struct icmp6_hdr nd_ra_hdr; + uint32_t nd_ra_reachable; /* reachable time */ + uint32_t nd_ra_retransmit; /* retransmit timer */ + /* could be followed by options */ }; -#define rsol_type rsol_hdr.icmpv6_type -#define rsol_code rsol_hdr.icmpv6_code -#define rsol_cksum rsol_hdr.icmpv6_cksum -#define rsol_reserved rsol_hdr.icmpv6_data32[0] +#define nd_ra_type nd_ra_hdr.icmp6_type +#define nd_ra_code nd_ra_hdr.icmp6_code +#define nd_ra_cksum nd_ra_hdr.icmp6_cksum +#define nd_ra_curhoplimit nd_ra_hdr.icmp6_data8[0] +#define nd_ra_flags_reserved nd_ra_hdr.icmp6_data8[1] +#define ND_RA_FLAG_MANAGED 0x80 +#define ND_RA_FLAG_OTHER 0x40 +#define nd_ra_router_lifetime nd_ra_hdr.icmp6_data16[1] -struct nd6_router_advert +struct nd_neighbor_solicit /* neighbor solicitation */ { - struct icmpv6hdr radv_hdr; - u_int32_t radv_reachable; /* reachable time */ - u_int32_t radv_retransmit; /* reachable retransmit time */ + struct icmp6_hdr nd_ns_hdr; + struct in6_addr nd_ns_target; /* target address */ + /* could be followed by options */ }; -#define radv_type radv_hdr.icmpv6_type -#define radv_code radv_hdr.icmpv6_code -#define radv_cksum radv_hdr.icmpv6_cksum -#define radv_maxhoplimit radv_hdr.icmpv6_data8[0] -#define radv_m_o_res radv_hdr.icmpv6_data8[1] -#define ND6_RADV_M_BIT 0x80 -#define ND6_RADV_O_BIT 0x40 -#define radv_router_lifetime radv_hdr.icmpv6_data16[1] +#define nd_ns_type nd_ns_hdr.icmp6_type +#define nd_ns_code nd_ns_hdr.icmp6_code +#define nd_ns_cksum nd_ns_hdr.icmp6_cksum +#define nd_ns_reserved nd_ns_hdr.icmp6_data32[0] -struct nd6_nsolicitation /* neighbor solicitation */ +struct nd_neighbor_advert /* neighbor advertisement */ { - struct icmpv6hdr nsol6_hdr; - struct in6_addr nsol6_target; + struct icmp6_hdr nd_na_hdr; + struct in6_addr nd_na_target; /* target address */ + /* could be followed by options */ }; -struct nd6_nadvertisement /* neighbor advertisement */ +#define nd_na_type nd_na_hdr.icmp6_type +#define nd_na_code nd_na_hdr.icmp6_code +#define nd_na_cksum nd_na_hdr.icmp6_cksum +#define nd_na_flags_reserved nd_na_hdr.icmp6_data32[0] +#if BYTE_ORDER == BIG_ENDIAN +#define ND_NA_FLAG_ROUTER 0x80000000 +#define ND_NA_FLAG_SOLICITED 0x40000000 +#define ND_NA_FLAG_OVERRIDE 0x20000000 +#else /* BYTE_ORDER == LITTLE_ENDIAN */ +#define ND_NA_FLAG_ROUTER 0x00000080 +#define ND_NA_FLAG_SOLICITED 0x00000040 +#define ND_NA_FLAG_OVERRIDE 0x00000020 +#endif + +struct nd_redirect /* redirect */ { - struct icmpv6hdr nadv6_hdr; - struct in6_addr nadv6_target; + struct icmp6_hdr nd_rd_hdr; + struct in6_addr nd_rd_target; /* target address */ + struct in6_addr nd_rd_dst; /* destination address */ + /* could be followed by options */ }; + +#define nd_rd_type nd_rd_hdr.icmp6_type +#define nd_rd_code nd_rd_hdr.icmp6_code +#define nd_rd_cksum nd_rd_hdr.icmp6_cksum +#define nd_rd_reserved nd_rd_hdr.icmp6_data32[0] -#define nadv6_flags nadv6_hdr.icmpv6_data32[0] -#define ND6_NADVERFLAG_ISROUTER 0x80 -#define ND6_NADVERFLAG_SOLICITED 0x40 -#define ND6_NADVERFLAG_OVERRIDE 0x20 - -struct nd6_redirect /* redirect */ +struct nd_opt_hdr /* Neighbor discovery option header */ { - struct icmpv6hdr redirect_hdr; - struct in6_addr redirect_target; - struct in6_addr redirect_destination; + uint8_t nd_opt_type; + uint8_t nd_opt_len; /* in units of 8 octets */ + /* followed by option specific data */ }; -struct nd6_opt_prefix_info /* prefix information */ +#define ND_OPT_SOURCE_LINKADDR 1 +#define ND_OPT_TARGET_LINKADDR 2 +#define ND_OPT_PREFIX_INFORMATION 3 +#define ND_OPT_REDIRECTED_HEADER 4 +#define ND_OPT_MTU 5 + +struct nd_opt_prefix_info /* prefix information */ { - u_int8_t opt_type; - u_int8_t opt_length; - u_int8_t opt_prefix_length; - u_int8_t opt_l_a_res; - u_int32_t opt_valid_life; - u_int32_t opt_preferred_life; - u_int32_t opt_reserved2; - struct in6_addr opt_prefix; + uint8_t nd_opt_pi_type; + uint8_t nd_opt_pi_len; + uint8_t nd_opt_pi_prefix_len; + uint8_t nd_opt_pi_flags_reserved; + uint32_t nd_opt_pi_valid_time; + uint32_t nd_opt_pi_preferred_time; + uint32_t nd_opt_pi_reserved2; + struct in6_addr nd_opt_pi_prefix; }; -#define ND6_OPT_PI_L_BIT 0x80 -#define ND6_OPT_PI_A_BIT 0x40 +#define ND_OPT_PI_FLAG_ONLINK 0x80 +#define ND_OPT_PI_FLAG_AUTO 0x40 -struct nd6_opt_mtu /* MTU option */ +struct nd_opt_rd_hdr /* redirected header */ { - u_int8_t opt_type; - u_int8_t opt_length; - u_int16_t opt_reserved; - u_int32_t opt_mtu; + uint8_t nd_opt_rh_type; + uint8_t nd_opt_rh_len; + uint16_t nd_opt_rh_reserved1; + uint32_t nd_opt_rh_reserved2; + /* followed by IP header and data */ }; +struct nd_opt_mtu /* MTU option */ + { + uint8_t nd_opt_mtu_type; + uint8_t nd_opt_mtu_len; + uint16_t nd_opt_mtu_reserved; + uint32_t nd_opt_mtu_mtu; + }; + + #endif /* netinet/icmpv6.h */ diff --git a/inet/netinet/in.h b/inet/netinet/in.h index d2a366b51c..9eda281360 100644 --- a/inet/netinet/in.h +++ b/inet/netinet/in.h @@ -20,6 +20,7 @@ #define _NETINET_IN_H 1 #include <features.h> +#include <inttypes.h> #include <sys/socket.h> #include <sys/types.h> @@ -30,19 +31,25 @@ __BEGIN_DECLS /* Standard well-defined IP protocols. */ enum { - IPPROTO_IP = 0, /* Dummy protocol for TCP. */ - IPPROTO_ICMP = 1, /* Internet Control Message Protocol. */ - IPPROTO_IGMP = 2, /* Internet Group Management Protocol. */ - IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94). */ - IPPROTO_TCP = 6, /* Transmission Control Protocol. */ - IPPROTO_EGP = 8, /* Exterior Gateway Protocol. */ - IPPROTO_PUP = 12, /* PUP protocol. */ - IPPROTO_UDP = 17, /* User Datagram Protocol. */ - IPPROTO_IDP = 22, /* XNS IDP protocol. */ - IPPROTO_IPV6 = 41, /* IPv6-in-IPv4 tunnelling. */ - IPPROTO_ICMPV6 = 58, /* ICMPv6. */ - - IPPROTO_RAW = 255, /* Raw IP packets. */ + IPPROTO_IP = 0, /* Dummy protocol for TCP. */ + IPPROTO_HOPOPTS = 0, /* IPv6 Hop-by-Hop options. */ + IPPROTO_ICMP = 1, /* Internet Control Message Protocol. */ + IPPROTO_IGMP = 2, /* Internet Group Management Protocol. */ + IPPROTO_IPIP = 4, /* IPIP tunnels (older KA9Q tunnels use 94). */ + IPPROTO_TCP = 6, /* Transmission Control Protocol. */ + IPPROTO_EGP = 8, /* Exterior Gateway Protocol. */ + IPPROTO_PUP = 12, /* PUP protocol. */ + IPPROTO_UDP = 17, /* User Datagram Protocol. */ + IPPROTO_IDP = 22, /* XNS IDP protocol. */ + IPPROTO_IPV6 = 41, /* IPv6 header. */ + IPPROTO_ROUTING = 43, /* IPv6 routing header. */ + IPPROTO_FRAGMENT = 44, /* IPv6 fragmentation header. */ + IPPROTO_ESP = 50, /* encapsulating security payload. */ + IPPROTO_AH = 51, /* authentication header. */ + IPPROTO_ICMPV6 = 58, /* ICMPv6. */ + IPPROTO_NONE = 59, /* IPv6 no next header. */ + IPPROTO_DSTOPTS = 60, /* IPv6 destination options. */ + IPPROTO_RAW = 255, /* Raw IP packets. */ IPPROTO_MAX }; @@ -90,7 +97,7 @@ enum /* Internet address. */ struct in_addr { - u_int32_t s_addr; + uint32_t s_addr; }; @@ -142,11 +149,11 @@ struct in6_addr { union { - u_int8_t u6_addr8[16]; - u_int16_t u6_addr16[8]; - u_int32_t u6_addr32[4]; + uint8_t u6_addr8[16]; + uint16_t u6_addr16[8]; + uint32_t u6_addr32[4]; #if (~0UL) > 0xffffffff - u_int64_t u6_addr64[2]; + uint64_t u6_addr64[2]; #endif } in6_u; #define s6_addr in6_u.u6_addr8 @@ -171,13 +178,13 @@ extern const struct in6_addr in6addr_loopback; /* ::1 */ struct sockaddr_in { __SOCKADDR_COMMON (sin_); - unsigned short int sin_port; /* Port number. */ + uint16_t sin_port; /* Port number. */ struct in_addr sin_addr; /* Internet address. */ /* Pad to size of `struct sockaddr'. */ unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - - sizeof (unsigned short int) - + sizeof (uint16_t) - sizeof (struct in_addr)]; }; @@ -185,8 +192,8 @@ struct sockaddr_in struct sockaddr_in6 { __SOCKADDR_COMMON (sin6_); - u_int16_t sin6_port; /* Transport layer port # */ - u_int32_t sin6_flowinfo; /* IPv6 flow information */ + uint16_t sin6_port; /* Transport layer port # */ + uint32_t sin6_flowinfo; /* IPv6 flow information */ struct in6_addr sin6_addr; /* IPv6 address */ }; @@ -196,8 +203,8 @@ struct ipv6_mreq /* IPv6 multicast address of group */ struct in6_addr ipv6mr_multiaddr; - /* local IPv6 address of interface */ - int ipv6mr_ifindex; + /* local interface */ + unsigned int ipv6mr_ifindex; }; /* Get system-specific definitions. */ @@ -210,10 +217,10 @@ struct ipv6_mreq this was a short-sighted decision since on different systems the types may have different representations but the values are always the same. */ -extern u_int32_t ntohl __P ((u_int32_t __netlong)); -extern u_int16_t ntohs __P ((u_int16_t __netshort)); -extern u_int32_t htonl __P ((u_int32_t __hostlong)); -extern u_int16_t htons __P ((u_int16_t __hostshort)); +extern uint32_t ntohl __P ((uint32_t __netlong)); +extern uint16_t ntohs __P ((uint16_t __netshort)); +extern uint32_t htonl __P ((uint32_t __hostlong)); +extern uint16_t htons __P ((uint16_t __hostshort)); #include <endian.h> @@ -237,30 +244,35 @@ extern u_int16_t htons __P ((u_int16_t __hostshort)); #endif #define IN6_IS_ADDR_UNSPECIFIED(a) \ - ((((u_int32_t *) (a))[0] == 0) && ((u_int32_t *) (a))[1] == 0) && \ - (((u_int32_t *) (a))[2] == 0) && ((u_int32_t *) (a))[3] == 0)) + ((((uint32_t *) (a))[0] == 0) && ((uint32_t *) (a))[1] == 0) && \ + (((uint32_t *) (a))[2] == 0) && ((uint32_t *) (a))[3] == 0)) #define IN6_IS_ADDR_LOOPBACK(a) \ - ((((u_int32_t *) (a))[0] == 0) && ((u_int32_t *) (a))[1] == 0) && \ - (((u_int32_t *) (a))[2] == 0) && ((u_int32_t *) (a))[3] == htonl (1))) + ((((uint32_t *) (a))[0] == 0) && ((uint32_t *) (a))[1] == 0) && \ + (((uint32_t *) (a))[2] == 0) && ((uint32_t *) (a))[3] == htonl (1))) #define IN6_IS_ADDR_MULTICAST(a) (((u_int8_t *) (a))[0] == 0xff) #define IN6_IS_ADDR_LINKLOCAL(a) \ - ((((u_int32_t *) (a))[0] & htonl (0xffc00000)) == htonl (0xfe800000)) + ((((uint32_t *) (a))[0] & htonl (0xffc00000)) == htonl (0xfe800000)) #define IN6_IS_ADDR_SITELOCAL(a) \ - ((((u_int32_t *) (a))[0] & htonl (0xffc00000)) == htonl (0xfec00000)) + ((((uint32_t *) (a))[0] & htonl (0xffc00000)) == htonl (0xfec00000)) #define IN6_IS_ADDR_V4MAPPED(a) \ - ((((u_int32_t *) (a))[0] == 0) && (((u_int32_t *) (a))[1] == 0) && \ - (((u_int32_t *) (a))[2] == htonl (0xffff))) + ((((uint32_t *) (a))[0] == 0) && (((uint32_t *) (a))[1] == 0) && \ + (((uint32_t *) (a))[2] == htonl (0xffff))) #define IN6_IS_ADDR_V4COMPAT(a) \ - ((((u_int32_t *) (a))[0] == 0) && (((u_int32_t *) (a))[1] == 0) && \ - (((u_int32_t *) (a))[2] == 0) && (ntohl (((u_int32_t *) (a))[3]) > 1)) - - + ((((uint32_t *) (a))[0] == 0) && (((uint32_t *) (a))[1] == 0) && \ + (((uint32_t *) (a))[2] == 0) && (ntohl (((uint32_t *) (a))[3]) > 1)) + +#define IN6_ARE_ADDR_EQUAL(a,b) \ + ((((uint32_t *) (a))[0] == ((uint32_t *) (b))[0]) && \ + (((uint32_t *) (a))[1] == ((uint32_t *) (b))[2]) && \ + (((uint32_t *) (a))[2] == ((uint32_t *) (b))[1]) && \ + (((uint32_t *) (a))[3] == ((uint32_t *) (b))[3])) + /* Bind socket to a privileged IP port. */ extern int bindresvport __P ((int __sockfd, struct sockaddr_in *__sin)); @@ -268,8 +280,8 @@ extern int bindresvport __P ((int __sockfd, struct sockaddr_in *__sin)); /* IPv6 packet information. */ struct in6_pktinfo { - struct in6_addr ipi6_addr; /* src/dst IPv6 address */ - int ipi6_ifindex; /* send/recv interface index */ + struct in6_addr ipi6_addr; /* src/dst IPv6 address */ + unsigned int ipi6_ifindex; /* send/recv interface index */ }; __END_DECLS diff --git a/inet/netinet/ip6.h b/inet/netinet/ip6.h index 2930578e4f..cd42ef64b9 100644 --- a/inet/netinet/ip6.h +++ b/inet/netinet/ip6.h @@ -19,27 +19,88 @@ #ifndef _NETINET_IP6_H #define _NETINET_IP6_H 1 +#include <inttypes.h> #include <netinet/in.h> -#include <endian.h> - -struct ipv6hdr -{ -#if __BYTE_ORDER == __LITTLE_ENDIAN - u_int8_t ipv6_version:4; - u_int8_t ipv6_priority:4; /* going away? */ - u_int32_t ipv6_flowid:24; -#elif __BYTE_ORDER == __BIG_ENDIAN - u_int32_t ipv6_flowid:24; - u_int8_t ipv6_priority:4; /* going away? */ - u_int8_t ipv6_version:4; -#else -# error Unknown endianness + +struct ip6_hdr + { + union + { + struct ip6_hdrctl + { + uint32_t ip6_un1_flow; /* 24 bits of flow-ID */ + uint16_t ip6_un1_plen; /* payload length */ + uint8_t ip6_un1_nxt; /* next header */ + uint8_t ip6_un1_hlim; /* hop limit */ + } ip6_un1; + uint8_t ip6_un2_vfc; /* 4 bits version, 4 bits priority */ + } ip6_ctlun; + struct in6_addr ip6_src; /* source address */ + struct in6_addr ip6_dst; /* destination address */ + }; + +#define ip6_vfc ip6_ctlun.ip6_un2_vfc +#define ip6_flow ip6_ctlun.ip6_un1.ip6_un1_flow +#define ip6_plen ip6_ctlun.ip6_un1.ip6_un1_plen +#define ip6_nxt ip6_ctlun.ip6_un1.ip6_un1_nxt +#define ip6_hlim ip6_ctlun.ip6_un1.ip6_un1_hlim +#define ip6_hops ip6_ctlun.ip6_un1.ip6_un1_hlim + +/* Hop-by-Hop options header. */ +struct ip6_hbh + { + uint8_t ip6h_nxt; /* next hesder. */ + uint8_t ip6h_len; /* length in units of 8 octets. */ + /* followed by options */ + }; + +/* Destination options header */ +struct ip6_dest + { + uint8_t ip6d_nxt; /* next header */ + uint8_t ip6d_len; /* length in units of 8 octets */ + /* followed by options */ + }; + +/* Routing header */ +struct ip6_rthdr + { + uint8_t ip6r_nxt; /* next header */ + uint8_t ip6r_len; /* length in units of 8 octets */ + uint8_t ip6r_type; /* routing type */ + uint8_t ip6r_segleft; /* segments left */ + /* followed by routing type specific data */ + }; + +/* Type 0 Routing header */ +struct ip6_rthdr0 + { + uint8_t ip6r0_nxt; /* next header */ + uint8_t ip6r0_len; /* length in units of 8 octets */ + uint8_t ip6r0_type; /* always zero */ + uint8_t ip6r0_segleft; /* segments left */ + uint8_t ip6r0_reserved; /* reserved field */ + uint8_t ip6r0_slmap[3]; /* strict/loose bit map */ + struct in6_addr ip6r0_addr[1]; /* up to 23 addresses */ + }; + +/* Fragment header */ +struct ip6_frag + { + uint8_t ip6f_nxt; /* next header */ + uint8_t ip6f_reserved; /* reserved field */ + uint16_t ip6f_offlg; /* offset, reserved, and flag */ + uint32_t ip6f_ident; /* identification */ + }; + +#if BYTE_ORDER == BIG_ENDIAN +#define IP6F_OFF_MASK 0xfff8 /* mask out offset from _offlg */ +#define IP6F_RESERVED_MASK 0x0006 /* reserved bits in ip6f_offlg */ +#define IP6F_MORE_FRAG 0x0001 /* more-fragments flag */ +#else /* BYTE_ORDER == LITTLE_ENDIAN */ +#define IP6F_OFF_MASK 0xf8ff /* mask out offset from _offlg */ +#define IP6F_RESERVED_MASK 0x0600 /* reserved bits in ip6f_offlg */ +#define IP6F_MORE_FRAG 0x0100 /* more-fragments flag */ #endif - u_int16_t ipv6_len; - u_int8_t ipv6_nextheader; - u_int8_t ipv6_hoplimit; - struct in6_addr ipv6_src; - struct in6_addr ipv6_dst; -}; #endif /* netinet/ip6.h */ |