NETLINK(7) | Manual do Programador Linux | NETLINK(7) |
NOME¶
netlink, PF_NETLINK - Comunicação entre o kernel e o usuário.SINOPSE¶
#include <asm/types.h>
#include <sys/socket.h>
#include <linux/netlink.h>
netlink_socket = socket(PF_NETLINK, socket_type, netlink_family);
DESCRIPTION¶
Netlink é usado para transferir informação entre módulos do kernel e processos do espaço do usuário. Consiste de uma interface padrão baseada em sockets, para processos de usuário e uma API interna do kernel para módulos. A interface interna do kernel não é documentada nesta página do manual. Há também uma interface netlink obsoleta, via dispositivos de caracteres netlink, esta interface não é documentada aqui e só é fornecida para retro-compatibilidade.Netlink é um serviço orientado a datagrama. Tanto SOCK_RAW quanto SOCK_DGRAM são valores válidos para socket_type; porém, o protocolo netlink não distingue entre datagramas e sockets diretos.
netlink_family seleciona o módulo do kernel ou grupo de netlink para se comunicar. As famílias de netlink atribuídas atualmente são:
- NETLINK_ROUTE
- Recebe atualizações de roteamento e pode ser usado para modificar a tabela de roteamento IPv4 (veja rtnetlink(7)).
- NETLINK_FIREWALL
- Recebe pacotes enviados pelo código do firewall IPv4.
- NETLINK_ARPD
- Para gerenciamento da tabela arp no espaço do usuário.
- NETLINK_ROUTE6
- Recebe e envia atualizações da tabela de roteamento IPv6.
- NETLINK_IP6_FW
- recebe pacotes que falharam nas checagens do firewall IPv6 (não implementado correntemente).
- NETLINK_TAPBASE...NETLINK_TAPBASE+15
- são as instâncias do dispositivo ethertap. Ethertap é um pseudo-dispositivo de túnel de rede que permite a um driver ethernet ser simulado a partir do espaço do usuário.
- NETLINK_SKIP
- Reservado para ENskip.
- NETLINK_USERSOCK
- é reservado para futuros protocolos do espaço do usuário.
Mensagens do netlink consistem de uma seqüência de bytes com um ou vários cabeçalhos nlmsghdr , e "payload" associado. Para mensagens multipartes, o primeiro cabeçalho e todos os seguintes têm o sinalizador NLM_F_MULTI setado, exceto pelo último cabeçalho, que tem o tipo NLMSG_DONE. A seqüência de bytes deveria ser acessada somente com as macros NLMSG_* padrões, veja netlink(3).
Netlink não é um protocolo confiável. Ele tenta fazer o melhor para entregar uma mensagem a seu(s) destinatário(s), mas pode perder mensagens quando ocorre uma condição de falta de memória, ou outra. Para transferência segura, o remetente pode requerer um reconhecimento do receptor, através da configuração do sinalizador NLM_F_ACK. Um reconhecimento é um pacote NLMSG_ERROR com o campo de erro setado para 0. A aplicação deve gerar acks para as próprias mensagens recebidas. O kernel tenta enviar uma mensagem NLMSG_ERROR para todos os pacotes falhos. Um processo de usuário também deveria seguir esta convenção.
Cada família de netlink tem um conjunto de 32 grupos de multicast. Quando bind(2) é chamado no socket, o campo nl_groups no sockaddr_nl deveria ser setado para uma máscara de bits do grupo que ele deseja ouvir. O valor padrão para este campo é zero, o que significa que nenhum multicast será reebido. Um socket podem realizar o multicast de mensagens para qualquer um dos grupos de multicast, através da configuração de nl_groups para uma máscara de bits dos grupos para os quais ele deseja enviar, quando ele chama sendmsg(2) ou executa um connect(2). Somente usuários com uid efetivo igual a 0 ou a capabilidade CAP_NET_ADMIN podem enviar ou escutar um grupo de multicast netlink. Qualquer resposta a uma mensagem recebida de um grupo de multicast deveria ser enviada de volta ao pid remetente e ao grupo de multicast.
struct nlmsghdr { __u32 nlmsg_len; /* Comprimento da mensagem incluindo cabeçalho */ __u16 nlmsg_type; /* Conteúdo da mensagem */ __u16 nlmsg_flags; /* Flags adicionais */ __u32 nlmsg_seq; /* Número de seqüência */ __u32 nlmsg_pid; /* PID de envio de processo */ }; struct nlmsgerr { int error; /* errno negativo, ou 0 para acks. */ struct nlmsghdr msg; /* cabeçalho da mensagem que causou o erro */ };
Depois de cada nlmsghdr o "payload" se segue. nlmsg_type pode ser um dos tipos de mensagem padrão: NLMSG_NOOP mensagem deve ser ignorada, NLMSG_ERROR a mensagem sinaliza um erro e o "payload" contém uma estrutura nlmsgerr , NLMSG_DONE mensagem encerra uma mensagem multiparte,
Uma família netlink geralmente especifica mais tipos de mensagem, veja a página de manual apropriada para isso, por exemplo rtnetlink(7) para NETLINK_ROUTE.
Bits de Flag Padrão em nlmsg_flags | |
NLM_F_REQUEST | setado em todas as mensagens de pedido |
NLM_F_MULTI | a mensagem é parte de uma mensagem multipart terminada por NLMSG_DONE . |
NLM_F_ACK | responde com um reconhecimento se bem-sucedido |
NLM_F_ECHO | ecoa este pedido |
Bits adicionais de flag para pedidos GET | |
NLM_F_ROOT | Retorna a tabela completa em vez de uma entrada única. |
NLM_F_MATCH | Ainda não implementado. |
NLM_F_ATOMIC | Retorna um snapshot atômico da tabela. |
NLM_F_DUMP | Ainda não documentado. |
Bits adicionais de flag para pedidos NEW | |
NLM_F_REPLACE | Sobrepõe objeto existente. |
NLM_F_EXCL | Não substitui se o objeto já existe. |
NLM_F_CREATE | Cria objeto se ele ainda não existe. |
NLM_F_APPEND | Acrescenta ao fim da lista de objetos. |
Note que NLM_F_ATOMIC requer CAP_NET_ADMIN ou direitos de super usuário.
FORMATOS DE ENDEREÇO¶
A estrutura sockaddr_nl descreve um cliente netlink no espaço do usuário no kernel. Um sockaddr_nl pode ser unicast (somente envia para um peer) ou enviar para grupos de netlink (nl_groups diferente de 0).struct sockaddr_nl { sa_family_t nl_family; /* AF_NETLINK */ unsigned short nl_pad; /* zero */ pid_t nl_pid; /* pid do processo */ __u32 nl_groups; /* máscara dos grupos de multicast */ };
nl_pid é o pid do netlink do espaço do usuário, ou 0 se o destino está no kernel. nl_groups é uma máscara de bits, com cada bit representando um número de grupo de netlink.
PROBLEMAS¶
Esta página de manual não está completa.NOTAS¶
Freqüentemente é melhor usar netlink via libnetlink do que via interface de kernel de baixo nível.VERSÕES¶
A interface de socket para netlink é uma realização nova no Linux 2.2O Linux 2.0 suporta uma interface netlink baseada em um dispositivo mais primitivo (que ainda está disponível como uma opção de compatibilidade). Esta interface obsoleta não é descrita aqui.
VEJA TAMBÉM¶
cmsg(3), rtnetlink(7), netlink(3).ftp://ftp.inr.ac.ru/ip-routing/iproute2* para libnetlink
TRADUZIDO POR LDP-BR em 21/08/2000.¶
Rubens de Jesus Nogueira <darkseid99@usa.net> (tradução) André L. Fassone Canova <lonelywolf@blv.com.br> (revisão)27/04/1999 | Página de Manual do Linux |