0

etherOutputHookAdd() を機能させようとして困惑しています。その対応物である etherInputHookAdd() は正常に動作しているようです。問題の OS バージョンは VxWorks 5.4 です。

フック コードは次のようになります (実際に実行するコードはもっと複雑ですが、これは例として役立ちます)。

int anCounter;
STATUS etherHook(struct ifnet *pif, char *buf, int size)
{
    anCounter += 1;
    return FALSE;
}

vxworks シェルから etherInputHookAdd を次のように接続できます。

etherInputHookAdd etherHook,"fei",0

これは 0 (STATUS OK) を返します。その後、「anCounter」変数を調べると、予想どおりのアクティビティが示されます。ただし、出力方向にはそのような運はありません。これらのコマンドラインの両方を試しました

etherOutputHookAdd etherHook,"fei",0
etherOutputHookAdd etherHook

どちらも OK を返しますが、フック ルーチンはまったく呼び出されていないようです。私の最善の仮説は、(1) 初期化ステップがないか、呼び出し方が間違っている、(2) etherOutputHookAdd の実装が単なるスタブである、(3) シェルから呼び出すことができない、または (4) たぶん私の nic ドライバーの実装にはバグがあります。

中心的な問題 (ボードから送信されたものを確認するにはどうすればよいか) を解決するアイデアを歓迎します。

4

3 に答える 3

1

次の VxWorks ネットワーク ドライバーは、input-hook ルーチンと output-hook ルーチンの両方をサポートしています。

if_cpm - Motorola MC68EN360 QUICC network interface driver 
if_eex - Intel EtherExpress 16 
if_ei - Intel 82596 ethernet driver
if_elc - SMC 8013WC Ethernet driver
if_elt - 3Com 3C509 Ethernet driver
if_ene - Novell/Eagle NE2000 network driver
if_fn - Fujitsu MB86960 NICE Ethernet driver
if_ln - Advanced Micro Devices Am7990 LANCE Ethernet driver
if_sm - shared memory backplane network interface driver
if_sn - National Semiconductor DP83932B SONIC Ethernet driver
if_ultra - SMC Elite Ultra Ethernet network interface driver

if_gn - generic MUX interface layer

次のドライバーは、入力フック ルーチンのみをサポートします。

if_nic - National Semiconductor SNIC Chip (for HKV30)
if_sl - Serial Line IP (SLIP) network interface driver

次のドライバーは、出力フック ルーチンのみをサポートします。

if_ulip - network interface driver for User Level IP (VxSim)

次のドライバーは、input-hook または output-hook ルーチンをサポートしていません。

if_loop - software loopback network interface driver
于 2012-03-23T13:57:48.837 に答える
0

このようにつまずくかもしれない少数の人々へ..それは恐ろしい「仮説4」でした!

etherOutputHookAdd() が正しく機能するためには、etherOutputHookRtn が指す関数の呼び出しを NIC デバイス ドライバー ライターに含める必要があることがわかりました。etherOutputHookAdd() が行うのは、提示されたパケット ハンドラーをリストに追加することだけです。これにより、NIC ドライバーが etherOutputHookRtn を呼び出したときに、送信されているもののコピーを取得できます。悲しいことに、何らかの理由でこれが行われなかったドライバーがたくさんいます。

したがって、今回のようなケースでは、行動方針は 2 つしかありません。

  • ドライバーのパッチを見つけるか、自分でパッチを当てます
  • 戦術を完全に変更します。たとえば、反対側で etherInputHookAdd() を使用してみてください。
于 2011-05-10T00:45:59.847 に答える