* Copyright (c) 1989 Stephen Deering
* Copyright (c) 1992, 1993
* The Regents of the University of California. All rights reserved.
* This code is derived from software contributed to Berkeley by
* Stephen Deering of Stanford University.
* %sccs.include.redist.c%
* @(#)mroute.c 8.1 (Berkeley) %G%
* Print DVMRP multicast routing structures and statistics.
#include <sys/socketvar.h>
#include <netinet/igmp.h>
#include <netinet/ip_mroute.h>
mroutepr(mrpaddr
, mrtaddr
, vifaddr
)
u_long mrpaddr
, mrtaddr
, vifaddr
;
struct mrt
*mrttable
[MRTHASHSIZ
];
struct vif viftable
[MAXVIFS
];
register struct mrt
*mrt
;
register struct in_addr
*grp
;
register int banner_printed
;
register int saved_nflag
;
printf("ip_mrtproto: symbol not in namelist\n");
kread(mrpaddr
, (char *)&mrtproto
, sizeof(mrtproto
));
printf("no multicast routing compiled into this system\n");
printf("multicast routing protocol %u, unknown\n", mrtproto
);
printf("mrttable: symbol not in namelist\n");
printf("viftable: symbol not in namelist\n");
kread(vifaddr
, (char *)&viftable
, sizeof(viftable
));
for (vifi
= 0, v
= viftable
; vifi
< MAXVIFS
; ++vifi
, ++v
) {
if (v
->v_lcl_addr
.s_addr
== 0)
printf("\nVirtual Interface Table\n%s%s",
" Vif Threshold Local-Address ",
"Remote-Address Groups\n");
printf(" %2u %3u %-15.15s",
vifi
, v
->v_threshold
, routename(v
->v_lcl_addr
.s_addr
));
printf(" %-15.15s\n", (v
->v_flags
& VIFF_TUNNEL
) ?
routename(v
->v_rmt_addr
.s_addr
) : "");
grp
= (struct in_addr
*)malloc(n
* sizeof(*grp
));
printf("v_lcl_grps_n: malloc failed\n");
kread((u_long
)v
->v_lcl_grps
, (caddr_t
)grp
, n
* sizeof(*grp
));
printf("%51s %-15.15s\n",
"", routename((grp
++)->s_addr
));
printf("\nVirtual Interface Table is empty\n");
kread(mrtaddr
, (char *)&mrttable
, sizeof(mrttable
));
for (i
= 0; i
< MRTHASHSIZ
; ++i
) {
for (mrt
= mrttable
[i
]; mrt
!= NULL
; mrt
= mrt
->mrt_next
) {
printf("\nMulticast Routing Table\n%s",
" Hash Origin-Subnet In-Vif Out-Vifs\n");
kread((u_long
)mrt
, (char *)&smrt
, sizeof(*mrt
));
printf(" %3u %-15.15s %2u ",
i
, netname(mrt
->mrt_origin
.s_addr
,
ntohl(mrt
->mrt_originmask
.s_addr
)),
for (vifi
= 0; vifi
< MAXVIFS
; ++vifi
)
if (VIFM_ISSET(vifi
, mrt
->mrt_children
))
VIFM_ISSET(vifi
, mrt
->mrt_leaves
) ?
printf("\nMulticast Routing Table is empty\n");
mrt_stats(mrpaddr
, mstaddr
)
printf("ip_mrtproto: symbol not in namelist\n");
kread(mrpaddr
, (char *)&mrtproto
, sizeof(mrtproto
));
printf("no multicast routing compiled into this system\n");
printf("multicast routing protocol %u, unknown\n", mrtproto
);
printf("mrtstat: symbol not in namelist\n");
kread(mstaddr
, (char *)&mrtstat
, sizeof(mrtstat
));
printf("multicast routing:\n");
printf(" %10u multicast route lookup%s\n",
mrtstat
.mrts_mrt_lookups
, plural(mrtstat
.mrts_mrt_lookups
));
printf(" %10u multicast route cache miss%s\n",
mrtstat
.mrts_mrt_misses
, plurales(mrtstat
.mrts_mrt_misses
));
printf(" %10u group address lookup%s\n",
mrtstat
.mrts_grp_lookups
, plural(mrtstat
.mrts_grp_lookups
));
printf(" %10u group address cache miss%s\n",
mrtstat
.mrts_grp_misses
, plurales(mrtstat
.mrts_grp_misses
));
printf(" %10u datagram%s with no route for origin\n",
mrtstat
.mrts_no_route
, plural(mrtstat
.mrts_no_route
));
printf(" %10u datagram%s with malformed tunnel options\n",
mrtstat
.mrts_bad_tunnel
, plural(mrtstat
.mrts_bad_tunnel
));
printf(" %10u datagram%s with no room for tunnel options\n",
mrtstat
.mrts_cant_tunnel
, plural(mrtstat
.mrts_cant_tunnel
));