Read IPsec forwarding information once.
authorbluhm <bluhm@openbsd.org>
Tue, 2 Jul 2024 18:33:47 +0000 (18:33 +0000)
committerbluhm <bluhm@openbsd.org>
Tue, 2 Jul 2024 18:33:47 +0000 (18:33 +0000)
commit0e25137aacafd0b8445eef84d77c82f326686a18
treea40f8e821a012417c8f0500765dd2e26600106e6
parent11d381874a35ef1e6c970c722b1d610abef71698
Read IPsec forwarding information once.

Fix MP race between reading ip_forwarding in ip_input() and checking
ip_forwarding == 2 in ip_output().  In theory ip_forwarding could
be 2 during ip_input() and later 0 in ip_output().  Then a packet
would be forwarded that was never allowed.  Currently exclusive
netlock in sysctl(2) prevents all races.

Introduce IP_FORWARDING_IPSEC and pass it with the flags parameter
that was introduced for IP_FORWARDING.

Instead of calling m_tag_find(), traversing the list, and comparing
with NULL, just check the PACKET_TAG_IPSEC_IN_DONE bit.  Reading
ipsec_in_use in ip_output() is a performance hack that is not
necessary.  New code only checks tree bits.

OK mvs@
sys/net/pf.c
sys/netinet/ip_input.c
sys/netinet/ip_mroute.c
sys/netinet/ip_output.c
sys/netinet/ip_var.h