前言
前置阅读要求:libnl教程(1):订阅内核的netlink广播通知
本文介绍,libnl如何向内核发送请求。这包含三个部分:构建请求;创建套接字;发送请求。
同样,本文使用示例说明libnl的API该如何组合使用。
本文使用的示例是,发送netlink请求,以创建一张dummy网卡。
示例
示例代码
运行该示例代码,即可创建一个dummy
类型的网卡。网卡名为dummy0
。
代码参考自:https://github.com/FDio/vpp/blob/master/src/vnet/devices/netlink.c
上面的参考代码很好,完整的显示了构建请求-创建套接字-发送请求-接收回复的过程。
但是上面参考代码的路子有点野。因为它很少调用libnl的API。它作为参考是好的。但是日常编程中,还是尽量调用libnl的API。
下面的示例代码中,我在展示逻辑结构的基础上,尽量调用了libnl的API。
#include <linux/rtnetlink.h>
#include <netlink/msg.h>
#include <netlink/netlink.h>
#include <netlink/route/link.h>
#include <netlink/socket.h>
int netlink_add(const char *iftype, const char *ifname) {
int ret = 0;
struct nl_msg *msg = NULL;
struct nl_sock *sk = NULL;
// 构建请求
msg = nlmsg_alloc_simple(RTM_NEWLINK, NLM_F_REQUEST | NLM_F_ACK |
NLM_F_CREATE | NLM_F_EXCL);
struct ifinfomsg ifi = {
};
ifi.ifi_family = AF_UNSPEC;
ret = nlmsg_append