diff options
author | Alexander V. Chernikov <melifaro@FreeBSD.org> | 2020-09-21 20:02:26 +0000 |
---|---|---|
committer | Alexander V. Chernikov <melifaro@FreeBSD.org> | 2020-09-21 20:02:26 +0000 |
commit | 2259a03020fe043af123bbc9e749cf7fa1b4346c (patch) | |
tree | 1996dd791751401a476342f8debdefd760657ec9 /sys/net/rtsock.c | |
parent | 7b3286c189638f983ce419a9451c0854783bdeb5 (diff) | |
download | src-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.c | 21 |
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; |