Initial project commit

This commit is contained in:
2022-06-11 16:42:18 -04:00
commit 14565a17e2
60 changed files with 3739 additions and 0 deletions

View File

@@ -0,0 +1,87 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Hermes.Objects;
namespace Hermes.Selectors
{
class UniqueHighestSpeedTwoNodeSelector : UniqueRouteSelector, IRouteSelector
{
public UniqueHighestSpeedTwoNodeSelector()
: base()
{}
#region IRouteSelector Members
public Circuit CreateNewCircuit()
{
Random rand = new Random();
Circuit circuit = new Circuit();
GetPoolReaderLock();
{
lock (UsedRouters)
{
//Try to use unused routers
IEnumerable<Router> nonExits = RouterPool.Where(p => !p.Flags.Contains("Exit") && !UsedRouters.Contains(p));
if (nonExits.Count() == 0)
{
nonExits = RouterPool.Where(p => !p.Flags.Contains("Exit"));
circuit.AddNextRouter(nonExits.ElementAt(rand.Next(nonExits.Count())));
}
else
circuit.AddNextRouter(nonExits.OrderByDescending(p => p.BandwidthObserved).First());
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.ElementAt(rand.Next(exits.Count())));
}
else
circuit.AddNextRouter(exits.OrderByDescending(p => p.BandwidthObserved).First());
UsedRouters.AddRange(circuit.Routers.Values.ToList());
}
}
ReleasePoolReaderLock();
return circuit;
}
public Circuit CreateNewCircuit(System.Net.IPEndPoint destination)
{
Random rand = new Random();
Circuit circuit = new Circuit();
GetPoolReaderLock();
{
lock (UsedRouters)
{
//Try to use unused routers
IEnumerable<Router> nonExits = RouterPool.Where(p => !p.Flags.Contains("Exit") && !UsedRouters.Contains(p));
if (nonExits.Count() == 0)
{
nonExits = RouterPool.Where(p => !p.Flags.Contains("Exit"));
circuit.AddNextRouter(nonExits.ElementAt(rand.Next(nonExits.Count())));
}
else
circuit.AddNextRouter(nonExits.OrderByDescending(p => p.BandwidthObserved).First());
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.ElementAt(rand.Next(exits.Count())));
}
else
circuit.AddNextRouter(exits.OrderByDescending(p => p.BandwidthObserved).First());
UsedRouters.AddRange(circuit.Routers.Values.ToList());
}
}
ReleasePoolReaderLock();
return circuit;
}
#endregion
}
}