summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVitaliy Makkoveev <mvs@cvs.openbsd.org>2024-08-20 07:47:26 +0000
committerVitaliy Makkoveev <mvs@cvs.openbsd.org>2024-08-20 07:47:26 +0000
commit497ccfca54af4795787cf8295f790a6d414fedf6 (patch)
treeae5299aab22b5df24efae968d217f8d3ba6270a5
parentc0a4a91c1c3f2e32650fa335f36f2108333e2b62 (diff)
Unlock etherip_sysctl().
- ETHERIPCTL_ALLOW - atomically accessed integer; - ETHERIPCTL_STATS - per-CPU counters ok bluhm
-rw-r--r--sys/net/if_etherip.c21
-rw-r--r--sys/netinet/in_proto.c4
2 files changed, 13 insertions, 12 deletions
diff --git a/sys/net/if_etherip.c b/sys/net/if_etherip.c
index dd4e90c595d..0dc3614b723 100644
--- a/sys/net/if_etherip.c
+++ b/sys/net/if_etherip.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: if_etherip.c,v 1.55 2024/02/13 12:22:09 bluhm Exp $ */
+/* $OpenBSD: if_etherip.c,v 1.56 2024/08/20 07:47:25 mvs Exp $ */
/*
* Copyright (c) 2015 Kazuya GODA <goda@openbsd.org>
*
@@ -55,6 +55,11 @@
#include <net/if_etherip.h>
+/*
+ * Locks used to protect data:
+ * a atomic
+ */
+
union etherip_addr {
struct in_addr in4;
struct in6_addr in6;
@@ -97,7 +102,7 @@ struct etherip_softc {
* We can control the acceptance of EtherIP packets by altering the sysctl
* net.inet.etherip.allow value. Zero means drop them, all else is acceptance.
*/
-int etherip_allow = 0;
+int etherip_allow = 0; /* [a] */
struct cpumem *etheripcounters;
@@ -628,7 +633,8 @@ etherip_input(struct etherip_tunnel *key, struct mbuf *m, uint8_t tos,
struct etherip_header *eip;
int rxprio;
- if (!etherip_allow && (m->m_flags & (M_AUTH|M_CONF)) == 0) {
+ if (atomic_load_int(&etherip_allow) == 0 &&
+ (m->m_flags & (M_AUTH|M_CONF)) == 0) {
etheripstat_inc(etherips_pdrops);
goto drop;
}
@@ -799,19 +805,14 @@ int
etherip_sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp,
void *newp, size_t newlen)
{
- int error;
-
/* All sysctl names at this level are terminal. */
if (namelen != 1)
return ENOTDIR;
switch (name[0]) {
case ETHERIPCTL_ALLOW:
- NET_LOCK();
- error = sysctl_int_bounded(oldp, oldlenp, newp, newlen,
- &etherip_allow, 0, 1);
- NET_UNLOCK();
- return (error);
+ return (sysctl_int_bounded(oldp, oldlenp, newp, newlen,
+ &etherip_allow, 0, 1));
case ETHERIPCTL_STATS:
return (etherip_sysctl_etheripstat(oldp, oldlenp, newp));
default:
diff --git a/sys/netinet/in_proto.c b/sys/netinet/in_proto.c
index 558123df7ef..e4e00015ce9 100644
--- a/sys/netinet/in_proto.c
+++ b/sys/netinet/in_proto.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: in_proto.c,v 1.109 2024/08/20 07:46:27 mvs Exp $ */
+/* $OpenBSD: in_proto.c,v 1.110 2024/08/20 07:47:25 mvs Exp $ */
/* $NetBSD: in_proto.c,v 1.14 1996/02/18 18:58:32 christos Exp $ */
/*
@@ -366,7 +366,7 @@ const struct protosw inetsw[] = {
.pr_type = SOCK_RAW,
.pr_domain = &inetdomain,
.pr_protocol = IPPROTO_ETHERIP,
- .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET,
+ .pr_flags = PR_ATOMIC|PR_ADDR|PR_MPSOCKET|PR_MPSYSCTL,
.pr_input = ip_etherip_input,
.pr_ctloutput = rip_ctloutput,
.pr_usrreqs = &rip_usrreqs,