- Add relative specification in expiration time.

- Add proto3 option for RTF_PROTO3.
- Use %lu for members of struct rt_metrics.
This commit is contained in:
Hiroki Sato 2013-10-17 19:04:05 +00:00
parent fb93f5c47f
commit de109e29ef
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=256695
3 changed files with 43 additions and 11 deletions

View File

@ -39,6 +39,7 @@ osi
prefixlen
proto1
proto2
proto3
proxy
recvpipe
reject

View File

@ -28,7 +28,7 @@
.\" @(#)route.8 8.3 (Berkeley) 3/19/94
.\" $FreeBSD$
.\"
.Dd November 17, 2012
.Dd October 17, 2013
.Dt ROUTE 8
.Os
.Sh NAME
@ -301,6 +301,7 @@ by indicating the following corresponding modifiers:
-blackhole RTF_BLACKHOLE - silently discard pkts (during updates)
-proto1 RTF_PROTO1 - set protocol specific routing flag #1
-proto2 RTF_PROTO2 - set protocol specific routing flag #2
-proto3 RTF_PROTO3 - set protocol specific routing flag #3
.Ed
.Pp
The optional modifiers
@ -324,6 +325,17 @@ specify that all ensuing metrics may be locked by the
.Fl lockrest
meta-modifier.
.Pp
Note that
.Fl expire
accepts expiration time of the route as the number of seconds since the
Epoch
.Pq see Xr time 3 .
When the first character of the number is
.Dq +
or
.Dq - ,
it is interpreted as a value relative to the current time.
.Pp
The optional modifier
.Fl fib Ar number
specifies that the command will be applied to a non-default FIB.

View File

@ -67,6 +67,7 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <time.h>
#include <unistd.h>
#include <ifaddrs.h>
@ -723,6 +724,7 @@ static void
set_metric(char *value, int key)
{
int flag = 0;
char *endptr;
u_long noval, *valp = &noval;
switch (key) {
@ -742,7 +744,18 @@ set_metric(char *value, int key)
rt_metrics.rmx_locks |= flag;
if (locking)
locking = 0;
*valp = atoi(value);
errno = 0;
*valp = strtol(value, &endptr, 0);
if (errno == 0 && *endptr != '\0')
errno = EINVAL;
if (errno)
err(EX_USAGE, "%s", value);
if (flag & RTV_EXPIRE && (value[0] == '+' || value[0] == '-')) {
struct timespec ts;
clock_gettime(CLOCK_REALTIME_FAST, &ts);
*valp += ts.tv_sec;
}
}
#define F_ISHOST 0x01
@ -827,6 +840,9 @@ newroute(int argc, char **argv)
case K_PROTO2:
flags |= RTF_PROTO2;
break;
case K_PROTO3:
flags |= RTF_PROTO3;
break;
case K_PROXY:
nrflags |= F_PROXY;
break;
@ -1681,6 +1697,7 @@ static void
print_getmsg(struct rt_msghdr *rtm, int msglen, int fib)
{
struct sockaddr *sp[RTAX_MAX];
struct timespec ts;
char *cp;
int i;
@ -1733,15 +1750,17 @@ print_getmsg(struct rt_msghdr *rtm, int msglen, int fib)
#define msec(u) (((u) + 500) / 1000) /* usec to msec */
printf("\n%9s %9s %9s %9s %9s %10s %9s\n", "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 ", 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));
printf("%8lu%c ", rtm->rtm_rmx.rmx_recvpipe, lock(RPIPE));
printf("%8lu%c ", rtm->rtm_rmx.rmx_sendpipe, lock(SPIPE));
printf("%8lu%c ", rtm->rtm_rmx.rmx_ssthresh, lock(SSTHRESH));
printf("%8lu%c ", msec(rtm->rtm_rmx.rmx_rtt), lock(RTT));
printf("%8lu%c ", rtm->rtm_rmx.rmx_mtu, lock(MTU));
printf("%8lu%c ", rtm->rtm_rmx.rmx_weight, lock(WEIGHT));
if (rtm->rtm_rmx.rmx_expire > 0)
clock_gettime(CLOCK_REALTIME_FAST, &ts);
else
ts.tv_sec = 0;
printf("%8ld%c\n", rtm->rtm_rmx.rmx_expire - ts.tv_sec, lock(EXPIRE));
#undef lock
#undef msec
#define RTA_IGN (RTA_DST|RTA_GATEWAY|RTA_NETMASK|RTA_IFP|RTA_IFA|RTA_BRD)