diff options
author | Alexander V. Chernikov <melifaro@FreeBSD.org> | 2015-01-03 19:09:06 +0000 |
---|---|---|
committer | Alexander V. Chernikov <melifaro@FreeBSD.org> | 2015-01-03 19:09:06 +0000 |
commit | b44a7d5d874985eee33e82ef72f511c7ab2bd71d (patch) | |
tree | 2c9268edf1c174521f366e035f97d74b52555cab /sys/net/if_llatbl.c | |
parent | 20dd899505f9dead9d234724941e33048c19e4aa (diff) | |
download | src-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.c | 38 |
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; |