diff options
author | Kip Macy <kmacy@FreeBSD.org> | 2009-04-14 23:05:36 +0000 |
---|---|---|
committer | Kip Macy <kmacy@FreeBSD.org> | 2009-04-14 23:05:36 +0000 |
commit | 427ac07f05d7ed561978c93c42896f123ec51d9a (patch) | |
tree | 2c468e4e81b86a0a66401b94c6626251cbbccf6a /sys/net/rtsock.c | |
parent | ecbd3f3a291f2704b4ff4599d8bb69c0a10015a7 (diff) | |
download | src-427ac07f05d7ed561978c93c42896f123ec51d9a.tar.gz src-427ac07f05d7ed561978c93c42896f123ec51d9a.zip |
Extend route command:
- add show as alias for get
- add weights to allow mpath to do more than equal cost
- add sticky / nostick to disable / re-enable per-connection load balancing
This adds a field to rt_metrics_lite so network bits of world will need to be re-built.
Reviewed by: jeli & qingli
Notes
Notes:
svn path=/head/; revision=191080
Diffstat (limited to 'sys/net/rtsock.c')
-rw-r--r-- | sys/net/rtsock.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index 91aec203ad36..6b7c29b47e74 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -637,7 +637,6 @@ route_output(struct mbuf *m, struct socket *so) } (void)rt_msg2(rtm->rtm_type, &info, (caddr_t)rtm, NULL); rtm->rtm_flags = rt->rt_flags; - rtm->rtm_use = 0; rt_getmetrics(&rt->rt_rmx, &rtm->rtm_rmx); rtm->rtm_addrs = info.rti_addrs; break; @@ -691,10 +690,8 @@ route_output(struct mbuf *m, struct socket *so) rt->rt_ifp = info.rti_ifp; } /* Allow some flags to be toggled on change. */ - if (rtm->rtm_fmask & RTF_FMASK) - rt->rt_flags = (rt->rt_flags & - ~rtm->rtm_fmask) | - (rtm->rtm_flags & rtm->rtm_fmask); + rt->rt_flags = (rt->rt_flags & ~RTF_FMASK) | + (rtm->rtm_flags & RTF_FMASK); rt_setmetrics(rtm->rtm_inits, &rtm->rtm_rmx, &rt->rt_rmx); rtm->rtm_index = rt->rt_ifp->if_index; @@ -773,6 +770,7 @@ rt_setmetrics(u_long which, const struct rt_metrics *in, * of tcp hostcache. The rest is ignored. */ metric(RTV_MTU, rmx_mtu); + metric(RTV_WEIGHT, rmx_weight); /* Userland -> kernel timebase conversion. */ if (which & RTV_EXPIRE) out->rmx_expire = in->rmx_expire ? @@ -786,6 +784,7 @@ rt_getmetrics(const struct rt_metrics_lite *in, struct rt_metrics *out) #define metric(e) out->e = in->e; bzero(out, sizeof(*out)); metric(rmx_mtu); + metric(rmx_weight); /* Kernel -> userland timebase conversion. */ out->rmx_expire = in->rmx_expire ? in->rmx_expire - time_uptime + time_second : 0; @@ -1257,7 +1256,10 @@ sysctl_dumpentry(struct radix_node *rn, void *vw) struct rt_msghdr *rtm = (struct rt_msghdr *)w->w_tmem; rtm->rtm_flags = rt->rt_flags; - rtm->rtm_use = rt->rt_rmx.rmx_pksent; + /* + * let's be honest about this being a retarded hack + */ + rtm->rtm_fmask = rt->rt_rmx.rmx_pksent; rt_getmetrics(&rt->rt_rmx, &rtm->rtm_rmx); rtm->rtm_index = rt->rt_ifp->if_index; rtm->rtm_errno = rtm->rtm_pid = rtm->rtm_seq = 0; |