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)