rtnetlink 中文描述

本文详细介绍了Rtnetlink接口,一种用于Linux内核与用户空间通信的机制,特别是关于路由控制方面。涵盖rtnetlink消息结构、不同类型的rtnetlink消息及其应用场景,如网络设备管理、IP地址配置、路由管理等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

源文件:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值