2016-03-22 11 views
6

W systemie Linux, używając C, w jaki sposób znaleźć nazwę urządzenia mostkowego, do którego jest podłączony mój interfejs Ethernet? Czy jest potrzeba wykonania sekwencji ioctl(), aby znaleźć główne urządzenie mostkowe?Jak mogę znaleźć nazwę urządzenia mostkowego dla mojego adaptera z zaczepem w C?

Mój program C zna nazwę urządzenia mojego adaptera TAP z pliku konfiguracyjnego (w tym przypadku tap0). Ostatecznie potrzebuję adresu IP, na który odpowiada mój adapter TAP. Ponieważ jest zmostkowany, adapter TAP nie ma adresu IP; to jest urządzenie bridge, które ma adres IP.

Mam urządzenie TAP i urządzenie VETH połączone razem. ip a zawiera następujące informacje:

1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
2: tap0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 500 
    link/ether 22:d4:fa:a4:89:81 brd ff:ff:ff:ff:ff:ff 
3: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 22:8c:ee:b8:e3:30 brd ff:ff:ff:ff:ff:ff 
    inet 10.20.30.40/24 scope global br0 
     valid_lft forever preferred_lft forever 
45: veth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN group default qlen 1000 
    link/ether 22:8c:ee:b8:e3:30 brd ff:ff:ff:ff:ff:ff 

pamiętać, że tap0 i veth0 wprowadzane: każdy z ich mostka nadrzędnego jest br0 (czyli mają mostek master br0).

Kiedy zadzwonić ioctl(SIOCGIFFLAGS), a następnie ioctl(SIOCGIFPFLAGS) gdy ifr_name jest tap0 jedynymi flagi które są ustawione są IFF_UP i IFF_BROADCAST. Nie mam pojęcia, dokąd się udać.

+0

Można parsować wyjście 'brctl show' – stark

+0

@stark To mniej pożądane niż parsowanie' ip a'. Wymaga to zainstalowania pakietu 'bridge-utils'. Wszystkie pomosty zostały skonfigurowane tylko przy użyciu pakietu 'iproute2'. – scottbb

+2

Możesz spróbować użyć 'strace' na' ip a' i zobaczyć, co robi. –

Odpowiedz

1

iputils i przyjaciele używają API rtnetlink pomiędzy jądrem i przestrzenią użytkownika (interfejs API gniazda POSIX jest zbyt wąski, aby wykonać wszystkie potrzebne zadania, i nie ma żadnego sposobu dodawania powiadomień). Jeśli twój projekt jest mały, prawdopodobnie łatwiej i szybciej przeanalizuje dane wyjściowe z narzędzia ip. Jest to spowodowane doświadczeniem z pisania demona konfiguracji sieci dla projektu wbudowanego Linux. Interfejs API rtnetlink jest początkowo nieco trudny w użyciu, ale jeśli naprawdę chcesz (wiele wskazówek i odniesień rozmiaru, które muszą być poprawne), zrób trochę badań i używaj źródła iputils jako punktu wyjścia.

Powiązane problemy