设置接口IPv6地址时使用c-libnl:segfault



我正在尝试使用libnl设置接口的IPv6地址。浏览文档和其他资源,这基本上就是我要做的:

static int set_ipv6(const char *if_name, const char *ipv6) {
struct rtnl_link *link = NULL;
struct nl_sock *sk = NULL;
struct rtnl_addr *ipv6_addr = NULL;
struct nl_addr* lo_ipv6_addr = NULL;
struct nl_cache *link_cache = NULL;
int err = 0;
int ifindex = 0;
sk = nl_socket_alloc();
if ((err = nl_connect(sk, NETLINK_ROUTE)) < 0) {
nl_perror(err, "nl_connect");
return err;
}
ipv6_addr = rtnl_addr_alloc();
if ((err = nl_addr_parse(ipv6, AF_INET6, &lo_ipv6_addr)) < 0) {
nl_perror(err, "nl_addr_parse");
return err;
}
printf("This part segfaultsn");
if((err = rtnl_addr_set_local(ipv6_addr, lo_ipv6_addr)) < 0) {
nl_perror(err, "rtnl_addr_set_local");
return err;
}
if ((err = rtnl_link_alloc_cache(sk, AF_UNSPEC, &link_cache)) < 0) {
nl_perror(err, "rtnl_link_alloc_cache");
return err;
}
if((link = rtnl_link_get_by_name(link_cache, if_name)) == NULL) {
return -1;
}
if((ifindex = rtnl_link_get_ifindex(link)) == 0) {
fprintf(stderr,"index of %s not setn", if_name);
return -1;
}
rtnl_addr_set_ifindex(ipv6_addr, ifindex);
rtnl_addr_set_link(ipv6_addr, link);
if ((err = rtnl_addr_add(sk, ipv6_addr, 0)) < 0) {
nl_perror(err, "rtnl_addr_add");
return err;
}
nl_addr_put(lo_ipv6_addr);
rtnl_addr_put(ipv6_addr);
nl_cache_free(link_cache);
nl_socket_free(sk);
rtnl_link_put(link);
return 0;
}

很明显,我用类似于的东西来调用这个代码

set_ipv6("veth1", "fc00:dead:cafe:1::2");

其中veth1是有效的veth设备。然而,由于一些奇怪的原因,一旦调用rtnl_addr_set_local,该代码似乎就会出错,因为它在设置堆栈时试图取消引用rdi寄存器中的无效地址。

有什么想法吗?这可能是libnl中的一个错误吗?

谢谢!

想清楚了,我似乎缺少了一个include指令,更具体地说,就是addr.h头。

#include <netlink/route/addr.h>

最新更新