Wireshark-dev: Re: [Wireshark-dev] hfinfo.string const initializer / change VALS by preference
From: Jakub Zawadzki <darkjames@xxxxxxxxxxxxxxxx>
Date: Fri, 18 Jun 2010 10:48:07 +0200
Hi,

On Fri, Jun 18, 2010 at 09:35:02AM +0200, Harald Welte wrote:
> As part of the OpenBSC project, I've been  working on a dissector for the GSM
> A-bis OML protocol.  One of the problems with this protocol is that it only
> specifies a set of common functions which are then extended by each
> vendor/implementor.
> 
> This starts with the message type.  There are some message types that are
> according to the GSM TS 12.21, and then there are vendor-specific message
> types.  The ranges of the vendor-specific message types overlap.
> 
> so let's say the spec has defined 0x01, 0x02, 0x03 and vendor A uses 0x05,
> 0x06, whereas vendor B uses 0x05 and 0x06 for something completely else.
> 
> Thus, it is impossible to make one 'value_string' array that encompasses
> all the message types and their names.
> 
> Luckily, I can have a preference that allows the user to select which vendor
> his trace uses.
> 
> My idea was to use the proto_handoff() function to check the preference and
> then dynamically allocate (and populate) a value_string[] array that contains
> the combination of the standard message types as well as the specific message
> types for the preferences-selected vendor.
> 
> However, this fails since the hinfo.strings value needs toe have a constant
> initializer.  And as hfinfo is registered in the proto_register() function,
> there is probably no way for me to change this from within proto_handoff()

I think the best is to have two hfinfo entries, with different value_string..

But if you don't want to:

1/ You can use value_string_ext (and or hfinfo.display with BASE_EXT_STRING)

  static const value_string vs_vendor0[] = { ... }; /* pref_vendor == 0 */
  static const value_string vs_vendor1[] = { ... }; /* pref_vendor == 1 */

  static int pref_vendor = 0;
  static value_string_ext vse_vendor0 = VALUE_STRING_EXT_INIT(vs_vendor0); 
  static value_string_ext vse_vendor1 = VALUE_STRING_EXT_INIT(vs_vendor1);
  static value_string_ext vs_vendor = VALUE_STRING_EXT_INIT(vs_vendor0); /*needed?*

  /* And when preference is changed (apply_cb in prefs_register_protocol), something like: 
    (or in proto_handoff() (?)
  */
  switch (pref_vendor) {
    case 0: vs_vendor = vs_vendor0; break;
    case 1: vs_vendor = vs_vendor1; break;
    default: g_assert_not_reached();
  }

2/ Simillar idea like before, but use value_string instead of value_string_ext.
   And memcpy() arrays. (If you have small arrays it won't hurt much)

Hth.

Btw. OpenBSC is great project!