From 93059552f8bec606bdcf6e7aa84d8b36ffccf1c6 Mon Sep 17 00:00:00 2001 From: Scalpel_cp <165da7fc5536ee16440a98f161bfa866a8b94595G55xazV5> Date: Fri, 2 May 2008 17:24:33 +0000 Subject: [PATCH] IPv4 - Endian changes --- .../NetworkLayer/IPv4/IPv4Packet.cs | 39 +++++++++++++++++-- source/FrodeTest/Shell/Session.cs | 4 ++ 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/source/Cosmos/Cosmos.Hardware/Network/TCPIPModel/NetworkLayer/IPv4/IPv4Packet.cs b/source/Cosmos/Cosmos.Hardware/Network/TCPIPModel/NetworkLayer/IPv4/IPv4Packet.cs index 923c8a48b..536f9d854 100644 --- a/source/Cosmos/Cosmos.Hardware/Network/TCPIPModel/NetworkLayer/IPv4/IPv4Packet.cs +++ b/source/Cosmos/Cosmos.Hardware/Network/TCPIPModel/NetworkLayer/IPv4/IPv4Packet.cs @@ -135,6 +135,10 @@ namespace Cosmos.Hardware.Network.TCPIPModel.NetworkLayer.IPv4 private byte[] GetHeaderBytes() { + //TODO - the following things don't work (because of endianism) + // Identification + Flags + Fragment Offset + // Header Checksum + List bytes = new List(); List fields = new List(); @@ -144,12 +148,14 @@ namespace Cosmos.Hardware.Network.TCPIPModel.NetworkLayer.IPv4 //field1 = ConvertToBigEndian(field1); fields.Add(field1); - UInt32 field2 = (UInt32)((this.Identification << 8) | (((byte)(this.FragmentFlags)) << 21) | (byte)(this.FragmentOffset << 24)); //TODO: FragmentOffset should be 13 bits. + //UInt32 field2 = (UInt32)((this.Identification << 8) | (((byte)(this.FragmentFlags)) << 21) | (byte)(this.FragmentOffset << 24)); //TODO: FragmentOffset should be 13 bits. //fields.Add(ConvertToBigEndian(field2)); - fields.Add(field2); + UInt32 field2 = (UInt32)((this.Identification << 8) | ((byte)(this.FragmentFlags)) << 21 | (this.FragmentOffset << 24)); + //field2 = (UInt32)System.Net.IPAddress.HostToNetworkOrder(field2); + fields.Add((UInt32)HostToNetworkOrder((int)field2)); - UInt32 field3 = (UInt32)((this.TimeToLive << 0) | (((byte)(this.Protocol)) << 8) | (this.HeaderChecksum << 24)); - //fields.Add(ConvertToBigEndian(field3)); + UInt32 field3 = (UInt32)((this.TimeToLive << 0) | (((byte)(this.Protocol)) << 8) | (UInt16)(this.HeaderChecksum << 16)); + //field3 = ConvertToBigEndian(field3); fields.Add(field3); //Split the 32-bit words into bytes @@ -352,6 +358,31 @@ namespace Cosmos.Hardware.Network.TCPIPModel.NetworkLayer.IPv4 return bin.FromBinary(); } + public short HostToNetworkOrder(short host) + { + throw new NotImplementedException(); + } + + private static int HostToNetworkOrder(int n) + { + string bin = n.ToBinary(); + bin = bin.PadLeft(32, '0'); + + string first = bin.Substring(0, 8); + string second = bin.Substring(8, 8); + string third = bin.Substring(16, 8); + string fourth = bin.Substring(24, 8); + + bin = fourth + third + second + first; + + return (int)bin.FromBinary(); + } + + public long HostToNetworkOrder(long host) + { + throw new NotImplementedException(); + } + #endregion #region Enumerations diff --git a/source/FrodeTest/Shell/Session.cs b/source/FrodeTest/Shell/Session.cs index c1120dde8..28075f47a 100644 --- a/source/FrodeTest/Shell/Session.cs +++ b/source/FrodeTest/Shell/Session.cs @@ -30,6 +30,10 @@ namespace FrodeTest.Shell { Test.Ethernet2FrameTest.RunTest(); } + else if (command.Equals("ip")) + { + Test.IPv4Test.RunTest(); + } else if (command.Equals("load")) { var list = RTL8139.FindAll();