Another option, which should work with the existing API, is to have a wmem_tree with keys the upper 32 bits whose data nodes are also trees, with keys the lower 32 bits. (You store it by doing an exact wmem_tree_lookup32() match, adding a new tree if not found.) Then you do a normal wmem_tree_lookup32_le() on the upper 32 bits, get the result a tree, and depending on whether the key that matched result was equal or less than equal to the upper 32 bits, call wmem_tree_lookup32_le() on the returned tree with key either the lower 32 bits or on G_MAXUINT32 (the latter will get you the highest result in the tree, for the less than equal match case.)
John On Tue, Oct 19, 2021 at 12:21 PM qiangxiong.huang via Wireshark-dev < wireshark-dev@wireshark.org> wrote: > John Thacker, > > Thank you for your information. I may try to add xxx_insert64/lookup64(). > > ------------------ Original ------------------ > *From:* "Developer support list for Wireshark" <johnthac...@gmail.com>; > *Date:* Tue, Oct 19, 2021 10:42 PM > *To:* "Developer support list for Wireshark"<wireshark-dev@wireshark.org>; > *Subject:* Re: [Wireshark-dev] Is this the bug of > wmem_tree_lookup32_array_le()? > > On Sun, Oct 17, 2021 at 5:41 AM qiangxiong.huang via Wireshark-dev < > wireshark-dev@wireshark.org> wrote: > >> >> Who knows that the current behavior of the wmem_tree_lookup32_array_le() >> is designed in this way or it is just a bug? >> If I want to fix the issue #17633, should I modify this >> wmem_tree_lookup32_array_le() directly or write a new function like >> wmem_tree_lookup32_array_le_key_as_big_num() (or other name you recommend)? >> > > While I fully understand why you would want a lookup that would be a > lexicographical sort with the order of the 32 bit integers in the key being > rank (in order to handle a 64 bit integer as two 32 bit integers), the > current dissectors that use the API depend on the current behavior and > would break, e.g. > https://gitlab.com/wireshark/wireshark/-/blob/master/epan/dissectors/packet-dns.c#L4184-L4185 > and > https://gitlab.com/wireshark/wireshark/-/blob/master/epan/dissectors/packet-usb.c#L3560-L3574 > > Generally these dissectors have several independent keys, and what they > want to match is an exact match on some keys (transaction ID, for example) > and a less than match on others (e.g., frame number.) They do the less than > or equal match and then check for strict equality on the keys that need > that. Handling the lookup like a lexicographical sort would give incorrect > results for those dissectors; the current behavior is as intended. > > So if you're going to do it, you need a new API function. But perhaps what > you really want is to implement something like wmem_tree_lookup64 that > supports 64 bit integers directly rather than expecting the callers to > separate into the upper and lower 32 bits. It is possible to do lookups of > other types (there's a string lookup using a string comparison function, > which might be worth looking at since the method for 32 bit integers calls > the GUINT_TO_POINTER macros and is guaranteed to work for 64 bit integers.) > > John Thacker > ___________________________________________________________________________ > Sent via: Wireshark-dev mailing list <wireshark-dev@wireshark.org> > Archives: https://www.wireshark.org/lists/wireshark-dev > Unsubscribe: https://www.wireshark.org/mailman/options/wireshark-dev > mailto:wireshark-dev-requ...@wireshark.org > ?subject=unsubscribe >
___________________________________________________________________________ Sent via: Wireshark-dev mailing list <wireshark-dev@wireshark.org> Archives: https://www.wireshark.org/lists/wireshark-dev Unsubscribe: https://www.wireshark.org/mailman/options/wireshark-dev mailto:wireshark-dev-requ...@wireshark.org?subject=unsubscribe