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>
+
#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);
+ 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 */
-/* 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;
+};
+
+
/*
* 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 *);
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.