using System.Collections.Generic; using Cosmos.HAL; using System; namespace Cosmos.System.Network.IPv4 { /// /// Contains a IPv4 configuration /// public class Config { private static readonly List ipConfigs = new List(); internal static void Add(Config config) { ipConfigs.Add(config); } internal static Address FindNetwork(Address destIP) { Address default_gw = null; for (int c = 0; c < ipConfigs.Count; c++) { if ((ipConfigs[c].IPAddress.Hash & ipConfigs[c].SubnetMask.Hash) == (destIP.Hash & ipConfigs[c].SubnetMask.Hash)) { return ipConfigs[c].IPAddress; } if ((default_gw == null) && (ipConfigs[c].DefaultGateway.CompareTo(Address.Zero) != 0)) { default_gw = ipConfigs[c].IPAddress; } } return default_gw; } internal static bool IsLocalAddress(Address destIP) { for (int c = 0; c < ipConfigs.Count; c++) { if ((ipConfigs[c].IPAddress.Hash & ipConfigs[c].SubnetMask.Hash) == (destIP.Hash & ipConfigs[c].SubnetMask.Hash)) { return true; } } return false; } internal static NetworkDevice FindInterface(Address sourceIP) { return NetworkStack.AddressMap[sourceIP.Hash]; } internal static Address FindRoute(Address destIP) { for (int c = 0; c < ipConfigs.Count; c++) { if (ipConfigs[c].DefaultGateway.CompareTo(Address.Zero) != 0) { return ipConfigs[c].DefaultGateway; } } return null; } /// /// Create a IPv4 Configuration with no default gateway /// /// IP Address /// Subnet Mask public Config(Address ip, Address subnet) : this(ip, subnet, Address.Zero) { } /// /// Create a IPv4 Configuration /// /// IP Address /// Subnet Mask /// Default gateway public Config(Address ip, Address subnet, Address gw) { IPAddress = ip; SubnetMask = subnet; DefaultGateway = gw; } public Address IPAddress { get; } public Address SubnetMask { get; } public Address DefaultGateway { get; } } }