using System.Collections.Generic; using Cosmos.HAL; using System; namespace Cosmos.System.Network.IPv4 { /// /// Contains a IPv4 configuration /// public class Config { /// /// IPv4 configurations list. /// private static readonly List ipConfigs = new List(); /// /// Add IPv4 configuration. /// /// internal static void Add(Config config) { ipConfigs.Add(config); } /// /// Find network. /// /// Destination IP address. /// Address value. /// Thrown on fatal error (contact support). 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; } /// /// Check if address is local address. /// /// Address to check. /// bool value. 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; } /// /// Find interface. /// /// Source IP. /// NetworkDevice value. internal static NetworkDevice FindInterface(Address sourceIP) { return NetworkStack.AddressMap[sourceIP.Hash]; } /// /// Find route to address. /// /// Destination IP. /// Address value. /// Thrown on fatal error (contact support). 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; } /// /// Get IP address. /// public Address IPAddress { get; } /// /// Get subnet mask. /// public Address SubnetMask { get; } /// /// Get default gateway. /// public Address DefaultGateway { get; } } }