Scroll to navigation

RTNETLINK(7) Manual do Programador Linux RTNETLINK(7)

NOME

rtnetlink, NETLINK_ROUTE - socket Linux de roteamento IPv4.

SINOPSE

#include <asm/types.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <sys/socket.h>

rtnetlink_socket = socket(PF_NETLINK, int socket_type, NETLINK_ROUTE);

DESCRIÇÃO

Rtnetlink permite que as tabelas de roteamento do kernel sejam lidas e alteradas. É usado dentro do kernel para a comunicação entre vários subsistemas, apesar de que seu uso não é documentado aqui, e para comunicação com programas do espaço do usuário. Rotas de rede, endereços ip, parâmetros de ligação, configurações de vizinhança, disciplinas de filas, classes de tráfego e classificadores de pacotes podem todos ser controlados através de sockets NETLINK_ROUTE. Ele é baseado em mensagens de "netlink", veja netlink(7) para maiores informações.

ATRIBUTOS DE ROTEAMENTO

Algumas mensagens do rnetlink têm atributos opcionais depois do cabeçalho inicial:

struct rtattr
{
	unsigned short	rta_len;	/* Comprimento da opção */
	unsigned short	rta_type;	/* Tipo da opção */
	/* Dados seguem */ 
};

Estes atributos seriam manipulados somente pelo uso de macros RTA_* ou do libnetlink, veja rtnetlink(3).

MENSAGENS

Rtnetlink consiste nos seguintes tipos de mensagens (além das mensagens padrão do netlink):

RTM_NEWLINK, RTM_DELLINK, RTM_GETLINK
Cria, remove ou obtém informações sobre uma interface de rede específica. Essas mensagens contêm uma estrutura ifinfomsg seguida por uma série de estruturas rtattr

struct ifinfomsg
{
	unsigned char	ifi_family;	/* AF_UNSPEC */
	unsigned char	__ifi_pad;	/* não usado */
	unsigned short	ifi_type;	/* tipo de dispositivo */ 
	int	ifi_index;		/* índice da interface */
	unsigned int	ifi_flags;	/* flags do dispositivo  */
	unsigned int	ifi_change;	/* muda a máscara */
};
    

ifi_flags contém as flags do dispositivo, veja netdevice(7); ifi_index é o único índice de interface, ifi_change é reservado para uso futuro e deve sempre ser setado em 0xFFFFFFFF.

Atributos de roteamento
rta_type tipo de valor descrição
IFLA_UNSPEC - não-especificado.
IFLA_ADDRESS endereço de hardware endereço L2 da interface.
IFLA_BROADCAST endereço de hardware endereço de broadcast L2.
IFLA_IFNAME string asciiz Nome do dispositivo.
IFLA_MTU unsigned int MTU do dispositivo.
IFLA_LINK int Tipo de ligação.
IFLA_QDISC string asciiz Disciplina de fila.
IFLA_STATS struct net_device_stats Estatísticas de interface.

RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR
Acrescenta, remove ou recebe informação sobre um endereço IP associado a uma interface. No Linux 2.2, uma interface pode carregar múltiplos endereços IP, isso substitui o conceito de apelido de dispositivo no 2.0. No Linux 2.2, essas mensagens suportam endereços IPv4 e IPv6. Elas contêm uma estrutura ifaddrmsg , opcionalmente seguida pelos atributos de roteamento rtaddr

struct ifaddrmsg
{
	unsigned char	ifa_family;	/* Tipo de endereço */
	unsigned char	ifa_prefixlen;	/* Comprimento de prefixo do endereço */
	unsigned char	ifa_flags;	/* Flags do endereço */
	unsigned char	ifa_scope;	/* Escopo do endereço */
	int	ifa_index;		/* Índice da interface */
};
    

ifa_family é o tipo de família de endereço (correntemente AF_INET ou AF_INET6), ifa_prefixlen é o comprimento da máscara do endereço, se definida para a família (como para o IPv4), ifa_scope é o escopo de endereço, ifa_index é o índice da interface com a qual o endereço está associado. ifa_flags é uma palavra de flag do IFA_F_SECONDARY para endereços secundários (interface dos antigos apelidos), IFA_F_PERMANENT para um endereço permanente setado pelo usuário e outras flags não documentadas.

