我正在尝试实现一个netfilter模块,在调试TCP数据包的过程中,我发现
skb->data
中缺少有效负载部分。我相信这可能与分页数据有关。
编辑:有人向我指出,要提供更多可重现的示例。
我之前应该提到它发生在 nf hook 函数中。
static struct nf_hook_ops nfho = {
.hook = hook_func,
.hooknum = NF_INET_PRE_ROUTING,
.pf = PF_INET,
.priority = NF_IP_PRI_FIRST,
};
static unsigned int hook_func(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {
struct iphdr *iphdr;
struct tcphdr *tcphdr;
iphdr = ip_hdr(skb);
if(iphdr->protocol = IPPROTO_TCP) {
for(int i = 0; i < skb->len; i++) {
printk(KERN_CONT "%02x\t", skb->data[i]);
}
}
return NF_ACCEPT;
}
为了展示我通过 tcp 连接发送“hello world”的示例,下面是包含此有效负载的数据包,即最后 12 个字节。
skb->data_len = 12
skb->len = 64
wireshark中捕获的示例数据包:
0000 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00
0010 00 40 71 33 40 00 40 06 cb 82 7f 00 00 01 7f 00
0020 00 01 d8 7c 0d 05 c9 1c 57 6f e0 ad a7 51 80 18
0030 02 00 fe 34 00 00 01 01 08 0a 86 63 f5 54 86 62
0040 bb c8 68 65 6c 6c 6f 20 77 6f 72 6c 64 0a
十六进制转储格式的 dmesg:
0000 00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00
0010 00 40 71 33 40 00 40 06 cb 82 7f 00 00 01 7f 00
0020 00 01 d8 7c 0d 05 c9 1c 57 6f e0 ad a7 51 80 18
0030 02 00 fe 34 00 00 01 01 08 0a 86 63 f5 54 86 62
0040 bb c8 00 00 00 00 00 00 00 00 00 00 00 00
我在哪里寻找“丢失”的有效负载?