L3 to L4 Delivery: ip_local_deliver_finish
The
main job of ip_local_deliver_finish, which is defined
in net/ipv4/ip_input.c and was briefly described in
Chapter 20, is to find the correct protocol
handler based on the protocol field of the input IP
packet's header and to hand the packet to that handler. At the same time, ip_local_deliver_finish needs to handle raw IP and enforce
security policies if they are configured. These latter two tasks are described in later
sections.
Most packets, of course, are associated with an L4 protocol. ip_local_deliver_finish extracts the number of this protocol from the 8-bit
field of the IP header shown with shading in Figure 24-3. If the inet_protos table doesn't
contain a handler for this number—that is, if the kernel received a packet for an L4
protocol that never registered itself in the manner shown in the previous section—and no
raw socket is interested in the packet, the packet is dropped and an ICMP unreachable
message is sent back to the sender.
In addition to kernel handling, however, applications can also handle packets. This
handling can be done instead of the kernel handling or in addition to it. Therefore,
regardless of whether a kernel handler is registered, the ip_local_deliver_finish function always checks whether an application has set
up a raw socket to handle the protocol and, if so, makes a clone of the packet to hand
over to the application. This is depicted in Figure 24-4. Finally, whether the packet is processed through a ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access