Rtnetlink描述

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)

本文发布于:2024-09-21 13:26:03,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/137338.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:路由   地址   接口
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议