Setting Functions for Reception and Transmission
Both received packets and locally generated packets need to be routed: in the case of received packets, to find out whether they should be locally delivered or forwarded, and in the case of locally generated packets, to find out whether they should be delivered locally or transmitted out.
In both cases, given a packet to route skb, the
result of the routing lookup is saved in skb->dst.
This is a data structure of type dst_entry, described
in detail in the section "dst_entry
Structure" in Chapter 36. This data
structure includes several fields; two of them are function pointers named input and output that
process the packet in accordance with the result of the routing lookup. The next section
goes into detail on the initializations of these function pointers.
Then the sections "Input Routing"
and "Output Routing" describe in detail
the routines ip_route_input_slow and ip_route_output_slow, used respectively to find routes for
ingress and egress packets when the cache lookup fails. These two functions can be a bit
scary because of their size and the extent to which they apply macros, conditional code
(such as #ifdef), and special feature handling (e.g.,
Multipath), but they actually are simpler than they look. In addition, programmers who do
not like the use of goto statements in the source code may be disappointed by their heavy use. I have included a flowchart for each function, which you might want to look at for high-level descriptions ...
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