2

特定の VLAN タグ付きフレームのデータを受信する方法はありますか? 現在、次のような socket() 関数への入力として htons(0x22f0) を指定することで、すべての VLAN タグ付きフレームを受信して​​います。

m_iSocketDesc = socket(AF_PACKET, SOCK_RAW, htons(0x22f0));
numBytes = recvfrom(m_iSocketDesc, message_data, 1522, 0, NULL, 0)
4

1 に答える 1

2

同様の要件がありました。特定の VLAN でパケットを受信するために、VLAN インターフェイスを作成し、raw ソケットをそれにバインドしました。これで 802.3 フレームを送信できるようになり、カーネルが VLAN タグを挿入/抽出します。

  1. VLAN インターフェイスを作成します。root 権限が必要です

    ip link add link <phyInterface> name <phyInterface.VLANID> type vlan id VLANID
    Eg: ip link add link eth0 name eth0.100 type vlan 100
    
  2. アプリケーションで通常のバインド機能を使用して、VLAN インターフェイスにバインドします。上記の例では、eth0.100.

サンプル コードについては、以下の 2 つのリンクを参照してください (私はコードの所有者ではありません)。

送信: https://gist.github.com/austinmarton/1922600

受信: https://gist.github.com/austinmarton/2862515#file-recvraweth-c

必要な唯一の変更は、物理インターフェイスにバインドする代わりに、仮想 VLAN インターフェイスにバインドすることです。受信したイーサネット フレームはタグなしフレームであることに注意してください。このインターフェイスで送信されるフレームはすべて、VLANID で自動的にタグ付けされます。

于 2016-05-09T20:33:05.867 に答える