Atributos
rta_type tipo de valor descrição
IFA_UNSPEC - não especificado.
IFA_ADDRESS endereço de protocolo direto endereço da interface.
IFA_LOCAL endereço de protocolo direto endereço local.
IFA_LABEL string asciiz nome da interface.
IFA_BROADCAST endereço do protocolo direto endereço de broadcast.
IFA_ANYCAST endereço de protocolo direto endereço de anycast.
IFA_CACHEINFO struct ifa_cacheinfo informação de endereço.

RTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE
Cria, remove ou recebe informação sobre uma rota de rede. Essas mensagens contêm uma estrutura rtmsg com uma seqüência opcional de estruturas rtattr a seguir.

struct rtmsg
{
	unsigned char	rtm_family;	/* Família de endereços da rota */
	unsigned char	rtm_dst_len;	/* Comprimento da origem */
	unsigned char	rtm_src_len;	/* Comprimento do destino */ 
	unsigned char	rtm_tos;	/* filtro TOS */
	unsigned char	rtm_table;	/* id da tabela de roteamento */
	unsigned char	rtm_protocol;	/* protocolo de roteamento; veja abaixo */
	unsigned char	rtm_scope;	/* veja abaixo */	
	unsigned char	rtm_type;	/* veja abaixo */
	unsigned int	rtm_flags;	
};
    

rtm_type Tipo de rota
RTN_UNSPEC rota desconhecida
RTN_UNICAST um gateway ou rota direta
RTN_LOCAL uma rota de interface local
RTN_BROADCAST uma rota de broadcast local (enviado como um broadcast)
RTN_ANYCAST uma rota de broadcast local (enviado como um unicast)
RTN_MULTICAST uma rota de multicast
RTN_BLACKHOLE uma rota de perda de pacotes
RTN_UNREACHABLE um destino não alcançável
RTN_PROHIBIT uma rota de rejeição de pacotes
RTN_THROW continua a busca de roteamento em outra tabela
RTN_NAT uma regra de tradução de endereço de rede
RTN_XRESOLVE refere-se a um resolvedor externo (não implementado)

rtm_protocol Origem da rota.
RTPROT_UNSPEC desconhecida
RTPROT_REDIRECT por um redirecionamento de ICMP (não usado correntemente)
RTPROT_KERNEL pelo kernel
RTPROT_BOOT durante a inicialização
RTPROT_STATIC pelo administrador

Valores maiores que RTPROT_STATIC não são interpretados pelo kernel, eles são apenas para informação do usuário. Eles podem ser usados para marcar a origem de uma informação de roteamento ou para distinguir entre múltiplos daemons de roteamento. Veja <linux/rtnetlink.h> para os identificadores de daemons de roteamento que já são atribuídos.

rtm_scope é a distância ao destino:

RT_SCOPE_UNIVERSE rota global
RT_SCOPE_SITE rota interior no sistema autônomo local
RT_SCOPE_LINK rota nesta ligação
RT_SCOPE_HOST rota no host local
RT_SCOPE_NOWHERE destino não existe

Os valores entre RT_SCOPE_UNIVERSE e RT_SCOPE_SITE são disponíveis para o usuário.

O rtm_flags tem os seguintes significados:

RTM_F_NOTIFY se a rota muda, notifica o usuário via rtnetlink
RTM_F_CLONED a rota é clonada a partir de outra rota
RTM_F_EQUALIZE um equalizador de multicast (ainda não implementado)

rtm_table especifica a tabela de roteamento

RT_TABLE_UNSPEC uma tabela de roteamento não especificada
RT_TABLE_DEFAULT a tabela padrão
RT_TABLE_MAIN a tabela principal
RT_TABLE_LOCAL a tabela local

O usuário pode atribuir valores arbitrários entre RT_TABLE_UNSPEC e RT_TABLE_DEFAULT.

