summaryrefslogtreecommitdiff
path: root/inet
diff options
context:
space:
mode:
Diffstat (limited to 'inet')
-rw-r--r--inet/netinet/icmp6.h270
-rw-r--r--inet/netinet/in.h96
-rw-r--r--inet/netinet/ip6.h101
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 */