private void TransmitL2Packet(L2PacketType PacketType, Byte[] Parameter) { Byte[] OutgoingPacket = new Byte[8 + Parameter.Length]; OutgoingPacket[L2HeaderOffset] = L2PacketHeader; OutgoingPacket[L2PacketNumOffset] = (Byte)nPacketLastSent; OutgoingPacket[L2PacketAckOffset] = (Byte)nPacketLastSeen; OutgoingPacket[L2TypeOffset] = (Byte)PacketType; Parameter.CopyTo(OutgoingPacket, L2ParameterOffset); int nCalcCRC = compute_CRC(OutgoingPacket); OutgoingPacket[L2CRC1Offset] = (Byte)(((nCalcCRC >> 8) & 0xF0) | 0x01); OutgoingPacket[L2CRC2Offset] = (Byte)(((nCalcCRC >> 8) & 0x0F) | 0x40); OutgoingPacket[L2CRC3Offset] = (Byte)((nCalcCRC & 0xF0) | 0x01); OutgoingPacket[L2CRC4Offset] = (Byte)((nCalcCRC & 0x0F) | 0x40); Console.Write("Sending packet: "); for (Int32 i = 0; i < OutgoingPacket.Length; i++) { Console.Write("{0,02:X} ", OutgoingPacket[i]); } Console.WriteLine(); clientStream.Write(OutgoingPacket, 0, OutgoingPacket.Length); clientStream.WriteByte(L2PacketFooter); }
public void ProcessPacket(Byte[] NextPacket) { Console.Write("Packet: "); for (Int32 i = 0; i < NextPacket.Length; i++) { Console.Write("{0,02:X} ", NextPacket[i]); } Console.WriteLine(); UInt16 nPacketCRC = (UInt16)((((UInt16)(NextPacket[L2CRC1Offset] & 0xF0)) | ((UInt16)(NextPacket[L2CRC2Offset] & 0x0F))) << 8); nPacketCRC |= (UInt16)(((UInt16)(NextPacket[L2CRC3Offset] & 0xF0)) | ((UInt16)(NextPacket[L2CRC4Offset] & 0x0F))); UInt16 nCalcCRC = compute_CRC(NextPacket); if ((nPacketCRC != nCalcCRC) && (0 != nPacketCRC)) { // Officially, this packet did NOT happen! Console.WriteLine("CRC error! Got {0,04:X} and expected {1,04:X}", nCalcCRC, nPacketCRC); return; } nPacketLastSeen = NextPacket[L2PacketNumOffset]; // Keep track of the packet # we have seen L2PacketType CurrentPacketType = (L2PacketType)NextPacket[L2TypeOffset]; Byte[] OutgoingParameter = new Byte[NextPacket.Length - L2ParameterOffset]; Array.Copy(NextPacket, L2ParameterOffset, OutgoingParameter, 0, NextPacket.Length - L2ParameterOffset); switch (CurrentPacketType) { case L2PacketType.l2ptData: HandlePacketData(OutgoingParameter); break; case L2PacketType.l2ptWindowFull: HandleClientWindowFull(); break; case L2PacketType.l2ptProtocolReset: HandleProtocolReset(OutgoingParameter); break; case L2PacketType.l2ptTimeout: HandleProtocolTimer(); break; } }
private void TransmitL2Packet(L2PacketType PacketType) { TransmitL2Packet(PacketType, new Byte[0]); }