Bah si les extensions sont de taille fixe, à quoi sert le champs "extension header length" ?
Par contre, je suis d'accord avec toi, je pense que le problème viens de mon code mais là je ne sais plus où chercher.
En fait, j'arrive à étendre mon extension à 10 octets mais après ça, c'est le gros plantage.
J'ai l'impression que mon problème viens du "skb_push", dès que veux agrandir le buffer de plus de 10 octets, c'est mort. Pourtant, le kernel panic ne survient pas à mon appel de la fonction "skb_push" mais plus loin dans la stack IPv6.
Je vérifie bien que la place est suffisante en entête du buffer, et pour l'instant je me retrouve toujours dans le cas où c'est suffisant :
if (skb_headroom(skb) < max_headroom || skb_shared(skb) || (skb_cloned(skb) && !skb_clone_writable(skb, 0)))
{
DEBUG(DEBUG_LEVEL0, "not enougth space(%d) or shared or not writable clone sk_buff\n", max_headroom);
struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom);
if (!new_skb)
{
kfree_skb(skb);
return -ENOBUFS;
}
if (skb->sk)
skb_set_owner_w(new_skb, skb->sk);
kfree_skb(skb);
skb = new_skb;
}
[^] # Re: EH
Posté par Doude . En réponse au message Linux IPv6 stack, ajouter une extension "Hop-by-Hop". Évalué à 1.
Par contre, je suis d'accord avec toi, je pense que le problème viens de mon code mais là je ne sais plus où chercher.
En fait, j'arrive à étendre mon extension à 10 octets mais après ça, c'est le gros plantage.
J'ai l'impression que mon problème viens du "skb_push", dès que veux agrandir le buffer de plus de 10 octets, c'est mort. Pourtant, le kernel panic ne survient pas à mon appel de la fonction "skb_push" mais plus loin dans la stack IPv6.
Je vérifie bien que la place est suffisante en entête du buffer, et pour l'instant je me retrouve toujours dans le cas où c'est suffisant :
if (skb_headroom(skb) < max_headroom || skb_shared(skb) || (skb_cloned(skb) && !skb_clone_writable(skb, 0)))
{
DEBUG(DEBUG_LEVEL0, "not enougth space(%d) or shared or not writable clone sk_buff\n", max_headroom);
struct sk_buff *new_skb = skb_realloc_headroom(skb, max_headroom);
if (!new_skb)
{
kfree_skb(skb);
return -ENOBUFS;
}
if (skb->sk)
skb_set_owner_w(new_skb, skb->sk);
kfree_skb(skb);
skb = new_skb;
}