【发布时间】:2019-10-25 09:45:53
【问题描述】:
我正在尝试使用 libnl 创建桥接并更改其标志。代码:
#include <netlink/netlink.h>
#include <netlink/route/link.h>
#include <netlink/route/link/bridge.h>
#include <linux/if.h>
#define BRIDGE_NAME "brr"
int main()
{
struct rtnl_link *link;
struct rtnl_link *change;
struct nl_sock *sk;
int err;
sk = nl_socket_alloc();
if ((err = nl_connect(sk, NETLINK_ROUTE)) < 0) {
nl_perror(err, "Unable to connect socket");
return err;
}
link = rtnl_link_bridge_alloc();
rtnl_link_set_name(link, BRIDGE_NAME);
rtnl_link_set_family(link, AF_BRIDGE);
rtnl_link_set_flags(link, IFF_UP);
unsigned int flag = 0;
if ((err = rtnl_link_add(sk, link, NLM_F_CREATE)) < 0)
{
nl_perror(err, "Unable to add link");
return err;
}
rtnl_link_put(link);
link = NULL;
if (rtnl_link_get_kernel(sk, 0, BRIDGE_NAME, &link) < 0)
{
printf("can't get link\n");
return -1;
}
change = rtnl_link_alloc();
rtnl_link_unset_flags(change, IFF_UP);
if ((err = rtnl_link_change(sk, link, change, 0)) < 0)
printf("can't change flags: %s(%d)\n", nl_geterror(err), err);
rtnl_link_put(link);
rtnl_link_put(change);
return 0;
}
我是如何编译的:
gcc bridge-test.c -o createbr $(pkg-config --cflags --libs libnl-3.0 libnl-genl-3.0 libnl-route-3.0)
我得到:
Operation not supported(-10)
不是libnl的错误,是内核返回的。
我在相当旧的 Debian 上,但我不认为这是问题所在:
$ uname -a
Linux debian 4.9.0-8-amd64 #1 SMP Debian 4.9.144-3 (2019-02-02) x86_64 GNU/Linux
libnl 版本:
$ aptitude versions libnl-3-dev
i 3.4.0-1
当我尝试删除 IFF_UP 标志时出现问题。我做错了吗?
【问题讨论】: