NetLink 7 C -funksjon

NetLink 7 C -funksjon
Bruker-romoppgavene, så vel som kjernen, kommuniserer med hverandre via Netlink. Det består av et indre kjerne-API for kjerneplugins og et vanlig stikkontaktsentrert brukerområdet oppgavegrensesnitt. I denne instruksjonsartikkelen er ikke kjernekjernemegrensesnittet beskrevet. I tillegg er det faktisk et utdatert Netlink -grensesnitt tilgjengelig gjennom Netlink -karakterenes periferiutstyr. Dette grensesnittet er ikke beskrevet her og er utelukkende inkludert for bakoverkompatibilitet. Datagrammer er i fokus for Netlinks tjeneste. Det er to akseptable alternativer for sokkelstilen: sock_raw og sock_dgram. Netlink -grensesnittet skiller i mellomtiden ikke på en eller annen måte mellom datagrammer og rå stikkontakter.

Netlink -familier

Netlink -klanen bestemmer kjernepakken eller Netlink -settet som skal brukes til kommunikasjon. De eksisterende Netlink -familiene som er utpekt er følgende:

  • Netlink_route: Den aksepterer rutingen så vel som tilkoblingsoppdateringer som kan brukes til å endre IPS, koblingsinnstillinger, nabokonfigurasjoner, køsdisipliner, kommunikasjonsklassifiseringer og pakkeklassifiseringer.
  • Netlink_w1: Meldingene sendt av 1-Wire Network.
  • Netlink_usersock: Brukes bare av brukermodusgrensesnittprotokollene.
  • Netlink_firewall: Overfør IPv4 -pakkene via brukermodus til NetFilter som brukes av Core Package IP -køen. Siden det ble ansett som unødvendig for en langvarig tid (til fordel for den langt mer sofistikerte NFNetLink -køfunksjonen), blir Netlink Firewall endelig eliminert i Linux 3.5.
  • Netlink_sock_diag: Ber kjernen om detaljer om stikkontaktene som tilhører de forskjellige protokollvariantene.
  • NetLink Crypto: Be om chifferdata ved hjelp av NetLink -grensesnittet både autentisert med kjernen's Encryption API og tillater å sette opp kjernenes kryptografiske API.
  • Netlink_ip6_fw: Overfører IPv6 -rammer via brukermodus til NetFilter. Brukes av kjernekomponenten IP6 -køen.

Grensesnittet netlink er ikke pålitelig. Det gjør alt for å levere informasjonen til de tiltenkte mottakerne. Imidlertid, hvis et lagringsproblem eller noen annen feil oppstår, kan det miste kommunikasjonen. Ved å aktivere NLM F ack -flagget, kan senderen be mottakeren om en bekreftelse for å sikre en pålitelig overføring. NLMSG -feilpakker med feilfeltet satt til 0 er kvitteringer. Anerkjennelser for mottatt meldinger skal produseres av selve programmet.

For hver droppet pakke prøver kjernen å gi en NLMSG -feilrespons. Dette mønsteret bør også følges av brukerprosessene. I alle fall er det vanskelig å overføre dataene fra kjernen til brukeren på en pålitelig måte.

Mens sokkellagringen er fylt, kan ikke kjernen overføre en NetLink-melding fordi informasjonen vil gå tapt og kjernen med sin bruker-rom-operasjon ikke lenger vil dele den samme forestillingen om statusen til kjernen. Appen er ansvarlig for å bestemme når den oppstår som et resultat av enoBUFS -feilen som recvmsg (2) kommer tilbake og synkroniserer.

Eksempel:

Vi vil diskutere et program for å bruke NetLink () -funksjonen for kommunikasjon mellom kjernen og de normale systemene. Først tar vi en titt på brukersiden av dette programmet. For dette må vi legge til hovedkontakten og NetLink -overskriftene i koden for å benytte stikkontaktene i C -programmet sammen med NetLink () -funksjonen, i.e. "stikkontakt.H ”og“ Netlink.h ”.

Etter dette satte vi den maksimale nyttelaststørrelsen til 1024 og setter de definerende strukturene, i.e. SOCKADDR_NL, SRC_ADR, DEST_ADR. Nullstrukturen “nlmshdr” er også definert med “*nl” og iovec -struktur. Main () -funksjonen startes med opprettelsen av en stikkontakt ved hjelp av "socket" -funksjonen. Denne funksjonen inneholder PF_NETLINK -domenenavnet for stikkontakten og SOCK_RAW -sokkeletypen. Netlink_test socket -protokollen er definert i parametrene til sokkelfunksjonen.

Memset () -funksjonen brukes til å peke mot “SRC_ADR” -blokken til strukturminnet der verdien 0 er satt til flere byte som “SRC_ADR” -strukturen inneholder. Ved hjelp av SRC_ADR -strukturen setter vi familien, prosess -ID og grupper av den aktuelle kontakten til henholdsvis AF_NetLink, Self Process ID og 0. I likhet med en TCP/IP -tilkobling, er den etablerte kontakten koblet til en lokal (opprinnelses) tilkobling IP gjennom NetLink Bind () -funksjonen. Memset () -funksjonen brukes igjen til å peke mot “dest_adr” -blokken til strukturminnet der verdien 0 er satt til flere byte som destinasjonsstrukturen inneholder.

Ved hjelp av DEST_ADR -strukturen tildeler vi familien, prosess -ID og grupper for henholdsvis den aktuelle destinasjonssokkelen til af_netlink, 0 prosess -ID og 0 grupper. Ved hjelp av malloc () -funksjonen tilordner vi det dynamiske minnet til å strukturere “nlmshdr” og lagre returresultatet, i.e. lyktes eller ikke. Nullstrukturpekeren “NL” peker mot meldingslengden, prosess -ID og flagg 0 for å fylle NetLink -meldingsoverskriften. StrcPy () -funksjonen er her for å kopiere strengen i "NL" nullpekerstrukturen.


Derfor utgjør kommunikasjonens nyttelast pluss Nlmshdr en NetLink -melding. Når en kommunikasjon mottas, går den inn i bufferen som NL -pekeren peker på. Vi kan også sende inn den oppdaterte meldingen til strukturen MSGHDR “MSG”. "NL" strukturpekeren kan lese meldingen fra kjernen og vise den på skallet via bruk av NLMSG_DATA () -funksjonen.

Til slutt brukes netlink socketbeskrivelsen til å lukke netlink -kontakten.

Innenfor kjerneprogrammet lager vi en nullstruktur “sokk” sammen med pekeren “*nl_sk”. NL_DATA_READY () -funksjonen bruker denne strukturen og litt lengde for å vekke den og gjøre dataene klare etter en søvn. NetLink_Test () -funksjonen er her for å vente på en melding som kommer ned fra brukerområdet til kjernen og skrive ut den. Til slutt frigjør kjerneplassen kontakten.

"Hei du!”Meldingen vises på skjermen vår etter å ha utført dette eksemplet.

Konklusjon

Dette handler om bruk av NetLink () 7-funksjonen til C i våre C-programmene separat for brukerområdet og kjerne-rommet. Vi diskuterte bruken ved å sende en melding fra brukerområdet til det aktuelle kjerneområdet. Denne artikkelenes eksempelsjode kan implementeres på hvilken som helst kompilator.