Доступ к заголовку TCP из tcp модуля управления перегрузкой ядра Linux - PullRequest
4 голосов
/ 18 декабря 2010

Я работаю над алгоритмом управления перегрузкой TCP для ядра Linux, который я понимаю как модуль ядра.В коде я хочу получить доступ к заголовку 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");
}

Я думаю, что это должно в основном работать, так как это делается здесь, внутри ядра а также.

Hower, глядя на мой kern.log, я вижу, что:

skb address: dbd94501
tcp_header address is NULL

Видимо, вызов tcp_hdr (skb) не удается.

Я понятия не имею, почему это должно быть.У кого-нибудь есть вдохновляющий совет, куда мне обратиться или что я должен изменить, чтобы вернуть заголовок tcp?

Приветствия,

Стефан

Ответы [ 2 ]

1 голос
/ 24 июня 2011

Это может быть пакет без транспортного_header вообще.

1 голос
/ 21 марта 2011

В строке

struct tcphdr *tcp_header = tcp_hdr(skb);

вы можете иметь skb == NULL.

Почему бы вам не поместить весь раздел if в фигурные скобки?

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