当前位置: 技术问答>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? 求详解.
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报文的长度了 单位是字节
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-……
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的基础吧。
古云:欲善其事,必先利其器!
候老师说:勿造高台于浮沙之上!
(& 0x0f)的用法都不知道,你的基础知识真的不适合看内核代码,先去补一下C的基础吧。
古云:欲善其事,必先利其器!
候老师说:勿造高台于浮沙之上!