svn commit: r276631 - in projects/routing/sys: net netinet netinet6

Alexander V. Chernikov melifaro at FreeBSD.org
Sat Jan 3 19:09:08 UTC 2015


Author: melifaro
Date: Sat Jan  3 19:09:06 2015
New Revision: 276631
URL: https://svnweb.freebsd.org/changeset/base/276631

Log:
  * Use unified code for deleting entry by sockaddr instead of per-af one.
  * Remove now unused llt_delete_addr callback.

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

Modified: projects/routing/sys/net/if_llatbl.c
==============================================================================
--- projects/routing/sys/net/if_llatbl.c	Sat Jan  3 18:38:46 2015	(r276630)
+++ projects/routing/sys/net/if_llatbl.c	Sat Jan  3 19:09:06 2015	(r276631)
@@ -445,14 +445,6 @@ lltable_create_lle(struct lltable *llt, 
 	return (llt->llt_create(llt, flags, paddr));
 }
 
-int
-lltable_delete_addr(struct lltable *llt, u_int flags,
-    const struct sockaddr *l3addr)
-{
-
-	return llt->llt_delete_addr(llt, flags, l3addr);
-}
-
 void
 lltable_link_entry(struct lltable *llt, struct llentry *lle)
 {
@@ -581,8 +573,34 @@ lla_rt_output(struct rt_msghdr *rtm, str
 		break;
 
 	case RTM_DELETE:
-		error = lltable_delete_addr(llt, 0, dst);
-		return (error == 0 ? 0 : ENOENT);
+		l3addr = llt->llt_get_sa_addr(dst);
+
+		IF_AFDATA_CFG_WLOCK(ifp);
+		lle = lltable_lookup_lle(llt, LLE_UNLOCKED, l3addr);
+
+		if (lle == NULL) {
+			IF_AFDATA_CFG_WUNLOCK(ifp);
+			return (ENOENT);
+		}
+
+		/* Skipping LLE_IFADDR record */
+		if ((lle->la_flags & LLE_IFADDR) != 0) {
+			IF_AFDATA_CFG_WUNLOCK(ifp);
+			return (0);
+		}
+
+		LLE_WLOCK(lle);
+		IF_AFDATA_RUN_WLOCK(ifp);
+		lltable_unlink_entry(llt, lle);
+		IF_AFDATA_RUN_WUNLOCK(ifp);
+		IF_AFDATA_CFG_WUNLOCK(ifp);
+
+#ifdef DIAGNOSTIC
+		log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle);
+#endif
+		EVENTHANDLER_INVOKE(lle_event, lle, LLENTRY_DELETED);
+		llt->llt_clear_entry(llt, lle);
+		break;
 
 	default:
 		error = EINVAL;

Modified: projects/routing/sys/net/if_llatbl_var.h
==============================================================================
--- projects/routing/sys/net/if_llatbl_var.h	Sat Jan  3 18:38:46 2015	(r276630)
+++ projects/routing/sys/net/if_llatbl_var.h	Sat Jan  3 19:09:06 2015	(r276631)
@@ -50,8 +50,6 @@ typedef	struct llentry *(llt_lookup_t)(s
     const void *paddr);
 typedef	struct llentry *(llt_create_t)(struct lltable *, u_int flags,
     const void *paddr);
-typedef	int (llt_delete_addr_t)(struct lltable *, u_int flags,
-    const struct sockaddr *l3addr);
 typedef int (llt_dump_entry_t)(struct lltable *, struct llentry *,
     struct sysctl_req *);
 typedef uint32_t (llt_hash_t)(const struct llentry *);
@@ -78,7 +76,6 @@ struct lltable {
 
 	llt_lookup_t		*llt_lookup;
 	llt_create_t		*llt_create;
-	llt_delete_addr_t	*llt_delete_addr;
 	llt_dump_entry_t	*llt_dump_entry;
 	llt_hash_t		*llt_hash;
 	llt_match_prefix_t	*llt_match_prefix;
@@ -114,8 +111,6 @@ lltable_lookup_lle(struct lltable *llt, 
 
 struct llentry *lltable_create_lle(struct lltable *llt, u_int flags,
     const void *paddr);
-int lltable_delete_addr(struct lltable *llt, u_int flags,
-    const struct sockaddr *l3addr);
 void lltable_link_entry(struct lltable *llt, struct llentry *lle);
 void lltable_unlink_entry(struct lltable *llt, struct llentry *lle);
 

Modified: projects/routing/sys/netinet/in.c
==============================================================================
--- projects/routing/sys/netinet/in.c	Sat Jan  3 18:38:46 2015	(r276630)
+++ projects/routing/sys/netinet/in.c	Sat Jan  3 19:09:06 2015	(r276631)
@@ -1138,50 +1138,6 @@ in_lltable_find_dst(struct lltable *llt,
 	return (lle);
 }
 
-static int
-in_lltable_delete(struct lltable *llt, u_int flags,
-    const struct sockaddr *l3addr)
-{
-	const struct sockaddr_in *sin = (const struct sockaddr_in *)l3addr;
-	struct ifnet *ifp = llt->llt_ifp;
-	struct llentry *lle;
-
-	IF_AFDATA_CFG_UNLOCK_ASSERT(ifp);
-	KASSERT(l3addr->sa_family == AF_INET,
-	    ("sin_family %d", l3addr->sa_family));
-
-	IF_AFDATA_CFG_WLOCK(ifp);
-	lle = in_lltable_find_dst(llt, sin->sin_addr);
-	if (lle == NULL) {
-		IF_AFDATA_CFG_WUNLOCK(ifp);
-#ifdef DIAGNOSTIC
-		log(LOG_INFO, "interface address is missing from cache = %p\n",
-		    lle);
-#endif
-		return (ENOENT);
-	}
-
-	/* Skipping LLE_IFADDR record */
-	if ((lle->la_flags & LLE_IFADDR) != 0 && (flags & LLE_IFADDR) == 0) {
-		IF_AFDATA_CFG_WUNLOCK(ifp);
-		return (0);
-	}
-
-	LLE_WLOCK(lle);
-	IF_AFDATA_RUN_WLOCK(ifp);
-	lltable_unlink_entry(llt, lle);
-	IF_AFDATA_RUN_WUNLOCK(ifp);
-	IF_AFDATA_CFG_WUNLOCK(ifp);
-
-	EVENTHANDLER_INVOKE(lle_event, lle, LLENTRY_DELETED);
-#ifdef DIAGNOSTIC
-		log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle);
-#endif
-	llt->llt_clear_entry(llt, lle);
-
-	return (0);
-}
-
 static struct llentry *
 in_lltable_create(struct lltable *llt, u_int flags, const void *paddr)
 {
@@ -1315,7 +1271,6 @@ in_domifattach(struct ifnet *ifp)
 
 	llt->llt_lookup = in_lltable_lookup;
 	llt->llt_create = in_lltable_create;
-	llt->llt_delete_addr = in_lltable_delete;
 	llt->llt_dump_entry = in_lltable_dump_entry;
 	llt->llt_hash = in_lltable_hash;
 	llt->llt_get_sa_addr = in_lltable_get_sa_addr;

Modified: projects/routing/sys/netinet6/in6.c
==============================================================================
--- projects/routing/sys/netinet6/in6.c	Sat Jan  3 18:38:46 2015	(r276630)
+++ projects/routing/sys/netinet6/in6.c	Sat Jan  3 19:09:06 2015	(r276631)
@@ -2185,49 +2185,6 @@ in6_lltable_find_dst(struct lltable *llt
 	return (lle);
 }
 
-static int
-in6_lltable_delete(struct lltable *llt, u_int flags,
-	const struct sockaddr *l3addr)
-{
-	const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)l3addr;
-	struct ifnet *ifp;
-	struct llentry *lle;
-
-	ifp = llt->llt_ifp;
-
-	IF_AFDATA_CFG_UNLOCK_ASSERT(ifp);
-	KASSERT(l3addr->sa_family == AF_INET6,
-	    ("sin_family %d", l3addr->sa_family));
-
-	IF_AFDATA_CFG_WLOCK(ifp);
-	lle = in6_lltable_find_dst(llt, &sin6->sin6_addr);
-
-	if (lle == NULL) {
-		IF_AFDATA_CFG_WUNLOCK(ifp);
-		return (ENOENT);
-	}
-
-	/* Skipping LLE_IFADDR record */
-	if ((lle->la_flags & LLE_IFADDR) != 0 && (flags & LLE_IFADDR) == 0) {
-		IF_AFDATA_CFG_WUNLOCK(ifp);
-		return (0);
-	}
-
-	LLE_WLOCK(lle);
-	IF_AFDATA_RUN_WLOCK(ifp);
-	lltable_unlink_entry(llt, lle);
-	IF_AFDATA_RUN_WUNLOCK(ifp);
-	IF_AFDATA_CFG_WUNLOCK(ifp);
-
-#ifdef DIAGNOSTIC
-	log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle);
-#endif
-	EVENTHANDLER_INVOKE(lle_event, lle, LLENTRY_DELETED);
-	llt->llt_clear_entry(llt, lle);
-	
-	return (0);
-}
-
 static struct llentry *
 in6_lltable_create(struct lltable *llt, u_int flags,
 	const void *paddr)
@@ -2389,7 +2346,6 @@ in6_domifattach(struct ifnet *ifp)
 
 	llt->llt_lookup = in6_lltable_lookup;
 	llt->llt_create = in6_lltable_create;
-	llt->llt_delete_addr = in6_lltable_delete;
 	llt->llt_dump_entry = in6_lltable_dump_entry;
 	llt->llt_hash = in6_lltable_hash;
 	llt->llt_get_sa_addr = in6_lltable_get_sa_addr;


More information about the svn-src-projects mailing list