Provided by:
manpages-pt_20040726-2_all 
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.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)