aboutsummaryrefslogtreecommitdiff
path: root/sys/net/if_llatbl.c
diff options
context:
space:
mode:
authorAlexander V. Chernikov <melifaro@FreeBSD.org>2015-01-03 19:09:06 +0000
committerAlexander V. Chernikov <melifaro@FreeBSD.org>2015-01-03 19:09:06 +0000
commitb44a7d5d874985eee33e82ef72f511c7ab2bd71d (patch)
tree2c9268edf1c174521f366e035f97d74b52555cab /sys/net/if_llatbl.c
parent20dd899505f9dead9d234724941e33048c19e4aa (diff)
downloadsrc-b44a7d5d874985eee33e82ef72f511c7ab2bd71d.tar.gz
src-b44a7d5d874985eee33e82ef72f511c7ab2bd71d.zip
* Use unified code for deleting entry by sockaddr instead of per-af one.
* Remove now unused llt_delete_addr callback.
Notes
Notes: svn path=/projects/routing/; revision=276631
Diffstat (limited to 'sys/net/if_llatbl.c')
-rw-r--r--sys/net/if_llatbl.c38
1 files changed, 28 insertions, 10 deletions
diff --git a/sys/net/if_llatbl.c b/sys/net/if_llatbl.c
index 949966b824c7..09997d9d220b 100644
--- a/sys/net/if_llatbl.c
+++ b/sys/net/if_llatbl.c
@@ -445,14 +445,6 @@ lltable_create_lle(struct lltable *llt, u_int flags,
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, struct rt_addrinfo *info)
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;