2

インターフェイスからパケットを受け取り、その宛先と送信元の MAC アドレスを Linux カーネル レベルで出力する単純なプログラムを作成しようとしています。これは、Linux カーネルを使用した最初のプロジェクトであり、ネットデバイス、ループバック、および skbuff に関する多くのソース コードと本を読んでいます。これまでに学んだことから、skbuff はパケット データが配置される場所のように見えますが、ネットワーク デバイス ドライバーがインターフェイスからパケットを取得して skb に配置する方法や、特定のインターフェイスに関連する skb を取得する方法がわかりません。

誰かが eth0 などのネットデバイスにリンクされた skb をどのように見ているのか教えてもらえますか? それらを拾うために必要な送受信リングはありますか?

いくつかのサンプルコードは素晴らしいでしょう! それに失敗した場合、誰かがソースコードを指すことができれば(ファイル名だけでなく...行番号と関数名が素晴らしいでしょう)。

これが漠然とした質問である場合は申し訳ありませんが、できる限り調査しようとしました。前もって感謝します。

4

2 に答える 2

1

例として、PCI ベースの 1 つのイーサネット チップの破損コードを取り上げます: ./drivers/net/pci-skeleton.c。このコードは古いスタイルのイーサネット ドライバーかもしれませんが、勉強には役立ちます。

パケット受信フロー: netdrv_rx_interrupt() --> sk_buff の割り当て/置換 --> netif_rx() を呼び出し、受信したパケット/sk_buff を上位スタック層に渡します。

パケット送信フロー: netdrv_start_xmit();

デバイスの初期化フロー: init_module(); から開始できます。

一般的な関数は、netif_rx... などの ./net/core/dev.c にあります。

于 2013-03-04T08:18:08.390 に答える
1

netfilter フックを使用してみることができます。

でコールバックを登録するとnf_register_hook()、指定されたアドレス ファミリ (例: AF_INETIPv4) とタイプ (例:NF_IP_LOCAL_IN受信パケット) に対して呼び出されます。フックは、パケットの着信または発信に使用された skb とネットワーク デバイスも取得します。

コールバックのプロトタイプは次のようになります。

unsigned int my_hook(unsigned int hook,
                     struct sk_buff *skb,
                     const struct net_device *in,
                     const struct net_device *out,
                     int (*okfn)(struct sk_buff *));

http://www.sikurezza.org/ml/12_99/msg00063.htmlにも(古い) 例がありますが、カーネル ソースを掘り下げることもできます。ネットワーク スタックまたは iptables モジュールの使用方法の例がいくつかあります。 netfilter フック。

于 2013-03-03T21:34:16.970 に答える