skb_header_pointer 和 skb_transport_header 的区别?
Difference between skb_header_pointer and skb_transport_header?
我正在尝试实现一个 netfilter 模块,在处理过程中 sk_buff 我发现了两种可能的方法来检索 TCP header:
struct iphdr *ip_header = (struct iphdr *)skb_network_header(skb);
struct tcphdr *tcp_header = (struct tcphdr *)skb_transport_header(skb);
和
struct iphdr *ip_header = skb_header_pointer(skb, 0, sizeof(struct iphdr), &_iph)
struct tcphdr *tcp_header = skb_header_pointer(skb, ip_header->ihl * 4, sizeof(struct tcphdr), &_tcph);
我应该使用哪一个?
你应该在这里使用 ip_hdr()
from /include/linux/ip.h and tcp_hdr()
from /include/linux/tcp.h in case you know that there cannot be paged-skb
:
struct iphdr *ip_header = ip_hdr(skb);
if (ip_header->protocol == IPPROTO_TCP) {
struct tcphdr *tcp_header = tcp_hdr(skb);
//...
skb_header_pointer()
应该被使用以防 paged-skb
的出现是可能的。例子:IP, TCP, ICMP,等等
因此,如果 header 在分页数据中(全部或部分)- skb_header_pointer()
将正确处理它。
还要记得检查skb_header_pointer()
的return值,它可以return NULL。
我正在尝试实现一个 netfilter 模块,在处理过程中 sk_buff 我发现了两种可能的方法来检索 TCP header:
struct iphdr *ip_header = (struct iphdr *)skb_network_header(skb);
struct tcphdr *tcp_header = (struct tcphdr *)skb_transport_header(skb);
和
struct iphdr *ip_header = skb_header_pointer(skb, 0, sizeof(struct iphdr), &_iph)
struct tcphdr *tcp_header = skb_header_pointer(skb, ip_header->ihl * 4, sizeof(struct tcphdr), &_tcph);
我应该使用哪一个?
你应该在这里使用 ip_hdr()
from /include/linux/ip.h and tcp_hdr()
from /include/linux/tcp.h in case you know that there cannot be paged-skb
:
struct iphdr *ip_header = ip_hdr(skb);
if (ip_header->protocol == IPPROTO_TCP) {
struct tcphdr *tcp_header = tcp_hdr(skb);
//...
skb_header_pointer()
应该被使用以防 paged-skb
的出现是可能的。例子:IP, TCP, ICMP,等等
因此,如果 header 在分页数据中(全部或部分)- skb_header_pointer()
将正确处理它。
还要记得检查skb_header_pointer()
的return值,它可以return NULL。