Cosmos/source/Boot/Playgrounds/Kudzu/KudzuTest/Frame.cs
kudzu_cp f7bf0074ba
2008-06-23 01:24:06 +00:00

100 lines
3.3 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
namespace KudzuTest {
public class Frame {
public byte[] mData;
public Frame() {
}
public void InitTest() {
mData = new byte[43];
// Ethernet - Destination
mData[0] = 0xFF;
mData[1] = 0xFF;
mData[2] = 0xFF;
mData[3] = 0xFF;
mData[4] = 0xFF;
mData[5] = 0xFF;
// Ethernet - Source
mData[6] = 0x00;
mData[7] = 0x50;
mData[8] = 0x56;
mData[9] = 0x22;
mData[10] = 0x22;
mData[11] = 0x0d;
// Ethernet - Type - 0800 = IP
mData[12] = 0x08;
mData[13] = 0x00;
var xUDP = new Cosmos.Sys.Network.UDPPacket(
0x0A00020F // 10.0.2.15
, 0x0449
, 0xFFFFFFFF // 255.255.255.255, Broadcast
, 2222
, new byte[] { 0x16 });
var xUDPData = xUDP.GetData();
xUDPData.CopyTo(mData, 14);
}
public void SetEthSrcMAC(byte aMAC1, byte aMAC2, byte aMAC3, byte aMAC4, byte aMAC5, byte aMAC6) {
mData[6] = aMAC1;
mData[7] = aMAC2;
mData[8] = aMAC3;
mData[9] = aMAC4;
mData[10] = aMAC5;
mData[11] = aMAC6;
}
public UInt16 UpdateIPChecksum() {
mData[24] = 0;
mData[25] = 0;
// TODO: Change this to a ASM and use 32 bit addition
UInt32 xResult = 0;
// TODO: 20 doesnt take into account options
for (int i = 14; i < 34; i = i + 2) {
xResult += (UInt16)((mData[i] << 8) + mData[i + 1]);
}
xResult = (~((xResult & 0xFFFF) + (xResult >> 16)));
mData[24] = (byte)(xResult >> 8);
mData[25] = (byte)(xResult & 0xFF);
return (UInt16)xResult;
}
public UInt16 UpdateUDPChecksum() {
mData[40] = 0;
mData[41] = 0;
// TODO: Change this to a ASM and use 32 bit addition
UInt32 xResult = 0;
// TODO: Adjust for length and odd sizes
for (int i = 34; i < 42; i = i + 2) {
xResult += (UInt16)((mData[i] << 8) + mData[i + 1]);
}
// Data
xResult += (UInt16)((mData[42] << 8) + 0);
// Pseudo header
// --Protocol
// TODO: Change to actually iterate data
xResult += (UInt16)(mData[23]);
// --IP Source
xResult += (UInt16)((mData[26] << 8) + mData[27]);
xResult += (UInt16)((mData[28] << 8) + mData[29]);
// --IP Dest
xResult += (UInt16)((mData[30] << 8) + mData[31]);
xResult += (UInt16)((mData[32] << 8) + mData[33]);
// --UDP Length
xResult += (UInt16)((mData[38] << 8) + mData[39]);
xResult = (~((xResult & 0xFFFF) + (xResult >> 16)));
mData[40] = (byte)(xResult >> 8);
mData[41] = (byte)(xResult & 0xFF);
return (UInt16)xResult;
}
}
}