aboutsummaryrefslogtreecommitdiff
path: root/sys/net/rtsock.c
diff options
context:
space:
mode:
authorAlexander V. Chernikov <melifaro@FreeBSD.org>2020-09-21 20:02:26 +0000
committerAlexander V. Chernikov <melifaro@FreeBSD.org>2020-09-21 20:02:26 +0000
commit2259a03020fe043af123bbc9e749cf7fa1b4346c (patch)
tree1996dd791751401a476342f8debdefd760657ec9 /sys/net/rtsock.c
parent7b3286c189638f983ce419a9451c0854783bdeb5 (diff)
downloadsrc-2259a03020fe043af123bbc9e749cf7fa1b4346c.tar.gz
src-2259a03020fe043af123bbc9e749cf7fa1b4346c.zip
Rework part of routing code to reduce difference to D26449.
* Split rt_setmetrics into get_info_weight() and rt_set_expire_info(), as these two can be applied at different entities and at different times. * Start filling route weight in route change notifications * Pass flowid to UDP/raw IP route lookups * Rework nd6_subscription_cb() and sysctl_dumpentry() to prepare for the fact that rtentry can contain multiple nexthops. Differential Revision: https://reviews.freebsd.org/D26497
Notes
Notes: svn path=/head/; revision=365973
Diffstat (limited to 'sys/net/rtsock.c')
-rw-r--r--sys/net/rtsock.c21
1 files changed, 18 insertions, 3 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c
index dea5f8b4ebbd..f3b0ecec2430 100644
--- a/sys/net/rtsock.c
+++ b/sys/net/rtsock.c
@@ -175,6 +175,8 @@ static int rtsock_msg_buffer(int type, struct rt_addrinfo *rtinfo,
static int rt_xaddrs(caddr_t cp, caddr_t cplim,
struct rt_addrinfo *rtinfo);
static int sysctl_dumpentry(struct radix_node *rn, void *vw);
+static int sysctl_dumpnhop(struct rtentry *rt, struct nhop_object *nh,
+ uint32_t weight, struct walkarg *w);
static int sysctl_iflist(int af, struct walkarg *w);
static int sysctl_ifmalist(int af, struct walkarg *w);
static int route_output(struct mbuf *m, struct socket *so, ...);
@@ -740,6 +742,7 @@ handle_rtm_get(struct rt_addrinfo *info, u_int fibnum,
}
}
rc->rc_nh_new = rc->rc_rt->rt_nhop;
+ rc->rc_nh_weight = rc->rc_rt->rt_weight;
RIB_RUNLOCK(rnh);
return (0);
@@ -1696,9 +1699,7 @@ sysctl_dumpentry(struct radix_node *rn, void *vw)
struct walkarg *w = vw;
struct rtentry *rt = (struct rtentry *)rn;
struct nhop_object *nh;
- int error = 0, size;
- struct rt_addrinfo info;
- struct sockaddr_storage ss;
+ int error = 0;
NET_EPOCH_ASSERT();
@@ -1707,6 +1708,20 @@ sysctl_dumpentry(struct radix_node *rn, void *vw)
if (!can_export_rte(w->w_req->td->td_ucred, rt))
return (0);
nh = rt->rt_nhop;
+ error = sysctl_dumpnhop(rt, nh, rt->rt_weight, w);
+
+ return (0);
+}
+
+
+static int
+sysctl_dumpnhop(struct rtentry *rt, struct nhop_object *nh, uint32_t weight,
+ struct walkarg *w)
+{
+ struct rt_addrinfo info;
+ int error = 0, size;
+ struct sockaddr_storage ss;
+
bzero((caddr_t)&info, sizeof(info));
info.rti_info[RTAX_DST] = rt_key(rt);
info.rti_info[RTAX_GATEWAY] = &nh->gw_sa;