如何使用L2原始套接字发送/接收带有不同VLAN标签的数据包?

时间:2019-02-15 16:09:00

标签: linux sockets vlan

我的应用程序需要使用vlan来分离与NIC的通信。所以我正在使用L2原始套接字(AF_PACKET)进行发送/接收。对于每个数据包,可以在1〜4095之间附加一个vlan标签。在另一端,接收方还使用L2原始套接字接收数据包,获取vlan标签,并根据vlan标签对其进行处理。 / p>

问题是我无法收到此代码的任何pakcet。从发送方看来,数据包已成功发送出去(TX计数器从ifconfig中增加了)。但是接收方什么也没得到。

如果我将vlan标签(对于802.1q为0x8100)的TPID部分更改为其他内容,例如0x1234,接收方可以接收到报文。

看来Linux内核对VLAN数据包有一些特殊处理。有什么方法可以发送/接收VLAN数据包?

顺便说一句,看来内核代码中的vlan标签已被删除。不太确定这是否是根本原因。

static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc)
{
  ...
  ...

  if (skb->protocol == cpu_to_be16(ETH_P_8021Q) ||
        skb->protocol == cpu_to_be16(ETH_P_8021AD)) {
        skb = skb_vlan_untag(skb);
        if (unlikely(!skb))
            goto out;
    }
...
}

0 个答案:

没有答案