在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
阅读(2237) | 评论(1) | 转发(0) |