Looks good in general. Some trivial questions inline below.

On Tue, Aug 7, 2018 at 5:49 AM, Charles Myers <[email protected]>
wrote:

> Signed-off-by: Charles Myers <[email protected]>
> ---
>  bsd/sys/netinet/icmp6.h       |   2 +
>  bsd/sys/netinet/ip6.h         |  93 +----------------------
>  bsd/sys/netinet6/in6.h        | 125 +++++++------------------------
>  bsd/sys/netinet6/in6_pcb.h    |  30 ++++----
>  bsd/sys/netinet6/in6_var.h    | 170 ++++++++++++++++++++++++++++++
> +++---------
>  bsd/sys/netinet6/ip6_mroute.h |  12 +--
>  bsd/sys/netinet6/ip6_var.h    |  15 ++--
>  bsd/sys/netinet6/ip6protosw.h |   8 +-
>  bsd/sys/netinet6/mld6.h       |   7 ++
>  bsd/sys/netinet6/nd6.h        |  38 +++++-----
>  bsd/sys/netinet6/scope6_var.h |   4 +-
>  bsd/sys/netinet6/send.h       |   2 +-
>  bsd/sys/netinet6/tcp6_var.h   |   2 +-
>  bsd/sys/netinet6/udp6_var.h   |   2 +-
>  include/api/netinet/__icmp6.h |  11 +++
>  include/api/netinet6/__in6.h  |  70 +++++++++++++++++
>  16 files changed, 312 insertions(+), 279 deletions(-)
>  create mode 100644 include/api/netinet/__icmp6.h
>  create mode 100644 include/api/netinet6/__in6.h
>
> diff --git a/bsd/sys/netinet/icmp6.h b/bsd/sys/netinet/icmp6.h
> index 5952225..2f9ea4c 100644
> --- a/bsd/sys/netinet/icmp6.h
> +++ b/bsd/sys/netinet/icmp6.h
> @@ -64,6 +64,8 @@
>  #ifndef _NETINET_ICMP6_H_
>  #define _NETINET_ICMP6_H_
>
> +#include <netinet/__icmp6.h>
>

I'm curious why this was needed, how did FreeBSD work without this
additional file with definitions?

