IPv4 PIM support, from the submission of Pavlin Radoslavov on tech-net@

This commit is contained in:
manu 2004-09-04 23:35:43 +00:00
parent 40c2c137db
commit 753bcaf581
4 changed files with 148 additions and 8 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: inet.c,v 1.61 2004/05/18 14:44:41 itojun Exp $ */
/* $NetBSD: inet.c,v 1.62 2004/09/04 23:35:43 manu Exp $ */
/*
* Copyright (c) 1983, 1988, 1993
@ -34,7 +34,7 @@
#if 0
static char sccsid[] = "from: @(#)inet.c 8.4 (Berkeley) 4/20/94";
#else
__RCSID("$NetBSD: inet.c,v 1.61 2004/05/18 14:44:41 itojun Exp $");
__RCSID("$NetBSD: inet.c,v 1.62 2004/09/04 23:35:43 manu Exp $");
#endif
#endif /* not lint */
@ -60,6 +60,7 @@ __RCSID("$NetBSD: inet.c,v 1.61 2004/05/18 14:44:41 itojun Exp $");
#include <netinet/icmp_var.h>
#include <netinet/igmp_var.h>
#include <netinet/ip_var.h>
#include <netinet/pim_var.h>
#include <netinet/tcp.h>
#include <netinet/tcpip.h>
#include <netinet/tcp_seq.h>
@ -514,6 +515,45 @@ igmp_stats(off, name)
#undef py
}
/*
* Dump PIM statistics structure.
*/
void
pim_stats(off, name)
u_long off;
char *name;
{
struct pimstat pimstat;
if (off == 0)
return;
if (kread(off, (char *)&pimstat, sizeof (pimstat)) != 0) {
/* XXX: PIM is probably not enabled in the kernel */
return;
}
printf("%s:\n", name);
#define p(f, m) if (pimstat.f || sflag <= 1) \
printf(m, pimstat.f, plural(pimstat.f))
#define py(f, m) if (pimstat.f || sflag <= 1) \
printf(m, pimstat.f, pimstat.f != 1 ? "ies" : "y")
p(pims_rcv_total_msgs, "\t%llu message%s received\n");
p(pims_rcv_total_bytes, "\t%llu byte%s received\n");
p(pims_rcv_tooshort, "\t%llu message%s received with too few bytes\n");
p(pims_rcv_badsum, "\t%llu message%s received with bad checksum\n");
p(pims_rcv_badversion, "\t%llu message%s received with bad version\n");
p(pims_rcv_registers_msgs, "\t%llu data register message%s received\n");
p(pims_rcv_registers_bytes, "\t%llu data register byte%s received\n");
p(pims_rcv_registers_wrongiif, "\t%llu data register message%s received on wrong iif\n");
p(pims_rcv_badregisters, "\t%llu bad register%s received\n");
p(pims_snd_registers_msgs, "\t%llu data register message%s sent\n");
p(pims_snd_registers_bytes, "\t%llu data register byte%s sent\n");
#undef p
#undef py
}
/*
* Dump the ARP statistics structure.
*/

View File

@ -1,4 +1,4 @@
/* $NetBSD: main.c,v 1.46 2004/06/27 01:10:54 jonathan Exp $ */
/* $NetBSD: main.c,v 1.47 2004/09/04 23:35:43 manu Exp $ */
/*
* Copyright (c) 1983, 1988, 1993
@ -39,7 +39,7 @@ __COPYRIGHT("@(#) Copyright (c) 1983, 1988, 1993\n\
#if 0
static char sccsid[] = "from: @(#)main.c 8.4 (Berkeley) 3/1/94";
#else
__RCSID("$NetBSD: main.c,v 1.46 2004/06/27 01:10:54 jonathan Exp $");
__RCSID("$NetBSD: main.c,v 1.47 2004/09/04 23:35:43 manu Exp $");
#endif
#endif /* not lint */
@ -202,6 +202,8 @@ struct nlist nl[] = {
{ "_pkintrq" },
#define N_HARDCLOCK_TICKS 67
{ "_hardclock_ticks" },
#define N_PIMSTAT 68
{ "_pimstat" },
{ "" },
};
@ -233,6 +235,8 @@ struct protox {
{ -1, N_IPSECSTAT, 1, 0,
ipsec_switch, NULL, 0, "ipsec" },
#endif
{ -1, N_PIMSTAT, 1, 0,
pim_stats, NULL, 0, "pim" },
{ -1, -1, 0, 0,
0, NULL, 0, 0 }
};

View File

