2017-05-24 3 views
1

J'essaye d'envoyer des paquets personnalisés avec dpdk, mais je trouve que la structure de certains paquets le fera échouer à recevoir. Par exemple, je définir la structure de paquets comme ceci:DPDK envoie pkt personnalisé mais ne parvient pas à recevoir

union my_pkt{ 
    struct hdr{ 
     uint32_t id; 
     uint32_t name_len; 
     uint64_t tsc; 
     uint8_t name[100]; 
    }__attribute__((__packed__)) pkt_hdr; 
    char buff[500]; 
}; 

Mon serveur dpdk en cours d'exécution ne peut recevoir le 1er lot de pkts, mais la valeur retournée de rte_eth_tx_burst() montre des paquets beaucoup plus qui ont été envoyés.
Cependant, si je modifie la structure comme suit:

union my_pkt{ 
    struct hdr{ 
     uint32_t id; 
     uint32_t name_len; 
     uint32_t tsc[2];//modify this line 
     uint8_t name[100]; 
    }__attribute__((__packed__)) pkt_hdr; 
    char buff[500]; 
}; 

Envoi et réception correctement à la fois le travail. La seule différence entre deux structures est que l'horodatage uint64_t a été remplacé par un tableau uint32_t composé de deux éléments. Je débogue dans le code du pilote i40e, mais ne peux pas comprendre où ça va mal.

Quelqu'un peut-il me aider? Merci!

+0

Ajoutez-vous un en-tête Ethernet que vous venez d'envoyer le tampon tel quel? –

+0

J'utilise rte_eth_promiscuous_enable() dans le code pour activer le mode de promiscuité de tous les ports utilisés, et je faisais des expériences sur deux serveurs dont les NIC étaient directement liés et trouvaient qu'ils pouvaient communiquer correctement sans en-tête Ethernet. –

+0

Eh bien, c'est le problème, car selon le type Ethertype, certaines images peuvent être supprimées/consommées par la carte réseau. Vous pouvez vérifier le rte_eth_stats_get() pour confirmer si les paquets ont été abandonnés par le NIC. –

Répondre

0

Bien qu'il ne ressort pas de votre description, vous devriez probablement ajouter un en-tête Ethernet au début de vous tamponner, à savoir:

union my_pkt{ 
    struct hdr{ 
     struct ether_hdr; // Ethernet header 
     uint32_t id; 
     uint32_t name_len; 
     uint64_t tsc; 
     uint8_t name[100]; 
    }__attribute__((__packed__)) pkt_hdr; 
    char buff[500]; 
}; 

Et puis remplissez-le avec MACs de destination/source et tapez votre code .

+0

Espère que ça marche, merci quand même! –