Hi, ip_output() and ip6_output() should be MP safe when called with NULL options.
ok? bluhm Index: netinet/ip_input.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet/ip_input.c,v retrieving revision 1.385 diff -u -p -r1.385 ip_input.c --- netinet/ip_input.c 18 May 2023 09:59:43 -0000 1.385 +++ netinet/ip_input.c 5 Sep 2023 11:48:25 -0000 @@ -1851,7 +1851,7 @@ ip_send_do_dispatch(void *xmq, int flags if (ml_empty(&ml)) return; - NET_LOCK(); + NET_LOCK_SHARED(); while ((m = ml_dequeue(&ml)) != NULL) { u_int32_t ipsecflowinfo = 0; @@ -1862,7 +1862,7 @@ ip_send_do_dispatch(void *xmq, int flags } ip_output(m, NULL, NULL, flags, NULL, NULL, ipsecflowinfo); } - NET_UNLOCK(); + NET_UNLOCK_SHARED(); } void Index: netinet6/ip6_input.c =================================================================== RCS file: /data/mirror/openbsd/cvs/src/sys/netinet6/ip6_input.c,v retrieving revision 1.254 diff -u -p -r1.254 ip6_input.c --- netinet6/ip6_input.c 21 Aug 2022 14:15:55 -0000 1.254 +++ netinet6/ip6_input.c 5 Sep 2023 11:48:44 -0000 @@ -1572,11 +1572,11 @@ ip6_send_dispatch(void *xmq) if (ml_empty(&ml)) return; - NET_LOCK(); + NET_LOCK_SHARED(); while ((m = ml_dequeue(&ml)) != NULL) { ip6_output(m, NULL, NULL, 0, NULL, NULL); } - NET_UNLOCK(); + NET_UNLOCK_SHARED(); } void