RTNETLINK - Linux手册页

时间:2019-08-20 18:02:01  来源:igfitidea点击:

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_UNIVERSEglobal route
RT_SCOPE_SITEinterior route in the local autonomous system
RT_SCOPE_LINKroute on this link
RT_SCOPE_HOSTroute on the local host
RT_SCOPE_NOWHEREdestination doesn't exist

用户可以使用RT_SCOPE_UNIVERSE和RT_SCOPE_SITE之间的值。

The rtm_flags

have the following meanings:

RTM_F_NOTIFYif the route changes, notify the user via rtnetlink
RTM_F_CLONEDroute is cloned from another route
RTM_F_EQUALIZEa multipath equalizer (not yet implemented)

rtm_table指定路由表

RT_TABLE_UNSPECan unspecified routing table
RT_TABLE_DEFAULTthe default table
RT_TABLE_MAINthe main table
RT_TABLE_LOCALthe 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_INCOMPLETEa currently resolving cache entry
NUD_REACHABLEa confirmed working cache entry
NUD_STALEan expired cache entry
NUD_DELAYan entry waiting for a timer
NUD_PROBEa cache entry that is currently reprobed
NUD_FAILEDan invalid cache entry
NUD_NOARPa device with no destination cache
NUD_PERMANENTa static entry

有效的ndm_flags是:

NTF_PROXYa proxy arp entry
NTF_ROUTERan IPv6 router

rtattr结构对rta_type字段具有以下含义:

NDA_UNSPECunknown type
NDA_DSTa neighbor cache n/w layer destination address
NDA_LLADDRa neighbor cache link layer address
NDA_CACHEINFOcache 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

本手册页不完整。

另外参见

cmsg(3),rtnetlink(3),ip(7),netlink(7)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/