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:
Alexander V. Chernikov 2023-04-26 13:23:39 +00:00
parent 52199877a6
commit 20b6945c7f
2 changed files with 7 additions and 26 deletions

View File

@ -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) {

View File

@ -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