tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Removing post-mortem support from netstat -r



Hi all,
to further reduce the leak of the radix tree implementation in the
kernel, I would like to remove the post-mortem support from netstat.
After that, only the documented interface (rt_mask, rt_getkey,
rt_setkey, etc.) is used outside route.c and rtbl.c.

Joerg
Index: main.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/usr.bin/netstat/main.c,v
retrieving revision 1.83
diff -u -p -r1.83 main.c
--- main.c      22 Mar 2012 20:34:43 -0000      1.83
+++ main.c      24 Jan 2013 15:52:55 -0000
@@ -661,10 +661,10 @@ main(int argc, char *argv[])
                if (sflag)
                        rt_stats(use_sysctl ? 0 : nl[N_RTSTAT].n_value);
                else {
-                       if (use_sysctl)
-                               p_rttables(af);
-                       else
-                               routepr(nl[N_RTREE].n_value);
+                       if (!use_sysctl)
+                               err(1, "-r is not supported "
+                                   "for post-mortem analysis.");
+                       p_rttables(af);
                }
                exit(0);
        }
Index: netstat.h
===================================================================
RCS file: /home/joerg/repo/netbsd/src/usr.bin/netstat/netstat.h,v
retrieving revision 1.44
diff -u -p -r1.44 netstat.h
--- netstat.h   22 Mar 2012 20:34:43 -0000      1.44
+++ netstat.h   24 Jan 2013 15:57:14 -0000
@@ -118,7 +118,6 @@ void        pr_rthdr __P((int, int));
 void   pr_family __P((int));
 void   rt_stats __P((u_long));
 char   *ns_phost __P((struct sockaddr *));
-void   upHex __P((char *));
 
 void   p_rttables(int);
 void   p_flags(int, const char *);