+
>  #define ICMPV6_PLD_MAXLEN      1232    /* IPV6_MMTU - sizeof(struct
> ip6_hdr)
>                                            - sizeof(struct icmp6_hdr) */
>
> diff --git a/bsd/sys/netinet/ip6.h b/bsd/sys/netinet/ip6.h
> index 5f99fd9..a69aaa5 100644
> --- a/bsd/sys/netinet/ip6.h
> +++ b/bsd/sys/netinet/ip6.h
> @@ -64,6 +64,10 @@
>  #ifndef _NETINET_IP6_H_
>  #define _NETINET_IP6_H_
>
> +#include <sys/cdefs.h>
> +#include <bsd/sys/sys/param.h>
> +#include <bsd/sys/netinet6/in6.h>
> +
>  /*
>   * Definition for internet protocol version 6.
>   * RFC 2460
> @@ -259,94 +263,5 @@ struct ip6_frag {
>  #define IPV6_MAXPACKET 65535   /* ip6 max packet size without Jumbo
> payload*/
>  #define IPV6_MAXOPTHDR 2048    /* max option header size, 256 64-bit
> words */
>
> -#ifdef _KERNEL
>
-/*
> - * IP6_EXTHDR_CHECK ensures that region between the IP6 header and the
> - * target header (including IPv6 itself, extension headers and
> - * TCP/UDP/ICMP6 headers) are contiguous. KAME requires drivers
> - * to store incoming data into one internal mbuf or one or more external
> - * mbufs(never into two or more internal mbufs). Thus, the third case is
> - * supposed to never be matched but is prepared just in case.
> - */
> -
> -#define IP6_EXTHDR_CHECK(m, off, hlen, ret)                            \
> -do {                                                                   \
> -    if ((m)->m_next != NULL) {                                         \
> -       if (((m)->m_flags & M_LOOP) &&                                  \
> -           ((m)->m_len < (off) + (hlen)) &&                            \
> -           (((m) = m_pullup((m), (off) + (hlen))) == NULL)) {          \
> -               V_ip6stat.ip6s_exthdrtoolong++;                         \
> -               return ret;                                             \
> -       } else if ((m)->m_flags & M_EXT) {                              \
> -               if ((m)->m_len < (off) + (hlen)) {                      \
> -                       V_ip6stat.ip6s_exthdrtoolong++;                 \
> -                       m_freem(m);                                     \
> -                       return ret;                                     \
> -               }                                                       \
> -       } else {                                                        \
> -               if ((m)->m_len < (off) + (hlen)) {                      \
> -                       V_ip6stat.ip6s_exthdrtoolong++;                 \
> -                       m_freem(m);                                     \
> -                       return ret;                                     \
> -               }                                                       \
> -       }                                                               \
> -    } else {                                                           \
> -       if ((m)->m_len < (off) + (hlen)) {                              \
> -               V_ip6stat.ip6s_tooshort++;                              \
> -               in6_ifstat_inc(m->m_pkthdr.rcvif, ifs6_in_truncated);   \
> -               m_freem(m);                                             \
> -               return ret;                                             \
> -       }                                                               \
> -    }                                                                  \
> -} while (/*CONSTCOND*/ 0)
> -
> -/*
> - * IP6_EXTHDR_GET ensures that intermediate protocol header (from "off" to
> - * "len") is located in single mbuf, on contiguous memory region.
> - * The pointer to the region will be returned to pointer variable "val",
> - * with type "typ".
> - * IP6_EXTHDR_GET0 does the same, except that it aligns the structure at
> the
> - * very top of mbuf.  GET0 is likely to make memory copy than GET.
> - *
> - * XXX we're now testing this, needs m_pulldown()
> - */
> -#define IP6_EXTHDR_GET(val, typ, m, off, len) \
> -do {                                                                   \
> -       struct mbuf *t;                                                 \
> -       int tmp;                                                        \
> -       if ((m)->m_len >= (off) + (len))                                \
> -               (val) = (typ)(mtod((m), caddr_t) + (off));              \
> -       else {                                                          \
> -               t = m_pulldown((m), (off), (len), &tmp);                \
> -               if (t) {                                                \
> -                       if (t->m_len < tmp + (len))                     \
> -                               panic("m_pulldown malfunction");        \
> -                       (val) = (typ)(mtod(t, caddr_t) + tmp);          \
> -               } else {                                                \
> -                       (val) = (typ)NULL;                              \
> -                       (m) = NULL;                                     \
> -               }                                                       \
> -       }                                                               \
> -} while (/*CONSTCOND*/ 0)
> -
> -#define IP6_EXTHDR_GET0(val, typ, m, off, len) \
> -do {                                                                   \
> -       struct mbuf *t;                                                 \
> -       if ((off) == 0)                                                 \
> -               (val) = (typ)mtod(m, caddr_t);                          \
> -       else {                                                          \
> -               t = m_pulldown((m), (off), (len), NULL);                \
> -               if (t) {                                                \
> -                       if (t->m_len < (len))                           \
> -                               panic("m_pulldown malfunction");        \
> -                       (val) = (typ)mtod(t, caddr_t);                  \
> -               } else {                                                \
> -                       (val) = (typ)NULL;                              \
> -                       (m) = NULL;                                     \
> -               }                                                       \
> -       }                                                               \
> -} while (/*CONSTCOND*/ 0)
> -
> -#endif /*_KERNEL*/
>
>  #endif /* not _NETINET_IP6_H_ */
> diff --git a/bsd/sys/netinet6/in6.h b/bsd/sys/netinet6/in6.h
> index c8e24e9..d7bfc59 100644
> --- a/bsd/sys/netinet6/in6.h
> +++ b/bsd/sys/netinet6/in6.h
> @@ -154,7 +154,7 @@ extern const struct in6_addr in6mask128;
>   * Macros started with IPV6_ADDR is KAME local
>   */
>  #ifdef _KERNEL /* XXX nonstandard */
> -#if _BYTE_ORDER == _BIG_ENDIAN
> +#if BYTE_ORDER == BIG_ENDIAN
>  #define IPV6_ADDR_INT32_ONE    1
>  #define IPV6_ADDR_INT32_TWO    2
>  #define IPV6_ADDR_INT32_MNL    0xff010000
> @@ -163,7 +163,7 @@ extern const struct in6_addr in6mask128;
>  #define IPV6_ADDR_INT16_ULL    0xfe80
>  #define IPV6_ADDR_INT16_USL    0xfec0
>  #define IPV6_ADDR_INT16_MLL    0xff02
> -#elif _BYTE_ORDER == _LITTLE_ENDIAN
> +#elif BYTE_ORDER == LITTLE_ENDIAN
>  #define IPV6_ADDR_INT32_ONE    0x01000000
>  #define IPV6_ADDR_INT32_TWO    0x02000000
>  #define IPV6_ADDR_INT32_MNL    0x000001ff
> @@ -355,13 +355,20 @@ extern const struct in6_addr in6addr_linklocal_
> allv2routers;
>          (IN6_IS_ADDR_MC_LINKLOCAL(a)) ||       \
>          (IN6_IS_ADDR_MC_INTFACELOCAL(a)))
>
> +static inline time_t ifa6_get_time_second(void)
> +{
> +    struct timeval tv;
> +    getmicrotime(&tv)


This is not the fastest way to get only the seconds - it does extra
arithmetic to get microsecond (rather than nanosecond) time.

Something like this (not tested!) should be the fastest - if fastness is
important here (I don't know where this is used):

static inline time_t ifa6_get_time_second(void)
{
    return (std::chrono::duration_cast<std::chrono::seconds>
                (osv::clock::wall::now().time_since_epoch()).count();
}

But probably not important :-)

;
> +    return (time_t)tv.tv_sec;
> +}
> +
>  #define IFA6_IS_DEPRECATED(a) \
>         ((a)->ia6_lifetime.ia6t_pltime != ND6_INFINITE_LIFETIME && \
> -        (u_int32_t)((time_second - (a)->ia6_updatetime)) > \
> +        (u_int32_t)((ifa6_get_time_second() - (a)->ia6_updatetime)) >   \
>          (a)->ia6_lifetime.ia6t_pltime)
>  #define IFA6_IS_INVALID(a) \
>         ((a)->ia6_lifetime.ia6t_vltime != ND6_INFINITE_LIFETIME && \
> -        (u_int32_t)((time_second - (a)->ia6_updatetime)) > \
> +        (u_int32_t)((ifa6_get_time_second() - (a)->ia6_updatetime)) >  \
>          (a)->ia6_lifetime.ia6t_vltime)
>  #endif /* _KERNEL */
>
> @@ -378,104 +385,19 @@ struct route_in6 {
>  };
>  #endif
>
> -/*
> - * Options for use with [gs]etsockopt at the IPV6 level.
> - * First word of comment is data type; bool is stored in int.
> - */
> -/* no hdrincl */
> -#if 0 /* the followings are relic in IPv4 and hence are disabled */
> -#define IPV6_OPTIONS           1  /* buf/ip6_opts; set/get IP6 options */
> -#define IPV6_RECVOPTS          5  /* bool; receive all IP6 opts w/dgram */
> -#define IPV6_RECVRETOPTS       6  /* bool; receive IP6 opts for response
> */
> -#define IPV6_RECVDSTADDR       7  /* bool; receive IP6 dst addr w/dgram */
> -#define IPV6_RETOPTS           8  /* ip6_opts; set/get IP6 options */
> -#endif
> -#define IPV6_SOCKOPT_RESERVED1 3  /* reserved for future use */
> -#define IPV6_UNICAST_HOPS      4  /* int; IP6 hops */
> -#define IPV6_MULTICAST_IF      9  /* u_int; set/get IP6 multicast i/f  */
> -#define IPV6_MULTICAST_HOPS    10 /* int; set/get IP6 multicast hops */
> -#define IPV6_MULTICAST_LOOP    11 /* u_int; set/get IP6 multicast
> loopback */
> -#define IPV6_JOIN_GROUP                12 /* ipv6_mreq; join a group
> membership */
> -#define IPV6_LEAVE_GROUP       13 /* ipv6_mreq; leave a group membership
> */
> -#define IPV6_PORTRANGE         14 /* int; range to choose for unspec port
> */
> -#define ICMP6_FILTER           18 /* icmp6_filter; icmp6 filter */
>

I see you moved all this stuff to a separate header, I'm curious why.


> -/* RFC2292 options */
> -#ifdef _KERNEL
> -#define IPV6_2292PKTINFO       19 /* bool; send/recv if, src/dst addr */
> -#define IPV6_2292HOPLIMIT      20 /* bool; hop limit */
> -#define IPV6_2292NEXTHOP       21 /* bool; next hop addr */
> -#define IPV6_2292HOPOPTS       22 /* bool; hop-by-hop option */
> -#define IPV6_2292DSTOPTS       23 /* bool; destinaion option */
> -#define IPV6_2292RTHDR         24 /* bool; routing header */
> -#define IPV6_2292PKTOPTIONS    25 /* buf/cmsghdr; set/get IPv6 options */
> -#endif
> -
> -#define IPV6_CHECKSUM          26 /* int; checksum offset for raw socket
> */
> -#define IPV6_V6ONLY            27 /* bool; make AF_INET6 sockets v6 only
> */
> -#ifndef _KERNEL
> -#define IPV6_BINDV6ONLY                IPV6_V6ONLY
> -#endif
> -
> -#if 1 /* IPSEC */
> -#define IPV6_IPSEC_POLICY      28 /* struct; get/set security policy */
> -#endif /* IPSEC */
> -
> -#define IPV6_FAITH             29 /* bool; accept FAITH'ed connections */
> -
> -#if 1 /* IPV6FIREWALL */
> -#define IPV6_FW_ADD            30 /* add a firewall rule to chain */
> -#define IPV6_FW_DEL            31 /* delete a firewall rule from chain */
> -#define IPV6_FW_FLUSH          32 /* flush firewall rule chain */
> -#define IPV6_FW_ZERO           33 /* clear single/all firewall counter(s)
> */
> -#define IPV6_FW_GET            34 /* get entire firewall rule chain */
> -#endif
> -
> -/* new socket options introduced in RFC3542 */
> -#define IPV6_RTHDRDSTOPTS      35 /* ip6_dest; send dst option before
> rthdr */
> -
> -#define IPV6_RECVPKTINFO       36 /* bool; recv if, dst addr */
> -#define IPV6_RECVHOPLIMIT      37 /* bool; recv hop limit */
> -#define IPV6_RECVRTHDR         38 /* bool; recv routing header */
> -#define IPV6_RECVHOPOPTS       39 /* bool; recv hop-by-hop option */
> -#define IPV6_RECVDSTOPTS       40 /* bool; recv dst option after rthdr */
> -#ifdef _KERNEL
> -#define IPV6_RECVRTHDRDSTOPTS  41 /* bool; recv dst option before rthdr */
> -#endif
>
> -#define IPV6_USE_MIN_MTU       42 /* bool; send packets at the minimum
> MTU */
> -#define IPV6_RECVPATHMTU       43 /* bool; notify an according MTU */
> +#include <netinet6/__in6.h>
>
> -#define IPV6_PATHMTU           44 /* mtuinfo; get the current path MTU
> (sopt),
> -                                     4 bytes int; MTU notification (cmsg)
> */
> -#if 0 /*obsoleted during 2292bis -> 3542*/
> -#define IPV6_REACHCONF         45 /* no data; ND reachability confirm
> -                                     (cmsg only/not in of RFC3542) */
> -#endif
> -
> -/* more new socket options introduced in RFC3542 */
> -#define IPV6_PKTINFO           46 /* in6_pktinfo; send if, src addr */
> -#define IPV6_HOPLIMIT          47 /* int; send hop limit */
> -#define IPV6_NEXTHOP           48 /* bsd_sockaddr; next hop addr */
> -#define IPV6_HOPOPTS           49 /* ip6_hbh; send hop-by-hop option */
> -#define IPV6_DSTOPTS           50 /* ip6_dest; send dst option befor
> rthdr */
> -#define IPV6_RTHDR             51 /* ip6_rthdr; send routing header */
> -#if 0
> -#define IPV6_PKTOPTIONS                52 /* buf/cmsghdr; set/get IPv6
> options */
> -                                  /* obsoleted by RFC3542 */
> -#endif
> -
> -#define IPV6_RECVTCLASS                57 /* bool; recv traffic class
> values */
> -
> -#define IPV6_AUTOFLOWLABEL     59 /* bool; attach flowlabel automagically
> */
> -
> -#define IPV6_TCLASS            61 /* int; send traffic class value */
> -#define IPV6_DONTFRAG          62 /* bool; disable IPv6 fragmentation */
> -
> -#define IPV6_PREFER_TEMPADDR   63 /* int; prefer temporary addresses as
> -                                   * the source address.
> -                                   */
> -
> -#define        IPV6_BINDANY            64 /* bool: allow bind to any
> address */
> +/* IPV6 socket options defined in FreeBSD but not Linux/Musl
> + *
> + * These options might eventually just get removed...
> + */
> +#define IPV6_BINDANY            (IPV6_XOPTS_START + 0)
> +#define IPV6_RECVRTHDRDSTOPTS   (IPV6_XOPTS_START + 1)
> +#define IPV6_FAITH              (IPV6_XOPTS_START + 2)
> +#define IPV6_PREFER_TEMPADDR    (IPV6_XOPTS_START + 3)
> +#define IPV6_PORTRANGE          (IPV6_XOPTS_START + 4)
> +#define IPV6_2292NEXTHOP        (IPV6_XOPTS_START + 5)
>
>  /*
>   * The following option is private; do not use it from user applications.
> @@ -670,6 +592,9 @@ typedef     __socklen_t     socklen_t;
>  __BEGIN_DECLS
>  struct cmsghdr;
>
> +
> +extern void ip6_init2(void *);
> +
>  extern int inet6_option_space(int);
>  extern int inet6_option_init(void *, struct cmsghdr **, int);
>  extern int inet6_option_append(struct cmsghdr *, const uint8_t *,
> diff --git a/bsd/sys/netinet6/in6_pcb.h b/bsd/sys/netinet6/in6_pcb.h
> index 597e195..d338d7e 100644
> --- a/bsd/sys/netinet6/in6_pcb.h
> +++ b/bsd/sys/netinet6/in6_pcb.h
> @@ -65,8 +65,8 @@
>  #define        _NETINET6_IN6_PCB_H_
>
>  #ifdef _KERNEL
> -#define        satosin6(sa)    ((struct sockaddr_in6 *)(sa))
> -#define        sin6tosa(sin6)  ((struct sockaddr *)(sin6))
> +#define        satosin6(sa)    ((struct bsd_sockaddr_in6 *)(sa))
> +#define        sin6tosa(sin6)  ((struct bsd_sockaddr *)(sin6))
>  #define        ifatoia6(ifa)   ((struct in6_ifaddr *)(ifa))
>
>  struct inpcbgroup *
> @@ -81,12 +81,12 @@ struct      inpcbgroup *
>
>  void   in6_pcbpurgeif0(struct inpcbinfo *, struct ifnet *);
>  void   in6_losing(struct inpcb *);
> -int    in6_pcbbind(struct inpcb *, struct sockaddr *, struct ucred *);
> -int    in6_pcbconnect(struct inpcb *, struct sockaddr *, struct ucred *);
> -int    in6_pcbconnect_mbuf(struct inpcb *, struct sockaddr *,
> +int    in6_pcbbind(struct inpcb *, struct bsd_sockaddr *, struct ucred *);
> +int    in6_pcbconnect(struct inpcb *, struct bsd_sockaddr *, struct ucred
> *);
> +int    in6_pcbconnect_mbuf(struct inpcb *, struct bsd_sockaddr *,
>             struct ucred *, struct mbuf *);
>  void   in6_pcbdisconnect(struct inpcb *);
> -int    in6_pcbladdr(struct inpcb *, struct sockaddr *, struct in6_addr *);
> +int    in6_pcbladdr(struct inpcb *, struct bsd_sockaddr *, struct
> in6_addr *);
>  struct inpcb *
>         in6_pcblookup_local(struct inpcbinfo *,
>                                  struct in6_addr *, u_short, int,
> @@ -103,22 +103,22 @@ struct    inpcb *
>         in6_pcblookup_mbuf(struct inpcbinfo *, struct in6_addr *,
>                            u_int, struct in6_addr *, u_int, int,
>                            struct ifnet *ifp, struct mbuf *);
> -void   in6_pcbnotify(struct inpcbinfo *, struct sockaddr *,
> -                          u_int, const struct sockaddr *, u_int, int,
> void *,
> +void   in6_pcbnotify(struct inpcbinfo *, struct bsd_sockaddr *,
> +                          u_int, const struct bsd_sockaddr *, u_int, int,
> void *,
>                            struct inpcb *(*)(struct inpcb *, int));
>  struct inpcb *
>         in6_rtchange(struct inpcb *, int);
> -struct sockaddr *
> +struct bsd_sockaddr *
>         in6_sockaddr(in_port_t port, struct in6_addr *addr_p);
> -struct sockaddr *
> +struct bsd_sockaddr *
>         in6_v4mapsin6_sockaddr(in_port_t port, struct in_addr *addr_p);
> -int    in6_getpeeraddr(struct socket *so, struct sockaddr **nam);
> -int    in6_getsockaddr(struct socket *so, struct sockaddr **nam);
> -int    in6_mapped_sockaddr(struct socket *so, struct sockaddr **nam);
> -int    in6_mapped_peeraddr(struct socket *so, struct sockaddr **nam);
> +int    in6_getpeeraddr(struct socket *so, struct bsd_sockaddr **nam);
> +int    in6_getsockaddr(struct socket *so, struct bsd_sockaddr **nam);
> +int    in6_mapped_sockaddr(struct socket *so, struct bsd_sockaddr **nam);
> +int    in6_mapped_peeraddr(struct socket *so, struct bsd_sockaddr **nam);
>  int    in6_selecthlim(struct in6pcb *, struct ifnet *);
>  int    in6_pcbsetport(struct in6_addr *, struct inpcb *, struct ucred *);
> -void   init_sin6(struct sockaddr_in6 *sin6, struct mbuf *m);
> +void   init_sin6(struct bsd_sockaddr_in6 *sin6, struct mbuf *m);
>  #endif /* _KERNEL */
>
>  #endif /* !_NETINET6_IN6_PCB_H_ */
> diff --git a/bsd/sys/netinet6/in6_var.h b/bsd/sys/netinet6/in6_var.h
> index 193f672..1182a35 100644
> --- a/bsd/sys/netinet6/in6_var.h
> +++ b/bsd/sys/netinet6/in6_var.h
> @@ -64,7 +64,8 @@
>  #ifndef _NETINET6_IN6_VAR_H_
>  #define _NETINET6_IN6_VAR_H_
>
> -#include <sys/tree.h>
> +#include <bsd/sys/netinet6/in6.h>
> +#include <bsd/sys/tree.h>
>
>  #ifdef _KERNEL
>  #include <sys/libkern.h>
> @@ -109,13 +110,13 @@ struct in6_ifextra {
>  #define        LLTABLE6(ifp)   (((struct in6_ifextra
> *)(ifp)->if_afdata[AF_INET6])->lltable)
>
>  struct in6_ifaddr {
> -       struct  ifaddr ia_ifa;          /* protocol-independent info */
> +       struct  bsd_ifaddr ia_ifa;              /* protocol-independent
> info */
>  #define        ia_ifp          ia_ifa.ifa_ifp
>  #define ia_flags       ia_ifa.ifa_flags
> -       struct  sockaddr_in6 ia_addr;   /* interface address */
> -       struct  sockaddr_in6 ia_net;    /* network number of interface */
> -       struct  sockaddr_in6 ia_dstaddr; /* space for destination addr */
> -       struct  sockaddr_in6 ia_prefixmask; /* prefix mask */
> +       struct  bsd_sockaddr_in6 ia_addr;       /* interface address */
> +       struct  bsd_sockaddr_in6 ia_net;        /* network number of
> interface */
> +       struct  bsd_sockaddr_in6 ia_dstaddr; /* space for destination addr
> */
> +       struct  bsd_sockaddr_in6 ia_prefixmask; /* prefix mask */
>         u_int32_t ia_plen;              /* prefix length */
>         TAILQ_ENTRY(in6_ifaddr) ia_link;        /* list of IPv6 addresses
> */
>         int     ia6_flags;
> @@ -138,8 +139,8 @@ TAILQ_HEAD(in6_ifaddrhead, in6_ifaddr);
>
>  /* control structure to manage address selection policy */
>  struct in6_addrpolicy {
> -       struct sockaddr_in6 addr; /* prefix address */
> -       struct sockaddr_in6 addrmask; /* prefix mask */
> +       struct bsd_sockaddr_in6 addr; /* prefix address */
> +       struct bsd_sockaddr_in6 addrmask; /* prefix mask */
>         int preced;             /* precedence */
>         int label;              /* matching label */
>         u_quad_t use;           /* statistics */
> @@ -267,8 +268,8 @@ struct icmp6_ifstat {
>  struct in6_ifreq {
>         char    ifr_name[IFNAMSIZ];
>         union {
> -               struct  sockaddr_in6 ifru_addr;
> -               struct  sockaddr_in6 ifru_dstaddr;
> +               struct  bsd_sockaddr_in6 ifru_addr;
> +               struct  bsd_sockaddr_in6 ifru_dstaddr;
>                 int     ifru_flags;
>                 int     ifru_flags6;
>                 int     ifru_metric;
> @@ -282,9 +283,9 @@ struct      in6_ifreq {
>
>  struct in6_aliasreq {
>         char    ifra_name[IFNAMSIZ];
> -       struct  sockaddr_in6 ifra_addr;
> -       struct  sockaddr_in6 ifra_dstaddr;
> -       struct  sockaddr_in6 ifra_prefixmask;
> +       struct  bsd_sockaddr_in6 ifra_addr;
> +       struct  bsd_sockaddr_in6 ifra_dstaddr;
> +       struct  bsd_sockaddr_in6 ifra_prefixmask;
>         int     ifra_flags;
>         struct in6_addrlifetime ifra_lifetime;
>  };
> @@ -293,16 +294,19 @@ struct    in6_aliasreq {
>  #define IN6_PREFIX_ND  1
>  #define IN6_PREFIX_RR  2
>
> +struct prf_ra {
> +       u_char onlink : 1;
> +       u_char autonomous : 1;
> +       u_char reserved : 6;
> +};
>

I'm curious why you wanted to movet his structure definition from where it
was?

+
> +
>  /*
>   * prefix related flags passed between kernel(NDP related part) and
>   * user land command(ifconfig) and daemon(rtadvd).
>   */
>  struct in6_prflags {
> -       struct prf_ra {
> -               u_char onlink : 1;
> -               u_char autonomous : 1;
> -               u_char reserved : 6;
> -       } prf_ra;
> +       struct prf_ra prf_ra;
>         u_char prf_reserved1;
>         u_short prf_reserved2;
>         /* want to put this on 4byte offset */
> @@ -322,7 +326,7 @@ struct  in6_prefixreq {
>         u_int32_t ipr_vltime;
>         u_int32_t ipr_pltime;
>         struct in6_prflags ipr_flags;
> -       struct  sockaddr_in6 ipr_prefix;
> +       struct  bsd_sockaddr_in6 ipr_prefix;
>  };
>
>  #define PR_ORIG_RA     0
> @@ -354,8 +358,8 @@ struct      in6_rrenumreq {
>         u_int32_t irr_vltime;
>         u_int32_t irr_pltime;
>         struct in6_prflags irr_flags;
> -       struct  sockaddr_in6 irr_matchprefix;
> -       struct  sockaddr_in6 irr_useprefix;
> +       struct  bsd_sockaddr_in6 irr_matchprefix;
> +       struct  bsd_sockaddr_in6 irr_useprefix;
>  };
>
>  #define irr_raf_mask_onlink    irr_raflagmask.onlink
> @@ -380,10 +384,10 @@ struct    in6_rrenumreq {
>  #define IA6_MASKIN6(ia)        (&((ia)->ia_prefixmask.sin6_addr))
>  #define IA6_SIN6(ia)   (&((ia)->ia_addr))
>  #define IA6_DSTSIN6(ia)        (&((ia)->ia_dstaddr))
> -#define IFA_IN6(x)     (&((struct sockaddr_in6
> *)((x)->ifa_addr))->sin6_addr)
> -#define IFA_DSTIN6(x)  (&((struct sockaddr_in6
> *)((x)->ifa_dstaddr))->sin6_addr)
> +#define IFA_IN6(x)     (&((struct bsd_sockaddr_in6
> *)((x)->ifa_addr))->sin6_addr)
> +#define IFA_DSTIN6(x)  (&((struct bsd_sockaddr_in6
> *)((x)->ifa_dstaddr))->sin6_addr)
>
> -#define IFPR_IN6(x)    (&((struct sockaddr_in6
> *)((x)->ifpr_prefix))->sin6_addr)
> +#define IFPR_IN6(x)    (&((struct bsd_sockaddr_in6
> *)((x)->ifpr_prefix))->sin6_addr)
>
>  #ifdef _KERNEL
>  #define IN6_ARE_MASKED_ADDR_EQUAL(d, a, m)     (       \
> @@ -726,7 +730,7 @@ struct sockopt;
>
>  /* Multicast KPIs. */
>  int    im6o_mc_filter(const struct ip6_moptions *, const struct ifnet *,
> -           const struct sockaddr *, const struct sockaddr *);
> +           const struct bsd_sockaddr *, const struct bsd_sockaddr *);
>  int    in6_mc_join(struct ifnet *, const struct in6_addr *,
>             struct in6_mfilter *, struct in6_multi **, int);
>  int    in6_mc_join_locked(struct ifnet *, const struct in6_addr *,
> @@ -755,7 +759,7 @@ int in6_control(struct socket *, u_long, caddr_t,
> struct ifnet *,
>         struct thread *);
>  int    in6_update_ifa(struct ifnet *, struct in6_aliasreq *,
>         struct in6_ifaddr *, int);
> -void   in6_purgeaddr(struct ifaddr *);
> +void   in6_purgeaddr(struct bsd_ifaddr *);
>  int    in6if_do_dad(struct ifnet *);
>  void   in6_purgeif(struct ifnet *);
>  void   in6_savemkludge(struct in6_ifaddr *);
> @@ -765,6 +769,7 @@ void        in6_setmaxmtu(void);
>  int    in6_if2idlen(struct ifnet *);
>  struct in6_ifaddr *in6ifa_ifpforlinklocal(struct ifnet *, int);
>  struct in6_ifaddr *in6ifa_ifpwithaddr(struct ifnet *, struct in6_addr *);
> +struct in6_ifaddr *in6ifa_llaonifp(struct ifnet *);
>

Some of these are new function which I guess (?) you plan to add in a later
patch, so you could have
added them in those patches, but I don't want to give you more annoying
work. I'm fine that they remain in this patch.

 char   *ip6_sprintf(char *, const struct in6_addr *);
>  int    in6_addr2zoneid(struct ifnet *, struct in6_addr *, u_int32_t *);
>  int    in6_matchlen(struct in6_addr *, struct in6_addr *);
> @@ -775,22 +780,119 @@ int      in6_prefix_ioctl(struct socket *, u_long,
> caddr_t,
>  int    in6_prefix_add_ifid(int, struct in6_ifaddr *);
>  void   in6_prefix_remove_ifid(int, struct in6_ifaddr *);
>  void   in6_purgeprefix(struct ifnet *);
> -void   in6_ifremloop(struct ifaddr *);
> -void   in6_ifaddloop(struct ifaddr *);
> +void   in6_ifremloop(struct bsd_ifaddr *);
> +void   in6_ifaddloop(struct bsd_ifaddr *);
>
> -int    in6_is_addr_deprecated(struct sockaddr_in6 *);
> +int    in6_is_addr_deprecated(struct bsd_sockaddr_in6 *);
>  int    in6_src_ioctl(u_long, caddr_t);
>
>  /*
>   * Extended API for IPv6 FIB support.
>   */
> -void   in6_rtredirect(struct sockaddr *, struct sockaddr *, struct
> sockaddr *,
> -           int, struct sockaddr *, u_int);
> -int    in6_rtrequest(int, struct sockaddr *, struct sockaddr *,
> -           struct sockaddr *, int, struct rtentry **, u_int);
> +void   in6_rtredirect(struct bsd_sockaddr *, struct bsd_sockaddr *,
> struct bsd_sockaddr *,
> +           int, struct bsd_sockaddr *, u_int);
> +int    in6_rtrequest(int, struct bsd_sockaddr *, struct bsd_sockaddr *,
> +           struct bsd_sockaddr *, int, struct rtentry **, u_int);
>  void   in6_rtalloc(struct route_in6 *, u_int);
>  void   in6_rtalloc_ign(struct route_in6 *, u_long, u_int);
> -struct rtentry *in6_rtalloc1(struct sockaddr *, int, u_long, u_int);
> +struct rtentry *in6_rtalloc1(struct bsd_sockaddr *, int, u_long, u_int);
>  #endif /* _KERNEL */
>
> +#ifdef _KERNEL
> +
> +/*
> + * These macros were originally ip6.h but g++ won't compile with it there
> + * and due to cicrular dependency had to move to in6_var.h
> + */
> +
> +/*
> + * IP6_EXTHDR_CHECK ensures that region between the IP6 header and the
> + * target header (including IPv6 itself, extension headers and
> + * TCP/UDP/ICMP6 headers) are contiguous. KAME requires drivers
> + * to store incoming data into one internal mbuf or one or more external
> + * mbufs(never into two or more internal mbufs). Thus, the third case is
> + * supposed to never be matched but is prepared just in case.
> + */
> +
> +#define IP6_EXTHDR_CHECK(m, off, hlen, ret)                            \
> +do {                                                                   \
> +    if ((m)->m_hdr.mh_next != NULL) {                                  \
> +       if (((m)->m_hdr.mh_flags & M_LOOP) &&                           \
> +           ((m)->m_hdr.mh_len < (off) + (hlen)) &&                     \
> +           (((m) = m_pullup((m), (off) + (hlen))) == NULL)) {          \
> +               V_ip6stat.ip6s_exthdrtoolong++;                         \
> +               return ret;                                             \
> +       } else if ((m)->m_hdr.mh_flags & M_EXT) {                       \
> +               if ((m)->m_hdr.mh_len < (off) + (hlen)) {               \
> +                       V_ip6stat.ip6s_exthdrtoolong++;                 \
> +                       m_freem(m);                                     \
> +                       return ret;                                     \
> +               }                                                       \
> +       } else {                                                        \
> +               if ((m)->m_hdr.mh_len < (off) + (hlen)) {               \
> +                       V_ip6stat.ip6s_exthdrtoolong++;                 \
> +                       m_freem(m);                                     \
> +                       return ret;                                     \
> +               }                                                       \
> +       }                                                               \
> +    } else {                                                           \
> +       if ((m)->m_hdr.mh_len < (off) + (hlen)) {                       \
> +               V_ip6stat.ip6s_tooshort++;                              \
> +               in6_ifstat_inc(m->M_dat.MH.MH_pkthdr.rcvif,
> ifs6_in_truncated); \
> +               m_freem(m);                                             \
> +               return ret;                                             \
> +       }                                                               \
> +    }                                                                  \
> +} while (/*CONSTCOND*/ 0)
> +
> +/*
> + * IP6_EXTHDR_GET ensures that intermediate protocol header (from "off" to
> + * "len") is located in single mbuf, on contiguous memory region.
> + * The pointer to the region will be returned to pointer variable "val",
> + * with type "typ".
> + * IP6_EXTHDR_GET0 does the same, except that it aligns the structure at
> the
> + * very top of mbuf.  GET0 is likely to make memory copy than GET.
> + *
> + * XXX we're now testing this, needs m_pulldown()
> + */
> +#define IP6_EXTHDR_GET(val, typ, m, off, len) \
> +do {                                                                   \
> +       struct mbuf *t;                                                 \
> +       int tmp;                                                        \
> +       if ((m)->m_hdr.mh_len >= (off) + (len))                         \
> +               (val) = (typ)(mtod((m), caddr_t) + (off));              \
> +       else {                                                          \
> +               t = m_pulldown((m), (off), (len), &tmp);                \
> +               if (t) {                                                \
> +                       if (t->m_hdr.mh_len < tmp + (len))              \
> +                               panic("m_pulldown malfunction");        \
> +                       (val) = (typ)(mtod(t, caddr_t) + tmp);          \
> +               } else {                                                \
> +                       (val) = (typ)NULL;                              \
> +                       (m) = NULL;                                     \
> +               }                                                       \
> +       }                                                               \
> +} while (/*CONSTCOND*/ 0)
> +
> +#define IP6_EXTHDR_GET0(val, typ, m, off, len) \
> +do {                                                                   \
> +       struct mbuf *t;                                                 \
> +       if ((off) == 0)                                                 \
> +               (val) = (typ)mtod(m, caddr_t);                          \
> +       else {                                                          \
> +               t = m_pulldown((m), (off), (len), NULL);                \
> +               if (t) {                                                \
> +                       if (t->m_hdr.mh_len < (len))                    \
> +                               panic("m_pulldown malfunction");        \
> +                       (val) = (typ)mtod(t, caddr_t);                  \
> +               } else {                                                \
> +                       (val) = (typ)NULL;                              \
> +                       (m) = NULL;                                     \
> +               }                                                       \
> +       }                                                               \
> +} while (/*CONSTCOND*/ 0)
> +
> +#endif /*_KERNEL*/
> +
> +
>  #endif /* _NETINET6_IN6_VAR_H_ */
> diff --git a/bsd/sys/netinet6/ip6_mroute.h b/bsd/sys/netinet6/ip6_mroute.h
> index 3f0e12b..44ef099 100644
> --- a/bsd/sys/netinet6/ip6_mroute.h
> +++ b/bsd/sys/netinet6/ip6_mroute.h
> @@ -111,8 +111,8 @@ struct mif6ctl {
>   * Argument structure for MRT6_ADD_MFC and MRT6_DEL_MFC
>   */
>  struct mf6cctl {
> -       struct sockaddr_in6 mf6cc_origin;       /* IPv6 origin of mcasts */
> -       struct sockaddr_in6 mf6cc_mcastgrp; /* multicast group associated
> */
> +       struct bsd_sockaddr_in6 mf6cc_origin;   /* IPv6 origin of mcasts */
> +       struct bsd_sockaddr_in6 mf6cc_mcastgrp; /* multicast group
> associated */
>         mifi_t          mf6cc_parent;   /* incoming ifindex */
>         struct if_set   mf6cc_ifset;    /* set of forwarding ifs */
>  };
> @@ -181,8 +181,8 @@ struct mrt6msg {
>   * packet counts
>   */
>  struct sioc_sg_req6 {
> -       struct sockaddr_in6 src;
> -       struct sockaddr_in6 grp;
> +       struct bsd_sockaddr_in6 src;
> +       struct bsd_sockaddr_in6 grp;
>         u_quad_t pktcnt;
>         u_quad_t bytecnt;
>         u_quad_t wrong_if;
> @@ -222,8 +222,8 @@ struct mif6 {
>   * The kernel's multicast forwarding cache entry structure
>   */
>  struct mf6c {
> -       struct sockaddr_in6  mf6c_origin;       /* IPv6 origin of mcasts
>    */
> -       struct sockaddr_in6  mf6c_mcastgrp;     /* multicast group
> associated*/
> +       struct bsd_sockaddr_in6  mf6c_origin;   /* IPv6 origin of mcasts
>    */
> +       struct bsd_sockaddr_in6  mf6c_mcastgrp; /* multicast group
> associated*/
>         mifi_t           mf6c_parent;           /* incoming IF
>    */
>         struct if_set    mf6c_ifset;            /* set of outgoing IFs */
>
> diff --git a/bsd/sys/netinet6/ip6_var.h b/bsd/sys/netinet6/ip6_var.h
> index 5e44c87..b2f9178 100644
> --- a/bsd/sys/netinet6/ip6_var.h
> +++ b/bsd/sys/netinet6/ip6_var.h
> @@ -127,7 +127,7 @@ struct      ip6po_rhinfo {
>
>  /* Nexthop related info */
>  struct ip6po_nhinfo {
> -       struct  sockaddr *ip6po_nhi_nexthop;
> +       struct  bsd_sockaddr *ip6po_nhi_nexthop;
>         struct  route_in6 ip6po_nhi_route; /* Route to the nexthop */
>  };
>  #define ip6po_nexthop  ip6po_nhinfo.ip6po_nhi_nexthop
> @@ -402,13 +402,12 @@ int       ip6_process_hopopts(struct mbuf *,
> u_int8_t *, int, u_int32_t *,
>  struct mbuf    **ip6_savecontrol_v4(struct inpcb *, struct mbuf *,
>             struct mbuf **, int *);
>  void   ip6_savecontrol(struct inpcb *, struct mbuf *, struct mbuf **);
> -void   ip6_notify_pmtu(struct inpcb *, struct sockaddr_in6 *,
> -                            u_int32_t *);
> +void   ip6_notify_pmtu(struct inpcb *, struct bsd_sockaddr_in6 *,
> u_int32_t *);
>  int    ip6_sysctl(int *, u_int, void *, size_t *, void *, size_t);
>
>  void   ip6_forward(struct mbuf *, int);
>
> -void   ip6_mloopback(struct ifnet *, struct mbuf *, struct sockaddr_in6
> *);
> +void   ip6_mloopback(struct ifnet *, struct mbuf *, struct
> bsd_sockaddr_in6 *);
>  int    ip6_output(struct mbuf *, struct ip6_pktopts *,
>                         struct route_in6 *,
>                         int,
> @@ -432,7 +431,7 @@ void        frag6_drain(void);
>
>  void   rip6_init(void);
>  int    rip6_input(struct mbuf **, int *, int);
> -void   rip6_ctlinput(int, struct sockaddr *, void *);
> +void   rip6_ctlinput(int, struct bsd_sockaddr *, void *);
>  int    rip6_ctloutput(struct socket *, struct sockopt *);
>  int    rip6_output(struct mbuf *, ...);
>  int    rip6_usrreq(struct socket *,
> @@ -441,13 +440,13 @@ int       rip6_usrreq(struct socket *,
>  int    dest6_input(struct mbuf **, int *, int);
>  int    none_input(struct mbuf **, int *, int);
>
> -int    in6_selectsrc(struct sockaddr_in6 *, struct ip6_pktopts *,
> +int    in6_selectsrc(struct bsd_sockaddr_in6 *, struct ip6_pktopts *,
>         struct inpcb *inp, struct route_in6 *, struct ucred *cred,
>         struct ifnet **, struct in6_addr *);
> -int in6_selectroute(struct sockaddr_in6 *, struct ip6_pktopts *,
> +int in6_selectroute(struct bsd_sockaddr_in6 *, struct ip6_pktopts *,
>         struct ip6_moptions *, struct route_in6 *, struct ifnet **,
>         struct rtentry **);
> -int    in6_selectroute_fib(struct sockaddr_in6 *, struct ip6_pktopts *,
> +int    in6_selectroute_fib(struct bsd_sockaddr_in6 *, struct ip6_pktopts
> *,
>             struct ip6_moptions *, struct route_in6 *, struct ifnet **,
>             struct rtentry **, u_int);
>  u_int32_t ip6_randomid(void);
> diff --git a/bsd/sys/netinet6/ip6protosw.h b/bsd/sys/netinet6/ip6protosw.h
> index 2924835..3b2c34b 100644
> --- a/bsd/sys/netinet6/ip6protosw.h
> +++ b/bsd/sys/netinet6/ip6protosw.h
> @@ -71,7 +71,7 @@
>   */
>
>  struct mbuf;
> -struct sockaddr;
> +struct bsd_sockaddr;
>  struct socket;
>  struct domain;
>  struct thread;
> @@ -103,8 +103,8 @@ struct ip6ctlparam {
>         struct icmp6_hdr *ip6c_icmp6;   /* icmp6 header of target packet */
>         struct ip6_hdr *ip6c_ip6;       /* ip6 header of target packet */
>         int ip6c_off;                   /* offset of the target proto
> header */
> -       struct sockaddr_in6 *ip6c_src;  /* srcaddr w/ additional info */
> -       struct sockaddr_in6 *ip6c_dst;  /* (final) dstaddr w/ additional
> info */
> +       struct bsd_sockaddr_in6 *ip6c_src;      /* srcaddr w/ additional
> info */
> +       struct bsd_sockaddr_in6 *ip6c_dst;      /* (final) dstaddr w/
> additional info */
>         struct in6_addr *ip6c_finaldst; /* final destination address */
>         void *ip6c_cmdarg;              /* control command dependent data
> */
>         u_int8_t ip6c_nxt;              /* final next header field */
> @@ -122,7 +122,7 @@ struct ip6protosw {
>         int     (*pr_output)            /* output to protocol (from above)
> */
>                         (struct mbuf *, ...);
>         void    (*pr_ctlinput)          /* control input (from below) */
> -                       (int, struct sockaddr *, void *);
> +                       (int, struct bsd_sockaddr *, void *);
>         int     (*pr_ctloutput)         /* control output (from above) */
>                         (struct socket *, struct sockopt *);
>
> diff --git a/bsd/sys/netinet6/mld6.h b/bsd/sys/netinet6/mld6.h
> index 415cf5c..0d7f3f1 100644
> --- a/bsd/sys/netinet6/mld6.h
> +++ b/bsd/sys/netinet6/mld6.h
> @@ -109,4 +109,11 @@ struct mldv2_record {
>   */
>  #define MLD_TIMER_SCALE                        1000
>
> +__BEGIN_DECLS
> +
> +extern void mld_init(void *);
> +extern void vnet_mld_init(const void *);
> +
> +__END_DECLS
> +
>  #endif /* _NETINET6_MLD6_H_ */
> diff --git a/bsd/sys/netinet6/nd6.h b/bsd/sys/netinet6/nd6.h
> index a40caab..5708e85 100644
> --- a/bsd/sys/netinet6/nd6.h
> +++ b/bsd/sys/netinet6/nd6.h
> @@ -38,8 +38,10 @@
>  #define RTF_ANNOUNCE   RTF_PROTO2
>  #endif
>
> -#include <sys/queue.h>
> -#include <sys/callout.h>
> +#include <bsd/sys/sys/queue.h>
> +#include <bsd/sys/netinet6/in6.h>
> +#include <bsd/sys/netinet6/in6_var.h>
> +#include <bsd/porting/callout.h>
>
>  struct llentry;
>
> @@ -103,7 +105,7 @@ struct nd_ifinfo {
>
>  struct in6_nbrinfo {
>         char ifname[IFNAMSIZ];  /* if name, e.g. "en0" */
> -       struct in6_addr addr;   /* IPv6 address of the neighbor */
> +       struct  in6_addr addr;  /* IPv6 address of the neighbor */
>         long    asked;          /* number of queries already sent for this
> addr */
>         int     isrouter;       /* if it acts as a router */
>         int     state;          /* reachability state */
> @@ -124,7 +126,7 @@ struct      in6_drlist {
>  };
>
>  struct in6_defrouter {
> -       struct  sockaddr_in6 rtaddr;
> +       struct  bsd_sockaddr_in6 rtaddr;
>         u_char  flags;
>         u_short rtlifetime;
>         u_long  expire;
> @@ -166,7 +168,7 @@ struct      in6_prlist {
>  };
>
>  struct in6_prefix {
> -       struct  sockaddr_in6 prefix;
> +       struct  bsd_sockaddr_in6 prefix;
>         struct prf_ra raflags;
>         u_char  prefixlen;
>         u_char  origin;
> @@ -177,7 +179,7 @@ struct in6_prefix {
>         int refcnt;
>         u_short if_index;
>         u_short advrtrs; /* number of advertisement routers */
> -       /* struct sockaddr_in6 advrtr[] */
> +       /* struct bsd_sockaddr_in6 advrtr[] */
>  };
>
>  #ifdef _KERNEL
> @@ -248,7 +250,7 @@ struct nd_prefixctl {
>         struct ifnet *ndpr_ifp;
>
>         /* prefix */
> -       struct sockaddr_in6 ndpr_prefix;
> +       struct bsd_sockaddr_in6 ndpr_prefix;
>         u_char  ndpr_plen;
>
>         u_int32_t ndpr_vltime;  /* advertised valid lifetime */
> @@ -261,7 +263,7 @@ struct nd_prefixctl {
>  struct nd_prefix {
>         struct ifnet *ndpr_ifp;
>         LIST_ENTRY(nd_prefix) ndpr_entry;
> -       struct sockaddr_in6 ndpr_prefix;        /* prefix */
> +       struct bsd_sockaddr_in6 ndpr_prefix;    /* prefix */
>         struct in6_addr ndpr_mask; /* netmask derived from the prefix */
>
>         u_int32_t ndpr_vltime;  /* advertised valid lifetime */
> @@ -341,7 +343,7 @@ VNET_DECLARE(int, nd6_onlink_ns_rfc4861);
>  #define        V_nd6_debug                     VNET(nd6_debug)
>  #define        V_nd6_onlink_ns_rfc4861         VNET(nd6_onlink_ns_rfc4861)
>
> -#define nd6log(x)      do { if (V_nd6_debug) log x; } while
> (/*CONSTCOND*/ 0)
> +#define nd6log(x)      do { if (V_nd6_debug) bsd_log x; } while
> (/*CONSTCOND*/ 0)
>
>  VNET_DECLARE(struct callout, nd6_timer_ch);
>  #define        V_nd6_timer_ch                  VNET(nd6_timer_ch)
> @@ -391,7 +393,7 @@ void nd6_destroy(void);
>  #endif
>  struct nd_ifinfo *nd6_ifattach(struct ifnet *);
>  void nd6_ifdetach(struct nd_ifinfo *);
> -int nd6_is_addr_neighbor(struct sockaddr_in6 *, struct ifnet *);
> +int nd6_is_addr_neighbor(struct bsd_sockaddr_in6 *, struct ifnet *);
>  void nd6_option_init(void *, int, union nd_opts *);
>  struct nd_opt_hdr *nd6_option(union nd_opts *);
>  int nd6_options(union nd_opts *);
> @@ -409,27 +411,27 @@ int nd6_ioctl(u_long, caddr_t, struct ifnet *);
>  struct llentry *nd6_cache_lladdr(struct ifnet *, struct in6_addr *,
>         char *, int, int, int);
>  int nd6_output(struct ifnet *, struct ifnet *, struct mbuf *,
> -       struct sockaddr_in6 *, struct rtentry *);
> +       struct bsd_sockaddr_in6 *, struct rtentry *);
>  int nd6_output_lle(struct ifnet *, struct ifnet *, struct mbuf *,
> -       struct sockaddr_in6 *, struct rtentry *, struct llentry *,
> +       struct bsd_sockaddr_in6 *, struct rtentry *, struct llentry *,
>         struct mbuf **);
>  int nd6_output_flush(struct ifnet *, struct ifnet *, struct mbuf *,
> -       struct sockaddr_in6 *, struct route *);
> +       struct bsd_sockaddr_in6 *, struct route *);
>  int nd6_need_cache(struct ifnet *);
>  int nd6_storelladdr(struct ifnet *, struct mbuf *,
> -       struct sockaddr *, u_char *, struct llentry **);
> +       struct bsd_sockaddr *, u_char *, struct llentry **);
>
>  /* nd6_nbr.c */
>  void nd6_na_input(struct mbuf *, int, int);
>  void nd6_na_output(struct ifnet *, const struct in6_addr *,
> -       const struct in6_addr *, u_long, int, struct sockaddr *);
> +       const struct in6_addr *, u_long, int, struct bsd_sockaddr *);
>  void nd6_ns_input(struct mbuf *, int, int);
>  void nd6_ns_output(struct ifnet *, const struct in6_addr *,
>         const struct in6_addr *, struct llentry *, int);
>  caddr_t nd6_ifptomac(struct ifnet *);
> -void nd6_dad_start(struct ifaddr *, int);
> -void nd6_dad_stop(struct ifaddr *);
> -void nd6_dad_duplicated(struct ifaddr *);
> +void nd6_dad_start(struct bsd_ifaddr *, int);
> +void nd6_dad_stop(struct bsd_ifaddr *);
> +void nd6_dad_duplicated(struct bsd_ifaddr *);
>
>  /* nd6_rtr.c */
>  void nd6_rs_input(struct mbuf *, int, int);
> diff --git a/bsd/sys/netinet6/scope6_var.h b/bsd/sys/netinet6/scope6_var.h
> index 08402ed..c29526d 100644
> --- a/bsd/sys/netinet6/scope6_var.h
> +++ b/bsd/sys/netinet6/scope6_var.h
> @@ -50,8 +50,8 @@ int   scope6_get(struct ifnet *, struct scope6_id *);
>  void   scope6_setdefault(struct ifnet *);
>  int    scope6_get_default(struct scope6_id *);
>  u_int32_t scope6_addr2default(struct in6_addr *);
> -int    sa6_embedscope(struct sockaddr_in6 *, int);
> -int    sa6_recoverscope(struct sockaddr_in6 *);
> +int    sa6_embedscope(struct bsd_sockaddr_in6 *, int);
> +int    sa6_recoverscope(struct bsd_sockaddr_in6 *);
>  int    in6_setscope(struct in6_addr *, struct ifnet *, u_int32_t *);
>  int    in6_clearscope(struct in6_addr *);
>  uint16_t in6_getscope(struct in6_addr *);
> diff --git a/bsd/sys/netinet6/send.h b/bsd/sys/netinet6/send.h
> index 23dc7ab..ab13478 100644
> --- a/bsd/sys/netinet6/send.h
> +++ b/bsd/sys/netinet6/send.h
> @@ -34,7 +34,7 @@
>
>  struct sockaddr_send {
>         uint8_t                 send_len;       /* total length */
> -       sa_family_t             send_family;    /* address family */
> +       bsd_sa_family_t         send_family;    /* address family */
>         int                     send_direction;
>         int                     send_ifidx;
>         char                    send_zero[8];
> diff --git a/bsd/sys/netinet6/tcp6_var.h b/bsd/sys/netinet6/tcp6_var.h
> index 0ea572e..c12ded1 100644
> --- a/bsd/sys/netinet6/tcp6_var.h
> +++ b/bsd/sys/netinet6/tcp6_var.h
> @@ -71,7 +71,7 @@ VNET_DECLARE(int, tcp_v6mssdflt);     /* XXX */
>  #endif
>
>  struct ip6_hdr;
> -void   tcp6_ctlinput(int, struct sockaddr *, void *);
> +void   tcp6_ctlinput(int, struct bsd_sockaddr *, void *);
>  void   tcp6_init(void);
>  int    tcp6_input(struct mbuf **, int *, int);
>  struct rtentry *tcp_rtlookup6(struct in_conninfo *);
> diff --git a/bsd/sys/netinet6/udp6_var.h b/bsd/sys/netinet6/udp6_var.h
> index e1549e2..721d257 100644
> --- a/bsd/sys/netinet6/udp6_var.h
> +++ b/bsd/sys/netinet6/udp6_var.h
> @@ -68,7 +68,7 @@ SYSCTL_DECL(_net_inet6_udp6);
>
>  extern struct pr_usrreqs       udp6_usrreqs;
>
> -void   udp6_ctlinput(int, struct sockaddr *, void *);
> +void   udp6_ctlinput(int, struct bsd_sockaddr *, void *);
>  int    udp6_input(struct mbuf **, int *, int);
>  #endif
>
> diff --git a/include/api/netinet/__icmp6.h b/include/api/netinet/__icmp6.h
> new file mode 100644
> index 0000000..f2ec2c9
> --- /dev/null
> +++ b/include/api/netinet/__icmp6.h
> @@ -0,0 +1,11 @@
> +#ifndef OSV__ICMP6_H_
> +#define OSV__ICMP6_H_
> +
> +#define ICMP6_FILTER 1
> +
> +#define ICMP6_FILTER_BLOCK              1
> +#define ICMP6_FILTER_PASS               2
> +#define ICMP6_FILTER_BLOCKOTHERS        3
> +#define ICMP6_FILTER_PASSONLY           4
> +
> +#endif /* OSV__ICMP6_H_ */
> diff --git a/include/api/netinet6/__in6.h b/include/api/netinet6/__in6.h
> new file mode 100644
> index 0000000..fc4e3f3
> --- /dev/null
> +++ b/include/api/netinet6/__in6.h
> @@ -0,0 +1,70 @@
> +/*
> + * Copyright (C) 2018 Cloudius Systems, Ltd.
> + *
> + * This work is open source software, licensed under the terms of the
> + * BSD license as described in the LICENSE file in the top-level
> directory.
> + */
> +
> +#ifndef OSV__IN6_H_
> +#define OSV__IN6_H_
> +
> +
> +#define IPV6_ADDRFORM           1
> +#define IPV6_2292PKTINFO        2
> +#define IPV6_2292HOPOPTS        3
> +#define IPV6_2292DSTOPTS        4
> +#define IPV6_2292RTHDR          5
> +#define IPV6_2292PKTOPTIONS     6
> +#define IPV6_CHECKSUM           7
> +#define IPV6_2292HOPLIMIT       8
> +#define SCM_SRCRT               IPV6_RXSRCRT
> +#define IPV6_NEXTHOP            9
> +#define IPV6_AUTHHDR            10
> +#define IPV6_UNICAST_HOPS       16
> +#define IPV6_MULTICAST_IF       17
> +#define IPV6_MULTICAST_HOPS     18
> +#define IPV6_MULTICAST_LOOP     19
> +#define IPV6_JOIN_GROUP         20
> +#define IPV6_LEAVE_GROUP        21
> +#define IPV6_ROUTER_ALERT       22
> +#define IPV6_MTU_DISCOVER       23
> +#define IPV6_MTU                24
> +#define IPV6_RECVERR            25
> +#define IPV6_V6ONLY             26
> +#define IPV6_JOIN_ANYCAST       27
> +#define IPV6_LEAVE_ANYCAST      28
> +#define IPV6_IPSEC_POLICY       34
> +#define IPV6_XFRM_POLICY        35
> +
> +#define IPV6_RECVPKTINFO        49
> +#define IPV6_PKTINFO            50
> +#define IPV6_RECVHOPLIMIT       51
> +#define IPV6_HOPLIMIT           52
> +#define IPV6_RECVHOPOPTS        53
> +#define IPV6_HOPOPTS            54
> +#define IPV6_RTHDRDSTOPTS       55
> +#define IPV6_RECVRTHDR          56
> +#define IPV6_RTHDR              57
> +#define IPV6_RECVDSTOPTS        58
> +#define IPV6_DSTOPTS            59
> +#define IPV6_DSTOPTS            59
> +#define IPV6_RECVPATHMTU        60
> +#define IPV6_PATHMTU            61
> +#define IPV6_DONTFRAG           62
> +#define IPV6_USE_MIN_MTU        63
> +
> +#define IPV6_RECVTCLASS         66
> +#define IPV6_TCLASS             67
> +
> +#define IPV6_AUTOFLOWLABEL      70
> +#define IPV6_ADDR_PREFERENCES   72
> +
> +#define IPV6_ADD_MEMBERSHIP     IPV6_JOIN_GROUP
> +#define IPV6_DROP_MEMBERSHIP    IPV6_LEAVE_GROUP
> +#define IPV6_RXHOPOPTS          IPV6_HOPOPTS
> +#define IPV6_RXDSTOPTS          IPV6_DSTOPTS
> +
> +/* This range is used for FreeBSD options which are not linux compatible
> */
> +#define IPV6_XOPTS_START        100
> +
> +#endif
> --
> 2.7.4
>
> --
> You received this message because you are subscribed to the Google Groups
> "OSv Development" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>

-- 
You received this message because you are subscribed to the Google Groups "OSv 
Development" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to