Famiglie NetLink
Il clan NetLink determina il pacchetto kernel o il set di netlink da utilizzare per la comunicazione. Le famiglie NetLink esistenti designate sono le seguenti:
L'interfaccia netlink non è affidabile. Fa ogni sforzo per fornire le informazioni ai destinatari previsti. Tuttavia, se sorge un problema di archiviazione o qualsiasi altro errore, potrebbe perdere le comunicazioni. Abilitando la bandiera NLM F ACK, il trasmettitore può chiedere all'affermazione del destinatario di garantire una trasmissione affidabile. I pacchetti di errore NLMSG con il campo di errore impostato su 0 sono riconoscimenti. I riconoscimenti per i messaggi ricevuti dovrebbero essere prodotti dal programma stesso.
Per ogni pacchetto abbandonato, il kernel tenta di fornire una risposta all'errore NLMSG. Questo modello dovrebbe anche essere seguito dai processi dell'utente. In ogni caso, è difficile trasmettere i dati dal kernel all'utente in modo affidabile.
Considerando che, se l'archiviazione socket è riempita, il kernel non è in grado di trasmettere un messaggio NetLink perché le informazioni andranno perse e il core con la sua operazione dello spazio utente non condividerebbe più la stessa nozione dello stato del core. L'app è responsabile della determinazione quando si verifica a seguito del fallimento ENUBUFS che RECVMSG (2) restituisce e risincronizza.
Esempio:
Discuteremo un programma per utilizzare la funzione NetLink () per la comunicazione tra il kernel e i sistemi normali. Innanzitutto, diamo un'occhiata al lato utente di questo programma. Per questo, dobbiamo aggiungere la presa principale e le intestazioni NetLink nel codice per utilizzare le prese nel programma C insieme alla funzione NetLink (), i.e. "PRESA.H "e" NetLink.H".
Successivamente, abbiamo impostato la dimensione massima del payload su 1024 e impostiamo le strutture di definizione, i.e. Sockaddr_nl, src_adr, dest_adr. La struttura nulla "NLMSGHDR" è anche definita con "*nl" e struttura IOVEC. La funzione principale () viene avviata con la creazione di una presa usando la funzione "socket". Questa funzione contiene il nome di dominio PF_NETLink per il socket e il tipo di socket Sock_Raw. Il protocollo socket netlink_test è definito nei parametri della funzione socket.
La funzione Memset () viene utilizzata per puntare verso il blocco "src_adr" della memoria struct in cui il valore 0 è impostato su più byte che la struttura "src_adr" contiene. Utilizzando la struttura SRC_ADR, impostiamo l'ID famiglia, il processo e i gruppi del particolare socket su AF_NETLINK, ID auto -process e 0, rispettivamente. Simile a una connessione TCP/IP, la presa stabilita è collegata a una connessione locale (origine) IP tramite la funzione netlink bind (). La funzione Memset () viene nuovamente utilizzata per puntare verso il blocco "dest_adr" della memoria struct in cui il valore 0 è impostato su più byte che la struttura di destinazione contiene.
Utilizzando la struttura DEST_ADR, assegniamo la famiglia, l'ID di processo e i gruppi per il particolare socket di destinazione a AF_NETLink, ID processo 0 e 0 gruppi, rispettivamente. Usando la funzione Malloc (), assegniamo la memoria dinamica per strutturare "nlmsghdr" e salvare il risultato di ritorno, i.e. riuscito o no. Il puntatore della struttura null "NL" punta verso la lunghezza del messaggio, l'ID di processo e il flag 0 per riempire l'intestazione del messaggio NetLink. La funzione strcpy () è qui per copiare la stringa all'interno della struttura del puntatore null "NL".
Pertanto, il payload della comunicazione più NLMSGHDR costituisce un messaggio NetLink. Quando viene ricevuta una comunicazione, entra nel buffer che il puntatore NL sta indicando. Potremmo anche inviare il messaggio aggiornato alla struttura msghdr "msg". Il puntatore della struttura "NL" può leggere il messaggio dal kernel e visualizzarlo sulla shell tramite l'uso della funzione NLMSG_DATA ().
Infine, il descrittore della presa NetLink viene utilizzato per chiudere la presa NetLink.
All'interno dello spazio del programma del kernel, creiamo una struttura nulla "calzino" insieme al suo puntatore "*nl_sk". La funzione nl_data_ready () utilizza questa struttura e un po 'di lunghezza per svegliarla e rendere i dati pronti dopo un sonno. La funzione netlink_test () è qui per attendere un messaggio che scende dallo spazio utente al kernel e stamparlo. Alla fine, lo spazio del kernel rilascia la presa.
Il "ciao tu!"Il messaggio viene visualizzato sul nostro schermo dopo aver eseguito questo esempio.
Conclusione
Si tratta dell'uso della funzione NetLink () 7 di C all'interno dei nostri programmi C separatamente per lo spazio utente e lo spazio del kernel. Abbiamo discusso dei suoi usi inviando un messaggio dallo spazio utente allo spazio pertinente del kernel. Il codice di esempio di questo articolo può essere implementato su qualsiasi compilatore.