【问题标题】:What do the sk_buff functions skb_network_header() and skb_mac_header() do?sk_buff 函数 skb_network_header() 和 skb_mac_header() 有什么作用?
【发布时间】:2014-02-25 18:38:36
【问题描述】:

它们是否分别返回 IP 标头和 MAC 标头?我有点困惑,因为只看实现,它们返回的指针是 skb->head + skb->network_header 等。为什么不直接通过 skb->network_header 获取网络头呢?

谢谢!

【问题讨论】:

    标签: c linux networking kernel


    【解决方案1】:

    skb_network_header()有2个版本

    #ifdef NET_SKBUFF_DATA_USES_OFFSET
    
    static inline unsigned char *skb_network_header(const struct sk_buff )
    {
            return skb->head + skb->network_header;
    }
    #else
    static inline unsigned char *skb_network_header(const struct sk_buff *skb)
    {
         return skb->network_header;
    }
    

    基本上,如果 NET_SKBUFF_DATA_USES_OFFSET 有效(例如,对于 64 位架构),.network_header 是从开始的偏移量。

    【讨论】:

    • 嘎——你打败了我! +1
    • 哦,我明白了,谢谢,我没有看到其他定义。现在说得通了!
    【解决方案2】:

    我假设您正在查看内核源代码somewhere like this

    如果我们删掉一些代码,我认为它会变成这样:

    #ifdef NET_SKBUFF_DATA_USES_OFFSET 静态内联无符号字符 *skb_network_header(const struct sk_buff *skb) { 返回 skb->head + skb->network_header; } 静态内联无符号字符 *skb_mac_header(const struct sk_buff *skb) { 返回 skb->head + skb->mac_header; } #else /* NET_SKBUFF_DATA_USES_OFFSET */ 静态内联无符号字符 *skb_network_header(const struct sk_buff *skb) { 返回 skb->network_header; } 静态内联无符号字符 *skb_mac_header(const struct sk_buff *skb) { 返回 skb->mac_header; } #endif /* NET_SKBUFF_DATA_USES_OFFSET */

    【讨论】:

      猜你喜欢
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 2014-05-14
      • 2018-11-19
      • 2014-05-23
      • 2017-06-19
      • 2020-06-06
      • 2017-06-25
      相关资源
      最近更新 更多