diff --git a/source/Cosmos/Cosmos.System/Cosmos.Sys.csproj b/source/Cosmos/Cosmos.System/Cosmos.Sys.csproj
index 46ac95398..896f97886 100644
--- a/source/Cosmos/Cosmos.System/Cosmos.Sys.csproj
+++ b/source/Cosmos/Cosmos.System/Cosmos.Sys.csproj
@@ -49,6 +49,7 @@
+
diff --git a/source/Cosmos/Cosmos.System/Network/IP4Packet.cs b/source/Cosmos/Cosmos.System/Network/IP4Packet.cs
new file mode 100644
index 000000000..8d0648fd6
--- /dev/null
+++ b/source/Cosmos/Cosmos.System/Network/IP4Packet.cs
@@ -0,0 +1,16 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace Cosmos.Sys.Network {
+ public abstract class IP4Packet : Packet {
+ protected int mHeaderSize = 20;
+ protected int mHeaderBegin;
+
+ protected override int Initialize(byte[] aData, int aHeaderSize) {
+ mHeaderBegin = base.Initialize(aData, mHeaderSize + aHeaderSize);
+ return mHeaderBegin;
+ }
+ }
+}
diff --git a/source/Cosmos/Cosmos.System/Network/Packet.cs b/source/Cosmos/Cosmos.System/Network/Packet.cs
index 7fd50997f..bb3541063 100644
--- a/source/Cosmos/Cosmos.System/Network/Packet.cs
+++ b/source/Cosmos/Cosmos.System/Network/Packet.cs
@@ -11,16 +11,17 @@ namespace Cosmos.Sys.Network {
// user that it is not a direct access, but incurs a performance
// penalty to call
public byte[] GetData() {
- Finalize();
+ Conclude();
return mData;
}
- protected void Initialize(byte[] aData, int aHeaderSize) {
+ protected virtual int Initialize(byte[] aData, int aHeaderSize) {
mData = new byte[aData.Length + 8];
aData.CopyTo(mData, 8);
+ return 0;
}
- protected virtual void Finalize() {
+ protected virtual void Conclude() {
}
}
}
diff --git a/source/Cosmos/Cosmos.System/Network/UDPPacket.cs b/source/Cosmos/Cosmos.System/Network/UDPPacket.cs
index 971cbce13..0ae653ea2 100644
--- a/source/Cosmos/Cosmos.System/Network/UDPPacket.cs
+++ b/source/Cosmos/Cosmos.System/Network/UDPPacket.cs
@@ -5,26 +5,28 @@ using System.Text;
namespace Cosmos.Sys.Network {
// http://en.wikipedia.org/wiki/User_Datagram_Protocol
- public class UDPPacket : Packet {
+ public class UDPPacket : IP4Packet {
public UDPPacket(int aSrcPort, int aDestPort, byte[] aData) {
- Initialize(aData, 8);
+ mHeaderBegin = Initialize(aData, 8);
// Source Port
- mData[0] = (byte)(aSrcPort >> 8);
- mData[1] = (byte)(aSrcPort & 0xFF);
+ mData[mHeaderBegin] = (byte)(aSrcPort >> 8);
+ mData[mHeaderBegin + 1] = (byte)(aSrcPort & 0xFF);
// Destination Port
- mData[2] = (byte)(aDestPort >> 8);
- mData[3] = (byte)(aDestPort & 0xFF);
+ mData[mHeaderBegin + 2] = (byte)(aDestPort >> 8);
+ mData[mHeaderBegin + 3] = (byte)(aDestPort & 0xFF);
// Length
- mData[4] = (byte)(mData.Length >> 8);
- mData[5] = (byte)(mData.Length & 0xFF);
+ mData[mHeaderBegin + 4] = (byte)(mData.Length >> 8);
+ mData[mHeaderBegin + 5] = (byte)(mData.Length & 0xFF);
}
- protected override void Finalize() {
- base.Finalize();
+ protected new int mHeaderBegin = 0;
+
+ protected override void Conclude() {
+ base.Conclude();
// Checksum
//TODO: Uses info from IPHeader to create check sum as well
- mData[6] = 0;
- mData[7] = 0;
+ mData[mHeaderBegin + 6] = 0;
+ mData[mHeaderBegin + 7] = 0;
}
}
}