Protocol Handler Registration
At system startup and other times when a protocol is
registered, the kernel calls dev_add_pack, passing it a
data structure of type packet_type, which is defined in
include/linux/netdevice.h as follows:
struct packet_type
{
unsigned short type;
struct net_device *dev;
int (*func) (struct sk_buff *, struct net_device *,
struct packet_type *);
void *af_packet_priv;
struct list_head *list;
};The fields have the following meanings:
-
type The protocol code. It can take any of the values listed in the first column of Table 13-1 through 13-4 (i.e.,
ETH_P_IP). The difference between the protocols belonging to different tables will become clear in the following sections.-
dev Pointer to the device (i.e., eth0) for which the protocol is to be enabled. A setting of NULL means "all devices." Thanks to this parameter, it would be possible to have different handlers for different devices, or associate a handler with one specific device. This is not normally done, but could be useful for testing.
PF_PACKETsockets commonly use it to listen only on a specific device. For instance, a command such as tcpdump -i eth0 creates apacket_typeinstance via aPF_PACKETsocket and initializesdevto thenet_deviceinstance associated with eth0.-
func The function handler called by
netif_receive_skb(see Chapter 10) when it needs to process one frame withskb->protocol=type(an example isip_rcv). Note that one offunc's input parameters is a pointer to apacket_typestructure: it ...
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