RTNETLINK - Linux手册页

时间:2019-08-20 18:01:13  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2020-06-09

名称

rtnetlink-操纵rtnetlink消息的宏

语法

#包括
#包括
#包括
#包括

rtnetlink_socket =套接字(AF_NETLINK,int socket_type,NETLINK_ROUTE);

int RTA_OK(结构rtattr * rta,int rtabuflen);

无效* RTA_DATA(struct rtattr * rta);

无符号int RTA_PAYLOAD(struct rtattr * rta);

struct rtattr * RTA_NEXT(struct rtattr * rta,unsigned int rtabuflen);

无符号整数RTA_LENGTH(unsigned int length);

无符号整数RTA_SPACE(unsigned int length);

说明

所有rtnetlink(7)消息均由netlink(7)消息头和附加属性组成。只能使用此处提供的宏来操作属性。

如果rta指向有效的路由属性,则RTA_OK(rta,attrlen)返回true。 attrlen是属性缓冲区的运行长度。如果不为真,则即使attrlen为非零,也必须假定消息中没有其他属性。

RTA_DATA(rta)返回一个指向该属性数据开始的指针。

RTA_PAYLOAD(rta)返回此属性数据的长度。

RTA_NEXT(rta,attrlen)获取rta之后的下一个属性。调用此宏将更新attrlen。您应该使用RTA_OK检查返回的指针的有效性。

RTA_LENGTH(len)返回len数据字节和标头所需的长度。

RTA_SPACE(len)返回具有len字节数据的消息中所需的空间量。

遵循规范

这些宏是非标准的Linux扩展。

BUGS

本手册页不完整。

示例

创建rtnetlink消息以设置设备的MTU:

#include <linux/rtnetlink.h>

...

struct {
    struct nlmsghdr  nh;
    struct ifinfomsg if;
    char             attrbuf[512];
} req;

struct rtattr *rta;
unsigned int mtu = 1000;

int rtnetlink_sk = socket(AF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);

memset(&req, 0, sizeof(req));
req.nh.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
req.nh.nlmsg_flags = NLM_F_REQUEST;
req.nh.nlmsg_type = RTM_NEWLINK;
req.if.ifi_family = AF_UNSPEC;
req.if.ifi_index = INTERFACE_INDEX;
req.if.ifi_change = 0xffffffff; /* ??? */
rta = (struct rtattr *)(((char *) &req) +
                         NLMSG_ALIGN(req.nh.nlmsg_len));
rta->rta_type = IFLA_MTU;
rta->rta_len = RTA_LENGTH(sizeof(unsigned int));
req.nh.nlmsg_len = NLMSG_ALIGN(req.nh.nlmsg_len) +
                              RTA_LENGTH(sizeof(mtu));
memcpy(RTA_DATA(rta), &mtu, sizeof(mtu));
send(rtnetlink_sk, &req, req.nh.nlmsg_len, 0);

另外参见

netlink(3),netlink(7),rtnetlink(7)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/