Funzione netlink 7 c

Funzione netlink 7 c
Le attività dello spazio utente, così come il kernel, comunicano tra loro tramite NetLink. È costituito da un'API del kernel interno per i plugin core e un'interfaccia di attività di spazio utente centrata su prese comuni. In questo articolo didattico, l'interfaccia del kernel principale non è descritta. Inoltre, esiste davvero un'interfaccia NetLink obsoleta accessibile attraverso le periferiche del carattere NetLink. Questa interfaccia non è descritta qui ed è incluse esclusivamente per la compatibilità all'indietro. I datagrammi sono al centro del servizio di NetLink. Esistono due opzioni accettabili per lo stile socket: Sock_raw e Sock_Dgram. L'interfaccia NetLink, nel frattempo, in qualche modo non distingue tra i datagrammi e le prese grezze.

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:

  • Netlink_route: Accetta il routing e gli aggiornamenti di connessione che potrebbero essere utilizzati per modificare IPS, Impostazioni di collegamento, configurazioni di vicini, discipline di coda, classificazioni di comunicazione e classificazioni dei pacchetti.
  • Netlink_w1: I messaggi inviati dalla rete a 1 filo.
  • Netlink_usersock: Utilizzato solo dai protocolli di interfaccia in modalità utente.
  • Netlink_firewall: Trasferisci i pacchetti IPv4 tramite la modalità utente in netfilter utilizzato dalla coda IP del pacchetto principale. Da quando non è stato considerato inutile per una durata del tempo prolungata (a favore della funzione di coda NFNetLink molto più sofisticata), NetLink Firewall viene finalmente eliminato in Linux 3.5.
  • Netlink_sock_diag: Chiede il core per i dettagli sulle prese appartenenti alle diverse varianti del protocollo.
  • NetLink Crypto: Richiedere i dati di cifratura utilizzando l'interfaccia NetLink sia autenticata con l'API di crittografia del kernel e consente di impostare l'API crittografica del kernel.
  • Netlink_ip6_fw: Trasferisce i frame IPv6 tramite la modalità utente a NetFilter. Utilizzato dalla coda del componente del kernel IP6.

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.