Wireshark-dev: [Wireshark-dev] New proto_add_bits function (Was: rev 21556:/trunk/epan//tr...)
From: "Anders Broman \(AL/EAB\)" <anders.broman@xxxxxxxxxxxx>
Date: Thu, 26 Apr 2007 17:56:48 +0200
Hi, I have used it in the h263 dissector with a h263 prefix unfortunatly there is only short sequences Beeing dissected most being the same in all h263 frames :( Perhaps it can be used in the PER dissector but I didn't want to use it before we had agreed on a format to avoid to many changes. Regrads Anders -----Original Message----- From: wireshark-dev-bounces@xxxxxxxxxxxxx [mailto:wireshark-dev-bounces@xxxxxxxxxxxxx] On Behalf Of Martin Mathieson Sent: den 26 april 2007 16:56 To: Developer support list for Wireshark Subject: Re: [Wireshark-dev] [Wireshark-commits]rev21556:/trunk/epan//trunk/epan/: proto.c proto.h -allbuildbots rednow :-( OK, I'll wait until you check in the tvb_get_bits() change, then look at it again. Any test files you could share with longer bit sequences and/or different bit offsets would be welcome (so I don't trash it just to make my little examples work :) ). Martin On 4/26/07, Anders Broman (AL/EAB) <anders.broman@xxxxxxxxxxxx> wrote: > Hi, > The intention is to use tvb_get bits from inside proto_tree_add_bits > so there will be no overlap. > /Anders > > ________________________________ > > Från: wireshark-dev-bounces@xxxxxxxxxxxxx genom Martin Mathieson > Skickat: to 2007-04-26 13:49 > Till: Developer support list for Wireshark > Ämne: Re: [Wireshark-dev] [Wireshark-commits] > rev21556:/trunk/epan//trunk/epan/: proto.c proto.h - allbuildbots > rednow :-( > > > > Hi Anders, > > Your tvb_get_bits() has no much in common with the add_bits() > functions that it would be a shame not to share all of the fiddly > bits. > > Anyway, here is the patch I forgot to send earlier. It may be a few > days before I can look at this again :( > > Martin > > > On 4/26/07, Anders Broman (AL/EAB) <anders.broman@xxxxxxxxxxxx> wrote: > > Hi, > > I think you forgot the patch :) > > I have been looking at the funktion in packet-ansi_801.c > > ansi_801_tvb_get_bits() which may be better To use with some changes > > to handle endianess and not to use pointers to offsets. Feel free to > > check In any changes I'm a bit short on time pressently. > > Best regards > > Anders > > P.S > > Untested unused first draft of tvb_get_bits() just extracting the > > code fom the other funktions. > > guint32 > > tvb_get_bits(tvbuff_t *tvb, gint bit_offset, gint no_of_bits, > > gboolean > > little_endian) > > { > > gboolean is_bytealigned = FALSE; > > gint offset; > > guint length; > > guint bit_length; > > guint32 value = 0; > > guint32 mask = 0; > > guint8 mask8 = 0xff; > > guint16 mask16 = 0xffff; > > guint32 mask24 = 0xffffff; > > guint32 mask32 = 0xffffffff; > > guint8 shift; > > > > if((bit_offset&0x7)==0) > > is_bytealigned = TRUE; > > offset = bit_offset>>3; > > bit_length = ((bit_offset&0x7)+no_of_bits); > > length = bit_length >>3; > > if((bit_length&0x7)!=0) > > length = length +1; > > > > if (no_of_bits < 2){ > > /* Single bit */ > > mask8 = mask8 >>(bit_offset&0x7); > > value = tvb_get_guint8(tvb,offset) & mask8; > > mask = 0x80; > > shift = 8-((bit_offset + no_of_bits)&0x7); > > if (shift<8){ > > value = value >> shift; > > mask = mask >> shift; > > } > > }else if(no_of_bits < 9){ > > /* One or 2 bytes */ > > if(length == 1){ > > /* Spans 1 byte */ > > mask8 = mask8>>(bit_offset&0x7); > > value = tvb_get_guint8(tvb,offset)&mask8; > > mask = 0x80; > > }else{ > > /* Spans 2 bytes */ > > mask16 = mask16>>(bit_offset&0x7); > > if(little_endian){ > > value=tvb_get_letohs(tvb, offset); > > } else { > > value=tvb_get_ntohs(tvb, offset); > > } > > mask = 0x8000; > > } > > shift = 8-((bit_offset + no_of_bits)&0x7); > > if (shift<8){ > > value = value >> shift; > > mask = mask >> shift; > > } > > > > }else if (no_of_bits < 17){ > > /* 2 or 3 bytes */ > > if(length == 2){ > > /* Spans 2 bytes */ > > mask16 = mask16>>(bit_offset&0x7); > > if(little_endian){ > > value=tvb_get_letohs(tvb, offset); > > } else { > > value=tvb_get_ntohs(tvb, offset); > > } > > mask = 0x8000; > > }else{ > > /* Spans 3 bytes */ > > mask24 = mask24>>(bit_offset&0x7); > > if(little_endian){ > > value=tvb_get_letoh24(tvb, offset); > > } else { > > value=tvb_get_ntoh24(tvb, offset); > > } > > mask = 0x800000; > > } > > shift = 8-((bit_offset + no_of_bits)&0x7); > > if (shift<8){ > > value = value >> shift; > > mask = mask >> shift; > > } > > > > }else if (no_of_bits < 25){ > > /* 3 or 4 bytes */ > > if(length == 3){ > > /* Spans 3 bytes */ > > mask24 = mask24>>(bit_offset&0x7); > > if(little_endian){ > > value=tvb_get_letoh24(tvb, offset); > > } else { > > value=tvb_get_ntoh24(tvb, offset); > > } > > mask = 0x800000; > > }else{ > > /* Spans 4 bytes */ > > mask32 = mask32>>(bit_offset&0x7); > > if(little_endian){ > > value=tvb_get_letohl(tvb, offset); > > } else { > > value=tvb_get_ntohl(tvb, offset); > > } > > mask = 0x80000000; > > } > > shift = 8-((bit_offset + no_of_bits)&0x7); > > if (shift<8){ > > value = value >> shift; > > mask = mask >> shift; > > } > > > > }else if (no_of_bits < 33){ > > /* 4 or 5 bytes */ > > if(length == 4){ > > /* Spans 4 bytes */ > > mask32 = mask32>>(bit_offset&0x7); > > if(little_endian){ > > value=tvb_get_letohl(tvb, offset); > > } else { > > value=tvb_get_ntohl(tvb, offset); > > } > > mask = 0x80000000; > > }else{ > > /* Spans 5 bytes > > * Does not handle unaligned bits over 24 > > */ > > DISSECTOR_ASSERT_NOT_REACHED(); > > } > > shift = 8-((bit_offset + no_of_bits)&0x7); > > if (shift<8){ > > value = value >> shift; > > mask = mask >> shift; > > } > > > > }else{ > > DISSECTOR_ASSERT_NOT_REACHED(); > > } > > > > return value; > > > > } > > -----Original Message----- > > From: wireshark-dev-bounces@xxxxxxxxxxxxx > > [mailto:wireshark-dev-bounces@xxxxxxxxxxxxx] On Behalf Of Martin > > Mathieson > > Sent: den 26 april 2007 13:20 > > To: Developer support list for Wireshark > > Subject: Re: [Wireshark-dev] [Wireshark-commits] rev > > 21556:/trunk/epan//trunk/epan/: proto.c proto.h - all buildbots > > rednow :-( > > > > Anders, > > > > I've tried the functions (with new prototypes) in the FP dissector, > > and > made > > the changes indicated in the attached patch. > > > > I didn't want to commit it as you may not want to change it in this > > way, also I've only looked at the 1 and 2 byte length cases. > > > > In my patch, I shift the mask8/mask16 and the raw value immediately > > to occupy the lsb and and them to the final value there. This seems > > simpler > to > > me than working out a more complicated mask (which is where the bug > > was) then shifting the resulting value to occupy the lsb to get the > > final > result. > > > > Does this seem sane to you? > > Best regards, > > Martin > > > > On 4/25/07, Anders Broman <a.broman@xxxxxxxxx> wrote: > > > Hi, > > > I'm looking inot spliting it into: > > > > > > /*This function will call proto_tree_add_bits_ret_val() without > > > the return value. */ extern proto_item * > > > proto_tree_add_bits(proto_tree *tree, int hf_index, tvbuff_t *tvb, > > > gint bit_offset, gint no_of_bits, gboolean little_endian); > > > > > > /* Calls tvb_get bits */ > > > extern proto_item * > > > proto_tree_add_bits_ret_val(proto_tree *tree, int hf_index, > > > tvbuff_t *tvb, gint bit_offset, gint no_of_bits, guint32 > > > *return_value, gboolean little_endian); > > > > > > > > > guint32 > > > tvb_get_bits(tvbuff_t *tvb, gint bit_offset, gint no_of_bits, > > > gboolean > > > little_endian) > > > > > > (Should it handle 64bits?) > > > > > > If that's a more acceptable format. It would be good if we could > > > agree on a format and get down to the nitty gritti of fixing up the functions. > > > > > > Best regards > > > Anders > > > BTW > > > dissectors.lib(packet-ansi_801.obj) : warning LNK4006: > > > _tvb_get_bits already def ined in tvbuff.obj; second definition > > > ignored > > > > > > -----Ursprungligt meddelande----- > > > Från: wireshark-dev-bounces@xxxxxxxxxxxxx > > > [mailto:wireshark-dev-bounces@xxxxxxxxxxxxx] För Martin Mathieson > > > Skickat: den 25 april 2007 19:23 > > > Till: Developer support list for Wireshark > > > Ämne: Re: [Wireshark-dev] [Wireshark-commits] rev 21556: > > > /trunk/epan//trunk/epan/: proto.c proto.h - all buildbots red now > > > :-( > > > > > > I've had a play with this function, I like it - it can improve and > > > simplify parts of packet-umts_fp.c which are bit-oriented, like > > > E-DCH data. Having the function spit out the return value is > > > helpful here, as this will avoid the dissector doing the > > > equivalent shiting and masking work for a second time. > > > > > > Having said that, although it shows the correct bytes for me, it > > > is computing the wrong value at the moment. For example, I > > > selected 6 bits, offset 4 bytes into the bytes 0x4917. It shows the correct > > > bits, i.e. .... 100101.. .... but computes the value to be 101, > > > i.e. the bits 1100101. So it looks like maybe the masking is out > > > by 1 bit - I'll look at it tomorrow if no-one else does first. > > > > > > Best regards, > > > Martin > > > > > > On 4/24/07, Anders Broman <a.broman@xxxxxxxxx> wrote: > > > > > > > > > > > > -----Ursprungligt meddelande----- > > > > Från: wireshark-dev-bounces@xxxxxxxxxxxxx > > > > [mailto:wireshark-dev-bounces@xxxxxxxxxxxxx] För Ulf Lamping > > > > Skickat: den 24 april 2007 23:05 > > > > Till: Developer support list for Wireshark > > > > Ämne: Re: [Wireshark-dev] [Wireshark-commits] rev 21556: > > > > /trunk/epan/ > > > > /trunk/epan/: proto.c proto.h - all buildbots red now :-( > > > > > > > > Anders Broman wrote: > > > > >> Hi, > > > > >> I have no problem with backing out my changes but a Proto_... > > > > >> function should not be local to iuup in my opinion. > > > > >> Perhaps it should be renamed iuup_proto_.. instead until We > > > > >> have "the real thing" in proto.c > > > > >> > > > > >> What do others think? > > > > >> > > > > >Well, first of all, we shouldn't have a buildbot going into > > > > >deep red for a long time, so there's something to be done. > > > > > > > > >I'll fully agree that a function starting with proto_ shouldn't > > > > >be in any dissector code - a name clash will be the result > > > > >sooner or later - and today is sooner ;-) > > > > > > > > >Could you please: > > > > > > > > >1.) fix the issue in iuup by prepending iuup_ so the buildbot > > > > >get's green again - I'm currently waiting for it :-( > > > > > > > > Joerg beat me to it. > > > > > > > > >2.) if your new function doesn't follow the common function > > > > >pattern, fix this issue in your implementation (I didn't had a > > > > >look at the code in proto myself) > > > > > > > > > > > > Well what pattern it should have is being discussed. > > > > As I see it: > > > > Alt > > > > 1) Leave it as it is and change other proto_add.. functions to > > > > behave similarly. > > > > 1b) Leave the signature but rename it to something like > > > > proto_tree_add_bits_ret_val() and add similar functions for > > > > other > stuff. > > > > > > > > 2) use(proto_tree* tree, int hf, tvbuff_t* tvb, int offset, int > > > bit_offset, > > > > guint bits) as in iuup > > > > > > > > 3) use (proto_tree *tree, int hf_index, tvbuff_t *tvb, gint > > > > bit_offset, > > > gint > > > > no_of_bits, gboolean little_endian) > > > > > > > > Other? > > > > Regards > > > > Anders > > > > > > > > > > > > > > > > _______________________________________________ > > > > Wireshark-dev mailing list > > > > Wireshark-dev@xxxxxxxxxxxxx > > > > http://www.wireshark.org/mailman/listinfo/wireshark-dev > > > > > > > > _______________________________________________ > > > > Wireshark-dev mailing list > > > > Wireshark-dev@xxxxxxxxxxxxx > > > > http://www.wireshark.org/mailman/listinfo/wireshark-dev > > > > > > > _______________________________________________ > > > Wireshark-dev mailing list > > > Wireshark-dev@xxxxxxxxxxxxx > > > http://www.wireshark.org/mailman/listinfo/wireshark-dev > > > > > > _______________________________________________ > > > Wireshark-dev mailing list > > > Wireshark-dev@xxxxxxxxxxxxx > > > http://www.wireshark.org/mailman/listinfo/wireshark-dev > > > > > _______________________________________________ > > Wireshark-dev mailing list > > Wireshark-dev@xxxxxxxxxxxxx > > http://www.wireshark.org/mailman/listinfo/wireshark-dev > > _______________________________________________ > > Wireshark-dev mailing list > > Wireshark-dev@xxxxxxxxxxxxx > > http://www.wireshark.org/mailman/listinfo/wireshark-dev > > > > > _______________________________________________ Wireshark-dev mailing list Wireshark-dev@xxxxxxxxxxxxx http://www.wireshark.org/mailman/listinfo/wireshark-dev
- References:
- Re: [Wireshark-dev] [Wireshark-commits] rev 21556: /trunk/epan/ /trunk/epan/: proto.c proto.h - all buildbots red now :-(
- From: Martin Mathieson
- Re: [Wireshark-dev] [Wireshark-commits] rev 21556: /trunk/epan//trunk/epan/: proto.c proto.h - all buildbots red now :-(
- From: Anders Broman
- Re: [Wireshark-dev] [Wireshark-commits] rev 21556: /trunk/epan//trunk/epan/: proto.c proto.h - all buildbots red now :-(
- From: Martin Mathieson
- Re: [Wireshark-dev] [Wireshark-commits] rev 21556:/trunk/epan//trunk/epan/: proto.c proto.h - all buildbots rednow :-(
- From: Anders Broman (AL/EAB)
- Re: [Wireshark-dev] [Wireshark-commits] rev 21556:/trunk/epan//trunk/epan/: proto.c proto.h - all buildbots rednow :-(
- From: Martin Mathieson
- Re: [Wireshark-dev] [Wireshark-commits] rev21556:/trunk/epan//trunk/epan/: proto.c proto.h - allbuildbots rednow :-(
- From: Anders Broman (AL/EAB)
- Re: [Wireshark-dev] [Wireshark-commits] rev21556:/trunk/epan//trunk/epan/: proto.c proto.h - allbuildbots rednow :-(
- From: Martin Mathieson
- Re: [Wireshark-dev] [Wireshark-commits] rev 21556: /trunk/epan/ /trunk/epan/: proto.c proto.h - all buildbots red now :-(
- Prev by Date: Re: [Wireshark-dev] [Wireshark-commits] rev21556:/trunk/epan//trunk/epan/: proto.c proto.h - allbuildbots rednow :-(
- Next by Date: [Wireshark-dev] New disesector for Juniper NSRP
- Previous by thread: Re: [Wireshark-dev] [Wireshark-commits] rev21556:/trunk/epan//trunk/epan/: proto.c proto.h - allbuildbots rednow :-(
- Next by thread: [Wireshark-dev] Display RTP SSRC in Hex?
- Index(es):