c - skb_header_pointer 和 skb_transport_header 的区别?
问题描述
我正在尝试实现一个 netfilter 模块,在处理 sk_buff 时我发现了两种可能的方法来检索 TCP 标头:
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和tcp_hdr()
from /include/linux/tcp.h以防您知道此处无法分页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等。
因此,如果标头在分页数据中(全部或部分) -skb_header_pointer()
将正确处理它。
还要记得检查 的返回值,skb_header_pointer()
它可以返回 NULL。
推荐阅读
- ruby-on-rails - Ruby:将数据结构转换为 Excel 工作表
- javascript - 单击按钮时填写必填字段
- git-checkout - git --git-dir checkout 和 git checkout 的区别
- java - 如何杀死在后台运行的线程 - Java?
- java - 如何使用http请求获取特定数据?
- javascript - Angular 2 使用 ngfor 获取 json 数据
- mule - Mule 4.1.2 自定义连接器错误
- regex - 前瞻前的懒惰正则表达式:不使用`.+?`
- c++ - 无法从 cpp 代码将参数传递给 R 函数
- php - Laravel 标头在中间件中被剥离