Добавление маршрута с помощью libnl-3-route «Неверные входные данные или параметр»

0

Я пытаюсь добавить маршрут (ядро 2.6.32-57) с libnl-3-routing. Я использую документацию:

  1. Библиотека Netlink
  2. Маршрутизация Netlink

Но глава маршрутизации пуста...;)

Проблема заключается в ответе ядра с "Недопустимые входные данные или параметр". Я проведу несколько тестов с использованием netlink, и я могу добавить маршрут, если я установил следующие атрибуты:

  1. индекс интерфейса
  2. адрес назначения
  3. адрес шлюза
  4. маскировать

        int ret = 0;
        // Create the route.
        struct rtnl_route* rulesRoute = rtnl_route_alloc();
        rtnl_route_set_iif(rulesRoute, AF_INET); // IPV4
    
        // Set parameters.
        rtnl_route_set_scope(rulesRoute, RT_SCOPE_UNIVERSE);
        rtnl_route_set_table(rulesRoute, RT_TABLE_MAIN);
        rtnl_route_set_protocol(rulesRoute, RTPROT_STATIC);
        uint8_t maskTest = 16;
        rtnl_route_set_scope(rulesRoute, maskTest);
    
        // Set the destination.
        char destinationAddr[] = "0.0.0.0";
        nl_addr* dstAddr = nl_addr_build(AF_INET, destinationAddr, 8);
        ret = rtnl_route_set_dst(rulesRoute, dstAddr);
        if(ret != 0)
        {
        std::cout << "Error in setting destination route : " << nl_geterror(ret) << std::endl;
        }
    
        // Set the next hop.
        struct rtnl_nexthop* route_nexthop = rtnl_route_nh_alloc();
        char gatewayAddr[] = "10.110.0.240";
        nl_addr* gatewAddr = nl_addr_build(AF_INET, gatewayAddr, 12);
        rtnl_route_nh_set_gateway(route_nexthop, gatewAddr);
        rtnl_route_nh_set_ifindex(route_nexthop, 2);
        rtnl_route_add_nexthop(rulesRoute, route_nexthop);
        ret = rtnl_route_add(m_nlSocket, rulesRoute, 0);
        if(ret != 0)
        {
            std::cout << "Kernel response :" << nl_geterror(ret) << std::endl;
        }
    

Я добавляю для информации свою таблицу маршрутизации:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.110.0.0      0.0.0.0         255.255.255.0   U     1      0        0 eth3
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth3
0.0.0.0         10.110.0.1      0.0.0.0         UG    0      0        0 eth3

Спасибо за помощь в решении этой проблемы.

  • 0
    Ссылки битые :(
  • 0
    Да, проект, вероятно, мертв, документация никогда не была завершена, а библиотека не обновлялась с 2014 года. Недавно мы удалили все зависимости для этого проекта и вместо этого используем вызов двоичного файла (ip route, ip link, ...)
Показать ещё 2 комментария
Теги:
routes
netlink

1 ответ

0
Лучший ответ

Проблема связана с плохим использованием функции nl_addr_build.

Замените на nl_addr_parse() и это работает.

nl_addr_build: проанализировать двоичный addr

nl_addr_parse: проанализировать char * addr like "10.10.1.10"

Ещё вопросы

Сообщество Overcoder
Наверх
Меню