Manpages

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.

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 [AT] usa.net> (tradução) André L. Fassone Canova <lonelywolf [AT] blv.br> (revisão)