summaryrefslogtreecommitdiff
path: root/sys
diff options
context:
space:
mode:
authorAlexander Bluhm <bluhm@cvs.openbsd.org>2023-12-29 11:43:05 +0000
committerAlexander Bluhm <bluhm@cvs.openbsd.org>2023-12-29 11:43:05 +0000
commit709367d88c5f74a55ed2526fb552819926a20d04 (patch)
treed46d14af76ce47824b99c88a6c2f65681576376c /sys
parentf51baa807b657021404460f992484046127bcee5 (diff)
Make loopback interface counters MP safe.
Create and use the MP safe version of the interface counters for lo(4). Input packets were counted twice. As interface input queue is already counting, remove input count in if_input_local(). Multicast and siplex packets are counted at the ethernet interface. Add a comment that this not MP safe. OK mvs@
Diffstat (limited to 'sys')
-rw-r--r--sys/net/if.c15
-rw-r--r--sys/net/if_loop.c5
2 files changed, 12 insertions, 8 deletions
diff --git a/sys/net/if.c b/sys/net/if.c
index 61c24afb31f..bb1b8919e92 100644
--- a/sys/net/if.c
+++ b/sys/net/if.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if.c,v 1.713 2023/12/23 10:52:54 bluhm Exp $ */
+/* $OpenBSD: if.c,v 1.714 2023/12/29 11:43:04 bluhm Exp $ */
/* $NetBSD: if.c,v 1.35 1996/05/07 05:26:04 thorpej Exp $ */
/*
@@ -839,11 +839,14 @@ if_input_local(struct ifnet *ifp, struct mbuf *m, sa_family_t af)
if (ISSET(keepcksum, M_ICMP_CSUM_OUT))
m->m_pkthdr.csum_flags |= M_ICMP_CSUM_IN_OK;
- ifp->if_opackets++;
- ifp->if_obytes += m->m_pkthdr.len;
-
- ifp->if_ipackets++;
- ifp->if_ibytes += m->m_pkthdr.len;
+ if (ifp->if_counters == NULL) {
+ /* XXXSMP multicast loopback and simplex interfaces */
+ ifp->if_opackets++;
+ ifp->if_obytes += m->m_pkthdr.len;
+ } else {
+ counters_pkt(ifp->if_counters, ifc_opackets, ifc_obytes,
+ m->m_pkthdr.len);
+ }
switch (af) {
case AF_INET:
diff --git a/sys/net/if_loop.c b/sys/net/if_loop.c
index 1c771d1bfd5..6a22baf4b35 100644
--- a/sys/net/if_loop.c
+++ b/sys/net/if_loop.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_loop.c,v 1.97 2023/07/21 22:24:41 bluhm Exp $ */
+/* $OpenBSD: if_loop.c,v 1.98 2023/12/29 11:43:04 bluhm Exp $ */
/* $NetBSD: if_loop.c,v 1.15 1996/05/07 02:40:33 thorpej Exp $ */
/*
@@ -185,6 +185,7 @@ loop_clone_create(struct if_clone *ifc, int unit)
ifp->if_output = looutput;
ifp->if_type = IFT_LOOP;
ifp->if_hdrlen = sizeof(u_int32_t);
+ if_counters_alloc(ifp);
if (unit == 0) {
if_attachhead(ifp);
if_addgroup(ifp, ifc->ifc_name);
@@ -250,7 +251,7 @@ loinput(struct ifnet *ifp, struct mbuf *m)
error = if_input_local(ifp, m, m->m_pkthdr.ph_family);
if (error)
- ifp->if_ierrors++;
+ counters_inc(ifp->if_counters, ifc_ierrors);
}
int