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.
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.
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; |
};
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:
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_table especifica a tabela de roteamento
O usuário pode atribuir valores arbitrários entre RT_TABLE_UNSPEC e RT_TABLE_DEFAULT.
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:
Os ndm_flags válidos são:
documenta melhor os membros da estrutura
A estrutura rtaddr tem os seguintes significados para o campo rta_type :
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; |
};
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 [AT] usa.net> (tradução) André L. Fassone Canova <lonelywolf [AT] blv.br> (revisão)