admin管理员组

文章数量:1532440

2024年5月5日发(作者:)

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

ARPHRD_PPP

ARPHRDLOOPBACK

10M以太网

PPP拨号

环路设备

ifi_flags包含设备的一些标志:

IFF_UP

IFF_BROADCAST

IFF_DEBUG

IFF_LOOPBACK

IFF_POINTOPOINT

IFF_RUNNING

IFF_NOARP

IFF_PROMISC

IFF_NOTRAILERS

IFF_ALLMULTI

IFF_MASTER

IFF_SLAVE

IFF_MULTICAST

IFF_PORTSEL

IFF_AUTOMEDIA

IFF_DYNAMIC

接口正在运行

有效的广播地址集

内部调试标志

这是自环接口

这是点到点的链路设备

资源已分配

无arp协议,没有设置第二层目的地址

接口为杂凑(promiscuous)模式

避免使用trailer

接收所有组播(multicast)报文

主负载平衡群(bundle)

从负载平衡群(bundle)

支持组播(multicast)

可以通过ifmap选择介质(media)类型

自动选择介质

接口关闭时丢弃地址

2、RTM_NEWADDR, RTM_DELADDR, RTM_GETADDR 创建,删除或者获取网络设备的

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

本文标签: 接口地址类型进行设备