Files
Hermes/Hermes/Selectors/UniqueHighestSpeedSingleRouterSelector.cs
2022-06-11 16:42:18 -04:00

58 lines
2.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Hermes.Objects;
namespace Hermes.Selectors
{
public class UniqueHighestSpeedSingleRouterSelector : UniqueRouteSelector, IRouteSelector
{
#region IRouteSelector Members
public Circuit CreateNewCircuit()
{
Circuit circuit = new Circuit();
GetPoolReaderLock();
{
lock (UsedRouters)
{
IEnumerable<Router> exits = RouterPool.Where(p => p.Flags.Contains("Exit") && !UsedRouters.Contains(p));
if (exits.Count() == 0)
exits = RouterPool.Where(p => p.Flags.Contains("Exit"));
circuit.AddNextRouter(exits.OrderByDescending(p => p.BandwidthObserved).First());
UsedRouters.AddRange(circuit.Routers.Values.ToList());
}
}
ReleasePoolReaderLock();
return circuit;
}
public Circuit CreateNewCircuit(System.Net.IPEndPoint destination)
{
Circuit circuit = new Circuit();
GetPoolReaderLock();
{
lock (UsedRouters)
{
IEnumerable<Router> exits = RouterPool.Where(p => p.Flags.Contains("Exit") && p.ExitPolicy != null && p.ExitPolicy.IsAcceptableDestination(destination) && !UsedRouters.Contains(p));
if (exits.Count() == 0)
{
exits = RouterPool.Where(p => p.Flags.Contains("Exit") && p.ExitPolicy != null && p.ExitPolicy.IsAcceptableDestination(destination));
circuit.AddNextRouter(exits.OrderByDescending(p => p.BandwidthObserved).First());
}
else
circuit.AddNextRouter(exits.OrderByDescending(p => p.BandwidthObserved).First());
UsedRouters.AddRange(circuit.Routers.Values.ToList());
}
}
ReleasePoolReaderLock();
return circuit;
}
#endregion
}
}