2

中是否有任何信息struct skbuff可以区分转发流量(网桥转发和 ip 转发)和本地发起的流量?我们希望在网络驱动程序中区别对待这两种流量,因为转发流量不需要对整个数据包大小进行缓存失效。

任何建议表示赞赏。非常感谢你!

4

1 回答 1

3

是的,有可能,您可以尝试通过查看来自此函数的所有调用来跟踪接收数据包的生命周期 ip_rcv_finishhttp://lxr.free-electrons.com/source/net/ipv4/ip_input.c?v=3.3 #L317)。

该结构struct sk_buff包含一个指向目标条目的指针:

struct  dst_entry   *dst;

其中包含一个函数指针:

int (*input)(struct sk_buff*);

调用输入数据包,在本地数据包的情况下,内核调用ip_local_deliver函数和转发数据包调用ip_forward函数。

我认为您可以像这样检查本地和转发的数据包:

- 当地的 :

/*  struct sk_buff *skb : Entry packet */
if (((struct rtable *)skb->dst)->rt_type == RTN_LOCAL)
{
    /* This packet is to consume locally */
}

- 向前 :

if (((struct rtable *)skb->dst)->rt_type == RTN_UNICAST)
{
    /* This packet will be forwarded */
}
于 2012-08-24T16:28:00.573 回答