mirror of
https://github.com/danbulant/Cosmos
synced 2026-05-24 12:35:31 +00:00
Network code cleanup.
This commit is contained in:
parent
a7f508af14
commit
acdc048402
7 changed files with 223 additions and 360 deletions
|
|
@ -1,18 +1,16 @@
|
||||||
using System;
|
using Cosmos.HAL;
|
||||||
using Cosmos.HAL.Network;
|
using Cosmos.HAL.Network;
|
||||||
using Sys = System;
|
|
||||||
using Cosmos.HAL;
|
|
||||||
using Cosmos.System.Network.IPv4;
|
using Cosmos.System.Network.IPv4;
|
||||||
|
|
||||||
namespace Cosmos.System.Network.ARP
|
namespace Cosmos.System.Network.ARP
|
||||||
{
|
{
|
||||||
internal class ARPPacket : EthernetPacket
|
internal class ARPPacket : EthernetPacket
|
||||||
{
|
{
|
||||||
protected UInt16 aHardwareType;
|
protected ushort aHardwareType;
|
||||||
protected UInt16 aProtocolType;
|
protected ushort aProtocolType;
|
||||||
protected byte aHardwareLen;
|
protected byte aHardwareLen;
|
||||||
protected byte aProtocolLen;
|
protected byte aProtocolLen;
|
||||||
protected UInt16 aOperation;
|
protected ushort aOperation;
|
||||||
|
|
||||||
internal static void ARPHandler(byte[] packetData)
|
internal static void ARPHandler(byte[] packetData)
|
||||||
{
|
{
|
||||||
|
|
@ -78,41 +76,32 @@ namespace Cosmos.System.Network.ARP
|
||||||
protected override void initFields()
|
protected override void initFields()
|
||||||
{
|
{
|
||||||
base.initFields();
|
base.initFields();
|
||||||
aHardwareType = (UInt16)((mRawData[14] << 8) | mRawData[15]);
|
aHardwareType = (ushort)((RawData[14] << 8) | RawData[15]);
|
||||||
aProtocolType = (UInt16)((mRawData[16] << 8) | mRawData[17]);
|
aProtocolType = (ushort)((RawData[16] << 8) | RawData[17]);
|
||||||
aHardwareLen = mRawData[18];
|
aHardwareLen = RawData[18];
|
||||||
aProtocolLen = mRawData[19];
|
aProtocolLen = RawData[19];
|
||||||
aOperation = (UInt16)((mRawData[20] << 8) | mRawData[21]);
|
aOperation = (ushort)((RawData[20] << 8) | RawData[21]);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ARPPacket(MACAddress dest, MACAddress src, UInt16 hwType, UInt16 protoType,
|
protected ARPPacket(MACAddress dest, MACAddress src, ushort hwType, ushort protoType,
|
||||||
byte hwLen, byte protoLen, UInt16 operation, int packet_size)
|
byte hwLen, byte protoLen, ushort operation, int packet_size)
|
||||||
: base(dest, src, 0x0806, packet_size)
|
: base(dest, src, 0x0806, packet_size)
|
||||||
{
|
{
|
||||||
mRawData[14] = (byte)(hwType >> 8);
|
RawData[14] = (byte)(hwType >> 8);
|
||||||
mRawData[15] = (byte)(hwType >> 0);
|
RawData[15] = (byte)(hwType >> 0);
|
||||||
mRawData[16] = (byte)(protoType >> 8);
|
RawData[16] = (byte)(protoType >> 8);
|
||||||
mRawData[17] = (byte)(protoType >> 0);
|
RawData[17] = (byte)(protoType >> 0);
|
||||||
mRawData[18] = hwLen;
|
RawData[18] = hwLen;
|
||||||
mRawData[19] = protoLen;
|
RawData[19] = protoLen;
|
||||||
mRawData[20] = (byte)(operation >> 8);
|
RawData[20] = (byte)(operation >> 8);
|
||||||
mRawData[21] = (byte)(operation >> 0);
|
RawData[21] = (byte)(operation >> 0);
|
||||||
|
|
||||||
initFields();
|
initFields();
|
||||||
}
|
}
|
||||||
|
|
||||||
internal UInt16 Operation
|
internal ushort Operation => aOperation;
|
||||||
{
|
internal ushort HardwareType => aHardwareType;
|
||||||
get { return this.aOperation; }
|
internal ushort ProtocolType => aProtocolType;
|
||||||
}
|
|
||||||
internal UInt16 HardwareType
|
|
||||||
{
|
|
||||||
get { return this.aHardwareType; }
|
|
||||||
}
|
|
||||||
internal UInt16 ProtocolType
|
|
||||||
{
|
|
||||||
get { return this.aProtocolType; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -6,84 +6,73 @@ namespace Cosmos.System.Network
|
||||||
// for more info, http://standards.ieee.org/about/get/802/802.3.html
|
// for more info, http://standards.ieee.org/about/get/802/802.3.html
|
||||||
public class EthernetPacket
|
public class EthernetPacket
|
||||||
{
|
{
|
||||||
protected byte[] mRawData;
|
|
||||||
protected MACAddress srcMAC;
|
protected MACAddress srcMAC;
|
||||||
protected MACAddress destMAC;
|
protected MACAddress destMAC;
|
||||||
protected UInt16 aEtherType;
|
|
||||||
|
|
||||||
protected EthernetPacket()
|
protected EthernetPacket()
|
||||||
{ }
|
{
|
||||||
|
}
|
||||||
|
|
||||||
protected EthernetPacket(byte[] rawData)
|
protected EthernetPacket(byte[] rawData)
|
||||||
{
|
{
|
||||||
mRawData = rawData;
|
RawData = rawData;
|
||||||
initFields();
|
initFields();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected virtual void initFields()
|
protected virtual void initFields()
|
||||||
{
|
{
|
||||||
destMAC = new MACAddress(mRawData, 0);
|
destMAC = new MACAddress(RawData, 0);
|
||||||
srcMAC = new MACAddress(mRawData, 6);
|
srcMAC = new MACAddress(RawData, 6);
|
||||||
aEtherType = (UInt16)((mRawData[12] << 8) | mRawData[13]);
|
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)
|
: 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++)
|
for (int i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
mRawData[i] = dest.bytes[i];
|
RawData[i] = dest.bytes[i];
|
||||||
mRawData[6 + i] = src.bytes[i];
|
RawData[6 + i] = src.bytes[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
mRawData[12] = (byte)(type >> 8);
|
RawData[12] = (byte)(type >> 8);
|
||||||
mRawData[13] = (byte)(type >> 0);
|
RawData[13] = (byte)(type >> 0);
|
||||||
initFields();
|
initFields();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
internal byte[] RawData { get; }
|
||||||
|
|
||||||
internal MACAddress SourceMAC
|
internal MACAddress SourceMAC
|
||||||
{
|
{
|
||||||
get { return this.srcMAC; }
|
get => srcMAC;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 6; i++)
|
for (int i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
mRawData[6 + i] = value.bytes[i];
|
RawData[6 + i] = value.bytes[i];
|
||||||
}
|
}
|
||||||
initFields();
|
initFields();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
internal MACAddress DestinationMAC
|
internal MACAddress DestinationMAC
|
||||||
{
|
{
|
||||||
get { return this.destMAC; }
|
get => destMAC;
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 6; i++)
|
for (int i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
mRawData[i] = value.bytes[i];
|
RawData[i] = value.bytes[i];
|
||||||
}
|
}
|
||||||
initFields();
|
initFields();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
internal UInt16 EthernetType
|
|
||||||
{
|
|
||||||
get { return this.aEtherType; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public byte[] GetBytes()
|
internal ushort EthernetType { get; private set; }
|
||||||
{
|
|
||||||
return this.mRawData;
|
|
||||||
}
|
|
||||||
|
|
||||||
public byte[] RawData
|
|
||||||
{
|
|
||||||
get { return this.mRawData; }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Calculate any checksums
|
/// Calculate any checksums
|
||||||
|
|
@ -96,7 +85,7 @@ namespace Cosmos.System.Network
|
||||||
|
|
||||||
public override string ToString()
|
public override string ToString()
|
||||||
{
|
{
|
||||||
return "Ethernet Packet : Src=" + srcMAC + ", Dest=" + destMAC + ", Type=" + aEtherType;
|
return "Ethernet Packet : Src=" + srcMAC + ", Dest=" + destMAC + ", Type=" + EthernetType;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -23,14 +23,14 @@ namespace Cosmos.System.Network.IPv4
|
||||||
protected override void initFields()
|
protected override void initFields()
|
||||||
{
|
{
|
||||||
base.initFields();
|
base.initFields();
|
||||||
mSenderMAC = new MACAddress(mRawData, 22);
|
mSenderMAC = new MACAddress(RawData, 22);
|
||||||
mSenderIP = new Address(mRawData, 28);
|
mSenderIP = new Address(RawData, 28);
|
||||||
if (SenderIP == null)
|
if (SenderIP == null)
|
||||||
{
|
{
|
||||||
NetworkStack.debugger.Send("But its already null again");
|
NetworkStack.debugger.Send("But its already null again");
|
||||||
}
|
}
|
||||||
mTargetMAC = new MACAddress(mRawData, 32);
|
mTargetMAC = new MACAddress(RawData, 32);
|
||||||
mTargetIP = new Address(mRawData, 38);
|
mTargetIP = new Address(RawData, 38);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected ARPPacket_Ethernet(UInt16 operation, MACAddress senderMAC, Address senderIP,
|
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++)
|
for (int i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
mRawData[22 + i] = senderMAC.bytes[i];
|
RawData[22 + i] = senderMAC.bytes[i];
|
||||||
mRawData[32 + i] = arpTargetMAC.bytes[i];
|
RawData[32 + i] = arpTargetMAC.bytes[i];
|
||||||
}
|
}
|
||||||
for (int i = 0; i < 4; i++)
|
for (int i = 0; i < 4; i++)
|
||||||
{
|
{
|
||||||
mRawData[28 + i] = senderIP.address[i];
|
RawData[28 + i] = senderIP.address[i];
|
||||||
mRawData[38 + i] = targetIP.address[i];
|
RawData[38 + i] = targetIP.address[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
initFields();
|
initFields();
|
||||||
|
|
|
||||||
|
|
@ -9,12 +9,7 @@ namespace Cosmos.System.Network.IPv4
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class Config
|
public class Config
|
||||||
{
|
{
|
||||||
internal static List<Config> ipConfigs;
|
private static readonly List<Config> ipConfigs = new List<Config>();
|
||||||
|
|
||||||
static Config()
|
|
||||||
{
|
|
||||||
ipConfigs = new List<Config>();
|
|
||||||
}
|
|
||||||
|
|
||||||
internal static void Add(Config config)
|
internal static void Add(Config config)
|
||||||
{
|
{
|
||||||
|
|
@ -73,10 +68,6 @@ namespace Cosmos.System.Network.IPv4
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected Address address;
|
|
||||||
protected Address defaultGateway;
|
|
||||||
protected Address subnetMask;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a IPv4 Configuration with no default gateway
|
/// Create a IPv4 Configuration with no default gateway
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
@ -84,7 +75,8 @@ namespace Cosmos.System.Network.IPv4
|
||||||
/// <param name="subnet">Subnet Mask</param>
|
/// <param name="subnet">Subnet Mask</param>
|
||||||
public Config(Address ip, Address subnet)
|
public Config(Address ip, Address subnet)
|
||||||
: this(ip, subnet, Address.Zero)
|
: this(ip, subnet, Address.Zero)
|
||||||
{ }
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Create a IPv4 Configuration
|
/// Create a IPv4 Configuration
|
||||||
|
|
@ -94,22 +86,13 @@ namespace Cosmos.System.Network.IPv4
|
||||||
/// <param name="gw">Default gateway</param>
|
/// <param name="gw">Default gateway</param>
|
||||||
public Config(Address ip, Address subnet, Address gw)
|
public Config(Address ip, Address subnet, Address gw)
|
||||||
{
|
{
|
||||||
this.address = ip;
|
IPAddress = ip;
|
||||||
this.subnetMask = subnet;
|
SubnetMask = subnet;
|
||||||
this.defaultGateway = gw;
|
DefaultGateway = gw;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Address IPAddress
|
public Address IPAddress { get; }
|
||||||
{
|
public Address SubnetMask { get; }
|
||||||
get { return this.address; }
|
public Address DefaultGateway { get; }
|
||||||
}
|
|
||||||
public Address SubnetMask
|
|
||||||
{
|
|
||||||
get { return this.subnetMask; }
|
|
||||||
}
|
|
||||||
public Address DefaultGateway
|
|
||||||
{
|
|
||||||
get { return this.defaultGateway; }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,4 @@
|
||||||
using System;
|
using System;
|
||||||
using Sys = System;
|
|
||||||
|
|
||||||
namespace Cosmos.System.Network.IPv4
|
namespace Cosmos.System.Network.IPv4
|
||||||
{
|
{
|
||||||
|
|
@ -41,7 +40,8 @@ namespace Cosmos.System.Network.IPv4
|
||||||
|
|
||||||
internal ICMPPacket()
|
internal ICMPPacket()
|
||||||
: base()
|
: base()
|
||||||
{ }
|
{
|
||||||
|
}
|
||||||
|
|
||||||
internal ICMPPacket(byte[] rawData)
|
internal ICMPPacket(byte[] rawData)
|
||||||
: base(rawData)
|
: base(rawData)
|
||||||
|
|
@ -52,50 +52,38 @@ namespace Cosmos.System.Network.IPv4
|
||||||
{
|
{
|
||||||
//Sys.Console.WriteLine("ICMPPacket.initFields() called;");
|
//Sys.Console.WriteLine("ICMPPacket.initFields() called;");
|
||||||
base.initFields();
|
base.initFields();
|
||||||
icmpType = mRawData[this.dataOffset];
|
icmpType = RawData[DataOffset];
|
||||||
icmpCode = mRawData[this.dataOffset + 1];
|
icmpCode = RawData[DataOffset + 1];
|
||||||
icmpCRC = (UInt16)((mRawData[this.dataOffset + 2] << 8) | mRawData[this.dataOffset + 3]);
|
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)
|
: base(icmpDataSize, 1, source, dest, 0x00)
|
||||||
{
|
{
|
||||||
mRawData[this.dataOffset] = type;
|
RawData[DataOffset] = type;
|
||||||
mRawData[this.dataOffset + 1] = code;
|
RawData[DataOffset + 1] = code;
|
||||||
mRawData[this.dataOffset + 2] = 0x00;
|
RawData[DataOffset + 2] = 0x00;
|
||||||
mRawData[this.dataOffset + 3] = 0x00;
|
RawData[DataOffset + 3] = 0x00;
|
||||||
mRawData[this.dataOffset + 4] = (byte)((id >> 8) & 0xFF);
|
RawData[DataOffset + 4] = (byte)((id >> 8) & 0xFF);
|
||||||
mRawData[this.dataOffset + 5] = (byte)((id >> 0) & 0xFF);
|
RawData[DataOffset + 5] = (byte)((id >> 0) & 0xFF);
|
||||||
mRawData[this.dataOffset + 6] = (byte)((seq >> 8) & 0xFF);
|
RawData[DataOffset + 6] = (byte)((seq >> 8) & 0xFF);
|
||||||
mRawData[this.dataOffset + 7] = (byte)((seq >> 0) & 0xFF);
|
RawData[DataOffset + 7] = (byte)((seq >> 0) & 0xFF);
|
||||||
|
|
||||||
icmpCRC = CalcICMPCRC((UInt16)(icmpDataSize + 8));
|
icmpCRC = CalcICMPCRC((ushort)(icmpDataSize + 8));
|
||||||
mRawData[this.dataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF);
|
RawData[DataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF);
|
||||||
mRawData[this.dataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF);
|
RawData[DataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF);
|
||||||
initFields();
|
initFields();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected UInt16 CalcICMPCRC(UInt16 length)
|
protected ushort CalcICMPCRC(ushort length)
|
||||||
{
|
{
|
||||||
return CalcOcCRC(this.dataOffset, length);
|
return CalcOcCRC(DataOffset, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal byte ICMP_Type
|
internal byte ICMP_Type => icmpType;
|
||||||
{
|
internal byte ICMP_Code => icmpCode;
|
||||||
get { return this.icmpType; }
|
internal ushort ICMP_CRC => icmpCRC;
|
||||||
}
|
internal ushort ICMP_DataLength => (ushort)(DataLength - 8);
|
||||||
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[] GetICMPData()
|
internal byte[] GetICMPData()
|
||||||
{
|
{
|
||||||
|
|
@ -103,7 +91,7 @@ namespace Cosmos.System.Network.IPv4
|
||||||
|
|
||||||
for (int b = 0; b < ICMP_DataLength; b++)
|
for (int b = 0; b < ICMP_DataLength; b++)
|
||||||
{
|
{
|
||||||
data[b] = mRawData[this.dataOffset + 8 + b];
|
data[b] = RawData[DataOffset + 8 + b];
|
||||||
}
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
|
|
@ -111,37 +99,37 @@ namespace Cosmos.System.Network.IPv4
|
||||||
|
|
||||||
public override string ToString()
|
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
|
internal class ICMPEchoRequest : ICMPPacket
|
||||||
{
|
{
|
||||||
protected UInt16 icmpID;
|
protected ushort icmpID;
|
||||||
protected UInt16 icmpSequence;
|
protected ushort icmpSequence;
|
||||||
|
|
||||||
internal ICMPEchoRequest()
|
internal ICMPEchoRequest()
|
||||||
: base()
|
{
|
||||||
{ }
|
}
|
||||||
|
|
||||||
internal ICMPEchoRequest(byte[] rawData)
|
internal ICMPEchoRequest(byte[] rawData)
|
||||||
: base(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)
|
: 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;
|
RawData[DataOffset + 2] = 0x00;
|
||||||
mRawData[this.dataOffset + 3] = 0x00;
|
RawData[DataOffset + 3] = 0x00;
|
||||||
icmpCRC = CalcICMPCRC((UInt16)(this.ICMP_DataLength + 8));
|
icmpCRC = CalcICMPCRC((ushort)(ICMP_DataLength + 8));
|
||||||
mRawData[this.dataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF);
|
RawData[DataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF);
|
||||||
mRawData[this.dataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF);
|
RawData[DataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
@ -156,32 +144,26 @@ namespace Cosmos.System.Network.IPv4
|
||||||
{
|
{
|
||||||
//Sys.Console.WriteLine("ICMPEchoRequest.initFields() called;");
|
//Sys.Console.WriteLine("ICMPEchoRequest.initFields() called;");
|
||||||
base.initFields();
|
base.initFields();
|
||||||
icmpID = (UInt16)((mRawData[this.dataOffset + 4] << 8) | mRawData[this.dataOffset + 5]);
|
icmpID = (ushort)((RawData[DataOffset + 4] << 8) | RawData[DataOffset + 5]);
|
||||||
icmpSequence = (UInt16)((mRawData[this.dataOffset + 6] << 8) | mRawData[this.dataOffset + 7]);
|
icmpSequence = (ushort)((RawData[DataOffset + 6] << 8) | RawData[DataOffset + 7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal UInt16 ICMP_ID
|
internal ushort ICMP_ID => icmpID;
|
||||||
{
|
internal ushort ICMP_Sequence => icmpSequence;
|
||||||
get { return this.icmpID; }
|
|
||||||
}
|
|
||||||
internal UInt16 ICMP_Sequence
|
|
||||||
{
|
|
||||||
get { return this.icmpSequence; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
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
|
internal class ICMPEchoReply : ICMPPacket
|
||||||
{
|
{
|
||||||
protected UInt16 icmpID;
|
protected ushort icmpID;
|
||||||
protected UInt16 icmpSequence;
|
protected ushort icmpSequence;
|
||||||
|
|
||||||
internal ICMPEchoReply()
|
internal ICMPEchoReply()
|
||||||
: base()
|
{
|
||||||
{ }
|
}
|
||||||
|
|
||||||
internal ICMPEchoReply(byte[] rawData)
|
internal ICMPEchoReply(byte[] rawData)
|
||||||
: base(rawData)
|
: base(rawData)
|
||||||
|
|
@ -200,38 +182,32 @@ namespace Cosmos.System.Network.IPv4
|
||||||
{
|
{
|
||||||
//Sys.Console.WriteLine("ICMPEchoReply.initFields() called;");
|
//Sys.Console.WriteLine("ICMPEchoReply.initFields() called;");
|
||||||
base.initFields();
|
base.initFields();
|
||||||
icmpID = (UInt16)((mRawData[this.dataOffset + 4] << 8) | mRawData[this.dataOffset + 5]);
|
icmpID = (ushort)((RawData[DataOffset + 4] << 8) | RawData[DataOffset + 5]);
|
||||||
icmpSequence = (UInt16)((mRawData[this.dataOffset + 6] << 8) | mRawData[this.dataOffset + 7]);
|
icmpSequence = (ushort)((RawData[DataOffset + 6] << 8) | RawData[DataOffset + 7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal ICMPEchoReply(ICMPEchoRequest request)
|
internal ICMPEchoReply(ICMPEchoRequest request)
|
||||||
: base(request.DestinationIP, request.SourceIP, 0, 0,
|
: 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;
|
RawData[DataOffset + 2] = 0x00;
|
||||||
mRawData[this.dataOffset + 3] = 0x00;
|
RawData[DataOffset + 3] = 0x00;
|
||||||
icmpCRC = CalcICMPCRC((UInt16)(this.ICMP_DataLength + 8));
|
icmpCRC = CalcICMPCRC((ushort)(ICMP_DataLength + 8));
|
||||||
mRawData[this.dataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF);
|
RawData[DataOffset + 2] = (byte)((icmpCRC >> 8) & 0xFF);
|
||||||
mRawData[this.dataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF);
|
RawData[DataOffset + 3] = (byte)((icmpCRC >> 0) & 0xFF);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal UInt16 ICMP_ID
|
internal UInt16 ICMP_ID => icmpID;
|
||||||
{
|
internal UInt16 ICMP_Sequence => icmpSequence;
|
||||||
get { return this.icmpID; }
|
|
||||||
}
|
|
||||||
internal UInt16 ICMP_Sequence
|
|
||||||
{
|
|
||||||
get { return this.icmpSequence; }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,29 +1,13 @@
|
||||||
using System;
|
using Cosmos.HAL.Network;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using Cosmos.HAL.Network;
|
|
||||||
using Cosmos.System.Network.ARP;
|
using Cosmos.System.Network.ARP;
|
||||||
|
|
||||||
namespace Cosmos.System.Network.IPv4
|
namespace Cosmos.System.Network.IPv4
|
||||||
{
|
{
|
||||||
public class IPPacket : EthernetPacket
|
public class IPPacket : EthernetPacket
|
||||||
{
|
{
|
||||||
protected byte ipVersion;
|
|
||||||
protected byte ipHeaderLength;
|
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)
|
internal static void IPv4Handler(byte[] packetData)
|
||||||
{
|
{
|
||||||
|
|
@ -54,156 +38,113 @@ namespace Cosmos.System.Network.IPv4
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UInt16 NextIPFragmentID
|
public static ushort NextIPFragmentID => sNextFragmentID++;
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
return sNextFragmentID++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
internal IPPacket()
|
internal IPPacket()
|
||||||
: base()
|
{
|
||||||
{ }
|
}
|
||||||
|
|
||||||
internal IPPacket(byte[] rawData)
|
internal IPPacket(byte[] rawData)
|
||||||
: base(rawData)
|
: base(rawData)
|
||||||
{ }
|
{
|
||||||
|
}
|
||||||
|
|
||||||
protected override void initFields()
|
protected override void initFields()
|
||||||
{
|
{
|
||||||
base.initFields();
|
base.initFields();
|
||||||
ipVersion = (byte)((mRawData[14] & 0xF0) >> 4);
|
IPVersion = (byte)((RawData[14] & 0xF0) >> 4);
|
||||||
ipHeaderLength = (byte)(mRawData[14] & 0x0F);
|
ipHeaderLength = (byte)(RawData[14] & 0x0F);
|
||||||
tos = mRawData[15];
|
TypeOfService = RawData[15];
|
||||||
ipLength = (UInt16)((mRawData[16] << 8) | mRawData[17]);
|
IPLength = (ushort)((RawData[16] << 8) | RawData[17]);
|
||||||
fragmentID = (UInt16)((mRawData[18] << 8) | mRawData[19]);
|
FragmentID = (ushort)((RawData[18] << 8) | RawData[19]);
|
||||||
flags = (byte)((mRawData[20] & 0xE0) >> 5);
|
Flags = (byte)((RawData[20] & 0xE0) >> 5);
|
||||||
fragmentOffset = (UInt16)(((mRawData[20] & 0x1F) << 8) | mRawData[21]);
|
FragmentOffset = (ushort)(((RawData[20] & 0x1F) << 8) | RawData[21]);
|
||||||
ttl = mRawData[22];
|
TTL = RawData[22];
|
||||||
proto = mRawData[23];
|
Protocol = RawData[23];
|
||||||
ipCRC = (UInt16)((mRawData[24] << 8) | mRawData[25]);
|
IPCRC = (ushort)((RawData[24] << 8) | RawData[25]);
|
||||||
sourceIP = new Address(mRawData, 26);
|
SourceIP = new Address(RawData, 26);
|
||||||
destIP = new Address(mRawData, 30);
|
DestinationIP = new Address(RawData, 30);
|
||||||
dataOffset = (UInt16)(14 + HeaderLength);
|
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)
|
: 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)
|
Address source, Address dest, byte Flags)
|
||||||
: base(destMAC, srcMAC, 0x0800, dataLength + 14 + 20)
|
: base(destMAC, srcMAC, 0x0800, dataLength + 14 + 20)
|
||||||
{
|
{
|
||||||
mRawData[14] = 0x45;
|
RawData[14] = 0x45;
|
||||||
mRawData[15] = 0;
|
RawData[15] = 0;
|
||||||
ipLength = (UInt16)(dataLength + 20);
|
IPLength = (ushort)(dataLength + 20);
|
||||||
ipHeaderLength = 5;
|
ipHeaderLength = 5;
|
||||||
|
|
||||||
mRawData[16] = (byte)((ipLength >> 8) & 0xFF);
|
RawData[16] = (byte)((IPLength >> 8) & 0xFF);
|
||||||
mRawData[17] = (byte)((ipLength >> 0) & 0xFF);
|
RawData[17] = (byte)((IPLength >> 0) & 0xFF);
|
||||||
fragmentID = NextIPFragmentID;
|
FragmentID = NextIPFragmentID;
|
||||||
mRawData[18] = (byte)((fragmentID >> 8) & 0xFF);
|
RawData[18] = (byte)((FragmentID >> 8) & 0xFF);
|
||||||
mRawData[19] = (byte)((fragmentID >> 0) & 0xFF);
|
RawData[19] = (byte)((FragmentID >> 0) & 0xFF);
|
||||||
mRawData[20] = Flags;
|
RawData[20] = Flags;
|
||||||
mRawData[21] = 0x00;
|
RawData[21] = 0x00;
|
||||||
mRawData[22] = 0x80;
|
RawData[22] = 0x80;
|
||||||
mRawData[23] = protocol;
|
RawData[23] = protocol;
|
||||||
mRawData[24] = 0x00;
|
RawData[24] = 0x00;
|
||||||
mRawData[25] = 0x00;
|
RawData[25] = 0x00;
|
||||||
for (int b = 0; b < 4; b++)
|
for (int b = 0; b < 4; b++)
|
||||||
{
|
{
|
||||||
mRawData[26 + b] = source.address[b];
|
RawData[26 + b] = source.address[b];
|
||||||
mRawData[30 + b] = dest.address[b];
|
RawData[30 + b] = dest.address[b];
|
||||||
}
|
}
|
||||||
ipCRC = CalcIPCRC(20);
|
IPCRC = CalcIPCRC(20);
|
||||||
mRawData[24] = (byte)((ipCRC >> 8) & 0xFF);
|
RawData[24] = (byte)((IPCRC >> 8) & 0xFF);
|
||||||
mRawData[25] = (byte)((ipCRC >> 0) & 0xFF);
|
RawData[25] = (byte)((IPCRC >> 0) & 0xFF);
|
||||||
|
|
||||||
initFields();
|
initFields();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected UInt16 CalcOcCRC(UInt16 offset, UInt16 length)
|
protected ushort CalcOcCRC(ushort offset, ushort length) => CalcOcCRC(RawData, offset, length);
|
||||||
{
|
|
||||||
return IPPacket.CalcOcCRC(this.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)));
|
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);
|
return CalcOcCRC(14, headerLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal byte IPVersion
|
internal byte IPVersion { get; private set; }
|
||||||
{
|
internal ushort HeaderLength => (ushort)(ipHeaderLength * 4);
|
||||||
get { return this.ipVersion; }
|
|
||||||
}
|
internal byte TypeOfService { get; private set; }
|
||||||
internal UInt16 HeaderLength
|
|
||||||
{
|
internal ushort IPLength { get; private set; }
|
||||||
get { return (UInt16)(this.ipHeaderLength * 4); }
|
internal ushort FragmentID { get; private set; }
|
||||||
}
|
internal byte Flags { get; private set; }
|
||||||
internal byte TypeOfService
|
internal ushort FragmentOffset { get; private set; }
|
||||||
{
|
internal byte TTL { get; private set; }
|
||||||
get { return this.tos; }
|
internal byte Protocol { get; private set; }
|
||||||
}
|
internal ushort IPCRC { get; private set; }
|
||||||
internal UInt16 IPLength
|
internal Address SourceIP { get; private set; }
|
||||||
{
|
internal Address DestinationIP { get; private set; }
|
||||||
get { return this.ipLength; }
|
internal ushort DataOffset { get; private set; }
|
||||||
}
|
|
||||||
internal UInt16 FragmentID
|
internal ushort DataLength => (ushort)(IPLength - HeaderLength);
|
||||||
{
|
|
||||||
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); }
|
|
||||||
}
|
|
||||||
|
|
||||||
public override string ToString()
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,11 @@
|
||||||
using System;
|
using System;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Sys = System;
|
|
||||||
|
|
||||||
namespace Cosmos.System.Network.IPv4
|
namespace Cosmos.System.Network.IPv4
|
||||||
{
|
{
|
||||||
public class UDPPacket : IPPacket
|
public class UDPPacket : IPPacket
|
||||||
{
|
{
|
||||||
protected UInt16 sourcePort;
|
private ushort udpCRC;
|
||||||
protected UInt16 destPort;
|
|
||||||
protected UInt16 udpLen;
|
|
||||||
protected UInt16 udpCRC;
|
|
||||||
|
|
||||||
public static string DHCP;
|
|
||||||
|
|
||||||
internal static void UDPHandler(byte[] packetData)
|
internal static void UDPHandler(byte[] packetData)
|
||||||
{
|
{
|
||||||
|
|
@ -81,7 +75,7 @@ namespace Cosmos.System.Network.IPv4
|
||||||
|
|
||||||
public static bool CheckCRC(UDPPacket packet)
|
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);
|
UInt16 calculatedcrc = Check(header, 0, header.Length);
|
||||||
//NetworkStack.debugger.Send("Calculated: 0x" + Utils.Conversion.DecToHex(calculatedcrc));
|
//NetworkStack.debugger.Send("Calculated: 0x" + Utils.Conversion.DecToHex(calculatedcrc));
|
||||||
//NetworkStack.debugger.Send("Received: 0x" + Utils.Conversion.DecToHex(packet.udpCRC));
|
//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)));
|
crc = (~((crc & 0xFFFF) + (crc >> 16)));
|
||||||
return (UInt16)crc;
|
return (ushort)crc;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -118,34 +112,35 @@ namespace Cosmos.System.Network.IPv4
|
||||||
}
|
}
|
||||||
|
|
||||||
internal UDPPacket()
|
internal UDPPacket()
|
||||||
: base()
|
{
|
||||||
{ }
|
}
|
||||||
|
|
||||||
public UDPPacket(byte[] rawData)
|
public UDPPacket(byte[] rawData)
|
||||||
: base(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);
|
public UDPPacket(Address source, Address dest, ushort srcPort, ushort destPort, byte[] data)
|
||||||
mRawData[this.dataOffset + 5] = (byte)((udpLen >> 0) & 0xFF);
|
: 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);
|
UInt16 calculatedcrc = Check(header, 0, header.Length);
|
||||||
|
|
||||||
mRawData[this.dataOffset + 6] = (byte)((calculatedcrc >> 8) & 0xFF);
|
RawData[DataOffset + 6] = (byte)((calculatedcrc >> 8) & 0xFF);
|
||||||
mRawData[this.dataOffset + 7] = (byte)((calculatedcrc >> 0) & 0xFF);
|
RawData[DataOffset + 7] = (byte)((calculatedcrc >> 0) & 0xFF);
|
||||||
|
|
||||||
for (int b = 0; b < data.Length; b++)
|
for (int b = 0; b < data.Length; b++)
|
||||||
{
|
{
|
||||||
mRawData[this.dataOffset + 8 + b] = data[b];
|
RawData[DataOffset + 8 + b] = data[b];
|
||||||
}
|
}
|
||||||
|
|
||||||
initFields();
|
initFields();
|
||||||
|
|
@ -154,37 +149,26 @@ namespace Cosmos.System.Network.IPv4
|
||||||
protected override void initFields()
|
protected override void initFields()
|
||||||
{
|
{
|
||||||
base.initFields();
|
base.initFields();
|
||||||
sourcePort = (UInt16)((mRawData[this.dataOffset] << 8) | mRawData[this.dataOffset + 1]);
|
SourcePort = (ushort)((RawData[DataOffset] << 8) | RawData[DataOffset + 1]);
|
||||||
destPort = (UInt16)((mRawData[this.dataOffset + 2] << 8) | mRawData[this.dataOffset + 3]);
|
DestinationPort = (ushort)((RawData[DataOffset + 2] << 8) | RawData[DataOffset + 3]);
|
||||||
udpLen = (UInt16)((mRawData[this.dataOffset + 4] << 8) | mRawData[this.dataOffset + 5]);
|
UDP_Length = (ushort)((RawData[DataOffset + 4] << 8) | RawData[DataOffset + 5]);
|
||||||
udpCRC = (UInt16)((mRawData[this.dataOffset + 6] << 8) | mRawData[this.dataOffset + 7]);
|
udpCRC = (ushort)((RawData[DataOffset + 6] << 8) | RawData[DataOffset + 7]);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal UInt16 DestinationPort
|
public ushort DestinationPort { get; private set; }
|
||||||
{
|
public ushort SourcePort { get; private set; }
|
||||||
get { return this.destPort; }
|
public ushort UDP_Length { get; private set; }
|
||||||
}
|
public ushort UDP_DataLength => (ushort)(UDP_Length - 8);
|
||||||
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); }
|
|
||||||
}
|
|
||||||
internal byte[] UDP_Data
|
internal byte[] UDP_Data
|
||||||
{
|
{
|
||||||
get
|
get
|
||||||
{
|
{
|
||||||
byte[] data = new byte[this.udpLen - 8];
|
byte[] data = new byte[UDP_DataLength];
|
||||||
|
|
||||||
for (int b = 0; b < data.Length; b++)
|
for (int b = 0; b < data.Length; b++)
|
||||||
{
|
{
|
||||||
data[b] = this.mRawData[this.dataOffset + 8 + b];
|
data[b] = RawData[DataOffset + 8 + b];
|
||||||
}
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
|
|
@ -193,7 +177,8 @@ namespace Cosmos.System.Network.IPv4
|
||||||
|
|
||||||
public override string ToString()
|
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue