c - libnl:设置接口 IPv6 地址时的段错误
问题描述
我正在尝试设置接口的 IPv6 地址,使用libnl
. 通过文档和其他资源,这基本上是我想要做的:
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 segfaults\n");
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 set\n", 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
吗?
谢谢!
解决方案
弄清楚了,似乎我缺少一个包含指令,更具体地说 - addr.h 标头。
#include <netlink/route/addr.h>
推荐阅读
- javascript - Jquery生成的输出中的必需属性
- php - 发布因域重定向而丢失的 Android 应用程序发送的数据
- python-3.x - 如何在 Python3 中使用输入文本文件声明全局变量?
- linux - kobject_create_and_add 创建了多少个引用计数?
- python - 如何将 .pb 文件转换为 .tflite。在张量流 2.1.0
- c++ - 带有省略号的构造函数的调用约定更改
- php - php - 提取数组值的问题
- amazon-web-services - 通过 AWS ECS 服务发现将前端应用程序与后端连接起来
- database - 错误:在 psql 中使用 COPY FROM PROGRAM 时缺少列数据
- javascript - 未处理的拒绝(TypeError):无法读取未定义的属性“替换”