@ -1,4 +1,4 @@
/* $NetBSD: mroute.c,v 1.17 2003/08/07 11:15:21 agc Exp $ */
/* $NetBSD: mroute.c,v 1.18 2004/09/04 23:35:43 manu Exp $ */
/*
* Copyright (c) 1992, 1993
@ -76,12 +76,12 @@
#if 0
static char sccsid[] = "from: @(#)mroute.c 8.1 (Berkeley) 6/6/93";
#else
__RCSID("$NetBSD: mroute.c,v 1.17 2003/08/07 11:15:21 agc Exp $");
__RCSID("$NetBSD: mroute.c,v 1.18 2004/09/04 23:35:43 manu Exp $");
#endif
#endif /* not lint */
/*
* Print DVMRP multicast routing structures and statistics.
* Print multicast routing structures and statistics.
*
* MROUTING 1.0
*/
@ -104,6 +104,7 @@ __RCSID("$NetBSD: mroute.c,v 1.17 2003/08/07 11:15:21 agc Exp $");
#include "netstat.h"
static char *pktscale __P((u_long));
static void print_bw_meter __P((struct bw_meter *, int *));
static char *
pktscale(n)
@ -232,6 +233,27 @@ mroutepr(mrpaddr, mfchashtbladdr, mfchashaddr, vifaddr)
printf(" %u/%u", vifi, mfc.mfc_ttls[vifi]);
printf("\n");
/* Print the bw meter information */
{
struct bw_meter bw_meter, *bwm;
int banner_printed2 = 0;
bwm = mfc.mfc_bw_meter;
while (bwm) {
kread((u_long)bwm,
(char *)&bw_meter,
sizeof bw_meter);
print_bw_meter(&bw_meter,
&banner_printed2);
bwm = bw_meter.bm_mfc_next;
}
#if 0 /* Don't ever print it? */
if (! banner_printed2)
printf("\n No Bandwidth Meters\n");
#endif
}
nmfc++;
}
}
@ -244,6 +266,79 @@ mroutepr(mrpaddr, mfchashtbladdr, mfchashaddr, vifaddr)
numeric_addr = saved_numeric_addr;
}
static void
print_bw_meter(bw_meter, banner_printed)
struct bw_meter *bw_meter;
int *banner_printed;
{
char s0[256], s1[256], s2[256], s3[256];
struct timeval now, end, delta;
gettimeofday(&now, NULL);
if (! *banner_printed) {
printf(" Bandwidth Meters\n");
printf(" %-30s", "Measured(Start|Packets|Bytes)");
printf(" %s", "Type");
printf(" %-30s", "Thresh(Interval|Packets|Bytes)");
printf(" Remain");
printf("\n");
*banner_printed = 1;
}
/* The measured values */
if (bw_meter->bm_flags & BW_METER_UNIT_PACKETS)
sprintf(s1, "%llu", bw_meter->bm_measured.b_packets);
else
sprintf(s1, "?");
if (bw_meter->bm_flags & BW_METER_UNIT_BYTES)
sprintf(s2, "%llu", bw_meter->bm_measured.b_bytes);
else
sprintf(s2, "?");
sprintf(s0, "%lu.%lu|%s|%s",
bw_meter->bm_start_time.tv_sec,
bw_meter->bm_start_time.tv_usec,
s1, s2);
printf(" %-30s", s0);
/* The type of entry */
sprintf(s0, "%s", "?");
if (bw_meter->bm_flags & BW_METER_GEQ)
sprintf(s0, "%s", ">=");
else if (bw_meter->bm_flags & BW_METER_LEQ)
sprintf(s0, "%s", "<=");
printf(" %-3s", s0);
/* The threshold values */
if (bw_meter->bm_flags & BW_METER_UNIT_PACKETS)
sprintf(s1, "%llu", bw_meter->bm_threshold.b_packets);
else
sprintf(s1, "?");
if (bw_meter->bm_flags & BW_METER_UNIT_BYTES)
sprintf(s2, "%llu", bw_meter->bm_threshold.b_bytes);
else
sprintf(s2, "?");
sprintf(s0, "%lu.%lu|%s|%s",
bw_meter->bm_threshold.b_time.tv_sec,
bw_meter->bm_threshold.b_time.tv_usec,
s1, s2);
printf(" %-30s", s0);
/* Remaining time */
timeradd(&bw_meter->bm_start_time,
&bw_meter->bm_threshold.b_time, &end);
if (timercmp(&now, &end, <=)) {
timersub(&end, &now, &delta);
sprintf(s3, "%lu.%lu", delta.tv_sec, delta.tv_usec);
} else {
/* Negative time */
timersub(&now, &end, &delta);
sprintf(s3, "-%lu.%lu", delta.tv_sec, delta.tv_usec);
}
printf(" %s", s3);
printf("\n");
}
void
mrt_stats(mrpaddr, mstaddr)

View File

@ -1,4 +1,4 @@
/* $NetBSD: netstat.h,v 1.29 2004/05/07 00:55:15 jonathan Exp $ */
/* $NetBSD: netstat.h,v 1.30 2004/09/04 23:35:43 manu Exp $ */
/*
* Copyright (c) 1992, 1993
@ -74,6 +74,7 @@ void udp_stats __P((u_long, char *));
void ip_stats __P((u_long, char *));
void icmp_stats __P((u_long, char *));
void igmp_stats __P((u_long, char *));
void pim_stats __P((u_long, char *));
void arp_stats __P((u_long, char *));
#ifdef IPSEC
/* run-time selector for which implementation (KAME, FAST_IPSEC) to show */