网卡驱动5-做一个与外界交互的虚拟网卡4(netif_receive_skb和非napi分析)

看了网上的一些对此函数的解析,有些比较旧了。我在这分析一下linux-3.0.8的代码。

netif_receive_skb()中有RPS,我们不看了,直接看__netif_receive_skb()。


static int __netif_receive_skb(struct sk_buff *skb)
{
        struct packet_type *ptype, *pt_prev;
        rx_handler_func_t *rx_handler;
        struct net_device *orig_dev;
        struct net_device *null_or_dev;
        bool deliver_exact = false;
        int ret = NET_RX_DROP;
        __be16 type;

        // netdev_tstamp_prequeue设置为0,表示可能有些帧的延时;默认为1。
//net_timestamp_check()是设置skb的tstamp值,此值是记录接收包的时间
        if (!netdev_tstamp_prequeue)
                net_timestamp_check(skb);

        trace_netif_receive_skb(skb);

        /* netpoll 需要处理这个帧的话,会调用netpoll_rx 处理*/
        if (netpoll_receive_skb(skb))
                return NET_RX_DROP;

        //给设备的接口序号赋值
        if (!skb->skb_iif)
                skb->skb_iif = skb->dev->ifindex;
        orig_dev = skb->dev;

        //下面说的复位主要是校准对应的指针
        skb_reset_network_header(skb);//skb->network_header = skb->data - skb->head;网络层头
        skb_reset_transport_header(skb);// skb->transport_header = skb->data;传输层
        skb_reset_mac_len(skb);//skb->mac_len = skb->network_header - skb->mac_header;链路层头长,mac地址长度

        pt_prev = NULL;

        rcu_read_lock();

another_round:

        __this_cpu_inc(softnet_data.processed);

        if (skb->protocol == cpu_to_be16(ETH_P_8021Q)) {//如果是vlan要用的
                skb = vlan_untag(skb);//vlan头数据的处理
                if (unlikely(!skb))
                        goto out;
        }

//…
       //之前有说协议类型时有个ALL,这是给每个sniffer发一个
        list_for_each_entry_rcu(ptype, &ptype_all, list) {
                if (!ptype->dev || ptype->dev == skb->dev) {
                        if (pt_prev)
                                ret = deliver_skb(skb, pt_prev, orig_dev);
/*
deliver_skb()就认为是pt_prev->func(skb,
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值