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