summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrenato <renato@openbsd.org>2015-12-13 18:55:53 +0000
committerrenato <renato@openbsd.org>2015-12-13 18:55:53 +0000
commitdcfaa8d436a6736a5e02ca52b996c15d532c0763 (patch)
tree8a24a98157b4ac480a94e32d0702ef6aa44587c8
parent-c needs to be able for fail for display-message. (diff)
downloadwireguard-openbsd-dcfaa8d436a6736a5e02ca52b996c15d532c0763.tar.xz
wireguard-openbsd-dcfaa8d436a6736a5e02ca52b996c15d532c0763.zip
Introduce new command to show traffic statistics.
Can be useful as a troubleshooting tool.
-rw-r--r--usr.sbin/eigrpctl/eigrpctl.814
-rw-r--r--usr.sbin/eigrpctl/eigrpctl.c52
-rw-r--r--usr.sbin/eigrpctl/parser.c24
-rw-r--r--usr.sbin/eigrpctl/parser.h3
-rw-r--r--usr.sbin/eigrpd/control.c5
-rw-r--r--usr.sbin/eigrpd/eigrpd.h27
-rw-r--r--usr.sbin/eigrpd/eigrpe.c19
-rw-r--r--usr.sbin/eigrpd/eigrpe.h3
-rw-r--r--usr.sbin/eigrpd/packet.c44
9 files changed, 178 insertions, 13 deletions
diff --git a/usr.sbin/eigrpctl/eigrpctl.8 b/usr.sbin/eigrpctl/eigrpctl.8
index 27958e1e9f9..86832335ed8 100644
--- a/usr.sbin/eigrpctl/eigrpctl.8
+++ b/usr.sbin/eigrpctl/eigrpctl.8
@@ -1,4 +1,4 @@
-.\" $OpenBSD: eigrpctl.8,v 1.3 2015/10/27 03:30:23 renato Exp $
+.\" $OpenBSD: eigrpctl.8,v 1.4 2015/12/13 18:55:53 renato Exp $
.\"
.\" Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
.\" Copyright (c) 2004, 2005 Esben Norby <norby@openbsd.org>
@@ -15,7 +15,7 @@
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
.\"
-.Dd $Mdocdate: October 27 2015 $
+.Dd $Mdocdate: December 13 2015 $
.Dt EIGRPCTL 8
.Os
.Sh NAME
@@ -125,6 +125,16 @@ Show only active entries.
.It Cm all-links
Show all entries.
.El
+.It Xo
+.Cm show traffic
+.Op Cm family Ar family
+.Op Cm as Ar as
+.Xc
+Show traffic statistics.
+.Ar family
+and
+.Ar as ,
+if given, limit the output to the given address family and/or autonomous system.
.El
.Sh FILES
.Bl -tag -width "/var/run/eigrpd.sockXX" -compact
diff --git a/usr.sbin/eigrpctl/eigrpctl.c b/usr.sbin/eigrpctl/eigrpctl.c
index 068634bedb4..ac2ddf6eaee 100644
--- a/usr.sbin/eigrpctl/eigrpctl.c
+++ b/usr.sbin/eigrpctl/eigrpctl.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: eigrpctl.c,v 1.6 2015/12/07 20:28:18 mmcc Exp $ */
+/* $OpenBSD: eigrpctl.c,v 1.7 2015/12/13 18:55:53 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -59,6 +59,7 @@ const char * get_media_descr(uint64_t);
const char * get_linkstate(uint8_t, int);
void print_baudrate(uint64_t);
int show_fib_interface_msg(struct imsg *);
+int show_stats_msg(struct imsg *, struct parse_result *);
struct imsgbuf *ibuf;
@@ -157,6 +158,9 @@ main(int argc, char *argv[])
imsg_compose(ibuf, IMSG_CTL_IFINFO, 0, 0, -1, NULL, 0);
show_interface_head();
break;
+ case SHOW_STATS:
+ imsg_compose(ibuf, IMSG_CTL_SHOW_STATS, 0, 0, -1, NULL, 0);
+ break;
case FIB:
errx(1, "fib couple|decouple");
break;
@@ -225,6 +229,9 @@ main(int argc, char *argv[])
case SHOW_FIB_IFACE:
done = show_fib_interface_msg(&imsg);
break;
+ case SHOW_STATS:
+ done = show_stats_msg(&imsg, res);
+ break;
case NONE:
case FIB:
case FIB_COUPLE:
@@ -781,3 +788,46 @@ show_fib_interface_msg(struct imsg *imsg)
return (0);
}
+
+int
+show_stats_msg(struct imsg *imsg, struct parse_result *res)
+{
+ struct ctl_stats *cs;
+
+ switch (imsg->hdr.type) {
+ case IMSG_CTL_SHOW_STATS:
+ if (imsg->hdr.len < IMSG_HEADER_SIZE + sizeof(struct ctl_stats))
+ errx(1, "wrong imsg len");
+ cs = imsg->data;
+
+ if (res->family != AF_UNSPEC && res->family != cs->af)
+ break;
+ if (res->as != 0 && res->as != cs->as)
+ break;
+
+ printf("Address Family %s, Autonomous System %u\n",
+ af_name(cs->af), cs->as);
+ printf(" Hellos sent/received: %u/%u\n",
+ cs->stats.hellos_sent, cs->stats.hellos_recv);
+ printf(" Updates sent/received: %u/%u\n",
+ cs->stats.updates_sent, cs->stats.updates_recv);
+ printf(" Queries sent/received: %u/%u\n",
+ cs->stats.queries_sent, cs->stats.queries_recv);
+ printf(" Replies sent/received: %u/%u\n",
+ cs->stats.replies_sent, cs->stats.replies_recv);
+ printf(" Acks sent/received: %u/%u\n",
+ cs->stats.acks_sent, cs->stats.acks_recv);
+ printf(" SIA-Queries sent/received: %u/%u\n",
+ cs->stats.squeries_sent, cs->stats.squeries_recv);
+ printf(" SIA-Replies sent/received: %u/%u\n",
+ cs->stats.sreplies_sent, cs->stats.sreplies_recv);
+ break;
+ case IMSG_CTL_END:
+ printf("\n");
+ return (1);
+ default:
+ break;
+ }
+
+ return (0);
+}
diff --git a/usr.sbin/eigrpctl/parser.c b/usr.sbin/eigrpctl/parser.c
index d01f05b8558..55d744633b6 100644
--- a/usr.sbin/eigrpctl/parser.c
+++ b/usr.sbin/eigrpctl/parser.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: parser.c,v 1.2 2015/10/14 13:27:50 jsg Exp $ */
+/* $OpenBSD: parser.c,v 1.3 2015/12/13 18:55:53 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -67,6 +67,9 @@ static const struct token t_show_topology_af[];
static const struct token t_show_topology_as[];
static const struct token t_show_fib[];
static const struct token t_show_fib_af[];
+static const struct token t_show_stats[];
+static const struct token t_show_stats_af[];
+static const struct token t_show_stats_as[];
static const struct token t_log[];
static const struct token t_main[] = {
@@ -89,6 +92,7 @@ static const struct token t_show[] = {
{KEYWORD, "neighbor", SHOW_NBR, t_show_nbr},
{KEYWORD, "topology", SHOW_TOPOLOGY, t_show_topology},
{KEYWORD, "fib", SHOW_FIB, t_show_fib},
+ {KEYWORD, "traffic", SHOW_STATS, t_show_stats},
{ENDTOKEN, "", NONE, NULL}
};
@@ -163,6 +167,24 @@ static const struct token t_show_fib_af[] = {
{ENDTOKEN, "", NONE, NULL}
};
+
+static const struct token t_show_stats[] = {
+ {NOTOKEN, "", NONE, NULL},
+ {KEYWORD, "family", NONE, t_show_stats_af},
+ {KEYWORD, "as", NONE, t_show_stats_as},
+ {ENDTOKEN, "", NONE, NULL}
+};
+
+static const struct token t_show_stats_af[] = {
+ {FAMILY, "", NONE, t_show_stats},
+ {ENDTOKEN, "", NONE, NULL}
+};
+
+static const struct token t_show_stats_as[] = {
+ {ASNUM, "", NONE, t_show_stats},
+ {ENDTOKEN, "", NONE, NULL}
+};
+
static const struct token t_log[] = {
{KEYWORD, "verbose", LOG_VERBOSE, NULL},
{KEYWORD, "brief", LOG_BRIEF, NULL},
diff --git a/usr.sbin/eigrpctl/parser.h b/usr.sbin/eigrpctl/parser.h
index 3c44b005a1f..0af3352b3e0 100644
--- a/usr.sbin/eigrpctl/parser.h
+++ b/usr.sbin/eigrpctl/parser.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: parser.h,v 1.1 2015/10/02 04:31:52 renato Exp $ */
+/* $OpenBSD: parser.h,v 1.2 2015/12/13 18:55:53 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -39,6 +39,7 @@ enum actions {
SHOW_TOPOLOGY,
SHOW_FIB,
SHOW_FIB_IFACE,
+ SHOW_STATS,
RELOAD
};
diff --git a/usr.sbin/eigrpd/control.c b/usr.sbin/eigrpd/control.c
index 61ba96f59e6..ff5a1f03bd1 100644
--- a/usr.sbin/eigrpd/control.c
+++ b/usr.sbin/eigrpd/control.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: control.c,v 1.2 2015/12/05 15:49:01 claudio Exp $ */
+/* $OpenBSD: control.c,v 1.3 2015/12/13 18:55:53 renato Exp $ */
/*
* Copyright (c) 2003, 2004 Henning Brauer <henning@openbsd.org>
@@ -278,6 +278,9 @@ control_dispatch_imsg(int fd, short event, void *bula)
case IMSG_CTL_SHOW_NBR:
eigrpe_nbr_ctl(c);
break;
+ case IMSG_CTL_SHOW_STATS:
+ eigrpe_stats_ctl(c);
+ break;
case IMSG_CTL_LOG_VERBOSE:
if (imsg.hdr.len != IMSG_HEADER_SIZE +
sizeof(verbose))
diff --git a/usr.sbin/eigrpd/eigrpd.h b/usr.sbin/eigrpd/eigrpd.h
index 473501b8cf0..a2d1db7dae8 100644
--- a/usr.sbin/eigrpd/eigrpd.h
+++ b/usr.sbin/eigrpd/eigrpd.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: eigrpd.h,v 1.5 2015/10/21 03:52:12 renato Exp $ */
+/* $OpenBSD: eigrpd.h,v 1.6 2015/12/13 18:55:53 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -71,6 +71,7 @@ enum imsg_type {
IMSG_CTL_SHOW_INTERFACE,
IMSG_CTL_SHOW_NBR,
IMSG_CTL_SHOW_TOPOLOGY,
+ IMSG_CTL_SHOW_STATS,
IMSG_CTL_FIB_COUPLE,
IMSG_CTL_FIB_DECOUPLE,
IMSG_CTL_IFACE,
@@ -252,6 +253,23 @@ struct redistribute {
};
SIMPLEQ_HEAD(redist_list, redistribute);
+struct eigrp_stats {
+ uint32_t hellos_sent;
+ uint32_t hellos_recv;
+ uint32_t updates_sent;
+ uint32_t updates_recv;
+ uint32_t queries_sent;
+ uint32_t queries_recv;
+ uint32_t replies_sent;
+ uint32_t replies_recv;
+ uint32_t acks_sent;
+ uint32_t acks_recv;
+ uint32_t squeries_sent;
+ uint32_t squeries_recv;
+ uint32_t sreplies_sent;
+ uint32_t sreplies_recv;
+};
+
/* eigrp instance */
struct eigrp {
TAILQ_ENTRY(eigrp) entry;
@@ -270,6 +288,7 @@ struct eigrp {
struct rde_nbr *rnbr_summary;
struct rt_tree topology;
uint32_t seq_num;
+ struct eigrp_stats stats;
};
/* eigrp_conf */
@@ -399,6 +418,12 @@ struct ctl_show_topology_req {
uint16_t flags;
};
+struct ctl_stats {
+ int af;
+ uint16_t as;
+ struct eigrp_stats stats;
+};
+
/* parse.y */
struct eigrpd_conf *parse_config(char *, int);
int cmdline_symset(char *);
diff --git a/usr.sbin/eigrpd/eigrpe.c b/usr.sbin/eigrpd/eigrpe.c
index f40dcd65267..df9f1d61536 100644
--- a/usr.sbin/eigrpd/eigrpe.c
+++ b/usr.sbin/eigrpd/eigrpe.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: eigrpe.c,v 1.9 2015/12/05 15:49:01 claudio Exp $ */
+/* $OpenBSD: eigrpe.c,v 1.10 2015/12/13 18:55:53 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -690,3 +690,20 @@ eigrpe_nbr_ctl(struct ctl_conn *c)
imsg_compose_event(&c->iev, IMSG_CTL_END, 0, 0, -1, NULL, 0);
}
+
+void
+eigrpe_stats_ctl(struct ctl_conn *c)
+{
+ struct eigrp *eigrp;
+ struct ctl_stats sctl;
+
+ TAILQ_FOREACH(eigrp, &econf->instances, entry) {
+ sctl.af = eigrp->af;
+ sctl.as = eigrp->as;
+ memcpy(&sctl.stats, &eigrp->stats, sizeof(sctl.stats));
+ imsg_compose_event(&c->iev, IMSG_CTL_SHOW_STATS, 0,
+ 0, -1, &sctl, sizeof(struct ctl_stats));
+ }
+
+ imsg_compose_event(&c->iev, IMSG_CTL_END, 0, 0, -1, NULL, 0);
+}
diff --git a/usr.sbin/eigrpd/eigrpe.h b/usr.sbin/eigrpd/eigrpe.h
index 434c26d6159..360578cfe1b 100644
--- a/usr.sbin/eigrpd/eigrpe.h
+++ b/usr.sbin/eigrpd/eigrpe.h
@@ -1,4 +1,4 @@
-/* $OpenBSD: eigrpe.h,v 1.3 2015/10/05 01:59:33 renato Exp $ */
+/* $OpenBSD: eigrpe.h,v 1.4 2015/12/13 18:55:53 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -85,6 +85,7 @@ void eigrpe_orig_local_route(struct eigrp_iface *,
struct if_addr *, int);
void eigrpe_iface_ctl(struct ctl_conn *, unsigned int);
void eigrpe_nbr_ctl(struct ctl_conn *);
+void eigrpe_stats_ctl(struct ctl_conn *);
/* interface.c */
struct iface *if_new(struct eigrpd_conf *, struct kif *);
diff --git a/usr.sbin/eigrpd/packet.c b/usr.sbin/eigrpd/packet.c
index 05a57f6db1e..9dfa9e08ed8 100644
--- a/usr.sbin/eigrpd/packet.c
+++ b/usr.sbin/eigrpd/packet.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: packet.c,v 1.4 2015/10/10 05:03:39 renato Exp $ */
+/* $OpenBSD: packet.c,v 1.5 2015/12/13 18:55:53 renato Exp $ */
/*
* Copyright (c) 2015 Renato Westphal <renato@openbsd.org>
@@ -190,15 +190,43 @@ send_packet(struct eigrp_iface *ei, struct nbr *nbr, uint32_t flags,
switch (eigrp->af) {
case AF_INET:
- send_packet_v4(iface, nbr, buf);
+ if (send_packet_v4(iface, nbr, buf) < 0)
+ return (-1);
break;
case AF_INET6:
- send_packet_v6(iface, nbr, buf);
+ if (send_packet_v6(iface, nbr, buf) < 0)
+ return (-1);
break;
default:
fatalx("send_packet: unknown af");
}
+ switch (eigrp_hdr->opcode) {
+ case EIGRP_OPC_HELLO:
+ if (ntohl(eigrp_hdr->ack_num) == 0)
+ ei->eigrp->stats.hellos_sent++;
+ else
+ ei->eigrp->stats.acks_sent++;
+ break;
+ case EIGRP_OPC_UPDATE:
+ ei->eigrp->stats.updates_sent++;
+ break;
+ case EIGRP_OPC_QUERY:
+ ei->eigrp->stats.queries_sent++;
+ break;
+ case EIGRP_OPC_REPLY:
+ ei->eigrp->stats.replies_sent++;
+ break;
+ case EIGRP_OPC_SIAQUERY:
+ ei->eigrp->stats.squeries_sent++;
+ break;
+ case EIGRP_OPC_SIAREPLY:
+ ei->eigrp->stats.sreplies_sent++;
+ break;
+ default:
+ break;
+ }
+
return (0);
}
@@ -402,23 +430,31 @@ recv_packet(int af, union eigrpd_addr *src, union eigrpd_addr *dest,
/* switch EIGRP packet type */
switch (eigrp_hdr->opcode) {
case EIGRP_OPC_HELLO:
- if (ntohl(eigrp_hdr->ack_num) == 0)
+ if (ntohl(eigrp_hdr->ack_num) == 0) {
recv_hello(ei, src, nbr, tp);
+ ei->eigrp->stats.hellos_recv++;
+ } else
+ ei->eigrp->stats.acks_recv++;
break;
case EIGRP_OPC_UPDATE:
recv_update(nbr, &rinfo_list, ntohl(eigrp_hdr->flags));
+ ei->eigrp->stats.updates_recv++;
break;
case EIGRP_OPC_QUERY:
recv_query(nbr, &rinfo_list, 0);
+ ei->eigrp->stats.queries_recv++;
break;
case EIGRP_OPC_REPLY:
recv_reply(nbr, &rinfo_list, 0);
+ ei->eigrp->stats.replies_recv++;
break;
case EIGRP_OPC_SIAQUERY:
recv_query(nbr, &rinfo_list, 1);
+ ei->eigrp->stats.squeries_recv++;
break;
case EIGRP_OPC_SIAREPLY:
recv_reply(nbr, &rinfo_list, 1);
+ ei->eigrp->stats.sreplies_recv++;
break;
default:
log_debug("%s: unknown EIGRP packet type, interface %s",