Rtnetlink描述
针对路由控制的netlink接口,Linux IPv4 routing sockets
Rtnetlink基于netlink,允许对内核的路由表进行读写。主要用来进行内核与用户空间的通信以及内核中子系统间的通信。Rtnetlink是Linux2.2及其以后的版本中的一个新的特征。
Rtnetlink消息在初始头后可以有一些属性。结构:
struct
{
unsignedshort rta_len; //属性的长度
unsignedshort rta_type; //属性类型
/*属性数据跟随在这个结构之后*/
}
这些属性用RTA_*宏或者libnetlink来进行修改。
RTA_*宏:
#define RTA_ALIGNTO 4
#define RTA_ALIGN(len)( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) ) /*对齐*/
#defineRTA_OK(rta,len) ((len) >= (int)sizeof(struct rtattr) && \
(rta)->rta_len >= sizeof(struct rtattr)&& \
(rta)->rta_len <= (len)) /*判断长度是否有len长*/
#define RTA_NEXT(rta,attrlen) ((attrlen) -= RTA_ALIGN((rta)->rta_len),\
(struct rtattr*)(((char*)(rta)) +RTA_ALIGN((rta)->rta_len))) /*下一个的首地址*/
#define RTA_LENGTH(len) (RTA_ALIGN(sizeof(struct rtattr)) + (len)) /*计算总长度*/
#define RTA_SPACE(len) RTA_ALIGN(RTA_LENGTH(len)) /*返回数据的对齐的最小数值*/
#define RTA_DATA(rta) ((void*)(((char*)(rta)) + RTA_LENGTH(0))) /*取得数据部分首地址*/
#define RTA_PAYLOAD(rta)((int)((rta)->rta_len) - RTA_LENGTH(0)) /*payload总长度*/
除了标准的netlink消息外,rtnetlink主要由以下的消息类型组成:
1、RTM_NEWLINK, RTM_DELLINK, RTM_GETLINK 创建,删除或者获取网络设备的信息
这些消息包含一个ifinfomsg结构以及多个rtattr结构。
structifinfomsg
{
unsigned char ifi_family;//接口的地址类型,IPv6时为AF_INET6,否则AF_UNSPEC
unsigned char __ifi_pad;
unsigned short ifi_type; //通常设为ARPHRD_EHTER
int ifi_index;//接口的ID号,只与接口相关,与接口的名字无关
unsigned int ifi_flags;
unsigned int ifi_change;//保留,通常设置成0xffffffff
}
ifi_type代表硬件设备的类型:
ARPHRD_ETHER 10M以太网
ARPHRD_PPP PPP拨号
ARPHRDLOOPBACK 环路设备
ifi_flags包含设备的一些标志:
IFF_UP 接口正在运行
IFF_BROADCAST 有效的广播地址集
IFF_DEBUG 内部调试标志
IFF_LOOPBACK 这是自环接口
IFF_POINTOPOINT 这是点到点的链路设备
IFF_RUNNING 资源已分配
IFF_NOARP 无arp协议,没有设置第二层目的地址
IFF_PROMISC 接口为杂凑(promiscuous)模式
IFF_NOTRAILERS 避免使用trailer
IFF_ALLMULTI 接收所有组播(multicast)报文
IFF_MASTER 主负载平衡群(bundle)
IFF_SLAVE 从负载平衡群(bundle)
IFF_MULTICAST 支持组播(multicast)
IFF_PORTSEL 可以通过ifmap选择介质(media)类型
IFF_AUTOMEDIA 自动选择介质
IFF_DYNAMIC 接口关闭时丢弃地址
ifinfo数据结构后跟可选择数量的属性rtattr,其中的rta_type可能为:
IFLA_UNSPEC 0
IFLA_ADDRESS 1 硬件MAC地址
IFLA_BROADCAST 2 硬件MAC广播地址
IFLA_IFNAME 3 接口名称
IFLA_MTU 4 最大传输单元
IFLA_LINK 5 连接类型
IFLA_QDISC 6 队列规则
IFLA_STATS 7 接口统计
IFLA_COST 8
IFLA_PRIORITY 9
IFLA_MASTER 10
IFLA_WIRELESS 11 /* Wireless Extension event - seewireless.h */
IFLA_PROTINFO 12 /* Protocol specific information for alink */
IFLA_TXQLEN 13
IFLA_MAP 14
IFLA_WEIGHT 15
IFLA_OPERSTATE 16
IFLA_LINKMODE 17
2、RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR 创建,删除或者获取网络设备的IP信息
这些消息包括一个ifaddrmsg结构以及多个rtaddr结构
structifaddrmsg
{
unsigned char ifa_family; /*地址类型,AF_INET或AF_INET6*/
unsigned char ifa_prefixlen; /*Prefixlength of the address*/
unsigned char ifa_flags; /*Address flags*/
unsigned char ifa_scope; /*Address scope*/
int ifa_index; /*Interfaceindex*/
}
ifa_flags:
IFA_F_SECONDARY 0x10
IFA_F_TEMPORARY 0x10
IFA_F_DEPRECATED 0x20
IFA_F_TENTATIVE 0x40
IFA_F_PERMANENT 0x80
这样的情况下,rta_type的可能取值:
IFA_UNSPEC 0
IFA_ADDRESS 1 接口地址interface address
IFA_LOCAL 2 本地地址localaddress
IFA_LABEL 3 接口名称nameof the interface
IFA_BROADCAST 4 广播地址broadcast address
IFA_ANYCAST 5 anycastaddress
IFA_CACHEINFO 6 addressinformation
IFA_MULTICAST 7
3、RTM_NEWROUTE, RTM_DELROUTE, RTM_GETROUTE 创建,删除或者获取网络设备的路由信息
这些消息包含一个rtmsg结构,其后跟数目可选的rtattr结构。
对于RTM_GETROUTE,设置rtm_dst_len以及rtm_src_len为0表示获取指定路由表的所有条目(entries)。其它的成员,除了rtm_table、rtm_protocol,0是通配符。
struct rtmsg
{
unsigned char rtm_family; /*路由地址族*/
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*/
unsigned char rtm_protocol; /*路由协议*/
unsigned char rtm_scope;
unsigned char rtm_type;
unsigned int rtm_flags;
}
rtm_type有以下几种取值:
RTN_UNSPEC 0 未知的路由
RTN_UNICAST 1 网管或者直接路由
RTN_LOCAL 2 本地接收
RTN_BROADCAST 3 广播式本地接收、发送
RTN_ANYCAST 4 本地广播接收,单播发送
RTN_MULTICAST 5 多播路由
RTN_BLACKHOLE 6 丢弃
RTN_UNREACHABLE 7 目标不可达
RTN_PROHIBIT 8 管理禁止
RTN_THROW 9 不在此表中
RTN_NAT 10 Translate this address
RTN_XRESOLVE 11 Useexternal resolver
rtm_protocol的取值:
RTPROT_UNSPEC 0 未知的路由来源
RTPROT_REDIRECT 1 通过ICMP转发建立路由(目前未使用)
RTPROT_KERNEL 2 内核转发建立路由
RTPROT_BOOT 3 该路由在系统启动时建立
RTPROT_STATIC 4 该路由由系统管理员建立
大于RTPROT_STATIC的值不被内核识别(interpreted),而是用作用户信息。
rtm_scope为到目的的范围:
RT_SCOPE_UNIVERSE 0 用户定义值
RT_SCOPE_SITE 200
RT_SCOPE_LINK 253 目的地址
RT_SCOPE_HOST 254 本地地址
RT_SCOPE_NOWHERE 255 为不存在destination预留
取值在RT_SCOPE_UNIVERSE和RT_SCOPE_SITE之间的为用户可用。
rtm_flags的值及含义:
RTM_F_NORIFY 0x100 通知用户路由改变
RTM_F_CLONED 0x200 该路由为克隆的(cloned)
RTM_F_EQUALIZE 0x400 Multipath equalizer:NI
RTM_F_PREFIX 0x800 Prefix addresses
rtm_table用于区别路由表:
RT_TABLE_UNSPEC 0 未指定的路由表
RT_TABLE_DEFAULT 253 默认的表(default table)
RT_TABLE_MAIN 254 主表(main table)
RT_TABLE_LOCAL 255 本地表(local table)
此时对应的rta_type的可能取值:
RTA_UNSPEC 0
RTA_DST 1 路由目的地址
RTA_SRC 2 路由源地址
RTA_IIF 3 Input interface index
RTA_OIF 4 Output interface index
RTA_GATEWAY 5 路由网关
RTA_PRIORITY 6 路由的优先级
RTA_PREFSRC 7
RTA_METRICS 8 Route metrics
RTA_MULTIPATH 9
RTA_PROTOINFO 10
RTA_FLOW 11
RTA_CACHEINFO 12
RTA_SESSION 13
RTA_MP_ALGO 14
4、RTM_NEWNEIGH, RTM_DELNEIGH, RTM_GETNEIGH 创建,删除或者获取网络设备的相邻信息
包含一个ndmsg结构:
struct ndmsg
{
unsigned char ndm_family;
int ndm_ifindex; /*接口索引Interfaceindex*/
__u16 ndm_state;
__u8 ndm_flags;
__u8 ndm_type;
}
ndm_state的取值为以下情况的位掩码(bitmask):
NUD_INCOMPLETE 0x01 a currently resolving cache entry
NUD_REACHABLE 0x02 aconfirmed working cache entry
NUD_STALE 0x04 anexpired cache entry
NUD_DELAY 0x08 anentry waiting for a timer
NUD_PROBE 0x10 acache entry that is currently reprobed
NUD_FAILED 0x20 aninvalid cache entry
NUD_NOARP 0x40 adevice with no destination cache
NUD_PERMANENT 0x80 astatic entry
NUD_NONE 0x00
有效的nsm_flags取值:
NTF_PROXY 0x08 aproxy arp entry
NTF_ROUTER 0x80 anIPv6 router
rta_type的可能取值含义:
NDA_UNSPEC 0 未知类型
NDA_DST 1 aneighbour cache network layer destination address
NDA_LLADDR 2 aneighbour cache link layer address
NDA_CACHEINFO 3 cachestatistics
NDA_PROBES 4
当rta_type为NDA_CACHEINFO时,结构nda_cacheinfo跟在结构ndmsg之后。
structcacheinfo
{
__32 ndm_confirmed;
__32 ndm_used;
__32 ndm_updated;
__32 ndm_refcnt;
}
5、RTM_NEWRULE, RTM_DELRULE, RTM_GETRULE 创建,删除或者获取路由规则信息
结构rtmsg。
6、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;
};
rta_type的取值:
TCA_UNSPEC 0
TCA_KIND 1 Name of queueing discipline
TCA_OPTIONS 2 Qdisc specific options follow
TCA_STATS 3 Qdisc statistics
TCA_XSTATS 4 Module specific statistics
TCA_RATE 5 Rate limit
TCA_FCNT 6
TCA_STATS2 7
7、RTM_NEWTCLASS, RTM_DELTCLASS, RTM_GETTCLASS 创建,删除或者获取流量的类别
包含tcmsg结构
8、RTM_NEWTFILTER, RTM_DELTFILTER, RTM_GETTFILTER 创建,删除或者获取流量的过滤
包含tcmsg结构
Reference:
[1] linux-2.6.18\include\linux\rtnetlink.h
[2] rtnetlink man page Section 7
[3] Asanga Udugama. Manipulating theNetworking Environment Using RTNETLINK. Mar 30,2006. Linux Journal
源文件: