2015-05-21 16 views
12

Jak uzyskać informacje VLAN, takie jak dodawanie i usuwanie interfejsu sub VLAN z jądra do przestrzeni użytkownika za pomocą gniazda NETLINK w C?Informacje VLAN przy użyciu NETLINK

Zrobiłem małe badanie w człowieku NETLINK jak sugerowano w komentarzach. Dodałem i usunięto interfejs sub-VLAN i monitorowałem za pomocą programu gniazda netlink. Do dodania & usuwania każdy odbiera 3 wiadomości. Dodawanie wysyła 3 wiadomości NEWLINK i usuwanie wysyła 2 NEWLINK & 1 wiadomość DELLINK. Dlaczego to jest takie?

dodawania nowych eth1.75 VLAN:

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

do usunięcia z VLAN interfejsu eth2.75:

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

poprawka małej gramatyki. –

+2

Przeczytaj strony podręcznika i wróć, gdy utkniesz w konkretnym pytaniu. Zacznij od 'man 7 netlink', a następnie' man 7 rtnetlink'. Myślę, że * dostaniesz 'RTM_NEWLINK' do dodania i' RTM_DELINK' do usunięcia. Sprawdź przykłady kodu źródłowego dla [Network Managera] (https://download.gnome.org/sources/NetworkManager/1.0/). –

Odpowiedz

4

Podczas tworzenia gniazda Netlink tworzyć 3 urządzenia. Właśnie dlatego otrzymujesz 3 zdarzenia. Oto 3 urządzenia, które tworzy podczas zdarzenia add.

  • Podsystem sieciowy.
  • Podsystem kolejki wysyłania.
  • Podsystem kolejki odbiorczej.

net podsystem to urządzenie sterujące wyższego poziomu. Pozostałe dwie to queues do przekazywania danych. Możesz to zweryfikować jak poniżej.

Kiedy robię udevadm monitor --env i stworzyć VLAN uzyskać następujące zdarzenia z jądra:

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 
1

wiadomości RTM_NEWLINK są wysyłane na każdej zmianie stanu interfejsu, zwykle od netdev_state_change (patrz: http://lxr.free-electrons.com/source/net/core/dev.c#L1226).

Zasadniczo, pomyśl o RTM_NEWLINK jako o "stanie interfejsu zmienionym", a nie o "utworzeniu nowego interfejsu".

Na przykład, dodając interfejs VLAN otrzymasz:

  1. powiadomienia o nowych eth2.75 interfejsu w stanie NIE
  2. Powiadomienie stanu bazowego eth2 interfejsu fizycznego (ma teraz "podrzędny" interfejs, który wcześniej nie miał przed sobą - na przykład niektóre karty NIC mają odciążenie sprzętowe w celu odfiltrowania niepożądanych znaczników VLAN z . Interfejs może teraz wymagać aktualizacji karty NIC itp.). eth2 jest w stanie UP i pozostaje takie - ale zmienił się jego stan wewnętrzny .
  3. Powiadomienie, że eth2.75 przeszedł ze stanu DOWN do UP.

W podobny sposób do usunięcia widać:

  1. Zawiadomienie o zmianie stanu ETH2 (odrębnie od eth2.75 i VLAN)
  2. powiadamianiu eth2.75 idąc od góry do dołu stan
  3. Powiadomienie o usunięciu eth2.75 interfejs