using System; using Sys = System; using System.Collections.Generic; using Cosmos.HAL; using Cosmos.System.Network.ARP; using Cosmos.System.Network.IPv4; using Cosmos.Debug.Kernel; namespace Cosmos.System.Network { /// /// Implement a Network Stack for all network devices and protocols /// public static class NetworkStack { public static Debugger debugger = new Debugger("System", "NetworkStack"); internal static TempDictionary AddressMap { get; private set; } internal static TempDictionary MACMap { get; private set; } /// /// Initialize the Network Stack to prepare it for operation /// public static void Init() { AddressMap = new TempDictionary(); MACMap = new TempDictionary(); // VMT Scanner issue workaround ARPPacket.VMTInclude(); ARPPacket_Ethernet.VMTInclude(); ARPReply_Ethernet.VMTInclude(); ARPRequest_Ethernet.VMTInclude(); ICMPPacket.VMTInclude(); ICMPEchoReply.VMTInclude(); ICMPEchoRequest.VMTInclude(); UDPPacket.VMTInclude(); //TCPPacket.VMTInclude(); } public static void SetConfigIP(NetworkDevice nic, IPv4.Config config) { NetworkConfig.Add(nic, config); AddressMap.Add(config.IPAddress.Hash, nic); MACMap.Add(nic.MACAddress.Hash, nic); IPv4.Config.Add(config); nic.DataReceived = HandlePacket; } /// /// Configure a IP configuration on the given network device. /// Multiple IP Configurations can be made, like *nix environments /// /// that will have the assigned configuration /// instance that defines the IP Address, Subnet /// Mask and Default Gateway for the device public static void ConfigIP(NetworkDevice nic, IPv4.Config config) { if (NetworkConfig.ContainsKey(nic)) { IPv4.Config toremove = NetworkConfig.Get(nic); AddressMap.Remove(toremove.IPAddress.Hash); MACMap.Remove(nic.MACAddress.Hash); IPv4.Config.Remove(config); NetworkConfig.Remove(nic); SetConfigIP(nic, config); } else { SetConfigIP(nic, config); } } public static void RemoveAllConfigIP() { AddressMap.Clear(); MACMap.Clear(); Config.RemoveAll(); NetworkConfig.Clear(); } internal static void HandlePacket(byte[] packetData) { debugger.Send("Packet Received Length=" + packetData.Length.ToString()); if (packetData == null) { debugger.Send("Error packet data null"); return; } UInt16 etherType = (UInt16)((packetData[12] << 8) | packetData[13]); switch (etherType) { case 0x0806: ARPPacket.ARPHandler(packetData); break; case 0x0800: IPPacket.IPv4Handler(packetData); break; } } /// /// Called continously to keep the Network Stack going. /// public static void Update() { OutgoingBuffer.Send(); } } }