]> git.saurik.com Git - apple/network_cmds.git/blobdiff - netstat.tproj/mroute.c
network_cmds-356.9.tar.gz
[apple/network_cmds.git] / netstat.tproj / mroute.c
index 03e47cc3c86e9b900ac1fe6297f8335278590608..04a9fe56d03bdc23544212d7cbf1bca5deb87fe6 100644 (file)
@@ -1,25 +1,29 @@
 /*
- * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2008-2009 Apple Inc. All rights reserved.
  *
- * @APPLE_LICENSE_HEADER_START@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
  * 
- * "Portions Copyright (c) 1999 Apple Computer, Inc.  All Rights
- * Reserved.  This file contains Original Code and/or Modifications of
- * Original Code as defined in and that are subject to the Apple Public
- * Source License Version 1.0 (the 'License').  You may not use this file
- * except in compliance with the License.  Please obtain a copy of the
- * License at http://www.apple.com/publicsource and read it before using
- * this file.
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. The rights granted to you under the License
+ * may not be used to create, or enable the creation or redistribution of,
+ * unlawful or unlicensed copies of an Apple operating system, or to
+ * circumvent, violate, or enable the circumvention or violation of, any
+ * terms of an Apple operating system software license agreement.
  * 
+ * Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this file.
+ *
  * The Original Code and all software distributed under the License are
  * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License."
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
  * 
- * @APPLE_LICENSE_HEADER_END@
+ * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
  */
 /*
  * Copyright (c) 1989 Stephen Deering
@@ -70,9 +74,9 @@
 #include <sys/queue.h>
 #include <sys/socket.h>
 #include <sys/socketvar.h>
-#include <sys/protosw.h>
 #include <sys/mbuf.h>
 #include <sys/time.h>
+#include <sys/sysctl.h>
 
 #include <net/if.h>
 #include <netinet/in.h>
 #include "netstat.h"
 
 void
-mroutepr(mfcaddr, vifaddr)
-       u_long mfcaddr, vifaddr;
+mroutepr(void)
 {
-       u_int mrtproto;
-       struct mfc *mfctable[MFCTBLSIZ];
-       struct vif viftable[MAXVIFS];
-       struct mfc mfc, *m;
+       struct mfc **mfctable = 0;
+       struct vif viftable[CONFIG_MAXVIFS];
+       struct mfc *m;
        register struct vif *v;
        register vifi_t vifi;
        register int i;
        register int banner_printed;
        register int saved_nflag;
        vifi_t maxvif = 0;
-
-       if (mfcaddr == 0 || vifaddr == 0) {
-               printf("No multicast routing compiled into this system.\n");
-               return;
-       }
+       size_t len;
 
        saved_nflag = nflag;
        nflag = 1;
 
-       kread(vifaddr, (char *)&viftable, sizeof(viftable));
+       len = CONFIG_MAXVIFS * sizeof(struct vif);
+       if (sysctlbyname("net.inet.ip.viftable", viftable, &len, 0, 0) == -1) {
+               //printf("No IPv4 multicast routing compiled into this system.\n");
+               return;
+       }
+
        banner_printed = 0;
-       for (vifi = 0, v = viftable; vifi < MAXVIFS; ++vifi, ++v) {
+       for (vifi = 0, v = viftable; vifi < CONFIG_MAXVIFS; ++vifi, ++v) {
                if (v->v_lcl_addr.s_addr == 0)
                        continue;
 
@@ -128,36 +131,44 @@ mroutepr(mfcaddr, vifaddr)
                printf(" %-15.15s", (v->v_flags & VIFF_TUNNEL) ?
                    routename(v->v_rmt_addr.s_addr) : "");
 
-               printf(" %9lu  %9lu\n", v->v_pkt_in, v->v_pkt_out);
+               printf(" %9u  %9u\n", v->v_pkt_in, v->v_pkt_out);
        }
        if (!banner_printed)
                printf("\nVirtual Interface Table is empty\n");
 
-       kread(mfcaddr, (char *)&mfctable, sizeof(mfctable));
+       if (sysctlbyname("net.inet.ip.mfctable", 0, &len, 0, 0) == -1) {
+               //printf("No IPv4 multicast routing compiled into this system.\n");
+               return;
+       }
+       mfctable = malloc(len);
+       if (mfctable == 0)
+               return;
+       if (sysctlbyname("net.inet.ip.mfctable", mfctable, &len, 0, 0) == -1) {
+               //printf("No IPv4 multicast routing compiled into this system.\n");
+               return;
+       }
        banner_printed = 0;
-       for (i = 0; i < MFCTBLSIZ; ++i) {
+       for (i = 0; i < CONFIG_MFCTBLSIZ; ++i) {
                m = mfctable[i];
                while(m) {
-                       kread((u_long)m, (char *)&mfc, sizeof mfc);
-
                        if (!banner_printed) {
-                               printf("\nMulticast Forwarding Cache\n"
+                               printf("\nIPv4 Multicast Forwarding Cache\n"
                                       " Origin          Group            "
                                       " Packets In-Vif  Out-Vifs:Ttls\n");
                                banner_printed = 1;
                        }
 
-                       printf(" %-15.15s", routename(mfc.mfc_origin.s_addr));
-                       printf(" %-15.15s", routename(mfc.mfc_mcastgrp.s_addr));
-                       printf(" %9lu", mfc.mfc_pkt_cnt);
-                       printf("  %3d   ", mfc.mfc_parent);
+                       printf(" %-15.15s", routename(m->mfc_origin.s_addr));
+                       printf(" %-15.15s", routename(m->mfc_mcastgrp.s_addr));
+                       printf(" %9u", m->mfc_pkt_cnt);
+                       printf("  %3d   ", m->mfc_parent);
                        for (vifi = 0; vifi <= maxvif; vifi++) {
-                               if (mfc.mfc_ttls[vifi] > 0)
+                               if (m->mfc_ttls[vifi] > 0)
                                        printf(" %u:%u", vifi, 
-                                              mfc.mfc_ttls[vifi]);
+                                              m->mfc_ttls[vifi]);
                        }
                        printf("\n");
-                       m = mfc.mfc_next;
+                       m = m->mfc_next;
                }
        }
        if (!banner_printed)
@@ -165,46 +176,47 @@ mroutepr(mfcaddr, vifaddr)
 
        printf("\n");
        nflag = saved_nflag;
+       
+       free(mfctable);
 }
 
 
 void
-mrt_stats(mstaddr)
-       u_long mstaddr;
+mrt_stats()
 {
        struct mrtstat mrtstat;
+       size_t len = sizeof(struct mrtstat);
 
-       if (mstaddr == 0) {
-               printf("No multicast routing compiled into this system.\n");
+       if(sysctlbyname("net.inet.ip.mrtstat", &mrtstat, &len, 0, 0) == -1) {
+               //printf("No IPv4 multicast routing compiled into this system.\n");
                return;
        }
 
-       kread(mstaddr, (char *)&mrtstat, sizeof(mrtstat));
-       printf("multicast forwarding:\n");
-       printf(" %10lu multicast forwarding cache lookup%s\n",
+       printf("IPv4 multicast forwarding:\n");
+       printf(" %10u multicast forwarding cache lookup%s\n",
          mrtstat.mrts_mfc_lookups, plural(mrtstat.mrts_mfc_lookups));
-       printf(" %10lu multicast forwarding cache miss%s\n",
+       printf(" %10u multicast forwarding cache miss%s\n",
          mrtstat.mrts_mfc_misses, plurales(mrtstat.mrts_mfc_misses));
-       printf(" %10lu upcall%s to mrouted\n",
+       printf(" %10u upcall%s to mrouted\n",
          mrtstat.mrts_upcalls, plural(mrtstat.mrts_upcalls));
-       printf(" %10lu upcall queue overflow%s\n",
+       printf(" %10u upcall queue overflow%s\n",
          mrtstat.mrts_upq_ovflw, plural(mrtstat.mrts_upq_ovflw));
-       printf(" %10lu upcall%s dropped due to full socket buffer\n",
+       printf(" %10u upcall%s dropped due to full socket buffer\n",
          mrtstat.mrts_upq_sockfull, plural(mrtstat.mrts_upq_sockfull));
-       printf(" %10lu cache cleanup%s\n",
+       printf(" %10u cache cleanup%s\n",
          mrtstat.mrts_cache_cleanups, plural(mrtstat.mrts_cache_cleanups));
-       printf(" %10lu datagram%s with no route for origin\n",
+       printf(" %10u datagram%s with no route for origin\n",
          mrtstat.mrts_no_route, plural(mrtstat.mrts_no_route));
-       printf(" %10lu datagram%s arrived with bad tunneling\n",
+       printf(" %10u datagram%s arrived with bad tunneling\n",
          mrtstat.mrts_bad_tunnel, plural(mrtstat.mrts_bad_tunnel));
-       printf(" %10lu datagram%s could not be tunneled\n",
+       printf(" %10u datagram%s could not be tunneled\n",
          mrtstat.mrts_cant_tunnel, plural(mrtstat.mrts_cant_tunnel));
-       printf(" %10lu datagram%s arrived on wrong interface\n",
+       printf(" %10u datagram%s arrived on wrong interface\n",
          mrtstat.mrts_wrong_if, plural(mrtstat.mrts_wrong_if));
-       printf(" %10lu datagram%s selectively dropped\n",
+       printf(" %10u datagram%s selectively dropped\n",
          mrtstat.mrts_drop_sel, plural(mrtstat.mrts_drop_sel));
-       printf(" %10lu datagram%s dropped due to queue overflow\n",
+       printf(" %10u datagram%s dropped due to queue overflow\n",
          mrtstat.mrts_q_overflow, plural(mrtstat.mrts_q_overflow));
-       printf(" %10lu datagram%s dropped for being too large\n",
+       printf(" %10u datagram%s dropped for being too large\n",
          mrtstat.mrts_pkt2large, plural(mrtstat.mrts_pkt2large));
 }