diff options
author | renato <renato@openbsd.org> | 2015-12-13 18:55:53 +0000 |
---|---|---|
committer | renato <renato@openbsd.org> | 2015-12-13 18:55:53 +0000 |
commit | dcfaa8d436a6736a5e02ca52b996c15d532c0763 (patch) | |
tree | 8a24a98157b4ac480a94e32d0702ef6aa44587c8 | |
parent | -c needs to be able for fail for display-message. (diff) | |
download | wireguard-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.8 | 14 | ||||
-rw-r--r-- | usr.sbin/eigrpctl/eigrpctl.c | 52 | ||||
-rw-r--r-- | usr.sbin/eigrpctl/parser.c | 24 | ||||
-rw-r--r-- | usr.sbin/eigrpctl/parser.h | 3 | ||||
-rw-r--r-- | usr.sbin/eigrpd/control.c | 5 | ||||
-rw-r--r-- | usr.sbin/eigrpd/eigrpd.h | 27 | ||||
-rw-r--r-- | usr.sbin/eigrpd/eigrpe.c | 19 | ||||
-rw-r--r-- | usr.sbin/eigrpd/eigrpe.h | 3 | ||||
-rw-r--r-- | usr.sbin/eigrpd/packet.c | 44 |
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", |