Funkcja NetLink 7 C

Funkcja NetLink 7 C
Zadania przestrzeni użytkowników, a także jądro, komunikują się ze sobą za pośrednictwem NetLink. Składa się z wewnętrznego interfejsu API jądra dla podstawowych wtyczek i wspólnego interfejsu zadań dotyczących przestrzeni użytkowników skoncentrowanych. W tym artykule instruktażowym interfejs podstawowego jądra nie jest opisany. Ponadto rzeczywiście istnieje przestarzały interfejs NetLink dostępny za pośrednictwem peryferyjnych znaków NetLink. Ten interfejs nie jest tutaj opisany i jest uwzględniony wyłącznie dla kompatybilności wstecznej. Datagrams są przedmiotem usługi NetLink. Istnieją dwie akceptowalne opcje dla stylu gniazda: Sock_RAW i Sock_Dgram. Tymczasem interfejs NetLink w jakiś sposób nie różnicuje się między datagramami a surowymi gniazdami.

Rodziny NetLink

Klan NetLink określa pakiet jądra lub zestaw NetLink do komunikacji. Wyznaczone istniejące rodziny NetLink są następujące:

  • NetLink_Route: Akceptuje aktualizacje routingu, a także aktualizacje połączeń, które można użyć do zmiany adresów IPS, ustawień linków, konfiguracji sąsiedztwa, dyscyplin kolejowych, klasyfikacji komunikacji i klasyfikacji pakietów.
  • NetLink_W1: Wiadomości wysyłane przez sieć 1-wire.
  • NetLink_usersock: Używane tylko przez protokoły interfejsu w trybie użytkownika.
  • NetLink_firewall: Przenieś pakiety IPv4 za pomocą trybu użytkownika do Netfilter używany przez kolejkę IP pakietu Core Pack. Ponieważ uznano go za niepotrzebne przez dłuższy czas (na korzyść znacznie bardziej wyrafinowanej funkcji kolejki NFNetLink), zapora NetLink jest ostatecznie wyeliminowana w Linux 3.5.
  • NetLink_Sock_Diag: Prosi rdzeń o szczegóły dotyczące gniazd należących do różnych wariantów protokołu.
  • Netlink Crypto: Żądanie danych szyfru za pomocą interfejsu NetLink zarówno uwierzytelnionego za pomocą interfejsu API szyfrowania jądra, jak i umożliwia konfigurację kryptograficznego interfejsu API jądra.
  • NetLink_IP6_FW: Przenosi ramki IPv6 za pomocą trybu użytkownika do Netfilter. Wykorzystywane przez komponent jądra kolejki IP6.

Interfejs NetLink nie jest godny zaufania. Dokładnie wszelkich starań dostarczenia informacji do zamierzonych odbiorców. Jeśli jednak pojawi się problem z przechowywaniem lub jakikolwiek inny błąd, może stracić komunikację. Włączając flagę NLM F ACK, nadajnik może poprosić odbiorcę o afirmację, aby zapewnić godną zaufania transmisję. Pakiety błędów NLMSG z zestawem pola usterki na 0 to potwierdzenia. Podziękowania otrzymanych wiadomości powinny zostać wydane przez sam program.

Dla każdego zrzuconego pakietu jądro próbuje podać odpowiedź błędu NLMSG. Po tym wzorze powinny również proces procesów użytkownika. W każdym razie trudno jest przesyłać dane z jądra do użytkownika.

Natomiast, jeśli przechowywanie gniazda zostanie wypełnione, jądro nie jest w stanie przesłać wiadomości NetLink, ponieważ informacje zostaną utracone, a rdzeń z działaniem przestrzeni użytkownika nie będzie już udostępniać tego samego pojęcia statusu rdzenia. Aplikacja jest odpowiedzialna za określenie, kiedy występuje w wyniku awarii ENOBUFS, którą zwraca i resynchronizuje recvmsg (2).

