Rodziny NetLink
Klan NetLink określa pakiet jądra lub zestaw NetLink do komunikacji. Wyznaczone istniejące rodziny NetLink są następujące:
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.