tcpudmp对 direction的支持。
内核代码有一个关键数据结构:skb的pkt_type字段。
在收发路径这个域被赋值为PACKET_OUTGOING或者其他。
这个值被传递到往用户空间,libpcap根据它判断报文的方向是否是期望的。
pkt_type的可能取值
1 | 24 #define PACKET_HOST 0 /* To us */ |
kernel 里对网络包的抓去分别在收方两个方向做分析。
收方向
1 | > netif_receive_skb |
发方向 :dev_queue_xmit_nit 具体调用关系如下
1 | > dev_hard_start_xmit(struct |
tcpudmp注册hook函数到ptye_all里的
packet socket在创建时候已经制定了处理函数为packet_rcv,并注册到ptype_all里。
1 | 2808 static int packet_create(struct net *net, struct socket *sock, int protocol, |
1 | 337 static void register_prot_hook(struct sock *sk) |
hook函数`packet_rcv`会将pkt_type传递到用户空间
1 | 1766 static int packet_rcv(struct sk_buff *skb, struct net_device *dev, |
libpcap根据pkt_type/sll_pkttype的数值判断方向是否合法。
1 | 1433 static inline int |
注:upstream的内核开始支持per netdevice的type chain
1 | dev: add per net_device packet type chains |
1 | packet_do_bind |
1 | 371 static inline struct list_head *ptype_head(const struct packet_type *pt) |