struct skbuff
中是否有任何信息可以区分转发流量(网桥转发和IP转发)和本地发起的流量?我们希望在网络驱动程序中区别对待这两种流量,因为转发流量不需要对整个数据包大小进行高速缓存失效。
任何建议都表示赞赏。非常感谢你!
答案 0 :(得分:3)
是的,您可以尝试通过查看此函数ip_rcv_finish
(http://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 */
}