From dfd09781135583914ae5605c1c938908e0782e66 Mon Sep 17 00:00:00 2001 From: XANTRONIX Development Date: Sun, 20 Sep 2020 12:59:56 -0500 Subject: [PATCH] Move patty_ax25_if_stats accounting into drivers Move patty_ax25_if_stats accounting into drivers to help provide a more consistent interface for accessing and incrementing interface statistics --- include/patty/ax25/if.h | 7 +++++-- src/aprs_is.c | 7 +++++++ src/if.c | 20 +++++++++++++++----- src/server.c | 2 +- src/tnc.c | 18 +++++++++++------- 5 files changed, 39 insertions(+), 15 deletions(-) diff --git a/include/patty/ax25/if.h b/include/patty/ax25/if.h index 8497bbf..8317b0d 100644 --- a/include/patty/ax25/if.h +++ b/include/patty/ax25/if.h @@ -31,6 +31,8 @@ typedef void *(patty_ax25_if_driver_create)(void *); typedef void (patty_ax25_if_driver_destroy)(void *); +typedef patty_ax25_if_stats *(patty_ax25_if_driver_stats)(void *); + typedef int (patty_ax25_if_driver_fd)(void *); typedef int (patty_ax25_if_driver_pending)(void *); @@ -48,6 +50,7 @@ typedef ssize_t (patty_ax25_if_driver_send)(void *, const void *, size_t); typedef struct _patty_ax25_if_driver { patty_ax25_if_driver_create *create; patty_ax25_if_driver_destroy *destroy; + patty_ax25_if_driver_stats *stats; patty_ax25_if_driver_fd *fd; patty_ax25_if_driver_pending *pending; patty_ax25_if_driver_fill *fill; @@ -62,8 +65,6 @@ typedef void patty_ax25_if_phy; typedef void patty_ax25_if_info; typedef struct _patty_ax25_if { - patty_ax25_if_stats stats; - char name[8]; uint32_t flags_classes; @@ -107,6 +108,8 @@ int patty_ax25_if_promisc_add(patty_ax25_if *iface, int patty_ax25_if_promisc_delete(patty_ax25_if *iface, int fd); +void patty_ax25_if_drop(patty_ax25_if *iface); + int patty_ax25_if_fd(patty_ax25_if *iface); int patty_ax25_if_pending(patty_ax25_if *iface); diff --git a/src/aprs_is.c b/src/aprs_is.c index 36a402a..68ef330 100644 --- a/src/aprs_is.c +++ b/src/aprs_is.c @@ -18,6 +18,8 @@ enum state { }; struct _patty_ax25_aprs_is { + patty_ax25_if_stats stats; + int fd; char rx_buf[PATTY_AX25_APRS_IS_PACKET_MAX], @@ -156,6 +158,10 @@ void patty_ax25_aprs_is_destroy(patty_ax25_aprs_is *aprs) { free(aprs); } +patty_ax25_if_stats *patty_ax25_aprs_is_stats(patty_ax25_aprs_is *aprs) { + return &aprs->stats; +} + int patty_ax25_aprs_is_fd(patty_ax25_aprs_is *aprs) { return aprs->fd; } @@ -402,6 +408,7 @@ patty_ax25_if_driver *patty_ax25_aprs_is_driver() { static patty_ax25_if_driver driver = { .create = (patty_ax25_if_driver_create *)patty_ax25_aprs_is_new, .destroy = (patty_ax25_if_driver_destroy *)patty_ax25_aprs_is_destroy, + .stats = (patty_ax25_if_driver_stats *)patty_ax25_aprs_is_stats, .fd = (patty_ax25_if_driver_fd *)patty_ax25_aprs_is_fd, .pending = (patty_ax25_if_driver_pending *)patty_ax25_aprs_is_pending, .fill = (patty_ax25_if_driver_fill *)patty_ax25_aprs_is_fill, diff --git a/src/if.c b/src/if.c index 75ed7c0..c414cad 100644 --- a/src/if.c +++ b/src/if.c @@ -271,6 +271,10 @@ static int handle_promisc_frame(uint32_t key, return patty_kiss_frame_send(fd, frame->buf, frame->len, 0); } +void patty_ax25_if_drop(patty_ax25_if *iface) { + iface->driver->stats(iface->phy)->dropped++; +} + int patty_ax25_if_fd(patty_ax25_if *iface) { return iface->driver->fd(iface->phy); } @@ -301,8 +305,10 @@ ssize_t patty_ax25_if_flush(patty_ax25_if *iface) { .iface = iface }; - iface->stats.rx_frames++; - iface->stats.rx_bytes += len; + patty_ax25_if_stats *stats = iface->driver->stats(iface->phy); + + stats->rx_frames++; + stats->rx_bytes += len; if (patty_dict_each(iface->promisc_fds, handle_promisc_frame, @@ -320,15 +326,19 @@ error_handle_promisc_frame: ssize_t patty_ax25_if_send(patty_ax25_if *iface, const void *buf, size_t len) { - ssize_t wrlen; struct promisc_frame frame; + patty_ax25_if_stats *stats; + + ssize_t wrlen; if ((wrlen = iface->driver->send(iface->phy, buf, len)) < 0) { goto error_driver_send; } - iface->stats.tx_frames++; - iface->stats.tx_bytes += wrlen; + stats = iface->driver->stats(iface->phy); + + stats->tx_frames++; + stats->tx_bytes += wrlen; frame.buf = buf; frame.len = wrlen; diff --git a/src/server.c b/src/server.c index e54039f..4e8f4bc 100644 --- a/src/server.c +++ b/src/server.c @@ -2000,7 +2000,7 @@ static int handle_frame(patty_ax25_server *server, return 0; error_decode: - iface->stats.dropped++; + patty_ax25_if_drop(iface); return 0; } diff --git a/src/tnc.c b/src/tnc.c index a121602..09a60ef 100644 --- a/src/tnc.c +++ b/src/tnc.c @@ -29,6 +29,8 @@ enum state { }; struct _patty_kiss_tnc { + patty_ax25_if_stats stats; + struct termios attrs, attrs_old; @@ -42,8 +44,7 @@ struct _patty_kiss_tnc { size_t bufsz, readlen, offset_i, - offset_o, - dropped; + offset_o; }; patty_kiss_tnc *patty_kiss_tnc_new(patty_kiss_tnc_info *info) { @@ -144,12 +145,13 @@ patty_kiss_tnc *patty_kiss_tnc_new(patty_kiss_tnc_info *info) { errno = 0; } + memset(&tnc->stats, '\0', sizeof(tnc->stats)); + tnc->opts = TNC_NONE; tnc->state = KISS_NONE; tnc->bufsz = PATTY_KISS_TNC_BUFSZ; tnc->offset_i = 0; tnc->offset_o = 0; - tnc->dropped = 0; tnc->readlen = 0; return tnc; @@ -189,6 +191,10 @@ void patty_kiss_tnc_destroy(patty_kiss_tnc *tnc) { free(tnc); } +patty_ax25_if_stats *patty_kiss_tnc_stats(patty_kiss_tnc *tnc) { + return &tnc->stats; +} + int patty_kiss_tnc_fd(patty_kiss_tnc *tnc) { return tnc->fd; } @@ -198,11 +204,8 @@ static void tnc_drop(patty_kiss_tnc *tnc) { tnc->offset_i = 0; tnc->offset_o = 0; tnc->readlen = 0; - tnc->dropped++; -} -size_t patty_kiss_tnc_dropped(patty_kiss_tnc *tnc) { - return tnc->dropped; + tnc->stats.dropped++; } int patty_kiss_tnc_pending(patty_kiss_tnc *tnc) { @@ -341,6 +344,7 @@ patty_ax25_if_driver *patty_kiss_tnc_driver() { static patty_ax25_if_driver driver = { .create = (patty_ax25_if_driver_create *)patty_kiss_tnc_new, .destroy = (patty_ax25_if_driver_destroy *)patty_kiss_tnc_destroy, + .stats = (patty_ax25_if_driver_stats *)patty_kiss_tnc_stats, .fd = (patty_ax25_if_driver_fd *)patty_kiss_tnc_fd, .pending = (patty_ax25_if_driver_pending *)patty_kiss_tnc_pending, .fill = (patty_ax25_if_driver_fill *)patty_kiss_tnc_fill,