summaryrefslogtreecommitdiffstats
path: root/sbin
diff options
context:
space:
mode:
authorkmacy <kmacy@FreeBSD.org>2009-04-14 23:05:36 +0000
committerkmacy <kmacy@FreeBSD.org>2009-04-14 23:05:36 +0000
commit8149bfaed6bb48e24c81b4fe830665f412bc7e32 (patch)
tree2c468e4e81b86a0a66401b94c6626251cbbccf6a /sbin
parent7500c86f06626d19d1c6296cfdb9f781600f1bf0 (diff)
downloadFreeBSD-src-8149bfaed6bb48e24c81b4fe830665f412bc7e32.zip
FreeBSD-src-8149bfaed6bb48e24c81b4fe830665f412bc7e32.tar.gz
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
Diffstat (limited to 'sbin')
-rw-r--r--sbin/route/keywords4
-rw-r--r--sbin/route/route.c31
2 files changed, 24 insertions, 11 deletions
diff --git a/sbin/route/keywords b/sbin/route/keywords
index 130fcd1..8817f30 100644
--- a/sbin/route/keywords
+++ b/sbin/route/keywords
@@ -33,6 +33,7 @@ mtu
net
netmask
nostatic
+nostick
osi
prefixlen
proto1
@@ -44,8 +45,11 @@ rtt
rttvar
sa
sendpipe
+show
ssthresh
static
+sticky
+weight
x25
xns
xresolve
diff --git a/sbin/route/route.c b/sbin/route/route.c
index 1b0985e..e20cedb 100644
--- a/sbin/route/route.c
+++ b/sbin/route/route.c
@@ -169,6 +169,7 @@ main(argc, argv)
if (*argv)
switch (keyword(*argv)) {
case K_GET:
+ case K_SHOW:
uid = 0;
/* FALLTHROUGH */
@@ -548,6 +549,7 @@ set_metric(value, key)
caseof(K_SSTHRESH, RTV_SSTHRESH, rmx_ssthresh);
caseof(K_RTT, RTV_RTT, rmx_rtt);
caseof(K_RTTVAR, RTV_RTTVAR, rmx_rttvar);
+ caseof(K_WEIGHT, RTV_WEIGHT, rmx_weight);
}
rtm_inits |= flag;
if (lockrest || locking)
@@ -571,8 +573,9 @@ newroute(argc, argv)
errx(EX_NOPERM, "must be root to alter routing table");
}
cmd = argv[0];
- if (*cmd != 'g')
+ if (*cmd != 'g' && *cmd != 's')
shutdown(s, SHUT_RD); /* Don't want to read back our messages */
+
while (--argc > 0) {
if (**(++argv)== '-') {
switch (key = keyword(1 + *argv)) {
@@ -635,6 +638,12 @@ newroute(argc, argv)
case K_STATIC:
flags |= RTF_STATIC;
break;
+ case K_STICKY:
+ flags |= RTF_STICKY;
+ break;
+ case K_NOSTICK:
+ flags &= ~RTF_STICKY;
+ break;
case K_IFA:
if (!--argc)
usage((char *)NULL);
@@ -688,6 +697,7 @@ newroute(argc, argv)
case K_SSTHRESH:
case K_RTT:
case K_RTTVAR:
+ case K_WEIGHT:
if (!--argc)
usage((char *)NULL);
set_metric(*++argv, key);
@@ -741,7 +751,7 @@ newroute(argc, argv)
} else
break;
}
- if (*cmd == 'g')
+ if (*cmd == 'g' || *cmd == 's')
exit(ret != 0);
if (!qflag) {
oerrno = errno;
@@ -1193,7 +1203,7 @@ rtmsg(cmd, flags)
cmd = RTM_ADD;
else if (cmd == 'c')
cmd = RTM_CHANGE;
- else if (cmd == 'g') {
+ else if (cmd == 'g' || cmd == 's') {
cmd = RTM_GET;
if (so_ifp.sa.sa_family == 0) {
so_ifp.sa.sa_family = AF_LINK;
@@ -1297,13 +1307,13 @@ char *msgtypes[] = {
};
char metricnames[] =
-"\011pksent\010rttvar\7rtt\6ssthresh\5sendpipe\4recvpipe\3expire\2hopcount"
+"\011weight\010rttvar\7rtt\6ssthresh\5sendpipe\4recvpipe\3expire"
"\1mtu";
char routeflags[] =
-"\1UP\2GATEWAY\3HOST\4REJECT\5DYNAMIC\6MODIFIED\7DONE\010MASK_PRESENT"
-"\011CLONING\012XRESOLVE\013LLINFO\014STATIC\015BLACKHOLE\016b016"
-"\017PROTO2\020PROTO1\021PRCLONING\022WASCLONED\023PROTO3\024CHAINDELETE"
-"\025PINNED\026LOCAL\027BROADCAST\030MULTICAST";
+"\1UP\2GATEWAY\3HOST\4REJECT\5DYNAMIC\6MODIFIED\7DONE"
+"\012XRESOLVE\013LLINFO\014STATIC\015BLACKHOLE"
+"\017PROTO2\020PROTO1\021PRCLONING\022WASCLONED\023PROTO3"
+"\025PINNED\026LOCAL\027BROADCAST\030MULTICAST\035STICKY";
char ifnetflags[] =
"\1UP\2BROADCAST\3DEBUG\4LOOPBACK\5PTP\6b6\7RUNNING\010NOARP"
"\011PPROMISC\012ALLMULTI\013OACTIVE\014SIMPLEX\015LINK0\016LINK1"
@@ -1466,14 +1476,13 @@ print_getmsg(rtm, msglen)
#define msec(u) (((u) + 500) / 1000) /* usec to msec */
(void) printf("\n%s\n", "\
- recvpipe sendpipe ssthresh rtt,msec rttvar hopcount mtu expire");
+ recvpipe sendpipe ssthresh rtt,msec mtu weight expire");
printf("%8ld%c ", rtm->rtm_rmx.rmx_recvpipe, lock(RPIPE));
printf("%8ld%c ", rtm->rtm_rmx.rmx_sendpipe, lock(SPIPE));
printf("%8ld%c ", rtm->rtm_rmx.rmx_ssthresh, lock(SSTHRESH));
printf("%8ld%c ", msec(rtm->rtm_rmx.rmx_rtt), lock(RTT));
- printf("%8ld%c ", msec(rtm->rtm_rmx.rmx_rttvar), lock(RTTVAR));
- printf("%8ld%c ", rtm->rtm_rmx.rmx_hopcount, lock(HOPCOUNT));
printf("%8ld%c ", rtm->rtm_rmx.rmx_mtu, lock(MTU));
+ printf("%8ld%c ", rtm->rtm_rmx.rmx_weight, lock(WEIGHT));
if (rtm->rtm_rmx.rmx_expire)
rtm->rtm_rmx.rmx_expire -= time(0);
printf("%8ld%c\n", rtm->rtm_rmx.rmx_expire, lock(EXPIRE));
OpenPOWER on IntegriCloud