NetLink 7 C função

NetLink 7 C função
As tarefas do espaço do usuário, assim como o kernel, se comunicam através do NetLink. É composto por uma API interna do kernel para os plug-ins do núcleo e uma interface de tarefa de espaço de soquetes comuns centrada. Neste artigo instrucional, a interface principal do kernel não é descrita. Além disso, existe de fato uma interface NetLink desatualizada acessível através dos periféricos de caracteres NetLink. Esta interface não é descrita aqui e está incluída apenas para compatibilidade com versões anteriores. Datagramas são o foco do serviço do netlink. Existem duas opções aceitáveis ​​para o estilo de soquete: Sock_raw e Sock_dgram. A interface NetLink, enquanto isso, de alguma forma não diferencia entre os datagramas e os soquetes crus.

Famílias NetLink

O clã NetLink determina o pacote do kernel ou o conjunto de netlink para usar para comunicação. As famílias NetLink existentes designadas são as seguintes:

  • Netlink_route: Ele aceita o roteamento e as atualizações de conexão que podem ser usadas para alterar os IPs, configurações de link, configurações de vizinhos, disciplinas de fila, classificações de comunicação e classificações de pacotes.
  • Netlink_w1: As mensagens enviadas pela rede de 1 fio.
  • Netlink_usersock: Usado apenas pelos protocolos de interface do modo de usuário.
  • Netlink_firewall: Transfira os pacotes IPv4 através do modo de usuário para o Netfilter que está sendo usado pela fila IP do pacote principal. Desde que foi considerado desnecessário por uma duração prolongada (a favor da função da fila NFNetLink muito mais sofisticada), o firewall do NetLink é finalmente eliminado no Linux 3.5.
  • Netlink_sock_diag: Pede ao núcleo detalhes sobre os soquetes pertencentes às diferentes variantes de protocolo.
  • NetLink Crypto: Solicitando dados de cifra usando a interface NetLink Ambos autenticados com a API de criptografia do kernel e permite a configuração da API criptográfica do kernel.
  • Netlink_ip6_fw: Transfere quadros IPv6 via modo de usuário para Netfilter. Utilizado pelo componente do kernel na fila.

A interface netlink não é confiável. Faz todos os esforços para entregar as informações aos destinatários pretendidos. No entanto, se surgir um problema de armazenamento ou qualquer outro erro, pode perder as comunicações. Ao ativar a bandeira NLM F ACK, o transmissor pode pedir ao destinatário uma afirmação para garantir uma transmissão confiável. Pacotes de erro nlmsg com o campo de falha definido como 0 são reconhecimentos. Os agradecimentos por mensagens recebidas devem ser produzidas pelo próprio programa.

Para cada pacote caído, o kernel tenta dar uma resposta de erro NLMSG. Esse padrão também deve ser seguido pelos processos do usuário. De qualquer forma, é difícil transmitir os dados do kernel ao usuário de maneira confiável.

Considerando que, se o armazenamento do soquete for preenchido, o kernel não poderá transmitir uma mensagem de NetLink porque as informações serão perdidas e o núcleo com sua operação no espaço do usuário não compartilharia mais a mesma noção do status do núcleo. O aplicativo é responsável por determinar quando ocorre como resultado da falha do Enobufs que recupera (2) retorna e ressincroniza.

Exemplo:

Discutiremos um programa para usar a função netlink () para comunicação entre o kernel e os sistemas normais. Primeiro, damos uma olhada no lado do usuário deste programa. Para isso, temos que adicionar o soquete principal e os cabeçalhos do NetLink no código para fazer uso dos soquetes no programa C, juntamente com a função netlink (), i.e. “Soquete.H "e" NetLink.h ".

Depois disso, definimos o tamanho máximo da carga útil para 1024 e definimos as estruturas definidoras, eu.e. Sockaddr_nl, src_adr, dest_adr. A estrutura nula “NLMSGHDR” também é definida com “*nl” e estrutura iovec. A função principal () é iniciada com a criação de um soquete usando a função "soquete". Esta função contém o nome de domínio PF_NETLink para o soquete e o tipo de soquete Sock_raw. O protocolo de soquete netlink_test é definido nos parâmetros da função de soquete.

A função memset () é usada para apontar para o bloco "src_adr" da memória da estrutura, onde o valor 0 é definido para vários bytes que a estrutura "src_adr" contém. Usando a estrutura SRC_ADR, definimos a família, o ID do processo e os grupos do soquete específico para AF_NETLINK, ID do auto -processo e 0, respectivamente. Semelhante a uma conexão TCP/IP, o soquete estabelecido está vinculado a uma conexão local (origem) IP através da função NetLink Bind (). A função MEMSET () é novamente usada para apontar para o bloco "Dest_adr" da memória da estrutura, onde o valor 0 é definido para vários bytes que a estrutura de destino contém.

Usando a estrutura Dest_adr, atribuímos a família, o ID do processo e os grupos para o soquete de destino específico para AF_NETLINK, 0 ID do processo e 0 grupos, respectivamente. Usando a função malloc (), atribuímos a memória dinâmica para estruturar "nlmsghdr" e salvar o resultado de retorno, i i.e. conseguiu ou não. O ponteiro da estrutura nula “NL” aponta para o comprimento da mensagem, ID do processo e sinalizador 0 para preencher o cabeçalho da mensagem do NetLink. A função strcpy () está aqui para copiar a string dentro da estrutura do ponteiro nulo "nl".


Portanto, a carga útil da comunicação mais nlmsghdr compõe uma mensagem de netlink. Quando uma comunicação é recebida, ele entra no buffer que o ponteiro da NL está apontando. Também podemos enviar a mensagem atualizada para a estrutura MSGHDR "MSG". O ponteiro da estrutura “NL” pode ler a mensagem do kernel e exibi -lo no shell através do uso da função nlmsg_data ().

Por fim, o descritor de soquete NetLink é usado para fechar o soquete NetLink.

Dentro do espaço do programa do kernel, criamos uma estrutura nula "Socha" junto com seu ponteiro "*nl_sk". A função nl_data_ready () usa essa estrutura e algum comprimento para acordá -la e preparar os dados após um sono. A função netlink_test () está aqui para esperar uma mensagem que desce do espaço do usuário para o kernel e impede -a. No final, o espaço do kernel libera o soquete.

O “olá você!”A mensagem é exibida em nossa tela depois de executar este exemplo.

Conclusão

Trata-se do uso da função NetLink () 7 de C em nossos programas C separadamente para o espaço do usuário e o espaço do kernel. Discutimos seus usos enviando uma mensagem do espaço do usuário para o espaço do kernel relevante. O código de exemplo deste artigo pode ser implementado em qualquer compilador.