Thanks for the tip.
I was able to make it work, and did not notice any problems. But along the way, I encountered some memory errors during exit of wireshark.
please recommend if I get the thing right?
My UI tests shows its already okay, im not sure if this is efficient.
Thanks,
--------
addr = tvb_get_ptr(tvb, cur_offset, afdpart_len);
addr_copy = se_alloc0((afamily == 0x02) ? 16 : 4);
tvb_memcpy(tvb, (guint8 *)addr_copy, cur_offset, afdpart_len);
proto_tree_add_text(rr_tree, tvb, cur_offset, afdpart_len, " %s address: %s", val_to_str(afamily, apl_afamily_vals, "Unknown"),
(afamily == 0x02) ? ip6_to_str((const struct e_in6_addr *)addr_copy)
: ip_to_str(addr_copy) );
--- On Tue, 8/11/09, Sake Blok <sake@xxxxxxxxxx> wrote:
> From: Sake Blok <sake@xxxxxxxxxx>
> Subject: Re: [Wireshark-dev] ip6_to_str equivalent/alternative with variable length for ipv6 address
> To: "Developer support list for Wireshark" <wireshark-dev@xxxxxxxxxxxxx>
> Date: Tuesday, August 11, 2009, 6:44 PM
> On Mon, Aug 10, 2009 at 07:03:09PM
> -0700, ivan jr sy wrote:
> > Hi all:
> >
> > I need some advise on getting an IPv6 address to str
> with variable number of bytes.
> >
> > Example:
> >
> > /* the hex part is */
> > 20 01 db 08 ff ff 00 02 20 86 20 03 de ad be ef
> >
> > addr_len = 6; /* variable */
> >
> > /* if I do this: */
> > addr = tvb_get_ptr(tvb, cur_offset, addr_len);
>
> This just gives you a ptr (addr) to the start of some data
> portion but
> it ensures that at least addr_len bytes are present.
>
> > .... ip6_to_str((const struct e_in6_addr
> *)addr);
> >
> > this will result to:
> > 2001:db8:ffff:2:2086:2003:dead:beef
>
> Which is as it is designed.
>
> > but what i wanted was:
> > /* the hex part is */
> > 20 01 db 08 ff ff
> >
> > so it will result to "2001:db8:ffff" (the network
> portion) coz
> > the "00 02 20 86 20 03 de ad be ef" is for a different
> purpose..
> > then I also need to append "::" to the last part of
> the str to
> > make it "2001:db8:ffff::"
>
> If *that* is what you want, you need to copy the first
> addr_len bytes
> into a new variable, add 16-addr_len zeroes to that
> variable and then
> call ip6_to_str on the new variable.
>
> The copying can be done with:
>
> /** Returns target for convenience. Does not suffer from
> possible
> * expense of tvb_get_ptr(), since this routine is smart
> enough
> * to copy data in chunks if the request range actually
> exists in
> * different TVBUFF_REAL_DATA tvbuffs. This function
> assumes that the
> * target memory is already allocated; it does not allocate
> or free the
> * target memory. */
> extern void* tvb_memcpy(tvbuff_t*, void* target, gint
> offset, size_t
> length);
>
> (see epan/tvbuff.h)
>
> Hope this helps,
> Cheers,
> Sake
> ___________________________________________________________________________
> Sent via: Wireshark-dev mailing list <wireshark-dev@xxxxxxxxxxxxx>
> Archives: http://www.wireshark.org/lists/wireshark-dev
> Unsubscribe: https://wireshark.org/mailman/options/wireshark-dev
>
> mailto:wireshark-dev-request@xxxxxxxxxxxxx?subject=unsubscribe
>