Информация о VLAN с использованием NETLINK

Как вы получаете информацию VLAN, такую ​​как добавление и удаление подинтерфейса VLAN из ядра в пользовательское пространство с помощью сокета NETLINK в C?

Я мало учился у человека NETLINK, как это было предложено в комментариях. Я добавил и удалил дополнительный интерфейс VLAN и отслеживал использование программы сокетов netlink. Для добавления и удаления каждый получает 3 сообщения. Добавление отправляет 3 сообщения NEWLINK и удаление отправляет 2 сообщения NEWLINK и 1 DELLINK. Почему это так?

Для добавления нового интерфейса VLAN eth1.75:

RTM_NEWLINK Link eth2.75 Down
RTM_NEWLINK Link eth2 Up
RTM_NEWLINK Link eth2.75 Up

Для удаления интерфейса VLAN eth2.75:

RTM_NEWLINK Link eth2 Up
RTM_NEWLINK Link eth2.75 Down
RTM_DELLINK eth2.75

Ответ 1

При создании сокета netlink создается 3 устройства. Вот почему вы получаете 3 события. Вот 3 устройства, которые он создает при событии add.

  • Сетевая подсистема.
  • Подсистема отправки очереди.
  • Подсистема приема очереди.
Подсистемой

net является устройство управления верхнего уровня. Другими двумя являются queues для передачи данных. Вы можете проверить его, как показано ниже.

Когда я делаю udevadm monitor --env и создаю vlan, я получаю из ядра следующие события:

UDEV  [305215.045416] add      /devices/virtual/net/vpn0 (net)
ACTION=add
DEVPATH=/devices/virtual/net/vpn0
ID_MM_CANDIDATE=1
IFINDEX=10
INTERFACE=vpn0
SEQNUM=3665
SUBSYSTEM=net
USEC_INITIALIZED=5215023319

UDEV  [305215.046658] add      /devices/virtual/net/vpn0/queues/rx-0 (queues)
ACTION=add
DEVPATH=/devices/virtual/net/vpn0/queues/rx-0
SEQNUM=3666
SUBSYSTEM=queues
USEC_INITIALIZED=15044665

UDEV  [305215.047628] add      /devices/virtual/net/vpn0/queues/tx-0 (queues)
ACTION=add
DEVPATH=/devices/virtual/net/vpn0/queues/tx-0
SEQNUM=3667
SUBSYSTEM=queues
USEC_INITIALIZED=5215044729

Ответ 2

Сообщения RTM_NEWLINK отправляются для каждого изменения состояния интерфейса, обычно из netdev_state_change (см. http://lxr.free-electrons.com/source/net/core/dev.c#L1226).

В принципе, подумайте о RTM_NEWLINK как об изменении состояния интерфейса, а не просто о создании "нового интерфейса".

Например, для добавления интерфейса VLAN вы получаете:

  • Уведомление о новом интерфейсе eth2.75 в состоянии DOWN
  • Уведомление о состоянии базового физического интерфейса eth2 (теперь он имеет "подчиненный" интерфейс, который у него не был раньше - например, некоторые карты NIC имеют разгрузку HW для фильтрации нежелательные теги VLAN. Теперь интерфейсу может потребоваться обновить сетевой адаптер и т.д.). eth2 находится в состоянии UP и остается таким - но его внутреннее состояние изменилось.
  • Уведомление о том, что eth2.75 перешло из состояния DOWN в UP.

Аналогичным образом для удаления вы видите:

  • Уведомление об изменении состояния eth2 (disassociated from eth2.75 и VLAN)
  • Уведомление eth2.75 о переходе из состояния UP в DOWN
  • Уведомление об удалении интерфейса eth2.75