特定の VLAN タグ付きフレームのデータを受信する方法はありますか? 現在、次のような socket() 関数への入力として htons(0x22f0) を指定することで、すべての VLAN タグ付きフレームを受信しています。
m_iSocketDesc = socket(AF_PACKET, SOCK_RAW, htons(0x22f0));
numBytes = recvfrom(m_iSocketDesc, message_data, 1522, 0, NULL, 0)
同様の要件がありました。特定の VLAN でパケットを受信するために、VLAN インターフェイスを作成し、raw ソケットをそれにバインドしました。これで 802.3 フレームを送信できるようになり、カーネルが VLAN タグを挿入/抽出します。
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
アプリケーションで通常のバインド機能を使用して、VLAN インターフェイスにバインドします。上記の例では、eth0.100.
サンプル コードについては、以下の 2 つのリンクを参照してください (私はコードの所有者ではありません)。
送信: https://gist.github.com/austinmarton/1922600
受信: https://gist.github.com/austinmarton/2862515#file-recvraweth-c
必要な唯一の変更は、物理インターフェイスにバインドする代わりに、仮想 VLAN インターフェイスにバインドすることです。受信したイーサネット フレームはタグなしフレームであることに注意してください。このインターフェイスで送信されるフレームはすべて、VLANID で自動的にタグ付けされます。