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.
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.2
O 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)