I did a setup of local server for testing DOL - unfortionatly i reached a point where i dont know how to proceed.
- DAoC Client with version: v1.122b
- Database DoL 1.9.6r3061
- DOLLoader for connecting to the server
I tried the latest pre-build version of the DOL server and as well as a local build form the master branch on Git.
What i have to mendtion is that i tried a couple of possible things, like hardware crc off and what not. But i can even reproduce it between different PC and VMs or just on localhost... so i guess its somehow a problem with the crc.
Issue is, if i connect with my client to the server, the server dropps the connection due to failed CRC. This error message describs it:
The part makes me worry is:[14:43:02,446] Incoming connection from 192.168.178.21 using client version 1122
[14:43:02,461] PacketProcessor: Loaded 79 handlers from GameServer Assembly!
[14:43:02,461] PacketProcessor: Loaded 0 handlers from Script Assemblys!
[14:43:02,461] PacketProcessor: Loaded 79 preprocessors from cache for version=v168!
[14:43:02,540] Bad TCP packet checksum (packet:0xEA05 calculated:0x6C8E) -> disconnecting
client: Version1122 pakLib:DOL.GS.PacketHandler.PacketLib1122 type:LabyrinthOfTheMinotaur(LabyrinthOfTheMinotaur) addons:bit4, NewNewFrontiers state:NotConnected IP:192.168.178.21:49788 session:0 acc:null char:null class:null
curOffset=0; packetLength=264
[14:43:02,555] Last client sent/received packets (from older to newer):
[14:43:02,555] GSPacketIn: Size=7 Sequence=0x0000 Session=0 Parameter=0 ID=0xF4
0000: 36 01 01 16 62 59 05 6...bY.
[14:43:02,571] GSTCPPacketOut
0000: 00 0A 22 06 00 31 2E 31 32 32 00 00 00 .."..1.122...
[14:43:02,571] Last Received Bytes :
0000: 00 FC 00 81 03 26 9C 0B 23 85 51 47 76 A8 31 E8 .....&..#.QGv.1.
0010: 7C 01 72 AC 79 0B 6C A6 AF AE 3D B7 B0 E9 9D 72 |.r.y.l...=....r
0020: B9 69 13 38 60 AA A4 35 41 AF 01 00 28 1F C0 89 .i.8`..5A...(...
0030: A1 0B BD 4C E5 F7 53 D8 F6 D1 7A 33 AE 06 61 77 ...L..S...z3..aw
0040: BB D4 D9 38 9A 35 4F 0E 27 8A FF 7D 67 2E 77 67 ...8.5O.'..}g.wg
0050: 15 9A 49 6D E4 3E 08 3C DF FC C4 1E B4 77 34 A9 ..Im.>.<.....w4.
0060: 84 F9 38 FA A8 35 97 E2 A8 46 AC B8 C4 51 5A 39 ..8..5...F...QZ9
0070: 3A BA E1 97 08 52 86 E7 A6 6B 31 45 1F CB 31 B1 :....R...k1E..1.
0080: A8 73 26 B6 81 00 81 03 42 C5 34 72 48 75 94 89 .s&.....B.4rHu..
0090: 08 02 36 3B 7E 54 32 B4 65 16 6F 10 BB 0C 71 7B ..6;~T2.e.o...q{
00A0: C5 35 9B EA 5B 0F 34 0B 57 63 A2 3E A6 A6 92 E6 .5..[.4.Wc.>....
00B0: 38 FF D4 42 FC 49 0F 15 2D CE 7B B6 D7 E9 4A 68 8..B.I..-.{...Jh
00C0: 98 2B 1A EA 2F 13 CD 95 95 6B 8F 93 17 49 94 7B .+../....k...I.{
00D0: 41 4D B6 EC 1C 8F CA B8 3F 5A 21 18 7F 9C A7 77 AM......?Z!.⌂..w
00E0: 54 3B 24 EB 59 BE DB 93 7E B3 52 31 13 F7 68 51 T;$.Y...~.R1..hQ
00F0: 21 75 A6 EA FA 7D B8 60 3A 19 4A D9 22 72 CD 44 !u...}.`:.J."r.D
0100: 8E B3 29 7C 30 6B EA 05 00 00 00 00 00 00 00 00 ..)|0k..........
0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0150: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
Bad TCP packet checksum (packet:0xEA05 calculated:0x6C8E)
So i searched for it on the DOL sources, extracted the part and issulated the issue in a small program for testing... and at least it is reproducable, but i have no clue how to fix it....
- Code: Select all
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; /* ISSUE [14:43:02,446] Incoming connection from 192.168.178.21 using client version 1122 [14:43:02,461] PacketProcessor: Loaded 79 handlers from GameServer Assembly! [14:43:02,461] PacketProcessor: Loaded 0 handlers from Script Assemblys! [14:43:02,461] PacketProcessor: Loaded 79 preprocessors from cache for version=v168! [14:43:02,540] Bad TCP packet checksum (packet:0xEA05 calculated:0x6C8E) -> disconnecting client: Version1122 pakLib:DOL.GS.PacketHandler.PacketLib1122 type:LabyrinthOfTheMinotaur(LabyrinthOfTheMinotaur) addons:bit4, NewNewFrontiers state:NotConnected IP:192.168.178.21:49788 session:0 acc:null char:null class:null curOffset=0; packetLength=264 [14:43:02,555] Last client sent/received packets (from older to newer): [14:43:02,555] GSPacketIn: Size=7 Sequence=0x0000 Session=0 Parameter=0 ID=0xF4 0000: 36 01 01 16 62 59 05 6...bY. [14:43:02,571] GSTCPPacketOut 0000: 00 0A 22 06 00 31 2E 31 32 32 00 00 00 .."..1.122... [14:43:02,571] Last Received Bytes : 0000: 00 FC 00 81 03 26 9C 0B 23 85 51 47 76 A8 31 E8 .....&..#.QGv.1. 0010: 7C 01 72 AC 79 0B 6C A6 AF AE 3D B7 B0 E9 9D 72 |.r.y.l...=....r 0020: B9 69 13 38 60 AA A4 35 41 AF 01 00 28 1F C0 89 .i.8`..5A...(... 0030: A1 0B BD 4C E5 F7 53 D8 F6 D1 7A 33 AE 06 61 77 ...L..S...z3..aw 0040: BB D4 D9 38 9A 35 4F 0E 27 8A FF 7D 67 2E 77 67 ...8.5O.'..}g.wg 0050: 15 9A 49 6D E4 3E 08 3C DF FC C4 1E B4 77 34 A9 ..Im.>.<.....w4. 0060: 84 F9 38 FA A8 35 97 E2 A8 46 AC B8 C4 51 5A 39 ..8..5...F...QZ9 0070: 3A BA E1 97 08 52 86 E7 A6 6B 31 45 1F CB 31 B1 :....R...k1E..1. 0080: A8 73 26 B6 81 00 81 03 42 C5 34 72 48 75 94 89 .s&.....B.4rHu.. 0090: 08 02 36 3B 7E 54 32 B4 65 16 6F 10 BB 0C 71 7B ..6;~T2.e.o...q{ 00A0: C5 35 9B EA 5B 0F 34 0B 57 63 A2 3E A6 A6 92 E6 .5..[.4.Wc.>.... 00B0: 38 FF D4 42 FC 49 0F 15 2D CE 7B B6 D7 E9 4A 68 8..B.I..-.{...Jh 00C0: 98 2B 1A EA 2F 13 CD 95 95 6B 8F 93 17 49 94 7B .+../....k...I.{ 00D0: 41 4D B6 EC 1C 8F CA B8 3F 5A 21 18 7F 9C A7 77 AM......?Z!.⌂..w 00E0: 54 3B 24 EB 59 BE DB 93 7E B3 52 31 13 F7 68 51 T;$.Y...~.R1..hQ 00F0: 21 75 A6 EA FA 7D B8 60 3A 19 4A D9 22 72 CD 44 !u...}.`:.J."r.D 0100: 8E B3 29 7C 30 6B EA 05 00 00 00 00 00 00 00 00 ..)|0k.......... 0110: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0120: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0130: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0140: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ */ namespace ConsoleApplication1 { class GSPacketIn { public static int HDR_SIZE = 12; } class gameclient { public gameclient() { } public int ReceiveBufferOffset; } class cutoutpacketmanager { public static gameclient m_client; public static byte[] staticBuffer = {0x00, 0xFC, 0x00, 0x81, 0x03, 0x26, 0x9C, 0x0B, 0x23, 0x85, 0x51, 0x47, 0x76, 0xA8, 0x31, 0xE8, 0x7C, 0x01, 0x72, 0xAC, 0x79, 0x0B, 0x6C, 0xA6, 0xAF, 0xAE, 0x3D, 0xB7, 0xB0, 0xE9, 0x9D, 0x72, 0xB9, 0x69, 0x13, 0x38, 0x60, 0xAA, 0xA4, 0x35, 0x41, 0xAF, 0x01, 0x00, 0x28, 0x1F, 0xC0, 0x89, 0xA1, 0x0B, 0xBD, 0x4C, 0xE5, 0xF7, 0x53, 0xD8, 0xF6, 0xD1, 0x7A, 0x33, 0xAE, 0x06, 0x61, 0x77, 0xBB, 0xD4, 0xD9, 0x38, 0x9A, 0x35, 0x4F, 0x0E, 0x27, 0x8A, 0xFF, 0x7D, 0x67, 0x2E, 0x77, 0x67, 0x15, 0x9A, 0x49, 0x6D, 0xE4, 0x3E, 0x08, 0x3C, 0xDF, 0xFC, 0xC4, 0x1E, 0xB4, 0x77, 0x34, 0xA9, 0x84, 0xF9, 0x38, 0xFA, 0xA8, 0x35, 0x97, 0xE2, 0xA8, 0x46, 0xAC, 0xB8, 0xC4, 0x51, 0x5A, 0x39, 0x3A, 0xBA, 0xE1, 0x97, 0x08, 0x52, 0x86, 0xE7, 0xA6, 0x6B, 0x31, 0x45, 0x1F, 0xCB, 0x31, 0xB1, 0xA8, 0x73, 0x26, 0xB6, 0x81, 0x00, 0x81, 0x03, 0x42, 0xC5, 0x34, 0x72, 0x48, 0x75, 0x94, 0x89, 0x08, 0x02, 0x36, 0x3B, 0x7E, 0x54, 0x32, 0xB4, 0x65, 0x16, 0x6F, 0x10, 0xBB, 0x0C, 0x71, 0x7B, 0xC5, 0x35, 0x9B, 0xEA, 0x5B, 0x0F, 0x34, 0x0B, 0x57, 0x63, 0xA2, 0x3E, 0xA6, 0xA6, 0x92, 0xE6, 0x38, 0xFF, 0xD4, 0x42, 0xFC, 0x49, 0x0F, 0x15, 0x2D, 0xCE, 0x7B, 0xB6, 0xD7, 0xE9, 0x4A, 0x68, 0x98, 0x2B, 0x1A, 0xEA, 0x2F, 0x13, 0xCD, 0x95, 0x95, 0x6B, 0x8F, 0x93, 0x17, 0x49, 0x94, 0x7B, 0x41, 0x4D, 0xB6, 0xEC, 0x1C, 0x8F, 0xCA, 0xB8, 0x3F, 0x5A, 0x21, 0x18, 0x7F, 0x9C, 0xA7, 0x77, 0x54, 0x3B, 0x24, 0xEB, 0x59, 0xBE, 0xDB, 0x93, 0x7E, 0xB3, 0x52, 0x31, 0x13, 0xF7, 0x68, 0x51, 0x21, 0x75, 0xA6, 0xEA, 0xFA, 0x7D, 0xB8, 0x60, 0x3A, 0x19, 0x4A, 0xD9, 0x22, 0x72, 0xCD, 0x44, 0x8E, 0xB3, 0x29, 0x7C, 0x30, 0x6B, 0xEA, 0x05/*, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00*/}; // original one from DOL public static ushort CalculateChecksum(byte[] packet, int dataOffset, int dataSize) { byte[] pak = packet; byte val1 = 0x7E; byte val2 = 0x7E; int i = dataOffset; int len = i + dataSize; while (i < len) { val1 += pak[i++]; val2 += val1; } return (ushort)(val2 - ((val1 + val2) << 8)); } ushort ComputeCheckSum(byte[] packet, int Size) { byte result; int i; result = 0; for (i = 0; i < Size; ++i) result += packet[i]; return ushort.Parse(""+result.ToString()); } uint calculateChecksum(byte[] message_byte, int length) { byte value1 = 0; byte value2 = 0; for(byte j=0; j<255; j++) { value1=j; value2=j; for(int i=0;i<length;i++) { value1+=message_byte[i]; value2+=value1; } Console.Write("j={0:X} calcCheck={1:X}\n", j, (ushort)(value2 - ((value1+value2) << 8))); if(0xEA+0x05 == (ushort)(value2 - ((value1+value2) << 8))) Console.Write("Fuckit\n"); } return (ushort)(value2 - ((value1+value2) << 8)); } // original one from DOL packagemanager class public void ReceiveBytes(int numBytes) { //lock (m_SyncLock) //{ byte[] buffer = staticBuffer; //m_client.ReceiveBuffer; //End Offset of buffer int bufferSize = /*m_client.ReceiveBufferOffset*/ 0 + numBytes; //Size < minimum if (bufferSize < GSPacketIn.HDR_SIZE) { m_client.ReceiveBufferOffset = bufferSize; // undo buffer read return; } //Reset the offset //m_client.ReceiveBufferOffset = 0; //Current offset into the buffer int curOffset = 0; do { int packetLength = (buffer[curOffset] << 8) + buffer[curOffset + 1] + GSPacketIn.HDR_SIZE; int dataLeft = bufferSize - curOffset; if (dataLeft < packetLength) { Buffer.BlockCopy(buffer, curOffset, buffer, 0, dataLeft); m_client.ReceiveBufferOffset = dataLeft; break; } // ** commented out because this hasn't been used in forever and crutching // ** to it only hurts performance in a design that needs to be reworked // ** anyways. // ** - tobz //var curPacket = new byte[packetLength]; //Buffer.BlockCopy(buffer, curOffset, curPacket, 0, packetLength); //curPacket = m_encoding.DecryptPacket(buffer, false); int packetEnd = curOffset + packetLength; int calcCheck = CalculateChecksum(buffer, curOffset, packetLength - 2); int pakCheck = (buffer[packetEnd - 2] << 8) | (buffer[packetEnd - 1]); int calcCheck2 = ComputeCheckSum(buffer, packetLength - 2); uint calcCheck3 = calculateChecksum(buffer, packetLength - 2); Console.Write("pakCheck={1:X} calcCheck={0:X} calcCheck2={2:X} calcCheck3={3:X}\n", calcCheck, pakCheck, calcCheck2, calcCheck3); if (pakCheck != calcCheck) { /*if (log.IsWarnEnabled) log.WarnFormat( "Bad TCP packet checksum (packet:0x{0:X4} calculated:0x{1:X4}) -> disconnecting\nclient: {2}\ncurOffset={3}; packetLength={4}", pakCheck, calcCheck, m_client.ToString(), curOffset, packetLength); if (log.IsInfoEnabled) { log.Info("Last client sent/received packets (from older to newer):"); foreach (IPacket prevPak in GetLastPackets()) { log.Info(prevPak.ToHumanReadable()); } log.Info(Marshal.ToHexDump("Last Received Bytes : ", buffer)); }*/ //m_client.Disconnect(); //return; } //var pak = new GSPacketIn(packetLength - GSPacketIn.HDR_SIZE); //pak.Load(buffer, curOffset, packetLength); /*try { HandlePacket(pak); } catch (Exception e) { if (log.IsErrorEnabled) log.Error("HandlePacket(pak)", e); }*/ curOffset += packetLength; } while (bufferSize - 1 > curOffset); if (bufferSize - 1 == curOffset) { buffer[0] = buffer[curOffset]; m_client.ReceiveBufferOffset = 1; } //} } } class Program { static void Main(string[] args) { cutoutpacketmanager tmp = new cutoutpacketmanager(); Console.Write("staticBuffer.Count()={0}\n", cutoutpacketmanager.staticBuffer.Count()); tmp.ReceiveBytes(cutoutpacketmanager.staticBuffer.Count()); Console.ReadKey(); } } }
Best regards
Leo