Przykład:

Omówimy program korzystania z funkcji netLink () do komunikacji między jądrem a normalnymi systemami. Najpierw spojrzymy na stronę użytkownika tego programu. W tym celu musimy dodać główne gniazdo i nagłówki NetLink w kodzie, aby korzystać z gniazd w programie C wraz z funkcją netLink (), i.mi. "gniazdo elektryczne.H ”i„ NetLink.H".

Następnie ustawiamy maksymalny rozmiar ładunku na 1024 i ustawiamy struktury definiujące, i.mi. sockaddr_nl, src_adr, dest_adr. Struktura zerowa „nlmsghdr” jest również zdefiniowana za pomocą struktury „*nl” i Iovec. Funkcja Main () rozpoczyna się od tworzenia gniazda za pomocą funkcji „gniazda”. Ta funkcja zawiera nazwę domeny pf_netlink dla gniazda i typu sock_raw. Protokół gniazda netLink_Test jest zdefiniowany w parametrach funkcji gniazda.

Funkcja memset () służy do wskazywania bloku „src_adr” pamięci struktury, w której wartość 0 jest ustawiona na kilka bajtów, które zawiera struktura „src_adr”. Korzystając ze struktury SRC_ADR, ustawiamy rodzinę, identyfikator procesu i grupy konkretnego gniazda odpowiednio na AF_NetLink, Id Id i 0. Podobnie do połączenia TCP/IP, ustalone gniazdo jest połączone z lokalnym (pochodzącym) IP za pośrednictwem funkcji netLink bind (). Funkcja memset () jest ponownie używana do wskazywania bloku „dest_adr” pamięci struktury, w której wartość 0 jest ustawiona na kilka bajtów, które zawiera struktura docelowa.

Korzystając z struktury dest_adr, przypisujemy rodzinę, identyfikator procesu i grupy dla konkretnego gniazda docelowego odpowiednio do AF_NetLink, 0. Korzystając z funkcji Malloc (), przypisujemy pamięć dynamiczną do struktury „nlmsghdr” i zapisujemy wynik powrotu, i.mi. odniósł sukces lub nie. Wskaźnik null struktury „NL” wskazuje na długość wiadomości, identyfikator procesu i flagę 0, aby wypełnić nagłówek wiadomości NetLink. Funkcja strcpy () ma skopiować ciąg w strukturze wskaźnika zerowego „NL”.


Dlatego ładunek komunikacyjny plus NLMSGHDR stanowi wiadomość netlink. Po odbieraniu komunikacji trafia do bufora, na który wskazuje wskaźnik NL. Możemy również przesłać zaktualizowaną wiadomość do struktury msghdr „MSG”. Wskaźnik struktury „NL” może odczytać wiadomość z jądra i wyświetlać ją na skorcie za pomocą funkcji NLMSG_DATA ().

Na koniec deskryptor gniazda NetLink służy do zamknięcia gniazda NetLink.

W przestrzeni programu jądra tworzymy zerową strukturę „skarpet” wraz z jej wskaźnikiem „*nl_sk”. Funkcja NL_Data_Ready () używa tej struktury i długości, aby ją obudzić i przygotować dane po śnie. Funkcja netLink_Test () ma poczekać na wiadomość, która spada z miejsca użytkownika do jądra i wydrukować ją. Ostatecznie przestrzeń jądra uwalnia gniazdo.

„Witam ciebie!„Wiadomość jest wyświetlana na naszym ekranie po wykonaniu tego przykładu.

Wniosek

Chodzi o użycie funkcji netLink () 7 w ramach naszych programów C osobno dla użytkownika i przestrzeni jądra. Omówiliśmy jego zastosowania, wysyłając wiadomość z przestrzeni użytkownika do odpowiedniej przestrzeni jądra. Przykładowy kod tego artykułu można wdrożyć na dowolnym kompilatorze.