Skip to content

Commit 7e149a4

Browse files
author
vimes
committed
Split filling request_interface from per socket requests
1 parent 43d8cdc commit 7e149a4

File tree

2 files changed

+76
-32
lines changed

2 files changed

+76
-32
lines changed

controlplane/route.cpp

Lines changed: 66 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -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

controlplane/route.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,16 @@ class route_t : public module_t
283283
void AddRequestForEachSocket(common::idp::updateGlobalBase::request& globalbase,
284284
uint32_t value_id,
285285
common::globalBase::eNexthopType nexthop);
286+
bool MakePerSocketRequest(
287+
common::idp::updateGlobalBase::request& globalbase,
288+
uint32_t value_id,
289+
const route::tunnel_value_key_t& value_key);
290+
std::vector<route::tunnel_value_interface_t>
291+
MakeTunnelValueRequestInterface(
292+
common::idp::updateGlobalBase::request& globalbase,
293+
const route::generation_t& generation,
294+
uint32_t value_id,
295+
const route::tunnel_value_key_t& value_key);
286296
void tunnel_value_compile(common::idp::updateGlobalBase::request& globalbase,
287297
const route::generation_t& generation,
288298
const uint32_t& value_id,

0 commit comments

Comments
 (0)