2017-08-23 1 views
1

J'ai construit et couru dans le dernier noyau Linux (extrait de github le 12 août 2017).LINUX KERNEL: fonction eth_hdr retournant le champ h_proto invalide

J'ai un périphérique réseau Ethernet REALTEK dans mon ordinateur portable. J'ai isolé le code du pilote open source realtek et placé quelques impressions de débogage. Ensuite, j'ai compilé le pilote par rapport à Linux en cours d'exécution et l'ai chargé avec succès.

Mes modifications sont les suivantes: 1. DUMP PACKET dans RX POLL METHOD.

Dans la méthode RX POLL, le paquet est copié de la file d'attente RX vers SKB. Juste avant d'invoquer, napi_receive_skb (skb) J'ai fait ce qui suit.


printk(KERN_INFO "NAPI RECEIVE SKB -----PROTOCOL :0x%x\n", skb->protocol); 
struct ethhdr *l2 = eth_hdr(skb); 
u8 *p = (u8 *)l2; 
printk(KERN_INFO "ETHHDR :%2x %2x %2x %2x %2x %2x", 
        p[0], p[1], p[2], p[3], p[4], p[5]); 
p += 6; 
printk(KERN_INFO "ETHHDR :%2x %2x %2x %2x %2x %2x", 
       p[0], p[1], p[2], p[3], p[4], p[5]); 
p += 2; 
printk(KERN_INFO "ETHHDR :%2x %2x", p[0], p[1]); 

napi_gro_receive(&tp->napi, skb); 
u64_stats_update_begin(&tp->rx_stats.syncp); 

Actual OutPUT In dmesg: 

Aug 23 12:40:49 vkalyanam-Lenovo-B41-80 kernel: [ 5246.684694] NAPI RECEIVE SKB -----PROTOCOL :0x8 
Aug 23 12:40:49 vkalyanam-Lenovo-B41-80 kernel: [ 5246.684703] ETHHDR :1c 39 47 ae 3d 65 
Aug 23 12:40:49 vkalyanam-Lenovo-B41-80 kernel: [ 5246.684709] ETHHDR :f4 8e 38 a4 5e 9f 
Aug 23 12:40:49 vkalyanam-Lenovo-B41-80 kernel: [ 5246.684715] ETHHDR :38 a4 

    struct ethhdr { 
     unsigned char h_dest[ETH_ALEN]; /* destination eth addr */ 
     unsigned char h_source[ETH_ALEN]; /* source ether addr */ 
     __be16  h_proto;  /* packet type ID field */ 
    } __attribute__((packed)); 

Pourquoi h_proto déposé est montrant faux. ?? Aug 23 12:40:49 vkalyanam-Lenovo-B41-80 noyau: [5246.684715] ETHHDR: 38 a4

Pour chaque paquet, je vois la même valeur "38 a4".

+0

J'ai raté une autre mise à jour. Ajout de cette information ici. Le protocole skb-> affiche une valeur valide. Je vois qui ont montré 0800 pour les paquets TCP. Skb-> protocol = eth_type_trans (skb, dev); Ci-dessus est le code où le protocole SKB est en cours de mise à jour. Cependant, le noyau eth_hdr devrait donner une valeur valide. –

Répondre

0

Je suppose que le problème dans votre code est que vous faites p + = 2; après avoir lu la deuxième adresse. Vous pourriez avoir besoin de p + = 6; à la place.

En effet, sauter 2 octets seulement vous montre les deux "mauvais" octets de la deuxième adresse: f4 8e 38 a4 5e 9f.