如何获取skb中分页数据的有效负载?

问题描述 投票:0回答:1

我正在尝试实现一个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

我在哪里寻找“丢失”的有效负载?

c network-programming tcp linux-kernel netfilter
1个回答
0
投票

这是由于非线性(分页)skb 造成的。

在您的情况下,您需要使用

skb_header_pointer()
来获取数据包有效负载。

参见示例此处

© www.soinside.com 2019 - 2024. All rights reserved.