4 votes

Accès à l'en-tête TCP à partir du module de contrôle de congestion tcp du noyau Linux

Je travaille sur un algorithme de contrôle de congestion TCP pour le noyau Linux, que je réalise en tant que module noyau. Dans le code, je veux accéder à l'en-tête tcp et utiliser la fonction suivante pour le faire.

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

Je pense que cela devrait fondamentalement fonctionner, puisque c'est fait ici dans le noyau également.

Hower, en regardant mon kern.log je vois ça :

skb address: dbd94501
tcp_header address is NULL

Apparemment, l'appel à tcp_hdr(skb) échoue.

Je n'ai aucune idée de la raison de cette situation. Quelqu'un a-t-il une idée de l'endroit où je dois regarder ou de ce que je dois changer pour récupérer l'en-tête tcp ?

A la vôtre,

Stefan

1voto

weekens Points 2685

En ligne

struct tcphdr *tcp_header = tcp_hdr(skb);

vous pouvez toujours avoir skb == NULL.

Pourquoi vous ne mettez pas toute la section if dans un appareil dentaire ?

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

1voto

kumar Points 527

Il peut s'agir d'un paquet sans en-tête de transport.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X