netlink: fix IPv6 proxy ndp deletion.
* Move LLT_ADDEDPROXY handling into lltable_link_entry() to reduct duplication * Use standard lltable_delete_addr() for entry deletion * Add (forgotten) call to llt_post_resolved handler after adding the entry via netlink. MFC after: 2 weeks
This commit is contained in:
parent
52199877a6
commit
20b6945c7f
@ -904,8 +904,12 @@ lltable_free_entry(struct lltable *llt, struct llentry *lle)
|
||||
int
|
||||
lltable_link_entry(struct lltable *llt, struct llentry *lle)
|
||||
{
|
||||
int error = llt->llt_link_entry(llt, lle);
|
||||
|
||||
return (llt->llt_link_entry(llt, lle));
|
||||
if (error == 0 && (lle->la_flags & LLE_PUB) != 0)
|
||||
llt->llt_flags |= LLT_ADDEDPROXY;
|
||||
|
||||
return (error);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1034,9 +1038,6 @@ lla_rt_output(struct rt_msghdr *rtm, struct rt_addrinfo *info)
|
||||
lltable_unlink_entry(llt, lle_tmp);
|
||||
}
|
||||
lltable_link_entry(llt, lle);
|
||||
if ((lle->la_flags & LLE_PUB) != 0 &&
|
||||
(llt->llt_flags & LLT_ADDEDPROXY) == 0)
|
||||
llt->llt_flags |= LLT_ADDEDPROXY;
|
||||
IF_AFDATA_WUNLOCK(ifp);
|
||||
|
||||
if (lle_tmp != NULL) {
|
||||
|
@ -451,6 +451,7 @@ rtnl_handle_newneigh(struct nlmsghdr *hdr, struct nlpcb *nlp, struct nl_pstate *
|
||||
/* XXX: We're inside epoch */
|
||||
EVENTHANDLER_INVOKE(lle_event, lle, LLENTRY_RESOLVED);
|
||||
LLE_WUNLOCK(lle);
|
||||
llt->llt_post_resolved(llt, lle);
|
||||
|
||||
return (0);
|
||||
}
|
||||
@ -479,28 +480,7 @@ rtnl_handle_delneigh(struct nlmsghdr *hdr, struct nlpcb *nlp, struct nl_pstate *
|
||||
if (llt == NULL)
|
||||
return (EAFNOSUPPORT);
|
||||
|
||||
IF_AFDATA_WLOCK(attrs.nda_ifp);
|
||||
struct llentry *lle = lla_lookup(llt, LLE_SF(attrs.ndm_family, LLE_EXCLUSIVE),
|
||||
attrs.nda_dst);
|
||||
if (lle != NULL) {
|
||||
if ((lle->la_flags & LLE_IFADDR) != 0) {
|
||||
LLE_WUNLOCK(lle);
|
||||
lle = NULL;
|
||||
error = EPERM;
|
||||
NLMSG_REPORT_ERR_MSG(npt, "unable to delete ifaddr record");
|
||||
} else
|
||||
lltable_unlink_entry(llt, lle);
|
||||
} else
|
||||
error = ENOENT;
|
||||
IF_AFDATA_WUNLOCK(attrs.nda_ifp);
|
||||
|
||||
if (error == 0 && lle != NULL)
|
||||
EVENTHANDLER_INVOKE(lle_event, lle, LLENTRY_DELETED);
|
||||
|
||||
if (lle != NULL)
|
||||
llentry_free(lle);
|
||||
|
||||
return (error);
|
||||
return (lltable_delete_addr(llt, 0, attrs.nda_dst));
|
||||
}
|
||||
|
||||
static int
|
||||
|
Loading…
Reference in New Issue
Block a user