Explicitly allocate stack memory for ICMP payload in IPv4 forward.
authorbluhm <bluhm@openbsd.org>
Mon, 24 Jun 2024 12:19:19 +0000 (12:19 +0000)
committerbluhm <bluhm@openbsd.org>
Mon, 24 Jun 2024 12:19:19 +0000 (12:19 +0000)
commita96be6992871e57ed676b51a9a1512da3ab5f68c
treee70a52c94219557046905d1b7759e9d251c87c6b
parent891e2565a0fb0f6c848ddd8c16053d504d9651bf
Explicitly allocate stack memory for ICMP payload in IPv4 forward.

Old ip_forward() allocated a fake mbuf copy on the stack to send
an ICMP packet after ip_output() has failed.  It seems easier to
just copy the data onto the stack that icmp_error() may use.  Only
if the ICMP error packet is acutally sent, create the mbuf.

m_dup_pkthdr() uses atomic operation to link the incpb to mbuf.
pf_pkt_addr_changed() was immediately called afterwards to remove
the linkage again.  Also m_tag_delete_chain() was overhead.  New
code uses less CPU locking in the hot path.

OK deraadt@ claudio@
sys/netinet/ip_input.c