Информация о 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