我的应用程序需要使用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;
}
...
}