私はdpdkでカスタマイズされたパッケージを送信しようとしていますが、パッケージ構造によっては受信に失敗することがあります。DPDKはカスタマイズされたpktを送信しますが、受信に失敗します
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];
};
私のサーバーで実行dpdkが唯一のパケット数の第一のバッチを受け取ることができますが、rte_eth_tx_burst()の戻り値が送られてきたはるかのパッケージを示しています。たとえば、私はこのようなパッケージ構造を定義します。しかし
、私は以下のように構造を変更する場合:正しく仕事の両方の送受信
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];
};
。 2つの構造の唯一の違いは、uint64_tタイムスタンプがuint32_t配列で置き換えられて2つのアイテムで構成されていたことです。私はi40eドライバコードにデバッグしますが、どこが間違っているのか理解できません。
誰かが私を助けることができますか?ありがとう!
バッファをそのまま送信するイーサネットヘッダーを追加しますか? –
コードでrte_eth_promiscuous_enable()を使用して、使用されているすべてのポートの無差別モードを有効にしています。私は、NICが直接リンクされている2つのサーバーで実験を行い、イーサネットヘッダーなしで正しく通信できることを確認しました。 –
これは問題です。Ethertypeによっては、NICによっていくつかのフレームがドロップ/消費される可能性があるためです。 rte_eth_stats_get()をチェックして、パケットがNICによって廃棄されたかどうかを確認できます。 –