Use system's RT_ROUNDUP and RT_ADVANCE macros instead of local copies.
[dragonfly.git] / sbin / route / route.c
index 26ae9ef..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.
  *
@@ -33,7 +29,6 @@
  * @(#) Copyright (c) 1983, 1989, 1991, 1993 The Regents of the University of California.  All rights reserved.
  * @(#)route.c 8.6 (Berkeley) 4/28/95
  * $FreeBSD: src/sbin/route/route.c,v 1.40.2.11 2003/02/27 23:10:10 ru Exp $
- * $DragonFly: src/sbin/route/route.c,v 1.17 2008/07/07 22:02:09 nant Exp $
  */
 
 #include <sys/param.h>
@@ -48,7 +43,6 @@
 #include <net/if_dl.h>
 #include <netinet/in.h>
 #include <netinet/if_ether.h>
-#include <netatalk/at.h>
 #include <arpa/inet.h>
 #include <netdb.h>
 
@@ -74,7 +68,6 @@ union sockunion {
 #ifdef INET6
        struct  sockaddr_in6 sin6;
 #endif
-       struct  sockaddr_at sat;
        struct  sockaddr_mpls smpls;
        struct  sockaddr_dl sdl;
        struct  sockaddr_inarp sinarp;
@@ -98,8 +91,6 @@ static int    mplsop, popcount, pushcount, swapcount;
 static u_long  rtm_inits;
 static uid_t   uid;
 
-static int      atalk_aton(const char *, struct at_addr *);
-static char    *atalk_ntoa(struct at_addr);
 static void     flushroutes(int, char **);
 static void     set_metric(char *, int);
 static void     newroute(int, char **);
@@ -131,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)
 {
@@ -239,9 +226,6 @@ flushroutes(int argc, char **argv)
                                af = AF_INET6;
                                break;
 #endif
-                       case K_ATALK:
-                               af = AF_APPLETALK;
-                               break;
                        case K_LINK:
                                af = AF_LINK;
                                break;
@@ -311,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));
@@ -407,11 +391,6 @@ routename(struct sockaddr *sa)
        }
 #endif
 
-       case AF_APPLETALK:
-               snprintf(line, sizeof(line), "atalk %s",
-                       atalk_ntoa(((struct sockaddr_at *)sa)->sat_addr));
-               break;
-
        case AF_LINK:
                return(link_ntoa((struct sockaddr_dl *)sa));
 
@@ -441,9 +420,9 @@ routename(struct sockaddr *sa)
 char *
 netname(struct sockaddr *sa)
 {
-       const char *cp = 0;
+       const char *cp = NULL;
        static char line[MAXHOSTNAMELEN + 1];
-       struct netent *np = 0;
+       struct netent *np = NULL;
        u_long net, mask;
        u_long i;
        int subnetshift;
@@ -475,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;
@@ -536,11 +515,6 @@ netname(struct sockaddr *sa)
        }
 #endif
 
-       case AF_APPLETALK:
-               snprintf(line, sizeof(line), "atalk %s",
-                       atalk_ntoa(((struct sockaddr_at *)sa)->sat_addr));
-               break;
-
        case AF_LINK:
                return(link_ntoa((struct sockaddr_dl *)sa));
 
@@ -580,6 +554,9 @@ set_metric(char *value, int key)
        caseof(K_SSTHRESH, RTV_SSTHRESH, rmx_ssthresh);
        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)
@@ -596,7 +573,7 @@ newroute(int argc, char **argv)
        const char *err_str, *dest = "", *gateway = "";
        int ishost = 0, proxy = 0, ret, attempts, oerrno, flags = RTF_STATIC;
        int key;
-       struct hostent *hp = 0;
+       struct hostent *hp = NULL;
 
        if (uid != 0) {
                errx(EX_NOPERM, "must be root to alter routing table");
@@ -621,10 +598,6 @@ newroute(int argc, char **argv)
                                aflen = sizeof(struct sockaddr_in6);
                                break;
 #endif
-                       case K_ATALK:
-                               af = AF_APPLETALK;
-                               aflen = sizeof(struct sockaddr_at);
-                               break;
                        case K_SA:
                                af = PF_ROUTE;
                                aflen = sizeof(union sockunion);
@@ -783,6 +756,9 @@ newroute(int argc, char **argv)
                        case K_SSTHRESH:
                        case K_RTT:
                        case K_RTTVAR:
+                       case K_MSL:
+                       case K_IWMAX:
+                       case K_IW:
                                if (--argc == 0)
                                        usage(NULL);
                                set_metric(*++argv, key);
@@ -1101,12 +1077,6 @@ getaddr(int which, const char *str, struct hostent **hpp)
        }
 #endif /* INET6 */
 
-       case AF_APPLETALK:
-               if (!atalk_aton(str, &su->sat.sat_addr))
-                       errx(EX_NOHOST, "bad address: %s", str);
-               rtm_addrs |= RTA_NETMASK;
-               return(forcehost || su->sat.sat_addr.s_node != 0);
-
        case AF_LINK:
                link_addr(str, &su->sdl);
                return(1);
@@ -1288,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");\
        }
 
@@ -1367,7 +1337,6 @@ mask_addr(void)
 #ifdef INET6
        case AF_INET6:
 #endif
-       case AF_APPLETALK:
        case 0:
                return;
        }
@@ -1403,8 +1372,8 @@ const char *msgtypes[] = {
 };
 
 char metricnames[] =
-"\011pksent\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"
@@ -1531,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 */
@@ -1556,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");
+ 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));
@@ -1564,9 +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);
-       printf("%8ld%c\n", rtm->rtm_rmx.rmx_expire, lock(EXPIRE));
+       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 ", 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)
@@ -1607,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);
@@ -1661,10 +1636,6 @@ sodump(sup su, const char *which)
                printf("%s: inet %s; ",
                    which, inet_ntoa(su->sin.sin_addr));
                break;
-       case AF_APPLETALK:
-               printf("%s: atalk %s; ",
-                   which, atalk_ntoa(su->sat.sat_addr));
-               break;
        }
        fflush(stdout);
 }
@@ -1719,25 +1690,3 @@ sockaddr(const char *addr, struct sockaddr *sa)
        } while (cp < cplim);
        sa->sa_len = cp - (char *)sa;
 }
-
-static int
-atalk_aton(const char *text, struct at_addr *addr)
-{
-       u_int net, node;
-
-       if (sscanf(text, "%u.%u", &net, &node) != 2
-           || net > 0xffff || node > 0xff)
-               return(0);
-       addr->s_net = htons(net);
-       addr->s_node = node;
-       return(1);
-}
-
-static char *
-atalk_ntoa(struct at_addr at)
-{
-       static char buf[20];
-
-       snprintf(buf, sizeof(buf), "%u.%u", ntohs(at.s_net), at.s_node);
-       return(buf);
-}