如果skb->data_len不为0,表示该IP包的数据分属不同的页,该数据包也就被成为非线性化的,函数skb_is_nonlinear()就是通过该参数判断,一般刚进行完碎片重组的skb包就属于此类。 这样skb_header_pointer()函数就好理解了,先判断要处理的数据是否都在当前页面内,如果是,则返回可以直接对数据处理,返回所求数据指针,...
static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, int len, void *buffer) { int hlen = skb_headlen(skb); if (hlen - offset >= len) return skb->data + offset; if (skb_copy_bits(skb, offset, buffer, len) < 0) return NULL; return buffer; } 其中参数...
struct iphdr *ip_header = (struct iphdr *)skb_network_header(skb); struct tcphdr *tcp_header = (struct tcphdr *)skb_transport_header(skb);2.struct iphdr *ip_header = skb_header_pointer(skb, 0, sizeof(struct iphdr), &_iph) struct...
最近一段时间看内核代码,总是看到skb_header_pointer函数,这个函数的主要功能很简单,就是从skb字段中获取指定长度到内容到缓存中。函数原型是这个样子的: static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, int len, void *buffer) 也就是从skb中skb->data开始的offset偏移处,获...
在2.6.17内核中获取sk_buff中各协议头的参数不再是直接读取skb包中定义的各协议头部分指针,而是使用skb_header_pointer()函数来获取,为什么要进行这种变化值得玩味。 以下内核代码版本为2.6.17.11。 2. skb_header_pointer函数 该函数本身很简单,定义如下: ...
最近一段时间看内核代码,总是看到skb_header_pointer函数,这个函数的主要功能很简单,就是从skb字段中获取指定长度到内容到缓存中。函数原型是这个样子的: static inline void *skb_header_pointer(const struct sk_buff *skb, int offset, int len, void *buffer) ...