在Linux下读取具有特定VLAN标记的802.1Q帧

时间:2014-02-17 09:20:32

标签: linux sockets vlan

有没有办法接收特定VLAN标记帧的数据?目前,我通过将htons(0x22f0)作为socket()函数的输入来接收所有带VLAN标记的帧,如:

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

1 个答案:

答案 0 :(得分:2)

我有类似的要求。为了接收具有特定VLAN的数据包,我创建了一个VLAN接口并将我的原始套接字绑定到它。现在我可以发送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。

  3. 您可以参考以下两个链接获取示例代码(我是代码的所有者)

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

    接收:https://gist.github.com/austinmarton/2862515#file-recvraweth-c

    唯一需要的更改是绑定到虚拟VLAN接口,而不是绑定到物理接口。请注意,收到的以太网帧是未标记的帧。在此接口上发送的任何帧都将自动使用VLANID标记。