Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 9 Dec 2014 00:48:08 +0000 (UTC)
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r275628 - in projects/routing/sys: net netinet netinet6
Message-ID:  <201412090048.sB90m8tC065610@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: melifaro
Date: Tue Dec  9 00:48:08 2014
New Revision: 275628
URL: https://svnweb.freebsd.org/changeset/base/275628

Log:
  * Do not assume lle has sockaddr key after struct lle:
     use llt_fill_sa_entry() llt method to store lle address in sa.
  * Eliminate L3_ADDR macro and either reference IPv4/IPv6 address
     directly from lle or use newly-created llt_fill_sa_entry().
  * Do not store sockaddr inside arp/ndp lle anymore.

Modified:
  projects/routing/sys/net/if_llatbl.h
  projects/routing/sys/netinet/if_ether.c
  projects/routing/sys/netinet/in.c
  projects/routing/sys/netinet/toecore.c
  projects/routing/sys/netinet6/in6.c
  projects/routing/sys/netinet6/nd6.c
  projects/routing/sys/netinet6/nd6_nbr.c

Modified: projects/routing/sys/net/if_llatbl.h
==============================================================================
--- projects/routing/sys/net/if_llatbl.h	Tue Dec  9 00:47:46 2014	(r275627)
+++ projects/routing/sys/net/if_llatbl.h	Tue Dec  9 00:48:08 2014	(r275628)
@@ -135,10 +135,6 @@ struct llentry {
 #define	ln_timer_ch	lle_timer.ln_timer_ch
 #define	la_timer	lle_timer.la_timer
 
-/* XXX bad name */
-#define	L3_ADDR(lle)	((struct sockaddr *)(&lle[1]))
-#define	L3_ADDR_LEN(lle)	(((struct sockaddr *)(&lle[1]))->sa_len)
-
 #ifndef LLTBL_HASHTBL_SIZE
 #define	LLTBL_HASHTBL_SIZE	32	/* default 32 ? */
 #endif
@@ -165,6 +161,7 @@ typedef void (llt_unlink_entry_t)(struct
 typedef int (llt_prepare_sentry_t)(struct lltable *, struct llentry *,
     struct rt_addrinfo *);
 typedef const void *(llt_get_sa_addr_t)(const struct sockaddr *l3addr);
+typedef void (llt_fill_sa_entry_t)(const struct llentry *, struct sockaddr *);
 
 typedef int (llt_foreach_cb_t)(struct lltable *, struct llentry *, void *);
 typedef int (llt_foreach_entry_t)(struct lltable *, llt_foreach_cb_t *, void *);
@@ -188,6 +185,7 @@ struct lltable {
 	llt_unlink_entry_t	*llt_unlink_entry;
 	llt_prepare_sentry_t	*llt_prepare_static_entry;
 	llt_get_sa_addr_t	*llt_get_sa_addr;
+	llt_fill_sa_entry_t	*llt_fill_sa_entry;
 	llt_free_tbl_t		*llt_free_tbl;
 };
 
@@ -271,6 +269,16 @@ lltable_unlink_entry(struct lltable *llt
 	llt->llt_unlink_entry(lle);
 }
 
+static __inline void
+lltable_fill_sa_entry(const struct llentry *lle, struct sockaddr *sa)
+{
+	struct lltable *llt;
+
+	llt = lle->lle_tbl;
+
+	llt->llt_fill_sa_entry(lle, sa);
+}
+
 int		lla_rt_output(struct rt_msghdr *, struct rt_addrinfo *);
 
 #include <sys/eventhandler.h>

Modified: projects/routing/sys/netinet/if_ether.c
==============================================================================
--- projects/routing/sys/netinet/if_ether.c	Tue Dec  9 00:47:46 2014	(r275627)
+++ projects/routing/sys/netinet/if_ether.c	Tue Dec  9 00:48:08 2014	(r275628)
@@ -232,9 +232,7 @@ arptimer(void *arg)
 	case ARP_LLINFO_VERIFY:
 		if (lle->r_kick == 0 && lle->la_preempt > 0) {
 			/* Entry was used, issue refresh request */
-			struct sockaddr_in *dst;
-			dst = (struct sockaddr_in *)L3_ADDR(lle);
-			arprequest(ifp, NULL, &dst->sin_addr, NULL);
+			arprequest(ifp, NULL, &lle->r_l3addr.addr4, NULL);
 			lle->la_preempt--;
 			lle->r_kick = 1;
 			callout_schedule(&lle->la_timer, hz * V_arpt_rexmit);
@@ -1193,7 +1191,7 @@ arp_update_lle(struct arphdr *ah, struct
 		m_hold = la->la_hold;
 		la->la_hold = NULL;
 		la->la_numheld = 0;
-		memcpy(&sin, L3_ADDR(la), sizeof(sin));
+		lltable_fill_sa_entry(la, (struct sockaddr *)&sin);
 		LLE_WUNLOCK(la);
 		for (; m_hold != NULL; m_hold = m_hold_next) {
 			m_hold_next = m_hold->m_nextpkt;

Modified: projects/routing/sys/netinet/in.c
==============================================================================
--- projects/routing/sys/netinet/in.c	Tue Dec  9 00:47:46 2014	(r275627)
+++ projects/routing/sys/netinet/in.c	Tue Dec  9 00:48:08 2014	(r275628)
@@ -988,11 +988,6 @@ in_purgemaddrs(struct ifnet *ifp)
 	IN_MULTI_UNLOCK();
 }
 
-struct in_llentry {
-	struct llentry		base;
-	struct sockaddr_in	l3_addr4;
-};
-
 /*
  * Frees unlinked record.
  * This function is called by the timer functions
@@ -1011,17 +1006,13 @@ in_lltable_free(struct llentry *lle)
 static struct llentry *
 in_lltable_new(struct in_addr addr4, u_int flags)
 {
-	struct in_llentry *lle;
+	struct llentry *lle;
 
-	lle = malloc(sizeof(struct in_llentry), M_LLTABLE, M_NOWAIT | M_ZERO);
+	lle = malloc(sizeof(struct llentry), M_LLTABLE, M_NOWAIT | M_ZERO);
 	if (lle == NULL)		/* NB: caller generates msg */
 		return NULL;
 
 	lle->base.r_l3addr.addr4 = addr4;
-	/* XXX: Legacy */
-	lle->l3_addr4.sin_len = sizeof(lle->l3_addr4);
-	lle->l3_addr4.sin_family = AF_INET;
-	lle->l3_addr4.sin_addr = addr4;
 
 	/*
 	 * For IPv4 this will trigger "arpresolve" to generate
@@ -1038,7 +1029,7 @@ in_lltable_new(struct in_addr addr4, u_i
 }
 
 #define IN_ARE_MASKED_ADDR_EQUAL(d, a, m)	(			\
-	    (((ntohl((d)->sin_addr.s_addr) ^ (a)->sin_addr.s_addr) & (m)->sin_addr.s_addr)) == 0 )
+	    (((ntohl((d).s_addr) ^ (a)->sin_addr.s_addr) & (m)->sin_addr.s_addr)) == 0 )
 
 static int
 in_lltable_match_prefix(const struct sockaddr *prefix,
@@ -1051,7 +1042,7 @@ in_lltable_match_prefix(const struct soc
 	 * (flags & LLE_STATIC) means deleting all entries
 	 * including static ARP entries.
 	 */
-	if (IN_ARE_MASKED_ADDR_EQUAL(satosin(L3_ADDR(lle)), pfx, msk) &&
+	if (IN_ARE_MASKED_ADDR_EQUAL(lle->r_l3addr.addr4, pfx, msk) &&
 	    ((flags & LLE_STATIC) || !(lle->la_flags & LLE_STATIC)))
 		return (1);
 
@@ -1118,6 +1109,18 @@ in_lltable_get_sa_addr(const struct sock
 	return ((const void *)&sin->sin_addr);
 }
 
+static void
+in_lltable_fill_sa_entry(const struct llentry *lle, struct sockaddr *sa)
+{
+	struct sockaddr_in *sin;
+
+	sin = (struct sockaddr_in *)sa;
+	bzero(sin, sizeof(*sin));
+	sin->sin_family = AF_INET;
+	sin->sin_len = sizeof(*sin);
+	sin->sin_addr = lle->r_l3addr.addr4;
+}
+
 static inline struct llentry *
 in_lltable_find_dst(struct lltable *llt, struct in_addr dst)
 {
@@ -1251,8 +1254,11 @@ in_lltable_dump_entry(struct lltable *ll
 	struct sockaddr_dl *sdl;
 	int error;
 
+	bzero(&arpc, sizeof(arpc));
 			/* Skip if jailed and not a valid IP of the prison. */
-			if (prison_if(wr->td->td_ucred, L3_ADDR(lle)) != 0)
+			lltable_fill_sa_entry(lle,(struct sockaddr *)&arpc.sin);
+			if (prison_if(wr->td->td_ucred,
+			    (struct sockaddr *)&arpc.sin) != 0)
 				return (0);
 			/*
 			 * produce a msg made of:
@@ -1260,15 +1266,11 @@ in_lltable_dump_entry(struct lltable *ll
 			 *  struct sockaddr_in; (IPv4)
 			 *  struct sockaddr_dl;
 			 */
-			bzero(&arpc, sizeof(arpc));
 			arpc.rtm.rtm_msglen = sizeof(arpc);
 			arpc.rtm.rtm_version = RTM_VERSION;
 			arpc.rtm.rtm_type = RTM_GET;
 			arpc.rtm.rtm_flags = RTF_UP;
 			arpc.rtm.rtm_addrs = RTA_DST | RTA_GATEWAY;
-			arpc.sin.sin_family = AF_INET;
-			arpc.sin.sin_len = sizeof(arpc.sin);
-			arpc.sin.sin_addr.s_addr = lle->r_l3addr.addr4.s_addr;
 
 			/* publish */
 			if (lle->la_flags & LLE_PUB)
@@ -1317,6 +1319,7 @@ in_domifattach(struct ifnet *ifp)
 	llt->llt_dump_entry = in_lltable_dump_entry;
 	llt->llt_hash = in_lltable_hash;
 	llt->llt_get_sa_addr = in_lltable_get_sa_addr;
+	llt->llt_fill_sa_entry = in_lltable_fill_sa_entry;
 	llt->llt_clear_entry = arp_lltable_clear_entry;
 	llt->llt_match_prefix = in_lltable_match_prefix;
 	llt->llt_prepare_static_entry = arp_lltable_prepare_static_entry;

Modified: projects/routing/sys/netinet/toecore.c
==============================================================================
--- projects/routing/sys/netinet/toecore.c	Tue Dec  9 00:47:46 2014	(r275627)
+++ projects/routing/sys/netinet/toecore.c	Tue Dec  9 00:48:08 2014	(r275628)
@@ -392,21 +392,26 @@ toe_lle_event(void *arg __unused, struct
 	struct sockaddr *sa;
 	uint8_t *lladdr;
 	uint16_t vtag;
+	int sa_family;
+	struct sockaddr_storage ss;
 
 	LLE_WLOCK_ASSERT(lle);
 
 	ifp = lle->lle_tbl->llt_ifp;
-	sa = L3_ADDR(lle);
+	sa_family = lle->lle_tbl->llt_af;
 
+#if 0
+	/* XXX: Do not panic, ignore event instead */
 	KASSERT(sa->sa_family == AF_INET || sa->sa_family == AF_INET6,
 	    ("%s: lle_event %d for lle %p but sa %p !INET && !INET6",
 	    __func__, evt, lle, sa));
+#endif
 
 	/*
 	 * Not interested if the interface's TOE capability is not enabled.
 	 */
-	if ((sa->sa_family == AF_INET && !(ifp->if_capenable & IFCAP_TOE4)) ||
-	    (sa->sa_family == AF_INET6 && !(ifp->if_capenable & IFCAP_TOE6)))
+	if ((sa_family == AF_INET && !(ifp->if_capenable & IFCAP_TOE4)) ||
+	    (sa_family == AF_INET6 && !(ifp->if_capenable & IFCAP_TOE6)))
 		return;
 
 	tod = TOEDEV(ifp);
@@ -433,6 +438,8 @@ toe_lle_event(void *arg __unused, struct
 #endif
 	}
 
+	sa = (struct sockaddr *)&ss;
+	lltable_fill_sa_entry(lle, sa);
 	tod->tod_l2_update(tod, ifp, sa, lladdr, vtag);
 }
 

Modified: projects/routing/sys/netinet6/in6.c
==============================================================================
--- projects/routing/sys/netinet6/in6.c	Tue Dec  9 00:47:46 2014	(r275627)
+++ projects/routing/sys/netinet6/in6.c	Tue Dec  9 00:48:08 2014	(r275628)
@@ -2046,11 +2046,6 @@ in6_if2idlen(struct ifnet *ifp)
 
 #include <sys/sysctl.h>
 
-struct in6_llentry {
-	struct llentry		base;
-	struct sockaddr_in6	l3_addr6;
-};
-
 /*
  * Frees already unlinked @lle.
  */
@@ -2066,17 +2061,13 @@ in6_lltable_free(struct llentry *lle)
 static struct llentry *
 in6_lltable_new(const struct in6_addr *addr6, u_int flags)
 {
-	struct in6_llentry *lle;
+	struct llentry *lle;
 
-	lle = malloc(sizeof(struct in6_llentry), M_LLTABLE, M_NOWAIT | M_ZERO);
+	lle = malloc(sizeof(struct llentry), M_LLTABLE, M_NOWAIT | M_ZERO);
 	if (lle == NULL)		/* NB: caller generates msg */
 		return NULL;
 
 	lle->base.r_l3addr.addr6 = *addr6;
-	/* XXX: legacy */
-	lle->l3_addr6.sin6_family = AF_INET6;
-	lle->l3_addr6.sin6_len = sizeof(lle->l3_addr6);
-	lle->l3_addr6.sin6_addr = *addr6;
 	lle->base.lle_refcnt = 1;
 	lle->base.lle_free = in6_lltable_free;
 	LLE_LOCK_INIT(&lle->base);
@@ -2093,7 +2084,7 @@ in6_lltable_match_prefix(const struct so
 	const struct sockaddr_in6 *pfx = (const struct sockaddr_in6 *)prefix;
 	const struct sockaddr_in6 *msk = (const struct sockaddr_in6 *)mask;
 
-	if (IN6_ARE_MASKED_ADDR_EQUAL(&satosin6(L3_ADDR(lle))->sin6_addr,
+	if (IN6_ARE_MASKED_ADDR_EQUAL(&lle->r_l3addr.addr6,
 	    &pfx->sin6_addr, &msk->sin6_addr) &&
 	    ((flags & LLE_STATIC) || !(lle->la_flags & LLE_STATIC)))
 		return (1);
@@ -2164,6 +2155,18 @@ in6_lltable_get_sa_addr(const struct soc
 	return ((const void *)&sin6->sin6_addr);
 }
 
+static void
+in6_lltable_fill_sa_entry(const struct llentry *lle, struct sockaddr *sa)
+{
+	struct sockaddr_in6 *sin6;
+
+	sin6 = (struct sockaddr_in6 *)sa;
+	bzero(sin6, sizeof(*sin6));
+	sin6->sin6_family = AF_INET6;
+	sin6->sin6_len = sizeof(*sin6);
+	sin6->sin6_addr = lle->r_l3addr.addr6;
+}
+
 static inline struct llentry *
 in6_lltable_find_dst(struct lltable *llt, const struct in6_addr *dst)
 {
@@ -2300,11 +2303,15 @@ in6_lltable_dump_entry(struct lltable *l
 	struct sockaddr_dl *sdl;
 	int error;
 
+	bzero(&ndpc, sizeof(ndpc));
 			/* skip invalid entries */
 			if ((lle->la_flags & LLE_VALID) == 0)
 				return (0);
 			/* Skip if jailed and not a valid IP of the prison. */
-			if (prison_if(wr->td->td_ucred, L3_ADDR(lle)) != 0)
+			lltable_fill_sa_entry(lle,
+			    (struct sockaddr *)&ndpc.sin6);
+			if (prison_if(wr->td->td_ucred,
+			    (struct sockaddr *)&ndpc.sin6) != 0)
 				return (0);
 			/*
 			 * produce a msg made of:
@@ -2312,15 +2319,11 @@ in6_lltable_dump_entry(struct lltable *l
 			 *  struct sockaddr_in6 (IPv6)
 			 *  struct sockaddr_dl;
 			 */
-			bzero(&ndpc, sizeof(ndpc));
 			ndpc.rtm.rtm_msglen = sizeof(ndpc);
 			ndpc.rtm.rtm_version = RTM_VERSION;
 			ndpc.rtm.rtm_type = RTM_GET;
 			ndpc.rtm.rtm_flags = RTF_UP;
 			ndpc.rtm.rtm_addrs = RTA_DST | RTA_GATEWAY;
-			ndpc.sin6.sin6_family = AF_INET6;
-			ndpc.sin6.sin6_len = sizeof(ndpc.sin6);
-			bcopy(L3_ADDR(lle), &ndpc.sin6, L3_ADDR_LEN(lle));
 			if (V_deembed_scopeid)
 				sa6_recoverscope(&ndpc.sin6);
 
@@ -2389,6 +2392,7 @@ in6_domifattach(struct ifnet *ifp)
 	llt->llt_dump_entry = in6_lltable_dump_entry;
 	llt->llt_hash = in6_lltable_hash;
 	llt->llt_get_sa_addr = in6_lltable_get_sa_addr;
+	llt->llt_fill_sa_entry = in6_lltable_fill_sa_entry;
 	llt->llt_clear_entry = nd6_lltable_clear_entry;
 	llt->llt_match_prefix = in6_lltable_match_prefix;
 	llt->llt_prepare_static_entry = nd6_lltable_prepare_static_entry;

Modified: projects/routing/sys/netinet6/nd6.c
==============================================================================
--- projects/routing/sys/netinet6/nd6.c	Tue Dec  9 00:47:46 2014	(r275627)
+++ projects/routing/sys/netinet6/nd6.c	Tue Dec  9 00:48:08 2014	(r275628)
@@ -68,7 +68,6 @@ __FBSDID("$FreeBSD$");
 #include <netinet/in.h>
 #include <netinet/in_kdtrace.h>
 #include <net/if_llatbl.h>
-#define	L3_ADDR_SIN6(le)	((struct sockaddr_in6 *) L3_ADDR(le))
 #include <netinet/if_ether.h>
 #include <netinet6/in6_var.h>
 #include <netinet/ip6.h>
@@ -543,7 +542,7 @@ nd6_llinfo_timer(void *arg)
 	CURVNET_SET(ifp->if_vnet);
 
 	ndi = ND_IFINFO(ifp);
-	dst = &L3_ADDR_SIN6(ln)->sin6_addr;
+	dst = &ln->r_l3addr.addr6;
 
 	/*
 	 * Each case statement needs to unlock @ln before break/return.
@@ -1122,7 +1121,7 @@ nd6_check_del_defrtr(struct lltable *llt
 	struct in6_addr dst;
 
 	ifp = llt->llt_ifp;
-	dst = L3_ADDR_SIN6(ln)->sin6_addr;
+	dst = ln->r_l3addr.addr6;
 
 	LLE_WLOCK_ASSERT(ln);
 
@@ -1165,7 +1164,7 @@ nd6_check_recalc_defrtr(struct lltable *
 	struct in6_addr dst;
 
 	ifp = llt->llt_ifp;
-	dst = L3_ADDR_SIN6(ln)->sin6_addr;
+	dst = ln->r_l3addr.addr6;
 
 	LLE_WLOCK_ASSERT(ln);
 
@@ -1909,6 +1908,8 @@ nd6_cache_lladdr(struct ifnet *ifp, stru
 			if (ln->la_hold) {
 				struct mbuf *m_hold, *m_hold_next;
 
+				lltable_fill_sa_entry(ln, (struct sockaddr *)&sin6);
+
 				/*
 				 * reset the la_hold in advance, to explicitly
 				 * prevent a la_hold lookup in nd6_output()
@@ -1924,15 +1925,12 @@ nd6_cache_lladdr(struct ifnet *ifp, stru
 					 * just set the 2nd argument as the
 					 * 1st one.
 					 */
-					nd6_output_lle(ifp, ifp, m_hold, L3_ADDR_SIN6(ln), NULL, ln, &chain);
+					nd6_output_lle(ifp, ifp, m_hold, &sin6, NULL, ln, &chain);
 				}
 				/*
 				 * If we have mbufs in the chain we need to do
-				 * deferred transmit. Copy the address from the
-				 * llentry before dropping the lock down below.
+				 * deferred transmit.
 				 */
-				if (chain != NULL)
-					memcpy(&sin6, L3_ADDR_SIN6(ln), sizeof(sin6));
 			}
 		} else if (ln->ln_state == ND6_LLINFO_INCOMPLETE) {
 			/* probe right away */

Modified: projects/routing/sys/netinet6/nd6_nbr.c
==============================================================================
--- projects/routing/sys/netinet6/nd6_nbr.c	Tue Dec  9 00:47:46 2014	(r275627)
+++ projects/routing/sys/netinet6/nd6_nbr.c	Tue Dec  9 00:48:08 2014	(r275628)
@@ -65,7 +65,6 @@ __FBSDID("$FreeBSD$");
 #include <netinet/in.h>
 #include <netinet/in_var.h>
 #include <net/if_llatbl.h>
-#define	L3_ADDR_SIN6(le)	((struct sockaddr_in6 *) L3_ADDR(le))
 #include <netinet6/in6_var.h>
 #include <netinet6/in6_ifattach.h>
 #include <netinet/ip6.h>
@@ -824,7 +823,7 @@ nd6_na_input(struct mbuf *m, int off, in
 			struct nd_defrouter *dr;
 			struct in6_addr *in6;
 
-			in6 = &L3_ADDR_SIN6(ln)->sin6_addr;
+			in6 = &ln->r_l3addr.addr6;
 
 			/*
 			 * Lock to protect the default router list.
@@ -879,13 +878,15 @@ nd6_na_input(struct mbuf *m, int off, in
 				m_tag_prepend(m, mtag);
 			}
 
-			nd6_output_lle(ifp, ifp, m_hold, L3_ADDR_SIN6(ln), NULL, ln, &chain);
+			lltable_fill_sa_entry(ln, (struct sockaddr *)&sin6);
+			nd6_output_lle(ifp, ifp, m_hold, &sin6, NULL, ln,
+			    &chain);
 		}
 	}
  freeit:
 	if (ln != NULL) {
 		if (chain)
-			memcpy(&sin6, L3_ADDR_SIN6(ln), sizeof(sin6));
+			lltable_fill_sa_entry(ln, (struct sockaddr *)&sin6);
 		LLE_WUNLOCK(ln);
 
 		if (chain)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201412090048.sB90m8tC065610>