@@ -1655,28 +1655,57 @@ void AddRequestInterface(
16551655 }
16561656}
16571657
1658- void route_t::tunnel_value_compile (common::idp::updateGlobalBase::request& globalbase,
1659- const route:: generation_t & generation ,
1660- const uint32_t & value_id,
1661- const route::tunnel_value_key_t & value_key)
1658+ bool route_t::MakePerSocketRequest (
1659+ common::idp::updateGlobalBase::request& globalbase ,
1660+ uint32_t value_id,
1661+ const route::tunnel_value_key_t & value_key)
16621662{
1663- std::vector<route::tunnel_value_interface_t > request_interface;
1664-
1665- const auto & [vrf_priority, destination, fallback] = value_key;
1666- GCC_BUG_UNUSED (vrf_priority); // /< @todo: VRF
1667-
1668- tunnel_value_lookup[value_id].clear ();
1669-
16701663 const auto & visitor = utils::Visitor{
16711664 [&](const route::tunnel_destination_interface_t & nexthops) {
1672- for (const auto & [nexthop, label, peer_id, origin_as, weight] : nexthops)
1665+ for (const auto & nexthop : nexthops)
1666+ {
1667+ if (std::get<common::ip_address_t >(nexthop).is_default ())
1668+ {
1669+ AddRequestForEachSocket (globalbase, value_id, common::globalBase::eNexthopType::controlPlane);
1670+ return true ;
1671+ }
1672+ }
1673+ return false ;
1674+ },
1675+ [&](const route::tunnel_destination_legacy_t & nexthops) {
1676+ for (const auto & nexthop : nexthops)
16731677 {
16741678 if (nexthop.is_default ())
16751679 {
16761680 AddRequestForEachSocket (globalbase, value_id, common::globalBase::eNexthopType::controlPlane);
16771681 return true ;
16781682 }
1683+ }
1684+ return false ;
1685+ },
1686+ [](const route::directly_connected_destination_t &) { return false ; },
1687+ [&](uint32_t virtual_port_id) {
1688+ AddRequestForEachSocket (globalbase, value_id, common::globalBase::eNexthopType::repeat);
1689+ return true ;
1690+ },
1691+ [](route::tunnel_destination_default_t ) { return false ; }};
1692+ return std::visit (visitor, std::get<route::tunnel_destination_t >(value_key));
1693+ }
1694+
1695+ std::vector<route::tunnel_value_interface_t > route_t::MakeTunnelValueRequestInterface (
1696+ common::idp::updateGlobalBase::request& globalbase,
1697+ const route::generation_t & generation,
1698+ uint32_t value_id,
1699+ const route::tunnel_value_key_t & value_key)
1700+ {
1701+ std::vector<route::tunnel_value_interface_t > request_interface;
16791702
1703+ tunnel_value_lookup[value_id].clear ();
1704+
1705+ const auto & visitor = utils::Visitor{
1706+ [&](const route::tunnel_destination_interface_t & nexthops) {
1707+ for (const auto & [nexthop, label, peer_id, origin_as, weight] : nexthops)
1708+ {
16801709 if (nexthop.is_ipv4 ())
16811710 {
16821711 for (const auto & default_nexthop : tunnel_defaults_v4)
@@ -1692,20 +1721,12 @@ void route_t::tunnel_value_compile(common::idp::updateGlobalBase::request& globa
16921721 }
16931722 }
16941723 }
1695- return false ;
16961724 },
16971725 [&](const route::tunnel_destination_legacy_t & nexthops) {
16981726 for (const auto & nexthop : nexthops)
16991727 {
1700- if (nexthop.is_default ())
1701- {
1702- AddRequestForEachSocket (globalbase, value_id, common::globalBase::eNexthopType::controlPlane);
1703- return true ;
1704- }
1705-
17061728 AddRequestInterface (request_interface, generation, nexthop, nexthop, 3 , 0 , 0 , 1 );
17071729 }
1708- return false ;
17091730 },
17101731 [&](const route::directly_connected_destination_t & directly_connected) {
17111732 const auto & [interface_id, interface_name] = directly_connected;
@@ -1718,13 +1739,9 @@ void route_t::tunnel_value_compile(common::idp::updateGlobalBase::request& globa
17181739 0 ,
17191740 1 ,
17201741 ipv4_address_t ()); // /< default
1721- return false ;
1722- },
1723- [&](uint32_t virtual_port_id) {
1724- AddRequestForEachSocket (globalbase, value_id, common::globalBase::eNexthopType::repeat);
1725- return true ;
17261742 },
1727- [&](route::tunnel_destination_default_t ) {
1743+ [](uint32_t virtual_port_id) {},
1744+ [&, &fallback = std::get<common::ip_prefix_t >(value_key)](route::tunnel_destination_default_t ) {
17281745 if (fallback.is_ipv4 ())
17291746 {
17301747 for (const auto & default_nexthop : tunnel_defaults_v4)
@@ -1739,13 +1756,9 @@ void route_t::tunnel_value_compile(common::idp::updateGlobalBase::request& globa
17391756 AddRequestInterface (request_interface, generation, default_nexthop, default_nexthop, 3 , 0 , 0 , 1 );
17401757 }
17411758 }
1742- return false ;
17431759 }};
17441760
1745- if (bool finished = std::visit (visitor, destination); finished)
1746- {
1747- return ;
1748- }
1761+ std::visit (visitor, std::get<route::tunnel_destination_t >(value_key));
17491762
17501763 if (request_interface.size () > YANET_CONFIG_ROUTE_TUNNEL_ECMP_SIZE)
17511764 {
@@ -1756,13 +1769,34 @@ void route_t::tunnel_value_compile(common::idp::updateGlobalBase::request& globa
17561769 request_interface.resize (YANET_CONFIG_ROUTE_TUNNEL_ECMP_SIZE);
17571770 }
17581771
1772+ return request_interface;
1773+ }
1774+
1775+ void route_t::tunnel_value_compile (common::idp::updateGlobalBase::request& globalbase,
1776+ const route::generation_t & generation,
1777+ const uint32_t & value_id,
1778+ const route::tunnel_value_key_t & value_key)
1779+ {
1780+ if (MakePerSocketRequest (globalbase, value_id, value_key))
1781+ {
1782+ return ;
1783+ }
1784+ std::vector<route::tunnel_value_interface_t > request_interface =
1785+ MakeTunnelValueRequestInterface (globalbase, generation, value_id, value_key);
1786+
17591787 if (request_interface.empty ())
17601788 {
17611789 AddRequestForEachSocket (globalbase, value_id, common::globalBase::eNexthopType::controlPlane);
17621790 return ;
17631791 }
17641792
1765- generation.for_each_socket ([this , &value_id, &request_interface, &fallback = fallback, &globalbase](const tSocketId& socket_id, const std::set<tInterfaceId>& interfaces) {
1793+ generation.for_each_socket ([this ,
1794+ &value_id,
1795+ &request_interface,
1796+ &fallback = std::get<common::ip_prefix_t >(value_key),
1797+ &globalbase](
1798+ const tSocketId& socket_id,
1799+ const std::set<tInterfaceId>& interfaces) {
17661800 common::idp::updateGlobalBase::route_tunnel_value_update::interface update_interface;
17671801 auto & [update_weight_start, update_weight_size, update_nexthops] = update_interface;
17681802
0 commit comments