Как использовать необработанный сокет L2 для отправки / получения пакетов с разными тегами VLAN? - PullRequest
0 голосов
/ 15 февраля 2019

Моему приложению необходимо использовать 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;
    }
...
}
...