Моему приложению необходимо использовать vlan для разделения трафика от / к сетевой карте.Поэтому я использую необработанный сокет L2 (AF_PACKET) для отправки / получения.Для каждого пакета к нему может быть прикреплен тег vlan в диапазоне от 1 до 4095. С другой стороны, получатель также использует необработанный сокет L2 для получения пакета, получения тега vlan и обработки его в соответствии с тегом vlan.
Проблема в том, что я не могу получить пакет с этим кодом.Со стороны отправителя кажется, что пакет был успешно отправлен (счетчик TX увеличен с ifconfig).Но сторона получателя ничего не получает.
Если я изменю часть TPID тега vlan (0x8100 для 802.1q) на что-то другое, например, 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;
}
...
}