aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephan de Wit <stephan.dewt@yahoo.co.uk>2021-08-18 07:17:43 +0000
committerKevin Bowling <kbowling@FreeBSD.org>2021-08-18 07:17:43 +0000
commit66fa12d8fb61485780f32f0226e79d3389567496 (patch)
treef5392bf7a35c583cc92e90804e9ad957f103ddfd
parente3500c602b13f8252eb8bb779849c41d47306cee (diff)
downloadsrc-66fa12d8fb61485780f32f0226e79d3389567496.tar.gz
src-66fa12d8fb61485780f32f0226e79d3389567496.zip
iflib: emulate counters in netmap mode
When iflib devices are in netmap mode the driver counters are no longer updated making it look from userspace tools that traffic has stopped. Reported by: Franco Fichtner <franco@opnsense.org> Reviewed by: vmaffione, iflib (erj, gallatin) Obtained from: OPNsense MFC after: 1 week Differential Revision: https://reviews.freebsd.org/D31550
-rw-r--r--sys/net/iflib.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/sys/net/iflib.c b/sys/net/iflib.c
index abd6bd32cd4e..8c8cc6936f7e 100644
--- a/sys/net/iflib.c
+++ b/sys/net/iflib.c
@@ -993,6 +993,7 @@ iflib_netmap_txsync(struct netmap_kring *kring, int flags)
u_int const lim = kring->nkr_num_slots - 1;
u_int const head = kring->rhead;
struct if_pkt_info pi;
+ int tx_pkts = 0, tx_bytes = 0;
/*
* interrupts on every tx packet are expensive so request
@@ -1077,6 +1078,10 @@ iflib_netmap_txsync(struct netmap_kring *kring, int flags)
ctx->isc_txd_encap(ctx->ifc_softc, &pi);
DBG_COUNTER_INC(tx_encap);
+ /* Update transmit counters */
+ tx_bytes += pi.ipi_len;
+ tx_pkts++;
+
/* Reinit per-packet info for the next one. */
flags = seg_idx = pkt_len = 0;
nic_i_start = -1;
@@ -1135,6 +1140,10 @@ iflib_netmap_txsync(struct netmap_kring *kring, int flags)
iflib_netmap_timer, txq,
txq->ift_netmap_timer.c_cpu, 0);
}
+
+ if_inc_counter(ifp, IFCOUNTER_OBYTES, tx_bytes);
+ if_inc_counter(ifp, IFCOUNTER_OPACKETS, tx_pkts);
+
return (0);
}
@@ -1162,7 +1171,7 @@ iflib_netmap_rxsync(struct netmap_kring *kring, int flags)
u_int n;
u_int const lim = kring->nkr_num_slots - 1;
int force_update = (flags & NAF_FORCE_READ) || kring->nr_kflags & NKR_PENDINTR;
- int i = 0;
+ int i = 0, rx_bytes = 0, rx_pkts = 0;
if_ctx_t ctx = ifp->if_softc;
if_shared_ctx_t sctx = ctx->ifc_sctx;
@@ -1233,6 +1242,10 @@ iflib_netmap_rxsync(struct netmap_kring *kring, int flags)
if (i == (ri.iri_nfrags - 1)) {
ring->slot[nm_i].len -= crclen;
ring->slot[nm_i].flags = 0;
+
+ /* Update receive counters */
+ rx_bytes += ri.iri_len;
+ rx_pkts++;
} else
ring->slot[nm_i].flags = NS_MOREFRAG;
}
@@ -1270,6 +1283,9 @@ iflib_netmap_rxsync(struct netmap_kring *kring, int flags)
*/
netmap_fl_refill(rxq, kring, false);
+ if_inc_counter(ifp, IFCOUNTER_IBYTES, rx_bytes);
+ if_inc_counter(ifp, IFCOUNTER_IPACKETS, rx_pkts);
+
return (0);
}