问一个linux内核 __netif_receive_skb_core 收包遍历ptype_all的问题?

搬板砖 2023-12-22 11:28:00
    pt_prev = NULL;
    ...........

/*
    list_for_each_entry_rcu 展开:
    for (ptype = list_entry_rcu(  (&ptype_all)->next, typeof(*ptype), list  ); 
        &ptype->list != (&ptype_all); 
        ptype = list_entry_rcu(  ptype->list.next, typeof(*ptype), list)  )
*/
    list_for_each_entry_rcu(ptype, &ptype_all, list) {
        if (pt_prev)
            ret = deliver_skb(skb, pt_prev, orig_dev);
        pt_prev = ptype;
    }

没看懂啊,用 pt_prev = ptype;   循环结束时,pt_prev指向最后一个节点,但此时循环条件己经不满足:

&ptype->list != (&ptype_all)

 因此不能再执行循环体里的deliver_skb,有没有大神讲解下为什么要这么写? 虽然下面还有list_for_each_entry_rcu会执行上一个 pt_prev。

但为什么不是这样写:

    pt_prev = NULL;
    ...........
    list_for_each_entry_rcu(ptype, &ptype_all, list) {
        if (ptype)
            ret = deliver_skb(skb, ptype, orig_dev);
    }

 

...全文
323 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
湖中仙人 2023-12-22
  • 打赏
  • 举报
回复

第一种,一定会执行 pt_prev = ptype; 第二种不会;注意 ; 这里省略了IF后面的 {}

搬板砖 2023-12-22
  • 举报
回复
@湖中仙人 你没看懂我问的意思。第一种,循环结束时,pt_prev指向最后一个节点,但此时循环条件己经不满足了(&ptype->list !=&ptype_all), 不能再执行循环体里的deliver_skb

23,124

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