aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander V. Chernikov <melifaro@FreeBSD.org>2022-08-09 11:33:45 +0000
committerAlexander V. Chernikov <melifaro@FreeBSD.org>2022-08-29 10:08:47 +0000
commit835a611e684094d82de306209071e233bb83123a (patch)
treee9b6bfdde367b9489e10b0cbfd8d6f44faa9c968
parentd8b2693414ae5cebdbd4c64c9559275c4baff11e (diff)
downloadsrc-835a611e684094d82de306209071e233bb83123a.tar.gz
src-835a611e684094d82de306209071e233bb83123a.zip
routing: make IPv6 defrouter code use new nhop-based KPI.
MFC after: 1 month Differential Revision: https://reviews.freebsd.org/D36168
-rw-r--r--sys/netinet6/nd6_rtr.c63
1 files changed, 24 insertions, 39 deletions
diff --git a/sys/netinet6/nd6_rtr.c b/sys/netinet6/nd6_rtr.c
index 032d019702ac..a8431e23b815 100644
--- a/sys/netinet6/nd6_rtr.c
+++ b/sys/netinet6/nd6_rtr.c
@@ -674,30 +674,21 @@ pfxrtr_del(struct nd_pfxrouter *pfr)
static void
defrouter_addreq(struct nd_defrouter *new)
{
- struct sockaddr_in6 def, mask, gate;
- struct rt_addrinfo info;
- struct rib_cmd_info rc;
- unsigned int fibnum;
- int error;
+ uint32_t fibnum = new->ifp->if_fib;
+ struct rib_cmd_info rc = {};
+ int error = 0;
- bzero(&def, sizeof(def));
- bzero(&mask, sizeof(mask));
- bzero(&gate, sizeof(gate));
+ NET_EPOCH_ASSERT();
- def.sin6_len = mask.sin6_len = gate.sin6_len =
- sizeof(struct sockaddr_in6);
- def.sin6_family = gate.sin6_family = AF_INET6;
- gate.sin6_addr = new->rtaddr;
- fibnum = new->ifp->if_fib;
+ struct sockaddr_in6 gw = {
+ .sin6_family = AF_INET6,
+ .sin6_len = sizeof(struct sockaddr_in6),
+ .sin6_addr = new->rtaddr,
+ };
- bzero((caddr_t)&info, sizeof(info));
- info.rti_flags = RTF_GATEWAY;
- info.rti_info[RTAX_DST] = (struct sockaddr *)&def;
- info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&gate;
- info.rti_info[RTAX_NETMASK] = (struct sockaddr *)&mask;
+ error = rib_add_default_route(fibnum, AF_INET6, new->ifp,
+ (struct sockaddr *)&gw, &rc);
- NET_EPOCH_ASSERT();
- error = rib_action(fibnum, RTM_ADD, &info, &rc);
if (error == 0) {
struct nhop_object *nh = nhop_select_func(rc.rc_nh_new, 0);
rt_routemsg(RTM_ADD, rc.rc_rt, nh, fibnum);
@@ -713,31 +704,25 @@ defrouter_addreq(struct nd_defrouter *new)
static void
defrouter_delreq(struct nd_defrouter *dr)
{
- struct sockaddr_in6 def, mask, gate;
- struct rt_addrinfo info;
- struct rib_cmd_info rc;
+ uint32_t fibnum = dr->ifp->if_fib;
struct epoch_tracker et;
- unsigned int fibnum;
+ struct rib_cmd_info rc;
int error;
- bzero(&def, sizeof(def));
- bzero(&mask, sizeof(mask));
- bzero(&gate, sizeof(gate));
-
- def.sin6_len = mask.sin6_len = gate.sin6_len =
- sizeof(struct sockaddr_in6);
- def.sin6_family = gate.sin6_family = AF_INET6;
- gate.sin6_addr = dr->rtaddr;
- fibnum = dr->ifp->if_fib;
+ struct sockaddr_in6 dst = {
+ .sin6_family = AF_INET6,
+ .sin6_len = sizeof(struct sockaddr_in6),
+ };
- bzero((caddr_t)&info, sizeof(info));
- info.rti_flags = RTF_GATEWAY;
- info.rti_info[RTAX_DST] = (struct sockaddr *)&def;
- info.rti_info[RTAX_GATEWAY] = (struct sockaddr *)&gate;
- info.rti_info[RTAX_NETMASK] = (struct sockaddr *)&mask;
+ struct sockaddr_in6 gw = {
+ .sin6_family = AF_INET6,
+ .sin6_len = sizeof(struct sockaddr_in6),
+ .sin6_addr = dr->rtaddr,
+ };
NET_EPOCH_ENTER(et);
- error = rib_action(fibnum, RTM_DELETE, &info, &rc);
+ error = rib_del_route_px(fibnum, (struct sockaddr *)&dst, 0,
+ rib_match_gw, (struct sockaddr *)&gw, 0, &rc);
if (error == 0) {
struct nhop_object *nh = nhop_select_func(rc.rc_nh_old, 0);
rt_routemsg(RTM_DELETE, rc.rc_rt, nh, fibnum);