|
|
|
@ -83,12 +83,12 @@ namespace llarp
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
template < typename Map_t, typename Key_t, typename CheckValue_t,
|
|
|
|
|
typename GetFunc_t >
|
|
|
|
|
template < typename Lock_t, typename Map_t, typename Key_t,
|
|
|
|
|
typename CheckValue_t, typename GetFunc_t >
|
|
|
|
|
HopHandler_ptr
|
|
|
|
|
MapGet(Map_t& map, const Key_t& k, CheckValue_t check, GetFunc_t get)
|
|
|
|
|
{
|
|
|
|
|
Map_t::Lock_t lock(&map.first);
|
|
|
|
|
Lock_t lock(&map.first);
|
|
|
|
|
auto range = map.second.equal_range(k);
|
|
|
|
|
for(auto i = range.first; i != range.second; ++i)
|
|
|
|
|
{
|
|
|
|
@ -98,11 +98,12 @@ namespace llarp
|
|
|
|
|
return nullptr;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template < typename Map_t, typename Key_t, typename CheckValue_t >
|
|
|
|
|
template < typename Lock_t, typename Map_t, typename Key_t,
|
|
|
|
|
typename CheckValue_t >
|
|
|
|
|
bool
|
|
|
|
|
MapHas(Map_t& map, const Key_t& k, CheckValue_t check)
|
|
|
|
|
{
|
|
|
|
|
Map_t::Lock_t lock(&map.first);
|
|
|
|
|
Lock_t lock(&map.first);
|
|
|
|
|
auto range = map.second.equal_range(k);
|
|
|
|
|
for(auto i = range.first; i != range.second; ++i)
|
|
|
|
|
{
|
|
|
|
@ -112,28 +113,30 @@ namespace llarp
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template < typename Map_t, typename Key_t, typename Value_t >
|
|
|
|
|
template < typename Lock_t, typename Map_t, typename Key_t,
|
|
|
|
|
typename Value_t >
|
|
|
|
|
void
|
|
|
|
|
MapPut(Map_t& map, const Key_t& k, const Value_t& v)
|
|
|
|
|
{
|
|
|
|
|
Map_t::Lock_t lock(&map.first);
|
|
|
|
|
Lock_t lock(&map.first);
|
|
|
|
|
map.second.emplace(k, v);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template < typename Map_t, typename Visit_t >
|
|
|
|
|
template < typename Lock_t, typename Map_t, typename Visit_t >
|
|
|
|
|
void
|
|
|
|
|
MapIter(Map_t& map, Visit_t v)
|
|
|
|
|
{
|
|
|
|
|
Map_t::Lock_t lock(map.first);
|
|
|
|
|
Lock_t lock(map.first);
|
|
|
|
|
for(const auto& item : map.second)
|
|
|
|
|
v(item);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
template < typename Map_t, typename Key_t, typename Check_t >
|
|
|
|
|
template < typename Lock_t, typename Map_t, typename Key_t,
|
|
|
|
|
typename Check_t >
|
|
|
|
|
void
|
|
|
|
|
MapDel(Map_t& map, const Key_t& k, Check_t check)
|
|
|
|
|
{
|
|
|
|
|
Map_t::Lock_t lock(map.first);
|
|
|
|
|
Lock_t lock(map.first);
|
|
|
|
|
auto range = map.second.equal_range(k);
|
|
|
|
|
for(auto i = range.first; i != range.second;)
|
|
|
|
|
{
|
|
|
|
@ -148,23 +151,24 @@ namespace llarp
|
|
|
|
|
PathContext::AddOwnPath(PathSet_ptr set, Path_ptr path)
|
|
|
|
|
{
|
|
|
|
|
set->AddPath(path);
|
|
|
|
|
MapPut(m_OurPaths, path->TXID(), set);
|
|
|
|
|
MapPut(m_OurPaths, path->RXID(), set);
|
|
|
|
|
MapPut< SyncOwnedPathsMap_t::Lock_t >(m_OurPaths, path->TXID(), set);
|
|
|
|
|
MapPut< SyncOwnedPathsMap_t::Lock_t >(m_OurPaths, path->RXID(), set);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
|
PathContext::HasTransitHop(const TransitHopInfo& info)
|
|
|
|
|
{
|
|
|
|
|
return MapHas(m_TransitPaths, info.txID,
|
|
|
|
|
[info](const std::shared_ptr< TransitHop >& hop) -> bool {
|
|
|
|
|
return info == hop->info;
|
|
|
|
|
});
|
|
|
|
|
return MapHas< SyncTransitMap_t::Lock_t >(
|
|
|
|
|
m_TransitPaths, info.txID,
|
|
|
|
|
[info](const std::shared_ptr< TransitHop >& hop) -> bool {
|
|
|
|
|
return info == hop->info;
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
HopHandler_ptr
|
|
|
|
|
PathContext::GetByUpstream(const RouterID& remote, const PathID_t& id)
|
|
|
|
|
{
|
|
|
|
|
auto own = MapGet(
|
|
|
|
|
auto own = MapGet< SyncOwnedPathsMap_t::Lock_t >(
|
|
|
|
|
m_OurPaths, id,
|
|
|
|
|
[](const PathSet_ptr) -> bool {
|
|
|
|
|
// TODO: is this right?
|
|
|
|
@ -176,7 +180,7 @@ namespace llarp
|
|
|
|
|
if(own)
|
|
|
|
|
return own;
|
|
|
|
|
|
|
|
|
|
return MapGet(
|
|
|
|
|
return MapGet< SyncTransitMap_t::Lock_t >(
|
|
|
|
|
m_TransitPaths, id,
|
|
|
|
|
[remote](const std::shared_ptr< TransitHop >& hop) -> bool {
|
|
|
|
|
return hop->info.upstream == remote;
|
|
|
|
@ -190,7 +194,7 @@ namespace llarp
|
|
|
|
|
PathContext::TransitHopPreviousIsRouter(const PathID_t& path,
|
|
|
|
|
const RouterID& otherRouter)
|
|
|
|
|
{
|
|
|
|
|
decltype(m_TransitPaths)::Lock_t lock(&m_TransitPaths.first);
|
|
|
|
|
SyncTransitMap_t::Lock_t lock(&m_TransitPaths.first);
|
|
|
|
|
auto itr = m_TransitPaths.second.find(path);
|
|
|
|
|
if(itr == m_TransitPaths.second.end())
|
|
|
|
|
return false;
|
|
|
|
@ -200,7 +204,7 @@ namespace llarp
|
|
|
|
|
HopHandler_ptr
|
|
|
|
|
PathContext::GetByDownstream(const RouterID& remote, const PathID_t& id)
|
|
|
|
|
{
|
|
|
|
|
return MapGet(
|
|
|
|
|
return MapGet< SyncTransitMap_t::Lock_t >(
|
|
|
|
|
m_TransitPaths, id,
|
|
|
|
|
[remote](const std::shared_ptr< TransitHop >& hop) -> bool {
|
|
|
|
|
return hop->info.downstream == remote;
|
|
|
|
@ -214,7 +218,7 @@ namespace llarp
|
|
|
|
|
PathContext::GetLocalPathSet(const PathID_t& id)
|
|
|
|
|
{
|
|
|
|
|
auto& map = m_OurPaths;
|
|
|
|
|
decltype(m_OurPaths)::Lock_t lock(&map.first);
|
|
|
|
|
SyncOwnedPathsMap_t::Lock_t lock(&map.first);
|
|
|
|
|
auto itr = map.second.find(id);
|
|
|
|
|
if(itr != map.second.end())
|
|
|
|
|
{
|
|
|
|
@ -241,7 +245,7 @@ namespace llarp
|
|
|
|
|
RouterID us(OurRouterID());
|
|
|
|
|
auto& map = m_TransitPaths;
|
|
|
|
|
{
|
|
|
|
|
decltype(m_TransitPaths)::Lock_t lock(&map.first);
|
|
|
|
|
SyncTransitMap_t::Lock_t lock(&map.first);
|
|
|
|
|
auto range = map.second.equal_range(id);
|
|
|
|
|
for(auto i = range.first; i != range.second; ++i)
|
|
|
|
|
{
|
|
|
|
@ -255,15 +259,15 @@ namespace llarp
|
|
|
|
|
void
|
|
|
|
|
PathContext::PutTransitHop(std::shared_ptr< TransitHop > hop)
|
|
|
|
|
{
|
|
|
|
|
MapPut(m_TransitPaths, hop->info.txID, hop);
|
|
|
|
|
MapPut(m_TransitPaths, hop->info.rxID, hop);
|
|
|
|
|
MapPut< SyncTransitMap_t::Lock_t >(m_TransitPaths, hop->info.txID, hop);
|
|
|
|
|
MapPut< SyncTransitMap_t::Lock_t >(m_TransitPaths, hop->info.rxID, hop);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
PathContext::ExpirePaths(llarp_time_t now)
|
|
|
|
|
{
|
|
|
|
|
{
|
|
|
|
|
decltype(m_TransitPaths)::Lock_t lock(&m_TransitPaths.first);
|
|
|
|
|
SyncTransitMap_t::Lock_t lock(&m_TransitPaths.first);
|
|
|
|
|
auto& map = m_TransitPaths.second;
|
|
|
|
|
auto itr = map.begin();
|
|
|
|
|
while(itr != map.end())
|
|
|
|
@ -277,7 +281,7 @@ namespace llarp
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
{
|
|
|
|
|
decltype(m_OurPaths)::Lock_t lock(&m_OurPaths.first);
|
|
|
|
|
SyncOwnedPathsMap_t::Lock_t lock(&m_OurPaths.first);
|
|
|
|
|
auto& map = m_OurPaths.second;
|
|
|
|
|
for(auto& item : map)
|
|
|
|
|
{
|
|
|
|
@ -299,7 +303,7 @@ namespace llarp
|
|
|
|
|
const RouterID us(OurRouterID());
|
|
|
|
|
auto& map = m_TransitPaths;
|
|
|
|
|
{
|
|
|
|
|
decltype(m_TransitPaths)::Lock_t lock(&map.first);
|
|
|
|
|
SyncTransitMap_t::Lock_t lock(&map.first);
|
|
|
|
|
auto range = map.second.equal_range(id);
|
|
|
|
|
for(auto i = range.first; i != range.second; ++i)
|
|
|
|
|
{
|
|
|
|
@ -313,7 +317,7 @@ namespace llarp
|
|
|
|
|
void
|
|
|
|
|
PathContext::RemovePathSet(PathSet_ptr set)
|
|
|
|
|
{
|
|
|
|
|
decltype(m_OurPaths)::Lock_t lock(&m_OurPaths.first);
|
|
|
|
|
SyncOwnedPathsMap_t::Lock_t lock(&m_OurPaths.first);
|
|
|
|
|
auto& map = m_OurPaths.second;
|
|
|
|
|
auto itr = map.begin();
|
|
|
|
|
while(itr != map.end())
|
|
|
|
|