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