netif_rx()源代码
时间: 2023-12-03 17:46:56 浏览: 105
netif_rx() 是 Linux 内核中用于接收网络数据包的函数。下面是它的源代码:
int netif_rx(struct sk_buff *skb)
{
struct net_device *dev = skb->dev;
int ret = NET_RX_DROP;
if (unlikely(!dev->rx_handler || dev->flags & IFF_LOOPBACK)) {
kfree_skb(skb);
goto out;
}
if (likely(!skb->pkt_type))
skb->pkt_type = PACKET_HOST;
if (unlikely(skb->pkt_type >= NUM_PKT_TYPES)) {
kfree_skb(skb);
goto out;
}
if (unlikely(skb_headroom(skb) < LL_ALLOCATED_SPACE(dev))) {
struct sk_buff *newskb;
newskb = skb_realloc_headroom(skb, LL_ALLOCATED_SPACE(dev));
if (!newskb) {
kfree_skb(skb);
goto out;
}
skb = newskb;
}
local_bh_disable();
ret = dev->rx_handler(skb);
local_bh_enable();
out:
return ret;
}
下面是对这个函数的逐行解析:
首先,这个函数接受一个指向 sk_buff 结构体的指针作为参数,并将它保存在本地变量
skb
中。接下来,从
skb
中获取到接收该数据包的网络设备,并将其保存在本地变量dev
中。如果设备没有注册接收处理函数或者是一个环回接口(loopback interface),则将
skb
直接释放掉,并返回 NET_RX_DROP 表示数据包被丢弃了。如果数据包的
pkt_type
字段还没有设置,则将其设置为 PACKET_HOST,表示这是一个接收到的主机数据包。如果
pkt_type
大于等于 NUM_PKT_TYPES,则说明这是一个无效的数据包类型,直接将skb
释放掉,并返回 NET_RX_DROP。如果
skb
的头部空间小于设备驱动程序需要的空间(即 LL_ALLOCATED_SPACE(dev)),则需要重新分配空间。如果分配失败,则将skb
释放掉,并返回 NET_RX_DROP。禁用本地中断,调用设备的接收处理函数,并将返回值保存在本地变量
ret
中。启用本地中断,并根据
ret
的值返回相应的结果。如果处理成功,则返回 0 表示数据包已经被处理了,否则返回 NET_RX_DROP 表示数据包被丢弃了。
相关推荐

















