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

Я пытаюсь добавить маршрут (ядро 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

Решение

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

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

nl_addr_build: анализ двоичного адреса

nl_addr_parse: разбирать char * addr, например «10.10.1.10»

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]