Update for new drafts of POSIX.1g and IPv6 advanced API.
authordrepper <drepper>
Mon, 28 Jul 1997 21:54:44 +0000 (21:54 +0000)
committerdrepper <drepper>
Mon, 28 Jul 1997 21:54:44 +0000 (21:54 +0000)
inet/netinet/icmp6.h
inet/netinet/in.h
inet/netinet/ip6.h

index 224fb64..38c1bc1 100644 (file)
@@ -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>
 
 #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 */
index d2a366b..9eda281 100644 (file)
@@ -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
index 2930578..cd42ef6 100644 (file)
 #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 */