Thread: Re: [Jnetstream-users] Error in TCP decode
Brought to you by:
voytechs
From: Frédéric D. <fre...@dr...> - 2008-08-05 18:19:39
|
Actually I will fligh back in europe tomorrow and also have to visit my chiro :-) Actually the "readBitsOneAtATime()" I posted correct something but break the TCP decoding (start offset is wrong). so I will look at it again (I find the exercise quite interessting) and I could wait some days. No problem, really. I will share my thoughts if I find something pertinent. Regards, Frederic Mark Bednarczyk a écrit : > I made changes in there recently. Its possible I screwed up. > > I hurt my back coming back from Europe yesterday and I can barely sit at the > computer right now. Hopefully tomorrow I'll feel better after my visit to > the chiropractor today and be able to take a look at the problem quickly. I > do have some jUnit test cases checked in that test various BitBuffer > conditions in the CommonUtils module. > > Cheers, > mark... > > >> -----Original Message----- >> From: jne...@li... >> [mailto:jne...@li...] On >> Behalf Of Frédéric Dreier >> Sent: Tuesday, August 05, 2008 1:10 PM >> To: Jne...@li... >> Subject: Re: [Jnetstream-users] Error in TCP decode >> >> Hi, >> >> I checkout the code from SVN and I thing there is something >> odd in the "BitBuffer.readBitsOneAtATime()" method. Its >> probably about the posBits which ich not always added to the offset. >> >> I temporary use the following implementation until a fix is >> commited in SVN (This concats the buffer byte per byte >> instead bit per bit) >> >> Regards, >> Frédéric >> >> private static final int[] RIGHT_BIT_MASK = new int[32]; >> static { >> // initialize mask used by readBitsOneAtATime() >> for (int i = 1; i < RIGHT_BIT_MASK.length; i++) { >> RIGHT_BIT_MASK[i] = (RIGHT_BIT_MASK[i - 1] << 1) | 1; >> } >> } >> >> private int readBitsOneAtATime(int length) { >> // basic checks to avoid unnecessary computation >> if (length == 0) { >> return 0; >> } >> if (length > 32) { >> throw new IndexOutOfBoundsException("0 >= range >> <= 32bits"); >> } >> // value is stored in long since length+posBits >> // could be greater than 32. >> long value = current; >> int acc = 8 - posBits; >> // concatenate buffer byte per byte >> for (; acc < length; acc += 8) { >> // fetch next byte >> posBits = 8; >> fetch(); >> // append new current byte >> value = (value << 8) | (current & 0xFF); >> } >> // right-align the bits and mask high bits >> value = (value >> (acc - length)) & RIGHT_BIT_MASK[length]; >> // update posBits value >> posBits = (posBits + length) % 8; >> // return >> return (int) value; >> } >> >> >> >> >> >> >> >> >> Frédéric Dreier a écrit : >> >>> Hi, >>> >>> I have some trouble decoding IP and TCP headers. the header length >>> and the offset are wrongly decoded in most of the packets. >>> >>> Did I do something wrong? >>> >>> Regards, >>> Frederic Dreier >>> >>> >>> >>> Console output ------------------------------- PACKET DUMP:: >>> 00 12 3F 19 FC 3F 00 07 >>> 84 BC A0 C0 08 00 45 00 >>> 00 28 9D 7A 40 00 2B 06 >>> 25 94 D0 50 98 03 81 AD >>> A2 C0 00 50 D7 59 29 F4 >>> BC EF 33 C8 F3 C5 50 11 >>> Vers : 4 >>> Hlen : 4 <----- should be 5 >>> TOS : 0 >>> Lgt : 40 >>> ident: 40314 >>> flags: 2 >>> offs : 1 <---- should be 0 >>> TTL : 43 >>> Prot : 6 >>> Src : 208.80.152.3 >>> Dst : 129.173.162.192 >>> Console output ------------------------------- >>> >>> >>> >>> Code snipet ------------------------------ >>> Ip4 ipHd = packet.getHeader(Ip4.class); >>> Tcp tcpHd = packet.getHeader(Tcp.class); >>> System.out.println("PACKET DUMP::"); >>> for (int i = 0; i < 6; i++) { >>> for (int k = i * 8; k < ((i >>> >> + 1) * 8); >> >>> k++) { >>> System.out.printf("%02X ", >>> packet.getBuffer().getBackingBuffer().get(k) & 0xFF); >>> } >>> System.out.println(); >>> } >>> System.out.printf("Vers : %d\n", >>> >> ipHd.ver()); >> >>> System.out.printf("Hlen : %d\n", >>> >> ipHd.hlen()); >> >>> System.out.printf("TOS : %d\n", >>> >> ipHd.tos()); >> >>> System.out.printf("Lgt : %d\n", >>> >> ipHd.length()); >> >>> System.out.printf("ident: %d\n", >>> ipHd.id()&0xFFFF); >>> System.out.printf("flags: %d\n", >>> >> ipHd.flags()); >> >>> System.out.printf("offs : %d\n", >>> >> ipHd.offset()); >> >>> System.out.printf("TTL : %d\n", >>> >> ipHd.ttl()); >> >>> System.out.printf("Prot : %d\n", >>> ipHd.protocol()); >>> System.out.printf("Src : %s\n", >>> >> ipHd.source()); >> >>> System.out.printf("Dst : %s\n", >>> ipHd.destination()); >>> -------------------------------------------- >>> >>> >>> >> -------------------------------------------------------------- >> ----------- >> >>> This SF.Net email is sponsored by the Moblin Your Move >>> >> Developer's challenge >> >>> Build the coolest Linux based applications with Moblin SDK >>> >> & win great prizes >> >>> Grand prize is a trip for two to an Open Source event >>> >> anywhere in the world >> >>> http://moblin-contest.org/redirect.php?banner_id=100&url=/ >>> _______________________________________________ >>> Jnetstream-users mailing list >>> Jne...@li... >>> https://lists.sourceforge.net/lists/listinfo/jnetstream-users >>> >>> >> -------------------------------------------------------------- >> ----------- >> This SF.Net email is sponsored by the Moblin Your Move >> Developer's challenge >> Build the coolest Linux based applications with Moblin SDK & >> win great prizes >> Grand prize is a trip for two to an Open Source event >> anywhere in the world >> http://moblin-contest.org/redirect.php?banner_id=100&url=/ >> _______________________________________________ >> Jnetstream-users mailing list >> Jne...@li... >> https://lists.sourceforge.net/lists/listinfo/jnetstream-users >> > > > |
From: Frédéric D. <fre...@dr...> - 2008-08-06 14:31:30
|
Good morning Mark, I will be unreachable until next monday so I already send you what I found. - my implementation of readBitsOneAtATime(). Perhaps it is not so good but it just does the trick until the original one will be fixed. - something in FastScanner didn't work after I changed readBitsOneAtATime(). 32 kept to be added to the ip header length. Regards, Frédéric Fast Scanner --------------------------------- /** * */ public final boolean scanIp4() { addToCache(IP4); r1 = readUByte(Ip4.StaticField.PROTOCOL); if (DEBUG) { logger.debug(String.format("Ip4 p=%d, r1=%d\n", offset, r1)); } //offset += bits.getBits(offset + 4, 4) * 4 * 8 + 32; <<== why +32 ? offset += bits.getBits(offset + 4, 4) * 32; switch (r1) { case 1: return scanIcmp(); case 6: return scanTcp(); case 17: return scanUdp(); } return true; } BitBuffer ------------------------------------- private static final int[] RIGHT_BIT_MASK = new int[33]; static { // initialize mask used by readBitsOneAtATime() for (int i = 1; i < RIGHT_BIT_MASK.length; i++) { RIGHT_BIT_MASK[i] = (RIGHT_BIT_MASK[i - 1] << 1) | 1; } } private int readBitsOneAtATime(int length) { // basic checks to avoid unnecessary computation if (length == 0) { return 0; } if (length > 32) { throw new IndexOutOfBoundsException("0 >= range <= 32bits"); } // value is stored in long since length+posBits // could be greater than 32. long value = current; int acc = 8 - posBits; // concatenate buffer byte per byte for (; acc < length; acc += 8) { // fetch next byte posBits = 8; fetch(); // append new current byte value = (value << 8) | (current & 0xFF); } // right-align the bits and mask high bits value = (value >> (acc - length)) & RIGHT_BIT_MASK[length]; // update posBits value posBits = (posBits + length) % 8; // return return (int) value; } |
From: Mark B. <voy...@ya...> - 2008-08-06 16:21:20
|
Thanks Frederic, I'm still out of commission myself. I will revist the BitBuffer as that is a core routine that has to be 100% correct all the time under all circumstances. Cheers, mark... ----- Original Message ----- From: "Frédéric Dreier" <fre...@dr...> Cc: <Jne...@li...> Sent: Wednesday, August 06, 2008 4:31 PM Subject: Re: [Jnetstream-users] Error in TCP decode Good morning Mark, I will be unreachable until next monday so I already send you what I found. - my implementation of readBitsOneAtATime(). Perhaps it is not so good but it just does the trick until the original one will be fixed. - something in FastScanner didn't work after I changed readBitsOneAtATime(). 32 kept to be added to the ip header length. Regards, Frédéric Fast Scanner --------------------------------- /** * */ public final boolean scanIp4() { addToCache(IP4); r1 = readUByte(Ip4.StaticField.PROTOCOL); if (DEBUG) { logger.debug(String.format("Ip4 p=%d, r1=%d\n", offset, r1)); } //offset += bits.getBits(offset + 4, 4) * 4 * 8 + 32; <<== why +32 ? offset += bits.getBits(offset + 4, 4) * 32; switch (r1) { case 1: return scanIcmp(); case 6: return scanTcp(); case 17: return scanUdp(); } return true; } BitBuffer ------------------------------------- private static final int[] RIGHT_BIT_MASK = new int[33]; static { // initialize mask used by readBitsOneAtATime() for (int i = 1; i < RIGHT_BIT_MASK.length; i++) { RIGHT_BIT_MASK[i] = (RIGHT_BIT_MASK[i - 1] << 1) | 1; } } private int readBitsOneAtATime(int length) { // basic checks to avoid unnecessary computation if (length == 0) { return 0; } if (length > 32) { throw new IndexOutOfBoundsException("0 >= range <= 32bits"); } // value is stored in long since length+posBits // could be greater than 32. long value = current; int acc = 8 - posBits; // concatenate buffer byte per byte for (; acc < length; acc += 8) { // fetch next byte posBits = 8; fetch(); // append new current byte value = (value << 8) | (current & 0xFF); } // right-align the bits and mask high bits value = (value >> (acc - length)) & RIGHT_BIT_MASK[length]; // update posBits value posBits = (posBits + length) % 8; // return return (int) value; } ------------------------------------------------------------------------- This SF.Net email is sponsored by the Moblin Your Move Developer's challenge Build the coolest Linux based applications with Moblin SDK & win great prizes Grand prize is a trip for two to an Open Source event anywhere in the world http://moblin-contest.org/redirect.php?banner_id=100&url=/ _______________________________________________ Jnetstream-users mailing list Jne...@li... https://lists.sourceforge.net/lists/listinfo/jnetstream-users |