2017-05-24 5 views
1

私は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ドライバコードにデバッグしますが、どこが間違っているのか理解できません。

誰かが私を助けることができますか?ありがとう!

+0

バッファをそのまま送信するイーサネットヘッダーを追加しますか? –

+0

コードでrte_eth_promiscuous_enable()を使用して、使用されているすべてのポートの無差別モードを有効にしています。私は、NICが直接リンクされている2つのサーバーで実験を行い、イーサネットヘッダーなしで正しく通信できることを確認しました。 –

+0

これは問題です。Ethertypeによっては、NICによっていくつかのフレームがドロップ/消費される可能性があるためです。 rte_eth_stats_get()をチェックして、パケットがNICによって廃棄されたかどうかを確認できます。 –

答えて

0

それはあなたの説明から明らかではないが、あなたはおそらく、あなたの最初にEthernetヘッダを追加するバッファ、すなわち必要があります。

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]; 
}; 

そして、あなたのコード内の宛先/送信元のMACおよびタイプでそれを埋めます。

+0

それは、とにかくありがとう、働くことを望む! –

関連する問題