From acdc048402646371be4e484fefe0dc87083aa87c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Pedro?= Date: Sat, 20 Oct 2018 17:02:45 +0100 Subject: [PATCH] Network code cleanup. --- .../Cosmos.System2/Network/ARP/ARPPacket.cs | 55 ++--- .../Cosmos.System2/Network/EthernetPacket.cs | 53 ++--- .../Network/IPv4/ARPPacket_Ethernet.cs | 16 +- source/Cosmos.System2/Network/IPv4/Config.cs | 35 +--- .../Cosmos.System2/Network/IPv4/ICMPPacket.cs | 142 ++++++------- .../Cosmos.System2/Network/IPv4/IPPacket.cs | 191 ++++++------------ .../Network/IPv4/UDP/UDPPacket.cs | 91 ++++----- 7 files changed, 223 insertions(+), 360 deletions(-) diff --git a/source/Cosmos.System2/Network/ARP/ARPPacket.cs b/source/Cosmos.System2/Network/ARP/ARPPacket.cs index b7ded06a6..c54a2981a 100644 --- a/source/Cosmos.System2/Network/ARP/ARPPacket.cs +++ b/source/Cosmos.System2/Network/ARP/ARPPacket.cs @@ -1,18 +1,16 @@ -using System; +using Cosmos.HAL; using Cosmos.HAL.Network; -using Sys = System; -using Cosmos.HAL; using Cosmos.System.Network.IPv4; namespace Cosmos.System.Network.ARP { internal class ARPPacket : EthernetPacket { - protected UInt16 aHardwareType; - protected UInt16 aProtocolType; + protected ushort aHardwareType; + protected ushort aProtocolType; protected byte aHardwareLen; protected byte aProtocolLen; - protected UInt16 aOperation; + protected ushort aOperation; internal static void ARPHandler(byte[] packetData) { @@ -78,41 +76,32 @@ namespace Cosmos.System.Network.ARP protected override void initFields() { base.initFields(); - aHardwareType = (UInt16)((mRawData[14] << 8) | mRawData[15]); - aProtocolType = (UInt16)((mRawData[16] << 8) | mRawData[17]); - aHardwareLen = mRawData[18]; - aProtocolLen = mRawData[19]; - aOperation = (UInt16)((mRawData[20] << 8) | mRawData[21]); + aHardwareType = (ushort)((RawData[14] << 8) | RawData[15]); + aProtocolType = (ushort)((RawData[16] << 8) | RawData[17]); + aHardwareLen = RawData[18]; + aProtocolLen = RawData[19]; + aOperation = (ushort)((RawData[20] << 8) | RawData[21]); } - protected ARPPacket(MACAddress dest, MACAddress src, UInt16 hwType, UInt16 protoType, - byte hwLen, byte protoLen, UInt16 operation, int packet_size) + protected ARPPacket(MACAddress dest, MACAddress src, ushort hwType, ushort protoType, + byte hwLen, byte protoLen, ushort operation, int packet_size) : base(dest, src, 0x0806, packet_size) { - mRawData[14] = (byte)(hwType >> 8); - mRawData[15] = (byte)(hwType >> 0); - mRawData[16] = (byte)(protoType >> 8); - mRawData[17] = (byte)(protoType >> 0); - mRawData[18] = hwLen; - mRawData[19] = protoLen; - mRawData[20] = (byte)(operation >> 8); - mRawData[21] = (byte)(operation >> 0); + RawData[14] = (byte)(hwType >> 8); + RawData[15] = (byte)(hwType >> 0); + RawData[16] = (byte)(protoType >> 8); + RawData[17] = (byte)(protoType >> 0); + RawData[18] = hwLen; + RawData[19] = protoLen; + RawData[20] = (byte)(operation >> 8); + RawData[21] = (byte)(operation >> 0); initFields(); } - internal UInt16 Operation - { - get { return this.aOperation; } - } - internal UInt16 HardwareType - { - get { return this.aHardwareType; } - } - internal UInt16 ProtocolType - { - get { return this.aProtocolType; } - } + internal ushort Operation => aOperation; + internal ushort HardwareType => aHardwareType; + internal ushort ProtocolType => aProtocolType; public override string ToString() { diff --git a/source/Cosmos.System2/Network/EthernetPacket.cs b/source/Cosmos.System2/Network/EthernetPacket.cs index 037b47764..a10260e8a 100644 --- a/source/Cosmos.System2/Network/EthernetPacket.cs +++ b/source/Cosmos.System2/Network/EthernetPacket.cs @@ -6,84 +6,73 @@ namespace Cosmos.System.Network // for more info, http://standards.ieee.org/about/get/802/802.3.html public class EthernetPacket { - protected byte[] mRawData; protected MACAddress srcMAC; protected MACAddress destMAC; - protected UInt16 aEtherType; protected EthernetPacket() - { } + { + } protected EthernetPacket(byte[] rawData) { - mRawData = rawData; + RawData = rawData; initFields(); } protected virtual void initFields() { - destMAC = new MACAddress(mRawData, 0); - srcMAC = new MACAddress(mRawData, 6); - aEtherType = (UInt16)((mRawData[12] << 8) | mRawData[13]); + destMAC = new MACAddress(RawData, 0); + srcMAC = new MACAddress(RawData, 6); + EthernetType = (ushort)((RawData[12] << 8) | RawData[13]); } - protected EthernetPacket(UInt16 type, int packet_size) + protected EthernetPacket(ushort type, int packet_size) : this(MACAddress.None, MACAddress.None, type, packet_size) { } - protected EthernetPacket(MACAddress dest, MACAddress src, UInt16 type, int packet_size) + protected EthernetPacket(MACAddress dest, MACAddress src, ushort type, int packet_size) { - mRawData = new byte[packet_size]; + RawData = new byte[packet_size]; for (int i = 0; i < 6; i++) { - mRawData[i] = dest.bytes[i]; - mRawData[6 + i] = src.bytes[i]; + RawData[i] = dest.bytes[i]; + RawData[6 + i] = src.bytes[i]; } - mRawData[12] = (byte)(type >> 8); - mRawData[13] = (byte)(type >> 0); + RawData[12] = (byte)(type >> 8); + RawData[13] = (byte)(type >> 0); initFields(); } + internal byte[] RawData { get; } + internal MACAddress SourceMAC { - get { return this.srcMAC; } + get => srcMAC; set { for (int i = 0; i < 6; i++) { - mRawData[6 + i] = value.bytes[i]; + RawData[6 + i] = value.bytes[i]; } initFields(); } } internal MACAddress DestinationMAC { - get { return this.destMAC; } + get => destMAC; set { for (int i = 0; i < 6; i++) { - mRawData[i] = value.bytes[i]; + RawData[i] = value.bytes[i]; } initFields(); } } - internal UInt16 EthernetType - { - get { return this.aEtherType; } - } - public byte[] GetBytes() - { - return this.mRawData; - } - - public byte[] RawData - { - get { return this.mRawData; } - } + internal ushort EthernetType { get; private set; } /// /// Calculate any checksums @@ -96,7 +85,7 @@ namespace Cosmos.System.Network public override string ToString() { - return "Ethernet Packet : Src=" + srcMAC + ", Dest=" + destMAC + ", Type=" + aEtherType; + return "Ethernet Packet : Src=" + srcMAC + ", Dest=" + destMAC + ", Type=" + EthernetType; } } } diff --git a/source/Cosmos.System2/Network/IPv4/ARPPacket_Ethernet.cs b/source/Cosmos.System2/Network/IPv4/ARPPacket_Ethernet.cs index c6e547c37..019a852fa 100644 --- a/source/Cosmos.System2/Network/IPv4/ARPPacket_Ethernet.cs +++ b/source/Cosmos.System2/Network/IPv4/ARPPacket_Ethernet.cs @@ -23,14 +23,14 @@ namespace Cosmos.System.Network.IPv4 protected override void initFields() { base.initFields(); - mSenderMAC = new MACAddress(mRawData, 22); - mSenderIP = new Address(mRawData, 28); + mSenderMAC = new MACAddress(RawData, 22); + mSenderIP = new Address(RawData, 28); if (SenderIP == null) { NetworkStack.debugger.Send("But its already null again"); } - mTargetMAC = new MACAddress(mRawData, 32); - mTargetIP = new Address(mRawData, 38); + mTargetMAC = new MACAddress(RawData, 32); + mTargetIP = new Address(RawData, 38); } protected ARPPacket_Ethernet(UInt16 operation, MACAddress senderMAC, Address senderIP, @@ -39,13 +39,13 @@ namespace Cosmos.System.Network.IPv4 { for (int i = 0; i < 6; i++) { - mRawData[22 + i] = senderMAC.bytes[i]; - mRawData[32 + i] = arpTargetMAC.bytes[i]; + RawData[22 + i] = senderMAC.bytes[i]; + RawData[32 + i] = arpTargetMAC.bytes[i]; } for (int i = 0; i < 4; i++) { - mRawData[28 + i] = senderIP.address[i]; - mRawData[38 + i] = targetIP.address[i]; + RawData[28 + i] = senderIP.address[i]; + RawData[38 + i] = targetIP.address[i]; } initFields(); diff --git a/source/Cosmos.System2/Network/IPv4/Config.cs b/source/Cosmos.System2/Network/IPv4/Config.cs index a048e2e1a..ecbfd1ff0 100644 --- a/source/Cosmos.System2/Network/IPv4/Config.cs +++ b/source/Cosmos.System2/Network/IPv4/Config.cs @@ -9,12 +9,7 @@ namespace Cosmos.System.Network.IPv4 /// public class Config { - internal static List ipConfigs; - - static Config() - { - ipConfigs = new List(); - } + private static readonly List ipConfigs = new List(); internal static void Add(Config config) { @@ -73,10 +68,6 @@ namespace Cosmos.System.Network.IPv4 return null; } - protected Address address; - protected Address defaultGateway; - protected Address subnetMask; - /// /// Create a IPv4 Configuration with no default gateway /// @@ -84,7 +75,8 @@ namespace Cosmos.System.Network.IPv4 /// Subnet Mask public Config(Address ip, Address subnet) : this(ip, subnet, Address.Zero) - { } + { + } /// /// Create a IPv4 Configuration @@ -94,22 +86,13 @@ namespace Cosmos.System.Network.IPv4 /// Default gateway public Config(Address ip, Address subnet, Address gw) { - this.address = ip; - this.subnetMask = subnet; - this.defaultGateway = gw; + IPAddress = ip; + SubnetMask = subnet; + DefaultGateway = gw; } - public Address IPAddress - { - get { return this.address; } - } - public Address SubnetMask - { - get { return this.subnetMask; } - } - public Address DefaultGateway - { - get { return this.defaultGateway; } - } + public Address IPAddress { get; } + public Address SubnetMask { get; } + public Address DefaultGateway { get; } } } diff --git a/source/Cosmos.System2/Network/IPv4/ICMPPacket.cs b/source/Cosmos.System2/Network/IPv4/ICMPPacket.cs index ae1b6ec6f..9ebaa3e92 100644 --- a/source/Cosmos.System2/Network/IPv4/ICMPPacket.cs +++ b/source/Cosmos.System2/Network/IPv4/ICMPPacket.cs @@ -1,5 +1,4 @@ using System; -using Sys = System; namespace Cosmos.System.Network.IPv4 { @@ -41,7 +40,8 @@ namespace Cosmos.System.Network.IPv4 internal ICMPPacket() : base() - { } + { + } internal ICMPPacket(byte[] rawData) : base(rawData) @@ -52,50 +52,38 @@ namespace Cosmos.System.Network.IPv4 { //Sys.Console.WriteLine("ICMPPacket.initFields() called;"); base.initFields(); - icmpType = mRawData[this.dataOffset]; - icmpCode = mRawData[this.dataOffset + 1]; - icmpCRC = (UInt16)((mRawData[this.dataOffset + 2] << 8) | mRawData[this.dataOffset + 3]); + icmpType = RawData[DataOffset]; + icmpCode = RawData[DataOffset + 1]; + icmpCRC = (ushort)((RawData[DataOffset + 2] << 8) | RawData[DataOffset + 3]); } - internal ICMPPacket(Address source, Address dest, byte type, byte code, UInt16 id, UInt16 seq, UInt16 icmpDataSize) + internal ICMPPacket(Address source, Address dest, byte type, byte code, ushort id, ushort seq, ushort icmpDataSize) : base(icmpDataSize, 1, source, dest, 0x00) { - mRawData[this.dataOffset] = type; - mRawData[this.dataOffset + 1] = code; - mRawData[this.dataOffset + 2] = 0x00; - mRawData[this.dataOffset + 3] = 0x00; - mRawData[this.dataOffset + 4] = (byte)((id >> 8) & 0xFF); - mRawData[this.dataOffset + 5] = (byte)((id >> 0) & 0xFF); - mRawData[this.dataOffset + 6] = (byte)((seq >> 8) & 0xFF); - mRawData[this.dataOffset + 7] = (byte)((seq >> 0) & 0xFF); + RawData[DataOffset] = type; + RawData[DataOffset + 1] = code; + RawData[DataOffset + 2] = 0x00; + RawData[DataOffset + 3] = 0x00; + RawData[DataOffset + 4] = (byte)((id >> 8) & 0xFF); + RawData[DataOffset + 5] = (byte)((id >> 0) & 0xFF); + RawData[DataOffset + 6] = (byte)((seq >> 8) & 0xFF); + RawData[DataOffset + 7] = (byte)((seq >> 0) & 0xFF); - icmpCRC = CalcICMPCRC((UInt16)(icmpDataSize + 8)); - mRawData[this.dataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF); - mRawData[this.dataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF); + icmpCRC = CalcICMPCRC((ushort)(icmpDataSize + 8)); + RawData[DataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF); + RawData[DataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF); initFields(); } - protected UInt16 CalcICMPCRC(UInt16 length) + protected ushort CalcICMPCRC(ushort length) { - return CalcOcCRC(this.dataOffset, length); + return CalcOcCRC(DataOffset, length); } - internal byte ICMP_Type - { - get { return this.icmpType; } - } - internal byte ICMP_Code - { - get { return this.icmpCode; } - } - internal UInt16 ICMP_CRC - { - get { return this.icmpCRC; } - } - internal UInt16 ICMP_DataLength - { - get { return (UInt16)(this.DataLength - 8); } - } + internal byte ICMP_Type => icmpType; + internal byte ICMP_Code => icmpCode; + internal ushort ICMP_CRC => icmpCRC; + internal ushort ICMP_DataLength => (ushort)(DataLength - 8); internal byte[] GetICMPData() { @@ -103,7 +91,7 @@ namespace Cosmos.System.Network.IPv4 for (int b = 0; b < ICMP_DataLength; b++) { - data[b] = mRawData[this.dataOffset + 8 + b]; + data[b] = RawData[DataOffset + 8 + b]; } return data; @@ -111,37 +99,37 @@ namespace Cosmos.System.Network.IPv4 public override string ToString() { - return "ICMP Packet Src=" + sourceIP + ", Dest=" + destIP + ", Type=" + icmpType + ", Code=" + icmpCode; + return "ICMP Packet Src=" + SourceIP + ", Dest=" + DestinationIP + ", Type=" + icmpType + ", Code=" + icmpCode; } } internal class ICMPEchoRequest : ICMPPacket { - protected UInt16 icmpID; - protected UInt16 icmpSequence; + protected ushort icmpID; + protected ushort icmpSequence; internal ICMPEchoRequest() - : base() - { } + { + } internal ICMPEchoRequest(byte[] rawData) : base(rawData) { } - internal ICMPEchoRequest(Address source, Address dest, UInt16 id, UInt16 sequence) + internal ICMPEchoRequest(Address source, Address dest, ushort id, ushort sequence) : base(source, dest, 8, 0, id, sequence, 40) { - for (int b = 8; b < this.ICMP_DataLength; b++) + for (int b = 8; b < ICMP_DataLength; b++) { - mRawData[this.dataOffset + b] = (byte)b; + RawData[DataOffset + b] = (byte)b; } - mRawData[this.dataOffset + 2] = 0x00; - mRawData[this.dataOffset + 3] = 0x00; - icmpCRC = CalcICMPCRC((UInt16)(this.ICMP_DataLength + 8)); - mRawData[this.dataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF); - mRawData[this.dataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF); + RawData[DataOffset + 2] = 0x00; + RawData[DataOffset + 3] = 0x00; + icmpCRC = CalcICMPCRC((ushort)(ICMP_DataLength + 8)); + RawData[DataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF); + RawData[DataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF); } /// @@ -156,32 +144,26 @@ namespace Cosmos.System.Network.IPv4 { //Sys.Console.WriteLine("ICMPEchoRequest.initFields() called;"); base.initFields(); - icmpID = (UInt16)((mRawData[this.dataOffset + 4] << 8) | mRawData[this.dataOffset + 5]); - icmpSequence = (UInt16)((mRawData[this.dataOffset + 6] << 8) | mRawData[this.dataOffset + 7]); + icmpID = (ushort)((RawData[DataOffset + 4] << 8) | RawData[DataOffset + 5]); + icmpSequence = (ushort)((RawData[DataOffset + 6] << 8) | RawData[DataOffset + 7]); } - internal UInt16 ICMP_ID - { - get { return this.icmpID; } - } - internal UInt16 ICMP_Sequence - { - get { return this.icmpSequence; } - } + internal ushort ICMP_ID => icmpID; + internal ushort ICMP_Sequence => icmpSequence; public override string ToString() { - return "ICMP Echo Request Src=" + sourceIP + ", Dest=" + destIP + ", ID=" + icmpID + ", Sequence=" + icmpSequence; + return "ICMP Echo Request Src=" + SourceIP + ", Dest=" + DestinationIP + ", ID=" + icmpID + ", Sequence=" + icmpSequence; } } internal class ICMPEchoReply : ICMPPacket { - protected UInt16 icmpID; - protected UInt16 icmpSequence; + protected ushort icmpID; + protected ushort icmpSequence; internal ICMPEchoReply() - : base() - { } + { + } internal ICMPEchoReply(byte[] rawData) : base(rawData) @@ -200,38 +182,32 @@ namespace Cosmos.System.Network.IPv4 { //Sys.Console.WriteLine("ICMPEchoReply.initFields() called;"); base.initFields(); - icmpID = (UInt16)((mRawData[this.dataOffset + 4] << 8) | mRawData[this.dataOffset + 5]); - icmpSequence = (UInt16)((mRawData[this.dataOffset + 6] << 8) | mRawData[this.dataOffset + 7]); + icmpID = (ushort)((RawData[DataOffset + 4] << 8) | RawData[DataOffset + 5]); + icmpSequence = (ushort)((RawData[DataOffset + 6] << 8) | RawData[DataOffset + 7]); } internal ICMPEchoReply(ICMPEchoRequest request) : base(request.DestinationIP, request.SourceIP, 0, 0, - request.ICMP_ID, request.ICMP_Sequence, (UInt16)(request.ICMP_DataLength + 8)) + request.ICMP_ID, request.ICMP_Sequence, (ushort)(request.ICMP_DataLength + 8)) { - for (int b = 0; b < this.ICMP_DataLength; b++) + for (int b = 0; b < ICMP_DataLength; b++) { - mRawData[this.dataOffset + 8 + b] = request.RawData[this.dataOffset + 8 + b]; + RawData[DataOffset + 8 + b] = request.RawData[DataOffset + 8 + b]; } - mRawData[this.dataOffset + 2] = 0x00; - mRawData[this.dataOffset + 3] = 0x00; - icmpCRC = CalcICMPCRC((UInt16)(this.ICMP_DataLength + 8)); - mRawData[this.dataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF); - mRawData[this.dataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF); + RawData[DataOffset + 2] = 0x00; + RawData[DataOffset + 3] = 0x00; + icmpCRC = CalcICMPCRC((ushort)(ICMP_DataLength + 8)); + RawData[DataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF); + RawData[DataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF); } - internal UInt16 ICMP_ID - { - get { return this.icmpID; } - } - internal UInt16 ICMP_Sequence - { - get { return this.icmpSequence; } - } + internal UInt16 ICMP_ID => icmpID; + internal UInt16 ICMP_Sequence => icmpSequence; public override string ToString() { - return "ICMP Echo Reply Src=" + sourceIP + ", Dest=" + destIP + ", ID=" + icmpID + ", Sequence=" + icmpSequence; + return "ICMP Echo Reply Src=" + SourceIP + ", Dest=" + DestinationIP + ", ID=" + icmpID + ", Sequence=" + icmpSequence; } } } diff --git a/source/Cosmos.System2/Network/IPv4/IPPacket.cs b/source/Cosmos.System2/Network/IPv4/IPPacket.cs index be2c0b946..bd2f12c38 100644 --- a/source/Cosmos.System2/Network/IPv4/IPPacket.cs +++ b/source/Cosmos.System2/Network/IPv4/IPPacket.cs @@ -1,29 +1,13 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using Cosmos.HAL.Network; +using Cosmos.HAL.Network; using Cosmos.System.Network.ARP; namespace Cosmos.System.Network.IPv4 { public class IPPacket : EthernetPacket { - protected byte ipVersion; protected byte ipHeaderLength; - protected byte tos; - protected UInt16 ipLength; - protected UInt16 fragmentID; - protected UInt16 fragmentOffset; - protected byte flags; - protected byte ttl; - protected byte proto; - protected UInt16 ipCRC; - protected Address sourceIP; - protected Address destIP; - protected UInt16 dataOffset; - private static UInt16 sNextFragmentID; + private static ushort sNextFragmentID; internal static void IPv4Handler(byte[] packetData) { @@ -54,156 +38,113 @@ namespace Cosmos.System.Network.IPv4 } } - public static UInt16 NextIPFragmentID - { - get - { - return sNextFragmentID++; - } - } + public static ushort NextIPFragmentID => sNextFragmentID++; internal IPPacket() - : base() - { } + { + } internal IPPacket(byte[] rawData) : base(rawData) - { } + { + } protected override void initFields() { base.initFields(); - ipVersion = (byte)((mRawData[14] & 0xF0) >> 4); - ipHeaderLength = (byte)(mRawData[14] & 0x0F); - tos = mRawData[15]; - ipLength = (UInt16)((mRawData[16] << 8) | mRawData[17]); - fragmentID = (UInt16)((mRawData[18] << 8) | mRawData[19]); - flags = (byte)((mRawData[20] & 0xE0) >> 5); - fragmentOffset = (UInt16)(((mRawData[20] & 0x1F) << 8) | mRawData[21]); - ttl = mRawData[22]; - proto = mRawData[23]; - ipCRC = (UInt16)((mRawData[24] << 8) | mRawData[25]); - sourceIP = new Address(mRawData, 26); - destIP = new Address(mRawData, 30); - dataOffset = (UInt16)(14 + HeaderLength); + IPVersion = (byte)((RawData[14] & 0xF0) >> 4); + ipHeaderLength = (byte)(RawData[14] & 0x0F); + TypeOfService = RawData[15]; + IPLength = (ushort)((RawData[16] << 8) | RawData[17]); + FragmentID = (ushort)((RawData[18] << 8) | RawData[19]); + Flags = (byte)((RawData[20] & 0xE0) >> 5); + FragmentOffset = (ushort)(((RawData[20] & 0x1F) << 8) | RawData[21]); + TTL = RawData[22]; + Protocol = RawData[23]; + IPCRC = (ushort)((RawData[24] << 8) | RawData[25]); + SourceIP = new Address(RawData, 26); + DestinationIP = new Address(RawData, 30); + DataOffset = (ushort)(14 + HeaderLength); } - protected IPPacket(UInt16 dataLength, byte protocol, Address source, Address dest, byte Flags) + protected IPPacket(ushort dataLength, byte protocol, Address source, Address dest, byte Flags) : this(MACAddress.None, MACAddress.None, dataLength, protocol, source, dest, Flags) { } - public IPPacket(MACAddress srcMAC, MACAddress destMAC, UInt16 dataLength, byte protocol, + public IPPacket(MACAddress srcMAC, MACAddress destMAC, ushort dataLength, byte protocol, Address source, Address dest, byte Flags) : base(destMAC, srcMAC, 0x0800, dataLength + 14 + 20) { - mRawData[14] = 0x45; - mRawData[15] = 0; - ipLength = (UInt16)(dataLength + 20); + RawData[14] = 0x45; + RawData[15] = 0; + IPLength = (ushort)(dataLength + 20); ipHeaderLength = 5; - mRawData[16] = (byte)((ipLength >> 8) & 0xFF); - mRawData[17] = (byte)((ipLength >> 0) & 0xFF); - fragmentID = NextIPFragmentID; - mRawData[18] = (byte)((fragmentID >> 8) & 0xFF); - mRawData[19] = (byte)((fragmentID >> 0) & 0xFF); - mRawData[20] = Flags; - mRawData[21] = 0x00; - mRawData[22] = 0x80; - mRawData[23] = protocol; - mRawData[24] = 0x00; - mRawData[25] = 0x00; + RawData[16] = (byte)((IPLength >> 8) & 0xFF); + RawData[17] = (byte)((IPLength >> 0) & 0xFF); + FragmentID = NextIPFragmentID; + RawData[18] = (byte)((FragmentID >> 8) & 0xFF); + RawData[19] = (byte)((FragmentID >> 0) & 0xFF); + RawData[20] = Flags; + RawData[21] = 0x00; + RawData[22] = 0x80; + RawData[23] = protocol; + RawData[24] = 0x00; + RawData[25] = 0x00; for (int b = 0; b < 4; b++) { - mRawData[26 + b] = source.address[b]; - mRawData[30 + b] = dest.address[b]; + RawData[26 + b] = source.address[b]; + RawData[30 + b] = dest.address[b]; } - ipCRC = CalcIPCRC(20); - mRawData[24] = (byte)((ipCRC >> 8) & 0xFF); - mRawData[25] = (byte)((ipCRC >> 0) & 0xFF); + IPCRC = CalcIPCRC(20); + RawData[24] = (byte)((IPCRC >> 8) & 0xFF); + RawData[25] = (byte)((IPCRC >> 0) & 0xFF); initFields(); } - protected UInt16 CalcOcCRC(UInt16 offset, UInt16 length) - { - return IPPacket.CalcOcCRC(this.RawData, offset, length); - } + protected ushort CalcOcCRC(ushort offset, ushort length) => CalcOcCRC(RawData, offset, length); - protected static UInt16 CalcOcCRC(byte[] buffer, UInt16 offset, int length) + protected static ushort CalcOcCRC(byte[] buffer, ushort offset, int length) { - UInt32 crc = 0; + uint crc = 0; - for (UInt16 w = offset; w < offset + length; w += 2) + for (ushort w = offset; w < offset + length; w += 2) { - crc += (UInt16)((buffer[w] << 8) | buffer[w + 1]); + crc += (ushort)((buffer[w] << 8) | buffer[w + 1]); } crc = (~((crc & 0xFFFF) + (crc >> 16))); - return (UInt16)crc; + return (ushort)crc; } - protected UInt16 CalcIPCRC(UInt16 headerLength) + protected ushort CalcIPCRC(ushort headerLength) { return CalcOcCRC(14, headerLength); } - internal byte IPVersion - { - get { return this.ipVersion; } - } - internal UInt16 HeaderLength - { - get { return (UInt16)(this.ipHeaderLength * 4); } - } - internal byte TypeOfService - { - get { return this.tos; } - } - internal UInt16 IPLength - { - get { return this.ipLength; } - } - internal UInt16 FragmentID - { - get { return this.fragmentID; } - } - internal UInt16 FragmentOffset - { - get { return this.fragmentOffset; } - } - internal byte Flags - { - get { return this.flags; } - } - internal byte TTL - { - get { return this.ttl; } - } - internal byte Protocol - { - get { return this.proto; } - } - internal UInt16 IPCRC - { - get { return this.ipCRC; } - } - internal Address SourceIP - { - get { return this.sourceIP; } - } - internal Address DestinationIP - { - get { return this.destIP; } - } - internal UInt16 DataLength - { - get { return (UInt16)(this.ipLength - this.HeaderLength); } - } + internal byte IPVersion { get; private set; } + internal ushort HeaderLength => (ushort)(ipHeaderLength * 4); + + internal byte TypeOfService { get; private set; } + + internal ushort IPLength { get; private set; } + internal ushort FragmentID { get; private set; } + internal byte Flags { get; private set; } + internal ushort FragmentOffset { get; private set; } + internal byte TTL { get; private set; } + internal byte Protocol { get; private set; } + internal ushort IPCRC { get; private set; } + internal Address SourceIP { get; private set; } + internal Address DestinationIP { get; private set; } + internal ushort DataOffset { get; private set; } + + internal ushort DataLength => (ushort)(IPLength - HeaderLength); public override string ToString() { - return "IP Packet Src=" + sourceIP + ", Dest=" + destIP + ", Protocol=" + proto + ", TTL=" + ttl + ", DataLen=" + DataLength; + return "IP Packet Src=" + SourceIP + ", Dest=" + DestinationIP + ", Protocol=" + Protocol + ", TTL=" + TTL + ", DataLen=" + DataLength; } } } diff --git a/source/Cosmos.System2/Network/IPv4/UDP/UDPPacket.cs b/source/Cosmos.System2/Network/IPv4/UDP/UDPPacket.cs index 5eb5f5264..ab21c0e10 100644 --- a/source/Cosmos.System2/Network/IPv4/UDP/UDPPacket.cs +++ b/source/Cosmos.System2/Network/IPv4/UDP/UDPPacket.cs @@ -1,17 +1,11 @@ using System; using System.Text; -using Sys = System; namespace Cosmos.System.Network.IPv4 { public class UDPPacket : IPPacket { - protected UInt16 sourcePort; - protected UInt16 destPort; - protected UInt16 udpLen; - protected UInt16 udpCRC; - - public static string DHCP; + private ushort udpCRC; internal static void UDPHandler(byte[] packetData) { @@ -81,7 +75,7 @@ namespace Cosmos.System.Network.IPv4 public static bool CheckCRC(UDPPacket packet) { - byte[] header = MakeHeader(packet.sourceIP.address, packet.destIP.address, packet.udpLen, packet.sourcePort, packet.destPort, packet.UDP_Data); + byte[] header = MakeHeader(packet.SourceIP.address, packet.DestinationIP.address, packet.UDP_Length, packet.SourcePort, packet.DestinationPort, packet.UDP_Data); UInt16 calculatedcrc = Check(header, 0, header.Length); //NetworkStack.debugger.Send("Calculated: 0x" + Utils.Conversion.DecToHex(calculatedcrc)); //NetworkStack.debugger.Send("Received: 0x" + Utils.Conversion.DecToHex(packet.udpCRC)); @@ -95,17 +89,17 @@ namespace Cosmos.System.Network.IPv4 } } - protected static UInt16 Check(byte[] buffer, UInt16 offset, int length) + protected static ushort Check(byte[] buffer, ushort offset, int length) { - UInt32 crc = 0; + uint crc = 0; - for (UInt16 w = offset; w < offset + length; w += 2) + for (ushort w = offset; w < offset + length; w += 2) { - crc += (UInt16)((buffer[w] << 8) | buffer[w + 1]); + crc += (ushort)((buffer[w] << 8) | buffer[w + 1]); } crc = (~((crc & 0xFFFF) + (crc >> 16))); - return (UInt16)crc; + return (ushort)crc; } @@ -118,34 +112,35 @@ namespace Cosmos.System.Network.IPv4 } internal UDPPacket() - : base() - { } + { + } public UDPPacket(byte[] rawData) : base(rawData) - { } - - public UDPPacket(Address source, Address dest, UInt16 srcPort, UInt16 destPort, byte[] data) - : base((UInt16)(data.Length + 8), 17, source, dest, 0x00) { - mRawData[this.dataOffset + 0] = (byte)((srcPort >> 8) & 0xFF); - mRawData[this.dataOffset + 1] = (byte)((srcPort >> 0) & 0xFF); - mRawData[this.dataOffset + 2] = (byte)((destPort >> 8) & 0xFF); - mRawData[this.dataOffset + 3] = (byte)((destPort >> 0) & 0xFF); - udpLen = (UInt16)(data.Length + 8); + } - mRawData[this.dataOffset + 4] = (byte)((udpLen >> 8) & 0xFF); - mRawData[this.dataOffset + 5] = (byte)((udpLen >> 0) & 0xFF); + public UDPPacket(Address source, Address dest, ushort srcPort, ushort destPort, byte[] data) + : base((ushort)(data.Length + 8), 17, source, dest, 0x00) + { + RawData[DataOffset + 0] = (byte)((srcPort >> 8) & 0xFF); + RawData[DataOffset + 1] = (byte)((srcPort >> 0) & 0xFF); + RawData[DataOffset + 2] = (byte)((destPort >> 8) & 0xFF); + RawData[DataOffset + 3] = (byte)((destPort >> 0) & 0xFF); + UDP_Length = (ushort)(data.Length + 8); - byte[] header = MakeHeader(source.address, dest.address, udpLen, srcPort, destPort, data); + RawData[DataOffset + 4] = (byte)((UDP_Length >> 8) & 0xFF); + RawData[DataOffset + 5] = (byte)((UDP_Length >> 0) & 0xFF); + + byte[] header = MakeHeader(source.address, dest.address, UDP_Length, srcPort, destPort, data); UInt16 calculatedcrc = Check(header, 0, header.Length); - mRawData[this.dataOffset + 6] = (byte)((calculatedcrc >> 8) & 0xFF); - mRawData[this.dataOffset + 7] = (byte)((calculatedcrc >> 0) & 0xFF); + RawData[DataOffset + 6] = (byte)((calculatedcrc >> 8) & 0xFF); + RawData[DataOffset + 7] = (byte)((calculatedcrc >> 0) & 0xFF); for (int b = 0; b < data.Length; b++) { - mRawData[this.dataOffset + 8 + b] = data[b]; + RawData[DataOffset + 8 + b] = data[b]; } initFields(); @@ -154,37 +149,26 @@ namespace Cosmos.System.Network.IPv4 protected override void initFields() { base.initFields(); - sourcePort = (UInt16)((mRawData[this.dataOffset] << 8) | mRawData[this.dataOffset + 1]); - destPort = (UInt16)((mRawData[this.dataOffset + 2] << 8) | mRawData[this.dataOffset + 3]); - udpLen = (UInt16)((mRawData[this.dataOffset + 4] << 8) | mRawData[this.dataOffset + 5]); - udpCRC = (UInt16)((mRawData[this.dataOffset + 6] << 8) | mRawData[this.dataOffset + 7]); + SourcePort = (ushort)((RawData[DataOffset] << 8) | RawData[DataOffset + 1]); + DestinationPort = (ushort)((RawData[DataOffset + 2] << 8) | RawData[DataOffset + 3]); + UDP_Length = (ushort)((RawData[DataOffset + 4] << 8) | RawData[DataOffset + 5]); + udpCRC = (ushort)((RawData[DataOffset + 6] << 8) | RawData[DataOffset + 7]); } - internal UInt16 DestinationPort - { - get { return this.destPort; } - } - internal UInt16 SourcePort - { - get { return this.sourcePort; } - } - internal UInt16 UDP_Length - { - get { return this.udpLen; } - } - internal UInt16 UDP_DataLength - { - get { return (UInt16)(this.udpLen - 8); } - } + public ushort DestinationPort { get; private set; } + public ushort SourcePort { get; private set; } + public ushort UDP_Length { get; private set; } + public ushort UDP_DataLength => (ushort)(UDP_Length - 8); + internal byte[] UDP_Data { get { - byte[] data = new byte[this.udpLen - 8]; + byte[] data = new byte[UDP_DataLength]; for (int b = 0; b < data.Length; b++) { - data[b] = this.mRawData[this.dataOffset + 8 + b]; + data[b] = RawData[DataOffset + 8 + b]; } return data; @@ -193,7 +177,8 @@ namespace Cosmos.System.Network.IPv4 public override string ToString() { - return "UDP Packet Src=" + sourceIP + ":" + sourcePort + ", Dest=" + destIP + ":" + destPort + ", DataLen=" + UDP_DataLength; + return "UDP Packet Src=" + SourceIP + ":" + SourcePort + "," + + "Dest=" + DestinationIP + ":" + DestinationPort + ", DataLen=" + UDP_DataLength; } } }