【问题标题】:libnl: segfault when setting interface IPv6 addresslibnl:设置接口 IPv6 地址时的段错误
【发布时间】:2020-12-21 19:03:40
【问题描述】:

我正在尝试使用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 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 中的错误吗?

谢谢!

【问题讨论】:

    标签: c networking ipv6 netlink


    【解决方案1】:

    想通了,似乎我缺少一个包含指令,更具体地说是 addr.h 标头。

    #include <netlink/route/addr.h>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-29
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多