我正在为Linux内核开发TCP拥塞控制算法,这将作为内核模块实现。 在代码中,我想要访问TCP头,并使用以下函数来完成。
void get_hdr(struct sock *sk){
struct sk_buff *skb;
skb = skb_peek_tail(&sk->sk_receive_queue);
if (skb != NULL)
printk(KERN_INFO "skb address: %p", skb);
struct tcphdr *tcp_header = tcp_hdr(skb);
if(tcp_header != 0)
printk(KERN_INFO "tcp_header address: %p", tcp_header);
else
printk(KERN_INFO "tcp_header is NULL");
}
我认为这基本上应该可以工作,因为它在内核中这里也是这样做的。
然而,查看我的kern.log,我发现:
skb address: dbd94501
tcp_header address is NULL
显然调用tcp_hdr(skb)失败了。
我不知道为什么会这样。有没有人能够给我一些启发,告诉我应该在哪里寻找或者需要做哪些更改才能够得到tcp头呢?
谢谢,
Stefan
skb->transport_header
中看到了什么?你是如何连接内核的?使用 Netfilter 吗? - eaterip_input
之前被调用,那么skb->transport_header
可能还没有被设置。但这听起来好像有其他问题。顺便说一下,请阅读注释并确保你理解使用skb_peek_tail()
的危险。 - eater