summaryrefslogtreecommitdiffstats
path: root/freebsd/sys/netinet6/in6.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2018-08-21 09:39:55 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2018-09-21 10:29:40 +0200
commit2df56dbd60bb5d925d2ce0ddbdefdbe6107ea783 (patch)
treebd7bad558534db4a1f400bc38a2c9aa7ea4f411e /freebsd/sys/netinet6/in6.c
parentUpdate to FreeBSD head 2018-02-01 (diff)
downloadrtems-libbsd-2df56dbd60bb5d925d2ce0ddbdefdbe6107ea783.tar.bz2
Update to FreeBSD head 2018-04-01
Git mirror commit 8dfb1ccc26d1cea7e2529303003ff61f9f1784c4. Update #3472.
Diffstat (limited to 'freebsd/sys/netinet6/in6.c')
-rw-r--r--freebsd/sys/netinet6/in6.c34
1 files changed, 28 insertions, 6 deletions
diff --git a/freebsd/sys/netinet6/in6.c b/freebsd/sys/netinet6/in6.c
index 6fc29892..a5d84d85 100644
--- a/freebsd/sys/netinet6/in6.c
+++ b/freebsd/sys/netinet6/in6.c
@@ -114,6 +114,14 @@ __FBSDID("$FreeBSD$");
#include <netinet6/in6_fib.h>
#include <netinet6/in6_pcb.h>
+/*
+ * struct in6_ifreq and struct ifreq must be type punnable for common members
+ * of ifr_ifru to allow accessors to be shared.
+ */
+_Static_assert(offsetof(struct in6_ifreq, ifr_ifru) ==
+ offsetof(struct ifreq, ifr_ifru),
+ "struct in6_ifreq and struct ifreq are not type punnable");
+
VNET_DECLARE(int, icmp6_nodeinfo_oldmcprefix);
#define V_icmp6_nodeinfo_oldmcprefix VNET(icmp6_nodeinfo_oldmcprefix)
@@ -480,10 +488,6 @@ in6_control(struct socket *so, u_long cmd, caddr_t data,
error = EINVAL;
goto out;
}
- /*
- * XXX: should we check if ifa_dstaddr is NULL and return
- * an error?
- */
ifr->ifr_dstaddr = ia->ia_dstaddr;
if ((error = sa6_recoverscope(&ifr->ifr_dstaddr)) != 0)
goto out;
@@ -1975,8 +1979,6 @@ in6_if2idlen(struct ifnet *ifp)
return (64);
case IFT_FDDI: /* RFC2467 */
return (64);
- case IFT_ISO88025: /* RFC2470 (IPv6 over Token Ring) */
- return (64);
case IFT_PPP: /* RFC2472 */
return (64);
case IFT_ARCNET: /* RFC2497 */
@@ -2152,6 +2154,25 @@ in6_lltable_rtcheck(struct ifnet *ifp,
return 0;
}
+/*
+ * Called by the datapath to indicate that the entry was used.
+ */
+static void
+in6_lltable_mark_used(struct llentry *lle)
+{
+
+ LLE_REQ_LOCK(lle);
+ lle->r_skip_req = 0;
+
+ /*
+ * Set the hit time so the callback function
+ * can determine the remaining time before
+ * transiting to the DELAY state.
+ */
+ lle->lle_hittime = time_uptime;
+ LLE_REQ_UNLOCK(lle);
+}
+
static inline uint32_t
in6_lltable_hash_dst(const struct in6_addr *dst, uint32_t hsize)
{
@@ -2384,6 +2405,7 @@ in6_lltattach(struct ifnet *ifp)
llt->llt_fill_sa_entry = in6_lltable_fill_sa_entry;
llt->llt_free_entry = in6_lltable_free_entry;
llt->llt_match_prefix = in6_lltable_match_prefix;
+ llt->llt_mark_used = in6_lltable_mark_used;
lltable_link(llt);
return (llt);