Всем добрый день, такая проблема - в зарегестрированном rx_handler вижу vlan тэг в метаданных (skb->vlan_tci), a вот в зарегестрированном netfilter хуке он уже нулевой. Стал рыться в коде ядра (4.8) и обнаружил что вроде как так и должно быть… Вопрос такой - правильно ли я понимаю:
- В __netif_receive_skb_core() в функции skb_vlan_untag() тег у VLAN пакетов удалается из skb->data и переноситься в метаданные skb (skb->vlan_tci) - я правильно прочитал? И зачем это? Оптимизация?
- Далее по коду функции __netif_receive_skb_core() кроме всего прочего вызываются rx_handler’ы и после этого есть следующий кусок:
if (unlikely(skb_vlan_tag_present(skb))) {
if (skb_vlan_tag_get_id(skb))
skb->pkt_type = PACKET_OTHERHOST;
/* Note: we might in the future use prio bits
* and set skb->priority like in vlan_do_receive()
* For the time being, just ignore Priority Code Point
*/
skb->vlan_tci = 0;
}
В этом коде получается удаляется совсем информация о VLANID? Почему так? А что если мне в netfilter хуке нужен VLAN? Или подразумевается что все что касается VLAN’ов решается на L2 уровне…
- И последний момент - не совсем понимаю логику работы макроса skb_vlan_tag_present()
((__skb)->vlan_tci & VLAN_TAG_PRESENT)
#define VLAN_TAG_PRESENT VLAN_CFI_MASK
Т. е. проверяется что CFI бит ненулевой, но он же должен быть нулевой у Ethernet VLAN пакетов, вообще не совсем понимаю что значит этот бит, он вроде к влану не относится… Спасибо!