Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40712
  • 博文数量: 9
  • 博客积分: 1557
  • 博客等级: 上尉
  • 技术积分: 124
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-06 17:06
文章分类
文章存档

2011年(2)

2010年(7)

我的朋友

分类: LINUX

2010-09-03 20:36:24

    在ipv4_pkt_to_tuple()的函数中运用了skb_header_pointer()函数,上网找到了端木隐的一篇文章,对此做了详细的分析,很好,非常受用,大家可以参考。

 36 static bool ipv4_pkt_to_tuple(const struct sk_buff *skb, unsigned int nhoff,
 37                   struct nf_conntrack_tuple *tuple)
 38 {        
 39     const __be32 *ap;
 40     __be32 _addrs[2];
         /*指向存有数据包的源ip与目的ip的地址*/
 41     ap = skb_header_pointer(skb, nhoff + offsetof(struct iphdr, saddr),
 42                 sizeof(u_int32_t) * 2, _addrs);
 43     if (ap == NULL)
 44         return false;
 45
 46     tuple->src.u3.ip = ap[0];
 47     tuple->dst.u3.ip = ap[1];
 48
 49     return true;          
 50 }
 
1784 static inline void *skb_header_pointer(const struct sk_buff *skb, int offset,
1785                        int len, void *buffer)
1786 {
1787     int hlen = skb_headlen(skb);//求出数据包在当前页的数据长度
1788
1789     if (hlen - offset >= len)
1790         return skb->data + offset;//如果需要处理的数据都在当前页面内,则返回直接对数据处理
1791     if (skb_copy_bits(skb, offset, buffer, len) < 0)//否则从其他相关页中拷贝len长度的数据至buffer
1792         return NULL;
1793
1794     return buffer;
1795 }

1038 static inline unsigned int skb_headlen(const struct sk_buff *skb)
1039 {
1040     return skb->len - skb->data_len;//skb->len指当前数据报长度,skb->data_len表示在其他页的数据长度,因此,skb->len - skb->data_len表示数据包在当前页的数据大小
1041 }

skb_copy_bits()函数挺复杂,由于本人对skb的结构不怎么了解,就暂时先不分析了。


reference: http://blog.chinaunix.net/u/12313/showart_162787.html
阅读(2169) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-07 11:20:32

Download More than 1000 free IT eBooks: http://free-ebooks.appspot.com