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)