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; }
}
}