区分Linux网络驱动程序中的转发流量和本地源流量

时间:2012-08-24 06:20:08

标签: linux networking linux-kernel linux-device-driver

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

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

1 个答案:

答案 0 :(得分:3)

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

struct 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 */
}