The IP in IP input function strips the outer header and reinserts
authorbluhm <bluhm@openbsd.org>
Wed, 5 Jul 2017 11:34:10 +0000 (11:34 +0000)
committerbluhm <bluhm@openbsd.org>
Wed, 5 Jul 2017 11:34:10 +0000 (11:34 +0000)
commitbb24c5264ce5c173de4416327edfcfa6883b62ff
tree72a0a13522e84689b894b16cebf6f278ef907713
parent2c3d0355d644cee32f9bbf0fcbc72ca550172d48
The IP in IP input function strips the outer header and reinserts
the inner IP packet into the internet queue.  The IPv6 local delivery
code has a loop to deal with header chains.  The idea is to use
this loop and avoid the queueing and rescheduling.  The IPsec packet
will be processed in a single flow.
Merge the IP deliver loop from both IP versions into a single
ip_deliver() function that can handle both addresss families.  This
allows to process an IP in IP header like a normal extension header.
If af != AF_UNSPEC, we are already in a deliver loop and have the
kernel look.  Then we can just return the next protocol.  Otherwise
we enqueue.  The dequeue thread has the kernel lock and starts an
IP delivery loop.
OK mpi@
sys/netinet/ip_input.c
sys/netinet/ip_ipip.c
sys/netinet/ipsec_input.c
sys/netinet6/ip6_input.c
sys/netinet6/ip6_var.h