0

イーサネット PHY にパケットが届かない状況があります。私はDMAリングバッファを使用しています。データは物理ワイヤからリングバッファにコピーされ、それを上位層スタックにプッシュしています。DMA リング バッファには、コンシューマ インデックスとプロデューサ インデックスの 2 つのカウンタと、リード ポインタとライタ ポインタの 2 つのポインタがあります。カウンターは、消費者バッファーが上位層にプッシュされた消費済みバッファーのインデックスを保持するために使用されるのに対し、物理層から送信されたパケットの数を示します。データの取得には、読み取りポインターと書き込みポインターが使用されます。

私の現在の状況では、プロデューサーとコンシューマーのインデックスが似てきています。これは、DMA リング バッファーにパケットが入っていないことを意味しますが、パケットは PC に接続されたデバイスに継続的に送られます (wireshark ログは、パケットがルーティングされていることを確認します)。

ブートローダ OS を独立させているため、ここでは、VxWorks である以前の実装と同様に、1 回の実行 (いくつかのタイマーの導入) 内で多くのこと (フロー管理、初期パケットの解析、上位層へのプッシュ) を実行しています。 、物事はさまざまなスレッドで発生しており、それらは IP スタックを使用していました。問題をさらにデバッグした後、RX_BUFFER オーバーフローが原因でパケットがドロップされていることを確認しました。ハードウェア レベルでフィルタに MAC マルチキャスト アドレスを設定する際に、同じ理由である可能性がある問題があることを発見しました。私の観察では、初めてうまく機能します。しかし、ソフトリセット後、フィルターを再度配置することはできません。さらにいくつかの問題について疑問があり、同じことを調査しています。

1>イーサネットドライバーを初期化します。
2> LWIP (IP スタック) の初期化。
3> コールバック関数の登録。
4> イーサネット PHY ドライバを起動します。
5> DHCP 接続を形成します。
6> イーサネット ドライバーはポーリングを続け、DHCP オファーを受け入れます。
7> IGMP に参加する
8> マルチキャスト パケットをポーリングする
9> パケットを解析し、他のマルチキャスト グループに参加する
10> マルチキャスト パケットのポーリングを再度開始します。ここでステップ 4 の後、任意のステップ以降で RX_BUFFER オーバーフロー メッセージをランダムに受け取ります。最大 MTU サイズ セットは 1500 バイトで、バッファのサイズは 2K です。

問題を分類/絞り込むための提案はありますか?

4

1 に答える 1

0

上記の問題について Broadcom と連絡を取り、問題を修正してテストしました。行った変更を更新したいと思います。

  • PHY レイヤーからデータ パケットを受信した後、PHY RX バッファーをフラッシュします。このセクションは、PHY レイヤーによって既に管理されているため、削除されました。

  • また、LWIP スタックのフローに若干の変更を加えました。

于 2012-11-30T18:13:09.430 に答える