当前位置:  技术问答>linux和unix

((*(skb->data)) & 0x0f) * 4是什么意思?

    来源: 互联网  发布时间:2016-10-23

    本文导语:  struct sk_buff 是linux里标准的网络传输数据结构.   struct sk_buff *skb 是传进来的参数.然后处理中有如下语句:  .......  int  ip_len = ((*(skb->data)) & 0x0f) * 4;  ....... 这句话怎么理解,我感觉是想得到一个**的长度,...

struct sk_buff 是linux里标准的网络传输数据结构.
 
struct sk_buff *skb 是传进来的参数.然后处理中有如下语句:

 .......

 int  ip_len = ((*(skb->data)) & 0x0f) * 4;

 .......

这句话怎么理解,我感觉是想得到一个**的长度,是skb->data数据的实际长度?和0x0f"与"一下是什么用意?后面为什么又要乘以4? 求详解.

|
这个可能要具体分析下上下文了
sk_buff 在TCP/IP中每个层都用到了
不过一般sk->data传下来的一般都是指向某个首部的 
考虑到这里用到的是第一个字节 而且还*4 我猜测这里是 IP首部

分析了一下:
struct iphdr {
  #if defined(__i386__)
      __u8    ihl:4,
         version:4;
     ...}
(*(skb->data)) & 0x0f) 得到了IP首部中的第一个字节中的ihl字段 也就是ip报文的长度
而Ip报文的长度的粒度是4字节 所以需要乘以4
最后的结果也就是 Ip报文的长度了 单位是字节

|
楼主刚才的理解是正确的。IP报文确实是四个字节为基本存储单位的。加入一个内容长度是5字节。在传输时也会占用8字节的空间。

|


LZ随便找本TCP/IP的书 上面都有讲

|
这个可能要具体分析下上下文了
sk_buff 在TCP/IP中每个层都用到了
不过一般sk->data传下来的一般都是指向某个首部的 
考虑到这里用到的是第一个字节 而且还*4 我猜测这里是 IP首部

分析了一下:
struct iphdr {
  #if defined(__i386__)
  __u8 ihl:4,
  version:4;
  ...}
(*(skb-……

|
楼上的分析都挺对~,楼主看一下IP协议的规定就都懂了,只有4个bit不(& 0x0f)怎么能行

|
这是获取IP头的长度,IP头长度只留了4个bit的空间,所以它放的是(ip头长度/4)。
(& 0x0f)的用法都不知道,你的基础知识真的不适合看内核代码,先去补一下C的基础吧。
古云:欲善其事,必先利其器!
候老师说:勿造高台于浮沙之上!

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • skb_copy和skb_clone
  • 关于skb的问题
  • (请来拿分)关于netlink 中的 kfree_skb的问题!
  • 关于linux 网络驱动的问题 sk_buff *skb
  • ip_rcv 中用skb_share_check是什么目的?
  • 关于skb_buffer的问题
  • 关于skb的构造,高手能否谈谈看法?
  • 关于skb_copy_expand问题
  • 求skb开发的建议!
  • 各位哥哥姐姐:如何zip压缩算法来压缩SKB里面的数据部分
  • 发送IP包时,skb->dev是在哪里被设置的
  • 本来可以修改skb里tcp数据的,突然不能修改了,为什么?
  • struct sock *sk和 struct sk_buff *skb之间的关系
  • netif_rx(skb)成功,但无法收到数据包是怎么回事呀
  • skb buffer与ring buffer区别等问题


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3