Chinaunix首页 | 论坛 | 博客
  • 博客访问: 148800
  • 博文数量: 24
  • 博客积分: 791
  • 博客等级: 军士长
  • 技术积分: 350
  • 用 户 组: 普通用户
  • 注册时间: 2010-02-22 11:00
文章存档

2011年(18)

2010年(6)

分类: LINUX

2010-11-03 17:11:59

skb_buff(内核2.6.18

(1)    skb_buff中数据长度的讨论

skb_buff中有两个数据长度:lendata_len;

        len=skb->tail-skb->data+data_len它包括主缓冲区中的数据长度(data指针指向它)和分片中的数据长度;

data_len只计算分片中数据的长度,即struct ip_shared_info中有效数据总长度(包括frag_list,frags[]中的扩展数据);显然随着数据到达不同的层,len的值会随着改变。

 

2skb_buff中数据部分的获取

ip层,sk_buffskb_headskb->dataskb->tailskb->end的位置如下图所示

 

数据包在不同的层,skb_data指向的是当前层的头;在IP层要获得tcp payload,则计算指针偏移量如下:

 

char *data;

struct iphdr *iph;

struct tcphdr *th;

iph=skb->nh.iph;

th=(struct tcphdr*)((__u32*)iph+iph->ihl);//TCP

data=(char*)((__u32*)th+th->doff);//数据的起始地址

 

注:iph->ihl32位字个数,ip头长度为20字节则此值为5

       th->doff32位字个数,ip头总长度为th->doff,单位是字。

 

 

skb_buff(内核2.6.24以上)

skb_buff中将2.6.18中的nnhmac改变为

sk_buff_data_t   transport_header;
sk_buff_data_t   network_header;
sk_buff_data_t   mac_header;

它提供了分别是传输层头,网络层头以及mac头相对于sk_buffhead的偏移量。

 

故针对不同的内核版本程序可能不同,可以用下段程序避免内核版本的不同。

 

钩子位于IP

char *data;

struct iphdr *iph;

struct tcphdr *th;

iph=ip_hdr(skb);

th=(struct tcphdr*)((__u32*)iph+iph->ihl);//TCP

data=(char*)((__u32*)th+th->doff);//数据的起始地址

 

那么dataskb->tail这段buffer就是我们要的数据。

阅读(10854) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~