@@ -139,7 +138,6 @@ const char *atalk_print __P((const struc
 const char *atalk_print2 __P((const struct sockaddr *, const struct sockaddr *,
     int));
 char   *ns_print __P((struct sockaddr *));
-void   routepr __P((u_long));
 
 void   nsprotopr __P((u_long, const char *));
 void   spp_stats __P((u_long, const char *));
Index: route.c
===================================================================
RCS file: /home/joerg/repo/netbsd/src/usr.bin/netstat/route.c,v
retrieving revision 1.79
diff -u -p -r1.79 route.c
--- route.c     20 Mar 2012 20:34:58 -0000      1.79
+++ route.c     24 Jan 2013 15:57:18 -0000
@@ -30,287 +30,15 @@
  */
 
 #include <sys/cdefs.h>
-#ifndef lint
-#if 0
-static char sccsid[] = "from: @(#)route.c      8.3 (Berkeley) 3/9/94";
-#else
-__RCSID("$NetBSD: route.c,v 1.79 2012/03/20 20:34:58 matt Exp $");
-#endif
-#endif /* not lint */
-
-#include <stdbool.h>
-#include <sys/param.h>
-#include <sys/protosw.h>
-#include <sys/socket.h>
-#include <sys/mbuf.h>
-#include <sys/un.h>
 
-#include <net/if.h>
-#include <net/if_dl.h>
-#include <net/if_types.h>
-#include <net/route.h>
-#include <netinet/in.h>
-#include <netatalk/at.h>
-#include <netiso/iso.h>
-#include <netmpls/mpls.h>
+__RCSID("$NetBSD: route.c,v 1.79 2012/03/20 20:34:58 matt Exp $");
 
 #include <sys/sysctl.h>
-
-#include <arpa/inet.h>
-
+#include <net/route.h>
 #include <err.h>
-#include <kvm.h>
-#include <netdb.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <unistd.h>
 
 #include "netstat.h"
 
-#define kget(p, d) (kread((u_long)(p), (char *)&(d), sizeof (d)))
-
-/*
- * XXX we put all of the sockaddr types in here to force the alignment
- * to be correct.
- */
-static union sockaddr_union {
-       struct  sockaddr u_sa;
-       struct  sockaddr_in u_in;
-       struct  sockaddr_un u_un;
-       struct  sockaddr_iso u_iso;
-       struct  sockaddr_at u_at;
-       struct  sockaddr_dl u_dl;
-       u_short u_data[128];
-       int u_dummy;            /* force word-alignment */
-} pt_u;
-
-int    do_rtent = 0;
-struct rtentry rtentry;
-struct radix_node rnode;
-struct radix_mask rmask;
-
-static struct sockaddr *kgetsa(const struct sockaddr *);
-static void p_tree(struct radix_node *);
-static void p_rtnode(void);
-static void p_krtentry(struct rtentry *);
-
-/*
- * Print routing tables.
- */
-void
-routepr(u_long rtree)
-{
-       struct radix_node_head *rnh, head;
-       struct radix_node_head *rt_nodes[AF_MAX+1];
-       int i;
-
-       printf("Routing tables\n");
-
-       if (rtree == 0) {
-               printf("rt_tables: symbol not in namelist\n");
-               return;
-       }
-
-       kget(rtree, rt_nodes);
-       for (i = 0; i <= AF_MAX; i++) {
-               if ((rnh = rt_nodes[i]) == 0)
-                       continue;
-               kget(rnh, head);
-               if (i == AF_UNSPEC) {
-                       if (Aflag && (af == 0 || af == 0xff)) {
-                               printf("Netmasks:\n");
-                               p_tree(head.rnh_treetop);
-                       }
-               } else if (af == AF_UNSPEC || af == i) {
-                       pr_family(i);
-                       do_rtent = 1;
-                       pr_rthdr(i, Aflag);
-                       p_tree(head.rnh_treetop);
-               }
-       }
-}
-
-static struct sockaddr *
-kgetsa(const struct sockaddr *dst)
-{
-
-       kget(dst, pt_u.u_sa);
-       if (pt_u.u_sa.sa_len > sizeof (pt_u.u_sa))
-               kread((u_long)dst, (char *)pt_u.u_data, pt_u.u_sa.sa_len);
-       return (&pt_u.u_sa);
-}
-
-static void
-p_tree(struct radix_node *rn)
-{
-
-again:
-       kget(rn, rnode);
-       if (rnode.rn_b < 0) {
-               if (Aflag)
-                       printf("%-8.8lx ", (u_long) rn);
-               if (rnode.rn_flags & RNF_ROOT) {
-                       if (Aflag)
-                               printf("(root node)%s",
-                                   rnode.rn_dupedkey ? " =>\n" : "\n");
-               } else if (do_rtent) {
-                       kget(rn, rtentry);
-                       p_krtentry(&rtentry);
-                       if (Aflag)
-                               p_rtnode();
-               } else {
-                       p_sockaddr(kgetsa((const struct sockaddr 
*)rnode.rn_key),
-                           NULL, 0, 44);
-                       putchar('\n');
-               }
-               if ((rn = rnode.rn_dupedkey) != NULL)
-                       goto again;
-       } else {
-               if (Aflag && do_rtent) {
-                       printf("%-8.8lx ", (u_long) rn);
-                       p_rtnode();
-               }
-               rn = rnode.rn_r;
-               p_tree(rnode.rn_l);
-               p_tree(rn);
-       }
-}
-
-static void
-p_rtnode(void)
-{
-       struct radix_mask *rm = rnode.rn_mklist;
-       char    nbuf[20];
-
-       if (rnode.rn_b < 0) {
-               if (rnode.rn_mask) {
-                       printf("\t  mask ");
-                       p_sockaddr(kgetsa((const struct sockaddr 
*)rnode.rn_mask),
-                                   NULL, 0, -1);
-               } else if (rm == 0)
-                       return;
-       } else {
-               (void)snprintf(nbuf, sizeof nbuf, "(%d)", rnode.rn_b);
-               printf("%6.6s %8.8lx : %8.8lx", nbuf, (u_long) rnode.rn_l,
-                   (u_long) rnode.rn_r);
-       }
-       while (rm) {
-               kget(rm, rmask);
-               (void)snprintf(nbuf, sizeof nbuf, " %d refs, ", rmask.rm_refs);
-               printf(" mk = %8.8lx {(%d),%s", (u_long) rm,
-                   -1 - rmask.rm_b, rmask.rm_refs ? nbuf : " ");
-               if (rmask.rm_flags & RNF_NORMAL) {
-                       struct radix_node rnode_aux;
-                       printf(" <normal>, ");
-                       kget(rmask.rm_leaf, rnode_aux);
-                       p_sockaddr(kgetsa((const struct sockaddr 
*)rnode_aux.rn_mask),
-                                   NULL, 0, -1);
-               } else
-                       p_sockaddr(kgetsa((const struct sockaddr 
*)rmask.rm_mask),
-                           NULL, 0, -1);
-               putchar('}');
-               if ((rm = rmask.rm_mklist) != NULL)
-                       printf(" ->");
-       }
-       putchar('\n');
-}
-
-static struct sockaddr *sockcopy(struct sockaddr *, union sockaddr_union *);
-
-/*
- * copy a sockaddr into an allocated region, allocate at least sockaddr
- * bytes and zero unused
- */
-static struct sockaddr *
-sockcopy(struct sockaddr *sp, union sockaddr_union *dp)
-{
-       int len;
-
-       if (sp == 0 || sp->sa_len == 0)
-               (void)memset(dp, 0, sizeof (*sp));
-       else {
-               len = (sp->sa_len >= sizeof (*sp)) ? sp->sa_len : sizeof (*sp);
-               (void)memcpy(dp, sp, len);
-       }
-       return ((struct sockaddr *)dp);
-}
-
-static void
-p_krtentry(struct rtentry *rt)
-{
-       static struct ifnet ifnet, *lastif;
-       union sockaddr_union addr_un, mask_un;
-       struct sockaddr *addr, *mask;
-
-       if (Lflag && (rt->rt_flags & RTF_LLINFO))
-               return;
-
-       memset(&addr_un, 0, sizeof(addr_un));
-       memset(&mask_un, 0, sizeof(mask_un));
-       addr = sockcopy(kgetsa(rt_getkey(rt)), &addr_un);
-       if (rt_mask(rt))
-               mask = sockcopy(kgetsa(rt_mask(rt)), &mask_un);
-       else
-               mask = sockcopy(NULL, &mask_un);
-       p_addr(addr, mask, rt->rt_flags);
-       p_gwaddr(kgetsa(rt->rt_gateway), kgetsa(rt->rt_gateway)->sa_family);
-       p_flags(rt->rt_flags, "%-6.6s ");
-       printf("%6d %8"PRIu64" ", rt->rt_refcnt, rt->rt_use);
-       if (rt->rt_rmx.rmx_mtu)
-               printf("%6"PRIu64, rt->rt_rmx.rmx_mtu); 
-       else
-               printf("%6s", "-");
-       putchar((rt->rt_rmx.rmx_locks & RTV_MTU) ? 'L' : ' ');
-       if (tagflag == 1) {
-               if (rt->rt_tag != NULL) {
-                       const struct sockaddr *tagsa = kgetsa(rt->rt_tag);
-                       char *tagstr;
-
-                       if (tagsa->sa_family == AF_MPLS) {
-                               tagstr = mpls_ntoa(tagsa);
-                               if (strlen(tagstr) < 7)
-                                       printf("%7s", tagstr);
-                               else
-                                       printf("%s", tagstr);
-                       }
-                       else
-                               printf("%7s", "-");
-               } else
-                       printf("%7s", "-");
-       }
-       if (rt->rt_ifp) {
-               if (rt->rt_ifp != lastif) {
-                       kget(rt->rt_ifp, ifnet);
-                       lastif = rt->rt_ifp;
-               }
-               printf(" %.16s%s", ifnet.if_xname,
-                       rt->rt_nodes[0].rn_dupedkey ? " =>" : "");
-       }
-       putchar('\n');
-       if (vflag) {
-               printf("\texpire   %10"PRId64"%c  recvpipe %10"PRIu64"%c  "
-                      "sendpipe %10"PRIu64"%c\n",
-                       (int64_t)rt->rt_rmx.rmx_expire, 
-                       (rt->rt_rmx.rmx_locks & RTV_EXPIRE) ? 'L' : ' ',
-                       rt->rt_rmx.rmx_recvpipe,
-                       (rt->rt_rmx.rmx_locks & RTV_RPIPE) ? 'L' : ' ',
-                       rt->rt_rmx.rmx_sendpipe,
-                       (rt->rt_rmx.rmx_locks & RTV_SPIPE) ? 'L' : ' ');
-               printf("\tssthresh %10"PRIu64"%c  rtt      %10"PRIu64"%c  "
-                      "rttvar   %10"PRIu64"%c\n",
-                       rt->rt_rmx.rmx_ssthresh, 
-                       (rt->rt_rmx.rmx_locks & RTV_SSTHRESH) ? 'L' : ' ',
-                       rt->rt_rmx.rmx_rtt, 
-                       (rt->rt_rmx.rmx_locks & RTV_RTT) ? 'L' : ' ',
-                       rt->rt_rmx.rmx_rttvar, 
-                       (rt->rt_rmx.rmx_locks & RTV_RTTVAR) ? 'L' : ' ');
-               printf("\thopcount %10"PRIu64"%c\n",
-                       rt->rt_rmx.rmx_hopcount, 
-                       (rt->rt_rmx.rmx_locks & RTV_HOPCOUNT) ? 'L' : ' ');
-       }
-}
-
 /*
  * Print routing statistics
  */
@@ -348,20 +76,3 @@ rt_stats(u_long off)
                (unsigned long long)rtstats.rts_wildcard,
                plural(rtstats.rts_wildcard));
 }
-
-void
-upHex(char *p0)
-{
-       char *p = p0;
-
-       for (; *p; p++)
-               switch (*p) {
-               case 'a':
-               case 'b':
-               case 'c':
-               case 'd':
-               case 'e':
-               case 'f':
-                       *p += ('A' - 'a');
-               }
-}


Home | Main Index | Thread Index | Old Index