rtnetlink - Linux routing socket
#include <asm/types.h>
#include <linux/if_link.h>
#include <linux/netlink.h>
#include <linux/rtnetlink.h>
#include <sys/socket.h>
rtnetlink_socket = socket(AF_NETLINK, int socket_type, NETLINK_ROUTE);
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)EN para maiores informações.
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 */
/* Seguem os Dados */
};
Estes atributos seriam manipulados somente pelo uso de macros RTA_* ou do libnetlink, veja rtnetlink(3)EN.
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 short ifi_type; /* Device type */
int ifi_index; /* Interface index */
unsigned int ifi_flags; /* Device flags */
unsigned int ifi_change; /* change mask */
};
- ifi_flags contains the device flags, see netdevice(7)EN; ifi_index is the unique interface index (since Linux 3.7, it is possible to feed a nonzero value with the RTM_NEWLINK message, thus creating a link with the given ifindex); ifi_change is reserved for future use and should be always set to 0xFFFFFFFF.
| Atributos de roteamento |
| rta_type | Tipo de valor | Descrição |
| IFLA_UNSPEC | - | não-especificado |
| IFLA_ADDRESS | ender. de hardware | interface L2 address |
| IFLA_BROADCAST | ender. de hardware | L2 broadcast address |
| IFLA_IFNAME | cadeia asciiz | Nome do dispos. |
| IFLA_MTU | int. sem sinal | MTU do dispos. |
| IFLA_LINK | int | Tipo de ligação |
| IFLA_QDISC | cadeia asciiz | Disciplina de fila |
| IFLA_STATS | see below | Interface Statistics |
- The value type for IFLA_STATS is struct rtnl_link_stats (struct net_device_stats in Linux 2.4 and earlier).
- 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 Linux 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; /* Address type */
unsigned char ifa_prefixlen; /* Prefixlength of address */
unsigned char ifa_flags; /* Address flags */
unsigned char ifa_scope; /* Address scope */
unsigned int ifa_index; /* Interface index */
};
- ifa_family is the address family type (currently AF_INET or AF_INET6), ifa_prefixlen is the length of the address mask of the address if defined for the family (like for IPv4), ifa_scope is the address scope, ifa_index is the interface index of the interface the address is associated with. ifa_flags is a flag word of IFA_F_SECONDARY for secondary address (old alias interface), IFA_F_PERMANENT for a permanent address set by the user and other undocumented flags.
| Atributos |
| rta_type | Tipo de valor | Descrição |
| IFA_UNSPEC | - | não-especificado |
| IFA_ADDRESS | ender. de protocolo direto | ender. da interface |
| IFA_LOCAL | ender. de protocolo direto | ender. local |
| IFA_LABEL | cadeia asciiz | nome da interface |
| IFA_BROADCAST | ender. de protocolo direto | Ender. de broadcast |
| IFA_ANYCAST | ender. de protocolo direto | ender. de anycast |
| IFA_CACHEINFO | struct ifa_cacheinfo | Informação de ender. |
- 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. Selecionando RTM_GETROUTE, rtm_dst_len e rtm_src_len para 0 significa que você obtém todas as entradas para a tabela de roteamento especificada. Para os outros campos, exceto rtm_table e rtm_protocol 0 é um caractere coringa.
-
struct rtmsg {
unsigned char rtm_family; /* Address family of route */
unsigned char rtm_dst_len; /* Length of destination */
unsigned char rtm_src_len; /* Length of source */
unsigned char rtm_tos; /* TOS filter */
unsigned char rtm_table; /* Routing table ID;
see RTA_TABLE below */
unsigned char rtm_protocol; /* Routing protocol; see below */
unsigned char rtm_scope; /* See below */
unsigned char rtm_type; /* See below */
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 atualmente) |
| 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 | a multipath equalizer (not yet implemented) |
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 | ender. do protocolo | Ender. de destino da rota |
| RTA_SRC | ender. do protocolo | Ender. da origem da rota |
| RTA_IIF | int | Input interface index |
| RTA_OIF | int | Output interface index |
| RTA_GATEWAY | ender. do protocolo | o gateway da rota |
| RTA_PRIORITY | int | Prioridade da rota |
| RTA_PREFSRC | ender. do protocolo | Preferred source address |
| RTA_METRICS | int | métrica da rota |
| RTA_MULTIPATH | | Multipath nexthop data br (see below). |
| RTA_PROTOINFO | | No longer used |
| RTA_FLOW | int | Route realm |
| RTA_CACHEINFO | struct rta_cacheinfo | (veja também linux/rtnetlink.h) |
| RTA_SESSION | | No longer used |
| RTA_MP_ALGO | | No longer used |
| RTA_TABLE | int | Routing table ID; if set, rtm_table é ignorado |
| RTA_MARK | int |
| RTA_MFC_STATS | struct rta_mfc_stats | (veja também linux/rtnetlink.h) |
| RTA_VIA | struct rtvia | Gateway in different AF (see below) |
| RTA_NEWDST | ender. do protocolo | Change packet destination address |
| RTA_PREF | char | RFC4191 IPv6 router preference (see below) |
| RTA_ENCAP_TYPE | short | Encapsulation type for lwtunnels (see below) |
| RTA_ENCAP | | Defined by RTA_ENCAP_TYPE |
| RTA_EXPIRES | int | Expire time for IPv6 routes (in seconds) |
- RTA_MULTIPATH contains several packed instances of struct rtnexthop together with nested RTAs (RTA_GATEWAY):
-
struct rtnexthop {
unsigned short rtnh_len; /* Length of struct + length
of RTAs */
unsigned char rtnh_flags; /* Flags (see
linux/rtnetlink.h) */
unsigned char rtnh_hops; /* Nexthop priority */
int rtnh_ifindex; /* Interface index for this
nexthop */
}
- There exist a bunch of RTNH_* macros similar to RTA_* and NLHDR_* macros useful to handle these structures.
-
struct rtvia {
unsigned short rtvia_family;
unsigned char rtvia_addr[0];
};
- rtvia_addr is the address, rtvia_family is its family type.
- RTA_PREF may contain values ICMPV6_ROUTER_PREF_LOW, ICMPV6_ROUTER_PREF_MEDIUM, and ICMPV6_ROUTER_PREF_HIGH defined incw <linux/icmpv6.h>.
- RTA_ENCAP_TYPE may contain values LWTUNNEL_ENCAP_MPLS, LWTUNNEL_ENCAP_IP, LWTUNNEL_ENCAP_ILA, or LWTUNNEL_ENCAP_IP6 defined in <linux/lwtunnel.h>.
- 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;
int ndm_ifindex; /* índice da interface */
__u16 ndm_state; /* estado */
__u8 ndm_flags; /* sinalizadores */
__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 atualmente resolvida de 'cache' |
| NUD_REACHABLE | uma entrada confirmada de 'cache' 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 |
A estrutura rtaddr tem os seguintes significados para o campo rta_type:
| NDA_UNSPEC | tipo desconhecido |
| NDA_DST | a neighbor cache n/w layer destination address |
| NDA_LLADDR | ender. 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;
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 | cadeia asciiz | nome da disciplina de fila |
| TCA_OPTIONS | seqüência de bytes | Opções específicas do qdisc |
| TCA_STATS | struct tc_stats | Estatísticas do qdisc |
| TCA_XSTATS | qdisc-specific | Module-specific statistics |
| 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.
rtnetlink é uma nova implementação do Linux 2.2.
Este página de manual é imcompleta.
A tradução para português brasileiro desta página man foi criada por Rubens de Jesus Nogueira <darkseid99@usa.net> e André Luiz Fassone <lonely_wolf@ig.com.br>
Esta tradução é uma documentação livre; leia a Licença Pública Geral GNU Versão 3 ou posterior para as condições de direitos autorais. Nenhuma responsabilidade é aceita.
Se você encontrar algum erro na tradução desta página de manual, envie um e-mail para a lista de discussão de tradutores.