从tcp拥塞控制Linux内核模块访问TCP头

我正在研究
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");
}

我认为这基本上可以工作,因为它也完成了 here inside the kernel .

Hower,看着我的kern.log,我看到了:

skb address: dbd94501
tcp_header address is NULL

显然,对tcp_hdr(skb)的呼叫失败了.

我不知道为什么会这样.有没有人有一个鼓舞人心的提示,我应该看看或我需要改变什么,以获得tcp标头回来?

干杯,

斯特凡

最佳答案 在线

struct tcphdr *tcp_header = tcp_hdr(skb);

你仍然可以有skb == NULL.

你为什么不把整个if-section放在括号里?

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");
 }
}
点赞