Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 7 Dec 2014 23:59:45 +0000 (UTC)
From:      "Alexander V. Chernikov" <melifaro@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r275587 - in projects/routing/sys: net netinet netinet6
Message-ID:  <201412072359.sB7NxjDH009339@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: melifaro
Date: Sun Dec  7 23:59:44 2014
New Revision: 275587
URL: https://svnweb.freebsd.org/changeset/base/275587

Log:
  Use llt_prepare_static_entry method to prepare valid per-af static entry.

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

Modified: projects/routing/sys/net/if_llatbl.c
==============================================================================
--- projects/routing/sys/net/if_llatbl.c	Sun Dec  7 23:08:07 2014	(r275586)
+++ projects/routing/sys/net/if_llatbl.c	Sun Dec  7 23:59:44 2014	(r275587)
@@ -440,7 +440,7 @@ lla_rt_output(struct rt_msghdr *rtm, str
 	struct sockaddr *dst = (struct sockaddr *)info->rti_info[RTAX_DST];
 	struct ifnet *ifp;
 	struct lltable *llt;
-	struct llentry *lle;
+	struct llentry *lle, *lle_tmp;
 	u_int laflags = 0;
 	int error;
 
@@ -469,36 +469,37 @@ lla_rt_output(struct rt_msghdr *rtm, str
 	switch (rtm->rtm_type) {
 	case RTM_ADD:
 		/* Add static LLE */
-		IF_AFDATA_CFG_WLOCK(ifp);
 		lle = llt->llt_create(llt, 0, dst);
-		if (lle == NULL) {
-			IF_AFDATA_CFG_WUNLOCK(ifp);
+		if (lle == NULL)
 			return (ENOMEM);
-		}
-
 
-		IF_AFDATA_RUN_WLOCK(ifp);
+		/* Save initial info to provide to _prepare hook */
 		bcopy(LLADDR(dl), &lle->ll_addr, ifp->if_addrlen);
 		if ((rtm->rtm_flags & RTF_ANNOUNCE))
 			lle->la_flags |= LLE_PUB;
-		lle->la_flags |= LLE_VALID;
-#ifdef INET6
-		/*
-		 * ND6
-		 */
-		if (dst->sa_family == AF_INET6)
-			lle->ln_state = ND6_LLINFO_REACHABLE;
-#endif
-		/*
-		 * NB: arp and ndp always set (RTF_STATIC | RTF_HOST)
-		 */
-
-		if (rtm->rtm_rmx.rmx_expire == 0) {
-			lle->la_flags |= LLE_STATIC;
-			lle->r_flags |= RLLE_VALID;
-			lle->la_expire = 0;
-		} else
-			lle->la_expire = rtm->rtm_rmx.rmx_expire;
+		lle->la_expire = rtm->rtm_rmx.rmx_expire;
+
+		error = llt->llt_prepare_static_entry(llt, lle, info);
+
+		if (error != 0) {
+			LLE_FREE(lle);
+			return (error);
+		}
+
+		/* Let's try to link new lle to the list */
+		IF_AFDATA_CFG_WLOCK(ifp);
+		LLE_WLOCK(lle);
+		/* Check if we already have this lle */
+		/* XXX: Use LLE_UNLOCKED */
+		lle_tmp = llt->llt_lookup(llt, LLE_EXCLUSIVE, dst);
+		if (lle_tmp != NULL) {
+			IF_AFDATA_CFG_WUNLOCK(ifp);
+			LLE_WUNLOCK(lle_tmp);
+			LLE_FREE_LOCKED(lle);
+			return (EEXIST);
+		}
+
+		IF_AFDATA_RUN_WLOCK(ifp);
 		llentry_link(llt, lle);
 		IF_AFDATA_RUN_WUNLOCK(ifp);
 		laflags = lle->la_flags;

Modified: projects/routing/sys/net/if_llatbl.h
==============================================================================
--- projects/routing/sys/net/if_llatbl.h	Sun Dec  7 23:08:07 2014	(r275586)
+++ projects/routing/sys/net/if_llatbl.h	Sun Dec  7 23:59:44 2014	(r275587)
@@ -162,6 +162,8 @@ typedef void (llt_clear_entry_t)(struct 
 typedef void (llt_free_tbl_t)(struct lltable *);
 typedef void (llt_link_entry_t)(struct lltable *, struct llentry *);
 typedef void (llt_unlink_entry_t)(struct llentry *);
+typedef int (llt_prepare_sentry_t)(struct lltable *, struct llentry *,
+    struct rt_addrinfo *);
 
 typedef int (llt_foreach_cb_t)(struct lltable *, struct llentry *, void *);
 typedef int (llt_foreach_entry_t)(struct lltable *, llt_foreach_cb_t *, void *);
@@ -183,6 +185,7 @@ struct lltable {
 	llt_foreach_entry_t	*llt_foreach_entry;
 	llt_link_entry_t	*llt_link_entry;
 	llt_unlink_entry_t	*llt_unlink_entry;
+	llt_prepare_sentry_t	*llt_prepare_static_entry;
 	llt_free_tbl_t		*llt_free_tbl;
 };
 

Modified: projects/routing/sys/netinet/if_ether.c
==============================================================================
--- projects/routing/sys/netinet/if_ether.c	Sun Dec  7 23:08:07 2014	(r275586)
+++ projects/routing/sys/netinet/if_ether.c	Sun Dec  7 23:59:44 2014	(r275587)
@@ -268,6 +268,20 @@ arptimer(void *arg)
 	CURVNET_RESTORE();
 }
 
+int
+arp_lltable_prepare_static_entry(struct lltable *llt, struct llentry *lle,
+    struct rt_addrinfo *info)
+{
+
+	lle->la_flags |= LLE_VALID;
+	lle->r_flags |= RLLE_VALID;
+
+	if (lle->la_expire == 0)
+		lle->la_flags |= LLE_STATIC;
+
+	return (0);
+}
+
 /*
  * Calback for lltable.
  */

Modified: projects/routing/sys/netinet/if_ether.h
==============================================================================
--- projects/routing/sys/netinet/if_ether.h	Sun Dec  7 23:08:07 2014	(r275586)
+++ projects/routing/sys/netinet/if_ether.h	Sun Dec  7 23:59:44 2014	(r275587)
@@ -115,6 +115,7 @@ extern u_char	ether_ipmulticast_max[ETHE
 struct lltable;
 struct llentry;
 struct ifaddr;
+struct rt_addrinfo;
 
 int	arpresolve(struct ifnet *ifp, struct rtentry *rt, struct mbuf *m,
 	    const struct sockaddr *dst, u_char *desten, struct llentry **lle);
@@ -126,6 +127,8 @@ void	arp_ifinit(struct ifnet *, struct i
 void	arp_ifinit2(struct ifnet *, struct ifaddr *, u_char *);
 void	arp_ifscrub(struct ifnet *, uint32_t);
 void	arp_lltable_clear_entry(struct lltable *, struct llentry *);
+int	arp_lltable_prepare_static_entry(struct lltable *, struct llentry *,
+	    struct rt_addrinfo *);
 #endif
 
 #endif

Modified: projects/routing/sys/netinet/in.c
==============================================================================
--- projects/routing/sys/netinet/in.c	Sun Dec  7 23:08:07 2014	(r275586)
+++ projects/routing/sys/netinet/in.c	Sun Dec  7 23:59:44 2014	(r275587)
@@ -1314,6 +1314,7 @@ in_domifattach(struct ifnet *ifp)
 	llt->llt_hash = in_lltable_hash;
 	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;
 	lltable_link(llt);
 
 	ii = malloc(sizeof(struct in_ifinfo), M_IFADDR, M_WAITOK|M_ZERO);

Modified: projects/routing/sys/netinet6/in6.c
==============================================================================
--- projects/routing/sys/netinet6/in6.c	Sun Dec  7 23:08:07 2014	(r275586)
+++ projects/routing/sys/netinet6/in6.c	Sun Dec  7 23:59:44 2014	(r275587)
@@ -2379,6 +2379,7 @@ in6_domifattach(struct ifnet *ifp)
 	llt->llt_hash = in6_lltable_hash;
 	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;
 	lltable_link(llt);
 	ext->lltable = llt;
 

Modified: projects/routing/sys/netinet6/nd6.c
==============================================================================
--- projects/routing/sys/netinet6/nd6.c	Sun Dec  7 23:08:07 2014	(r275586)
+++ projects/routing/sys/netinet6/nd6.c	Sun Dec  7 23:59:44 2014	(r275587)
@@ -1095,6 +1095,22 @@ nd6_free(struct llentry *ln, int gc)
 	llt->llt_clear_entry(ln->lle_tbl, ln);
 }
 
+int
+nd6_lltable_prepare_static_entry(struct lltable *llt, struct llentry *lle,
+    struct rt_addrinfo *info)
+{
+
+	lle->la_flags |= LLE_VALID;
+	lle->r_flags |= RLLE_VALID;
+
+	lle->ln_state = ND6_LLINFO_REACHABLE;
+
+	if (lle->la_expire == 0)
+		lle->la_flags |= LLE_STATIC;
+
+	return (0);
+}
+
 /*
  * Calback for lltable.
  */

Modified: projects/routing/sys/netinet6/nd6.h
==============================================================================
--- projects/routing/sys/netinet6/nd6.h	Sun Dec  7 23:08:07 2014	(r275586)
+++ projects/routing/sys/netinet6/nd6.h	Sun Dec  7 23:59:44 2014	(r275587)
@@ -421,6 +421,8 @@ void nd6_rem_ifa_lle(struct in6_ifaddr *
 int nd6_storelladdr(struct ifnet *, struct mbuf *,
 	const struct sockaddr *, u_char *, struct llentry **);
 void nd6_lltable_clear_entry(struct lltable *, struct llentry *);
+int nd6_lltable_prepare_static_entry(struct lltable *, struct llentry *,
+	struct rt_addrinfo *);
 
 /* nd6_nbr.c */
 void nd6_na_input(struct mbuf *, int, int);



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