RTNETLINK - Linux手册页
Linux程序员手册 第7部分
更新日期: 2020-06-09
名称
rtnetlink-Linux IPv4路由套接字
语法
#包括
#包括
#包括
#包括
rtnetlink_socket =套接字(AF_NETLINK,int socket_type,NETLINK_ROUTE);
说明
Rtnetlink允许读取和更改内核的路由表。它在内核中用于在各个子系统之间进行通信(尽管此处未记录此用法),并且用于与用户空间程序进行通信。网络路由,IP地址,链接参数,邻居设置,排队规则,流量类别和数据包分类器都可以通过NETLINK_ROUTE套接字进行控制。它基于netlink消息;有关更多信息,请参见netlink(7)。
Routing attributes
某些rtnetlink消息在初始标头之后具有可选属性:
struct rtattr { unsigned short rta_len; /* Length of option */ unsigned short rta_type; /* Type of option */ /* Data follows */ };
这些属性只能使用RTA_ *宏或libnetlink进行操作,请参见rtnetlink(3)。
Messages
Rtnetlink包含以下消息类型(除了标准的netlink消息):
- RTM_NEWLINK, RTM_DELLINK, RTM_GETLINK
- 创建,删除或获取有关特定网络接口的信息。这些消息包含一个ifinfomsg结构,后跟一系列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包含设备标志,请参见netdevice(7);。 ifi_index是唯一的接口索引(从Linux 3.7开始,可以通过RTM_NEWLINK消息提供非零值,从而创建具有给定ifindex的链接); ifi_change保留供将来使用,应始终设置为0xFFFFFFFF。路由属性 rta_typeValue类型说明 IFLA_UNSPEC-未指定 IFLA_ADDRESS硬件地址接口L2地址 IFLA_BROADCAST硬件地址L2广播地址 IFLA_IFNAMEASCII字符串设备名称 IFLA_MTU设备的未签名intMTU IFLA_LINKint链接类型 IFLA_QDISCasciiz字符串排队规则 IFLA_STATS参见下面的接口统计信息
IFLA_STATS的值类型为struct rtnl_link_stats(在Linux 2.4及更早版本中为struct net_device_stats)。
- RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR
- 添加,删除或接收有关与接口关联的IP地址的信息。在Linux 2.2中,一个接口可以携带多个IP地址,这取代了2.0中的别名设备概念。在Linux 2.2中,这些消息支持IPv4和IPv6地址。它们包含ifaddrmsg结构,还可以选择后面跟随rtattr路由属性。
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是地址族类型(当前为AF_INET或AF_INET6),ifa_prefixlen是为该族定义的地址的地址掩码的长度(如IPv4),ifa_scope是地址范围,ifa_index是接口的接口索引地址与之关联。 ifa_flags是IFA_F_SECONDARY的标志字,用于表示辅助地址(旧别名接口),IFA_F_PERMANENT是用于用户设置的永久地址以及其他未记录的标志。属性 rta_typeValue类型说明 IFA_UNSPEC-未指定 IFA_ADDRESS原始协议地址接口地址 IFA_LOCAL原始协议地址本地地址 接口的IFA_LABELasciiz字符串名称 IFA_BROADCAST原始协议地址广播地址 IFA_ANYCAST原始协议地址任意播地址 IFA_CACHEINFOstruct ifa_cacheinfo地址信息
- RTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE
- 创建,删除或接收有关网络路由的信息。这些消息包含rtmsg结构,其后是rtattr结构的可选序列。对于RTM_GETROUTE,将rtm_dst_len和rtm_src_len设置为0意味着您将获得指定路由表的所有条目。对于其他字段,除了rtm_table和rtm_protocol之外,0是通配符。
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; };
单元格不一致单元格不一致
大于RTPROT_STATIC的值不会由内核解释,它们仅用于用户信息。它们可用于标记路由信息的来源或区分多个路由守护程序。请参阅以获取已分配的路由守护程序标识符。
- rtm_scope
is the distance to the destination:
RT_SCOPE_UNIVERSE global route RT_SCOPE_SITE interior route in the local autonomous system RT_SCOPE_LINK route on this link RT_SCOPE_HOST route on the local host RT_SCOPE_NOWHERE destination doesn't exist 用户可以使用RT_SCOPE_UNIVERSE和RT_SCOPE_SITE之间的值。
- The
rtm_flags
have the following meanings:
RTM_F_NOTIFY if the route changes, notify the user via rtnetlink RTM_F_CLONED route is cloned from another route RTM_F_EQUALIZE a multipath equalizer (not yet implemented) rtm_table指定路由表
RT_TABLE_UNSPEC an unspecified routing table RT_TABLE_DEFAULT the default table RT_TABLE_MAIN the main table RT_TABLE_LOCAL the local table 用户可以在RT_TABLE_UNSPEC和RT_TABLE_DEFAULT之间分配任意值。
单元格不一致
RTA_MULTIPATH包含struct rtnexthop的几个打包实例以及嵌套的RTA(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 */ }
存在许多类似于RTA_ *和NLHDR_ *宏的RTNH_ *宏,可用于处理这些结构。
struct rtvia { unsigned short rtvia_family; unsigned char rtvia_addr[0]; };
rtvia_addr是地址,rtvia_family是其家庭类型。
RTA_PREF可能包含值ICMPV6_ROUTER_PREF_LOW,ICMPV6_ROUTER_PREF_MEDIUM和ICMPV6_ROUTER_PREF_HIGH
RTA_ENCAP_TYPE可以包含在中定义的值LWTUNNEL_ENCAP_MPLS,LWTUNNEL_ENCAP_IP,LWTUNNEL_ENCAP_ILA或LWTUNNEL_ENCAP_IP6。
填写这些值!
- RTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH
- 添加,删除或接收有关邻居表条目(例如ARP条目)的信息。该消息包含ndmsg结构。
struct ndmsg { unsigned char ndm_family; int ndm_ifindex; /* Interface index */ __u16 ndm_state; /* State */ __u8 ndm_flags; /* Flags */ __u8 ndm_type; }; struct nda_cacheinfo { __u32 ndm_confirmed; __u32 ndm_used; __u32 ndm_updated; __u32 ndm_refcnt; };
- ndm_state
is a bit mask of the following states:
NUD_INCOMPLETE a currently resolving cache entry NUD_REACHABLE a confirmed working cache entry NUD_STALE an expired cache entry NUD_DELAY an entry waiting for a timer NUD_PROBE a cache entry that is currently reprobed NUD_FAILED an invalid cache entry NUD_NOARP a device with no destination cache NUD_PERMANENT a static entry 有效的ndm_flags是:
NTF_PROXY a proxy arp entry NTF_ROUTER an IPv6 router rtattr结构对rta_type字段具有以下含义:
NDA_UNSPEC unknown type NDA_DST a neighbor cache n/w layer destination address NDA_LLADDR a neighbor cache link layer address NDA_CACHEINFO cache statistics 如果rta_type字段为NDA_CACHEINFO,则紧随其后的是struct nda_cacheinfo标头
- RTM_NEWRULE, RTM_DELRULE, RTM_GETRULE
- 添加,删除或检索路由规则。进行rtmsg结构
- RTM_NEWQDISC, RTM_DELQDISC, RTM_GETQDISC
- 添加,删除或获得排队规则。该消息包含一个tcmsg结构,并可以跟随一系列属性。
struct tcmsg { unsigned char tcm_family; int tcm_ifindex; /* interface index */ __u32 tcm_handle; /* Qdisc handle */ __u32 tcm_parent; /* Parent qdisc */ __u32 tcm_info; };
单元格不一致
此外,还允许其他各种qdisc-module-specific属性。有关更多信息,请参见相应的包含文件。
- RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS
- 添加,删除或获取流量类别。这些消息包含如上所述的tcmsg结构。
- RTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER
- 添加,删除或接收有关流量过滤器的信息。这些消息包含如上所述的tcmsg结构。
版本
rtnetlink是Linux 2.2的新功能。
BUGS
本手册页不完整。
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。