Use system's RT_ROUNDUP and RT_ADVANCE macros instead of local copies.
[dragonfly.git] / sbin / route / route.c
index 6297257..924c764 100644 (file)
  * 2. Redistributions in binary form must reproduce the above copyright
  *    notice, this list of conditions and the following disclaimer in the
  *    documentation and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- *    must display the following acknowledgement:
- *     This product includes software developed by the University of
- *     California, Berkeley and its contributors.
- * 4. Neither the name of the University nor the names of its contributors
+ * 3. Neither the name of the University nor the names of its contributors
  *    may be used to endorse or promote products derived from this software
  *    without specific prior written permission.
  *
@@ -126,10 +122,6 @@ usage(const char *cp)
        /* NOTREACHED */
 }
 
-#define ROUNDUP(a) \
-       ((a) > 0 ? (1 + (((a) - 1) | (sizeof(long) - 1))) : sizeof(long))
-#define ADVANCE(x, n) (x += ROUNDUP((n)->sa_len))
-
 int
 main(int argc, char **argv)
 {
@@ -303,7 +295,7 @@ bad:                        usage(*argv);
                            printf("%-20.20s ", rtm->rtm_flags & RTF_HOST ?
                                routename(sa) : netname(sa));
                        }
-                       sa = (struct sockaddr *)(ROUNDUP(sa->sa_len) +
+                       sa = (struct sockaddr *)(RT_ROUNDUP(sa->sa_len) +
                            (char *)sa);
                        if (wflag) {
                            printf("%-20s ", routename(sa));
@@ -462,7 +454,7 @@ netname(struct sockaddr *sa)
                         * width subnet fields.
                         */
                        while (in.s_addr &~ mask)
-                               mask = (long)mask >> subnetshift;
+                               mask |= mask >> subnetshift;
                        net = in.s_addr & mask;
                        while ((mask & 1) == 0)
                                mask >>= 1, net >>= 1;
@@ -563,6 +555,8 @@ set_metric(char *value, int key)
        caseof(K_RTT, RTV_RTT, rmx_rtt);
        caseof(K_RTTVAR, RTV_RTTVAR, rmx_rttvar);
        caseof(K_MSL, RTV_MSL, rmx_msl);
+       caseof(K_IWMAX, RTV_IWMAXSEGS, rmx_iwmaxsegs);
+       caseof(K_IW, RTV_IWCAPSEGS, rmx_iwcapsegs);
        }
        rtm_inits |= flag;
        if (lockrest || locking)
@@ -763,6 +757,8 @@ newroute(int argc, char **argv)
                        case K_RTT:
                        case K_RTTVAR:
                        case K_MSL:
+                       case K_IWMAX:
+                       case K_IW:
                                if (--argc == 0)
                                        usage(NULL);
                                set_metric(*++argv, key);
@@ -1262,7 +1258,7 @@ rtmsg(int cmd, int flags)
 
 #define NEXTADDR(w, u) \
        if (rtm_addrs & (w)) {\
-           l = ROUNDUP(u.sa.sa_len); memmove(cp, &(u), l); cp += l;\
+           l = RT_ROUNDUP(u.sa.sa_len); memmove(cp, &(u), l); cp += l;\
            if (verbose) sodump(&(u),"u");\
        }
 
@@ -1376,8 +1372,8 @@ const char *msgtypes[] = {
 };
 
 char metricnames[] =
-"\011msl\010rttvar\7rtt\6ssthresh\5sendpipe\4recvpipe\3expire\2hopcount"
-"\1mtu";
+"\013iw\012iwmax\011msl\010rttvar\7rtt\6ssthresh\5sendpipe\4recvpipe\3expire"
+"\2hopcount\1mtu";
 char routeflags[] =
 "\1UP\2GATEWAY\3HOST\4REJECT\5DYNAMIC\6MODIFIED\7DONE\010MASK_PRESENT"
 "\011CLONING\012XRESOLVE\013LLINFO\014STATIC\015BLACKHOLE\016b016"
@@ -1504,7 +1500,7 @@ print_getmsg(struct rt_msghdr *rtm, int msglen)
                                                ifp = (struct sockaddr_dl *)sa;
                                        break;
                                }
-                               ADVANCE(cp, sa);
+                               RT_ADVANCE(cp, sa);
                        }
        if (dst != NULL && mask != NULL)
                mask->sa_family = dst->sa_family;       /* XXX */
@@ -1529,7 +1525,7 @@ print_getmsg(struct rt_msghdr *rtm, int msglen)
 #define msec(u)        (((u) + 500) / 1000)            /* usec to msec */
 
        printf("\n%s\n", "\
- recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire  msl,msec");
+ recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire  msl,msec iwmax iw");
        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));
@@ -1537,10 +1533,15 @@ print_getmsg(struct rt_msghdr *rtm, int msglen)
        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));
-       if (rtm->rtm_rmx.rmx_expire != 0)
-               rtm->rtm_rmx.rmx_expire -= time(0);
+       if (rtm->rtm_rmx.rmx_expire != 0) {
+               struct timespec sp;
+               clock_gettime(CLOCK_MONOTONIC, &sp);
+               rtm->rtm_rmx.rmx_expire -= sp.tv_sec;
+       }
        printf("%8ld%c ", rtm->rtm_rmx.rmx_expire, lock(EXPIRE));
-       printf("%8ld\n", rtm->rtm_rmx.rmx_msl);
+       printf("%8ld ", rtm->rtm_rmx.rmx_msl);
+       printf("%5ld ", rtm->rtm_rmx.rmx_iwmaxsegs);
+       printf("%3ld\n", rtm->rtm_rmx.rmx_iwcapsegs);
 #undef lock
 #undef msec
 #define        RTA_IGN (RTA_DST|RTA_GATEWAY|RTA_NETMASK|RTA_IFP|RTA_IFA|RTA_BRD)
@@ -1581,7 +1582,7 @@ pmsg_addrs(char *cp, int addrs)
                if (i & addrs) {
                        sa = (struct sockaddr *)cp;
                        printf(" %s", routename(sa));
-                       ADVANCE(cp, sa);
+                       RT_ADVANCE(cp, sa);
                }
        putchar('\n');
        fflush(stdout);