Atributos
rta_type tipo de valor descrição
RTA_UNSPEC - ignorado.
RTA_DST endereço do protocolo endereço de destino da rota.
RTA_SRC endereço do protocolo endereço da origem da rota.
RTA_IIF int índice da interface de entrada.
RTA_OIF int índice da interface de saída.
RTA_GATEWAY endereço do protocolo o gateway da rota
RTA_PRIORITY int prioridade da rota.
RTA_PREFSRC
RTA_METRICS int métrica da rota.
RTA_MULTIPATH
RTA_PROTOINFO
RTA_FLOW
RTA_CACHEINFO

Preencha esses valores!

RTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH
Acrescenta, remove ou recebe informação sobre uma entrada de tabela de vizinhança (por exemplo, uma entrada ARP). A mensagem contém uma estrutura ndmsg

struct ndmsg
{
	unsigned char	ndm_family;
	unsigned char	ndm_pad1;
	unsigned short	ndm_pad2;
	int	ndm_ifindex;	/* índice da interface */
	__u16	ndm_state;	/* estado */ 
	__u8	ndm_flags;	/* flags */
	__u8	ndm_type;   
};
struct nda_cacheinfo
{
	__u32	ndm_confirmed;
	__u32	ndm_used;
	__u32	ndm_updated;
	__u32	ndm_refcnt;
};
    

ndm_state é uma máscara de bits dos seguintes estados:

NUD_INCOMPLETE uma entrada de cache resolvendo correntemente
NUD_REACHABLE uma entrada de cache confirmada funcionando
NUD_STALE uma entrada expirada do cache
NUD_DELAY uma entrada aguardando por um temporizador
NUD_PROBE uma entrada de cache que é retestada atualmente
NUD_FAILED uma entrada de cache inválida
NUD_NOARP um dispositivo sem cache de destino
NUD_PERMANENT uma entrada estática

Os ndm_flags válidos são:

NTF_PROXY uma entrada de arp do proxy
NTF_ROUTER um roteador IPv6

documenta melhor os membros da estrutura

A estrutura rtaddr tem os seguintes significados para o campo rta_type :

NDA_UNSPEC tipo desconhecido
NDA_DST um endereço de destino vizinho da camada de rede do cache
NDA_LLADDR um endereço vizinho da camada de ligação do cache
NDA_CACHEINFO estatísticas do cache

Se o campo rta_type é NDA_CACHEINFO , então segue o cabeçalho struct nda_cacheinfo

RTM_NEWRULE, RTM_DELRULE, RTM_GETRULE
Acrescenta, apaga ou recupera uma regra de roteamento. Carrega um struct rtmsg

RTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC
Acrescenta, remove ou obtém uma disciplina de fila. A mensagem contém um struct tcmsg e pode ser seguida por uma série de atributos.

struct tcmsg
{
	unsigned char	tcm_family;
	unsigned char	tcm__pad1;
	unsigned short	tcm__pad2;
	int	tcm_ifindex;	/* índice de interface */
	__u32	tcm_handle;	/* manipula Qdisc */ 
	__u32	tcm_parent;	/* qdisc pai */
	__u32	tcm_info;
};
    

Atributos
rta_type tipo de valor Descrição
TCA_UNSPEC - não especificado.
TCA_KIND string asciiz nome da disciplina de fila.
TCA_OPTIONS seqüência de bytes seguem as opções específicas do qdisc.
TCA_STATS struct tc_stats estatísticas do qdisc.
TCA_XSTATS qdisc specific estatísticas específicas do módulo.
TCA_RATE struct tc_estimator limite de taxa.

Além desses, são permitidos vários outros atributos específicos de módulos qdisc. Para maiores informações, veja os arquivos de inclusão apropriados.

RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS
Acrescenta, remove ou obtém uma classe de tráfego. Essas mensagens contêm um struct tcmsg como descrito acima.

RTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER
Acrescenta, remove ou recebe informações sobre um filtro de tráfego. Essas mensagens contém um struct tcmsg como descrito acima.

VERSÕES

rtnetlink é uma nova implementação do Linux 2.2.

BUGS

Este página de manual é falha e imcompleta.

VEJA TAMBÉM

netlink(7), cmsg(3), ip(7), rtnetlink(3)

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)
30/04/1999 Página do Manual Linux