Rtnetlink描述
针对路由控制的netlink接口,Linux IPv4 routing sockets Rtnetlink基于netlink,允许对内核的路由表进行读写。主要用来进行内核与用户空间的通信以及内核中子系统间的通信。Rtnetlink是Linux2.2及其以后的版本中的一个新的特征。
Rtnetlink消息在初始头后可以有一些属性。结构:
struct
{
unsigned short rta_len; //属性的长度
unsigned short rta_type; //属性类型
/*属性数据跟随在这个结构之后*/
}
这些属性用RTA_*宏或者libnetlink来进行修改。
RTA_*宏:
#define RTA_ALIGNTO 4
#define RTA_ALIGN(len) ( ((len)+RTA_ALIGNTO-1) & ~(RTA_ALIGNTO-1) ) /*对齐*/
#define RTA_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结构。
struct ifinfomsg
{中国足健会
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 - see wireless.h */
IFLA_PROTINFO 12 /* Protocol specific information for a link */
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结构
struct ifaddrmsg
{
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; /*Interface index*/
}
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 本地地址local address
IFA_LABEL 3 接口名称name of the interface
IFA_BROADCAST 4 广播地址broadcast address
IFA_ANYCAST 5 anycast address
IFA_CACHEINFO 6 address information
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 Use external 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)