noe: updated decoding of messages

display True/False if a property is of type "bool"
display string if a property is of type "utf-8"

Change-Id: I3655b401298fc4cca9bcf5388707c90c4c1540bb
Reviewed-on: https://code.wireshark.org/review/31934
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
This commit is contained in:
nbertin 2019-02-06 15:09:09 +01:00 committed by Anders Broman
parent b4f4804741
commit 00318b3267
1 changed files with 197 additions and 39 deletions

View File

@ -10,6 +10,8 @@
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include <stdlib.h>
#include "config.h"
#include "epan/packet.h"
@ -98,7 +100,6 @@ static const value_string val_str_class[] = {
{OPCODE_C_ime_context , "ime_context"},
{0, NULL}
};
static value_string_ext val_str_class_ext = VALUE_STRING_EXT_INIT(val_str_class);
#define OPCODE_P_B_objectid 0
@ -399,7 +400,6 @@ static const value_string val_str_props[] = {
{OPCODE_P_A_end_date , "end_date"},
{0, NULL}
};
static value_string_ext val_str_props_ext = VALUE_STRING_EXT_INIT(val_str_props);
#define OPCODE_EVT_CONTEXT_SWITCH 0
@ -548,7 +548,6 @@ static const value_string val_str_event[] = {
{OPCODE_EVT_ACTLISTBOX_DISMISSED , "EVT_ACTLISTBOX_DISMISSED"},
{0, NULL}
};
static value_string_ext val_str_event_ext = VALUE_STRING_EXT_INIT(val_str_event);
#define P_BASIC 0
@ -560,6 +559,119 @@ static value_string_ext val_str_event_ext = VALUE_STRING_EXT_INIT(val_str_event)
#define C_INVALID 255
#define E_INVALID 255
static guint utf8_properties[] = {
((OPCODE_C_security << 8) | OPCODE_P_B_login ),
((OPCODE_C_security << 8) | OPCODE_P_A_pem_data ),
((OPCODE_C_security << 8) | OPCODE_P_A_serial_number),
((OPCODE_C_security << 8) | OPCODE_P_A_owner_name ),
((OPCODE_C_security << 8) | OPCODE_P_A_issuer_name ),
((OPCODE_C_security << 8) | OPCODE_P_A_end_date ),
((OPCODE_C_date << 8) | OPCODE_P_A_today ),
((OPCODE_C_date << 8) | OPCODE_P_A_tomorrow ),
((OPCODE_C_AOMV << 8) | OPCODE_P_A_label ),
((OPCODE_C_AOMV << 8) | OPCODE_P_A_value ),
((OPCODE_C_bluetooth << 8) | OPCODE_P_B_address ),
((OPCODE_C_bluetooth << 8) | OPCODE_P_B_name ),
((OPCODE_C_callstate << 8) | OPCODE_P_A_name ),
((OPCODE_C_callstate << 8) | OPCODE_P_A_number ),
((OPCODE_C_tabbox << 8) | OPCODE_P_A_label ),
((OPCODE_C_tabbox << 8) | OPCODE_P_A_value ),
((OPCODE_C_listbox << 8) | OPCODE_P_A_label ),
((OPCODE_C_listbox << 8) | OPCODE_P_A_value ),
((OPCODE_C_actionlistbox << 8) | OPCODE_P_A_label ),
((OPCODE_C_actionlistbox << 8) | OPCODE_P_A_value ),
((OPCODE_C_textbox << 8) | OPCODE_P_B_label ),
((OPCODE_C_textbox << 8) | OPCODE_P_B_append ),
((OPCODE_C_textbox << 8) | OPCODE_P_B_overwrite ),
((OPCODE_C_actionbox << 8) | OPCODE_P_B_label ),
((OPCODE_C_actionbox << 8) | OPCODE_P_B_value ),
((OPCODE_C_inputbox << 8) | OPCODE_P_B_label ),
((OPCODE_C_inputbox << 8) | OPCODE_P_B_value ),
((OPCODE_C_inputbox << 8) | OPCODE_P_B_mask ),
((OPCODE_C_inputbox << 8) | OPCODE_P_B_append ),
((OPCODE_C_checkbox << 8) | OPCODE_P_B_label ),
((OPCODE_C_datebox << 8) | OPCODE_P_B_format ),
((OPCODE_C_timerbox << 8) | OPCODE_P_B_label ),
((OPCODE_C_timerbox << 8) | OPCODE_P_B_format ),
((OPCODE_C_dialogbox << 8) | OPCODE_P_B_label ),
((OPCODE_C_dialogbox << 8) | OPCODE_P_A_action_label ),
((OPCODE_C_dialogbox << 8) | OPCODE_P_A_action_value ),
((OPCODE_C_sliderbar << 8) | OPCODE_P_B_label ),
((OPCODE_C_progressbar << 8) | OPCODE_P_B_label ),
((OPCODE_C_imagebox << 8) | OPCODE_P_B_URI ),
((OPCODE_C_AOMEL << 8) | OPCODE_P_A_label ),
((OPCODE_C_telephonicboxitem << 8) | OPCODE_P_B_label ),
((OPCODE_C_bluetooth_device << 8) | OPCODE_P_B_address ),
((OPCODE_C_bluetooth_device << 8) | OPCODE_P_B_name ),
((OPCODE_C_bluetooth_device << 8) | OPCODE_P_B_pin ),
((OPCODE_C_headerbox << 8) | OPCODE_P_B_label ),
((OPCODE_C_ime_context << 8) | OPCODE_P_A_name )
};
static guint bool_properties[] = {
((OPCODE_C_terminal << 8) | OPCODE_P_B_negative_ack ),
((OPCODE_C_terminal << 8) | OPCODE_P_B_CS_idle_state ),
((OPCODE_C_terminal << 8) | OPCODE_P_B_PS_idle_state ),
((OPCODE_C_terminal << 8) | OPCODE_P_B_use_customisation),
((OPCODE_C_terminal << 8) | OPCODE_P_B_ime_lock ),
((OPCODE_C_audioconfig << 8) | OPCODE_P_B_enable ),
((OPCODE_C_audioconfig << 8) | OPCODE_P_B_qos_ticket ),
((OPCODE_C_leds << 8) | OPCODE_P_B_onoff ),
((OPCODE_C_screen << 8) | OPCODE_P_B_visible ),
((OPCODE_C_screen << 8) | OPCODE_P_B_clearscreen ),
((OPCODE_C_AOMV << 8) | OPCODE_P_B_all_icons_off ),
((OPCODE_C_AOMV << 8) | OPCODE_P_A_enable ),
((OPCODE_C_bluetooth << 8) | OPCODE_P_B_bth_ringing ),
((OPCODE_C_bluetooth << 8) | OPCODE_P_B_bonded_devices ),
((OPCODE_C_callstate << 8) | OPCODE_P_B_enable ),
((OPCODE_C_framebox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_framebox << 8) | OPCODE_P_B_autospread ),
((OPCODE_C_framebox << 8) | OPCODE_P_B_cycling ),
((OPCODE_C_tabbox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_listbox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_listbox << 8) | OPCODE_P_B_showevent ),
((OPCODE_C_listbox << 8) | OPCODE_P_B_showactive ),
((OPCODE_C_listbox << 8) | OPCODE_P_B_circular ),
((OPCODE_C_listbox << 8) | OPCODE_P_B_disablelongpress ),
((OPCODE_C_actionlistbox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_textbox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_actionbox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_inputbox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_inputbox << 8) | OPCODE_P_B_enable ),
((OPCODE_C_inputbox << 8) | OPCODE_P_B_password ),
((OPCODE_C_inputbox << 8) | OPCODE_P_B_focus ),
((OPCODE_C_inputbox << 8) | OPCODE_P_B_inputborder ),
((OPCODE_C_checkbox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_checkbox << 8) | OPCODE_P_B_enable ),
((OPCODE_C_checkbox << 8) | OPCODE_P_B_state ),
((OPCODE_C_datebox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_timerbox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_popupbox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_popupbox << 8) | OPCODE_P_B_modal ),
((OPCODE_C_dialogbox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_dialogbox << 8) | OPCODE_P_B_modal ),
((OPCODE_C_sliderbar << 8) | OPCODE_P_B_visible ),
((OPCODE_C_progressbar << 8) | OPCODE_P_B_visible ),
((OPCODE_C_imagebox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_iconbox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_AOMVbox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_telephonicbox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_telephonicbox << 8) | OPCODE_P_B_enable ),
((OPCODE_C_AOMEL << 8) | OPCODE_P_B_all_icons_off ),
((OPCODE_C_AOMEL << 8) | OPCODE_P_B_all_labels_off ),
((OPCODE_C_AOM10 << 8) | OPCODE_P_B_all_icons_off ),
((OPCODE_C_AOM40 << 8) | OPCODE_P_B_all_icons_off ),
((OPCODE_C_telephonicboxitem << 8) | OPCODE_P_B_focus ),
((OPCODE_C_bluetooth_device << 8) | OPCODE_P_B_enable ),
((OPCODE_C_bluetooth_device << 8) | OPCODE_P_B_bonded ),
((OPCODE_C_headerbox << 8) | OPCODE_P_B_visible ),
((OPCODE_C_ime_context << 8) | OPCODE_P_B_enable ),
((OPCODE_C_ime_context << 8) | OPCODE_P_B_visible ),
((OPCODE_C_ime_context << 8) | OPCODE_P_A_mode ),
((OPCODE_C_ime_context << 8) | OPCODE_P_A_state ),
((OPCODE_C_ime_context << 8) | OPCODE_P_A_enable )
};
/*-----------------------------------------------------------------------------
globals
---------------------------------------------------------------------------*/
@ -585,11 +697,13 @@ static int hf_noe_value = -1;
static int hf_noe_message = -1;
static int hf_noe_key_name = -1;
static int hf_noe_bonded = -1;
static int hf_noe_property_item_bool = -1;
static int hf_noe_property_item_u8 = -1;
static int hf_noe_property_item_u16 = -1;
static int hf_noe_property_item_u24 = -1;
static int hf_noe_property_item_u32 = -1;
static int hf_noe_property_item_bytes = -1;
static int hf_noe_property_item_utf8 = -1;
static int hf_event_bt_key = -1;
static int hf_event_context_switch = -1;
static int hf_evt_locappl_enable = -1;
@ -934,6 +1048,25 @@ static void decode_evt_error(proto_tree *tree,
proto_tree_add_item(tree, hf_noe_message, tvb, offset, length, ENC_NA);
}
static int compcp(const void *pcp1, const void *pcp2)
{
guint cp1 = *((guint *)pcp1);
guint cp2 = *((guint *)pcp2);
return (cp1 - cp2);
}
static gboolean property_is_bool(guint8 noe_class, guint8 property_code)
{
guint key = ((noe_class << 8) | property_code);
return (bsearch(&key, bool_properties, (sizeof(bool_properties)/sizeof(guint16)), sizeof(guint16), compcp) != NULL);
}
static gboolean property_is_utf8(guint8 noe_class, guint8 property_code)
{
guint key = ((noe_class << 8) | property_code);
return (bsearch(&key, utf8_properties, (sizeof(utf8_properties)/sizeof(guint16)), sizeof(guint16), compcp) != NULL);
}
/*-----------------------------------------------------------------------------
MESSAGE BODY DECODER
@ -941,11 +1074,12 @@ static void decode_evt_error(proto_tree *tree,
---------------------------------------------------------------------------*/
static void decode_tlv(proto_tree *tree,
tvbuff_t *tvb,
guint8 noe_class,
guint offset,
guint length)
{
proto_tree *property_tree;
guint8 property_type;
guint8 property_code;
guint16 property_length;
/* guint64 property_index;*/
@ -958,12 +1092,12 @@ static void decode_tlv(proto_tree *tree,
while(length > 0)
{
property_type = tvb_get_guint8(tvb, offset);
property_code = tvb_get_guint8(tvb, offset);
proto_tree_add_item(property_tree, hf_noe_pcode, tvb, offset, 1, ENC_BIG_ENDIAN);
offset += 1;
length -= 1;
if (property_type >= P_ARRAY)
if (property_code >= P_ARRAY)
{
proto_tree_add_item(property_tree, hf_noe_aindx, tvb, offset, 1, ENC_BIG_ENDIAN);
offset += 1;
@ -986,38 +1120,38 @@ static void decode_tlv(proto_tree *tree,
length -= 1;
}
switch(property_length)
if (property_is_utf8(noe_class, property_code))
{
case 0:
{
break;
}
case 1:
proto_tree_add_item(property_tree, hf_noe_property_item_u8, tvb, offset, 1, ENC_BIG_ENDIAN);
offset += 1;
length -= 1;
break;
case 2:
proto_tree_add_item(property_tree, hf_noe_property_item_u16, tvb, offset, 2, ENC_BIG_ENDIAN);
offset += 2;
length -= 2;
break;
case 3:
proto_tree_add_item(property_tree, hf_noe_property_item_u24, tvb, offset, 3, ENC_BIG_ENDIAN);
offset += 3;
length -= 3;
break;
case 4:
proto_tree_add_item(property_tree, hf_noe_property_item_u32, tvb, offset, 4, ENC_BIG_ENDIAN);
offset += 4;
length -= 4;
break;
default:
proto_tree_add_item(property_tree, hf_noe_property_item_bytes, tvb, offset, property_length, ENC_NA);
offset += property_length;
length -= property_length;
break;
proto_tree_add_item(property_tree, hf_noe_property_item_utf8, tvb, offset, property_length, ENC_STRING);
}
else
{
switch(property_length)
{
case 0:
break;
case 1:
if (property_is_bool(noe_class, property_code))
proto_tree_add_item(property_tree, hf_noe_property_item_bool, tvb, offset, 1, ENC_BIG_ENDIAN);
else
proto_tree_add_item(property_tree, hf_noe_property_item_u8, tvb, offset, 1, ENC_BIG_ENDIAN);
break;
case 2:
proto_tree_add_item(property_tree, hf_noe_property_item_u16, tvb, offset, 2, ENC_BIG_ENDIAN);
break;
case 3:
proto_tree_add_item(property_tree, hf_noe_property_item_u24, tvb, offset, 3, ENC_BIG_ENDIAN);
break;
case 4:
proto_tree_add_item(property_tree, hf_noe_property_item_u32, tvb, offset, 4, ENC_BIG_ENDIAN);
break;
default:
proto_tree_add_item(property_tree, hf_noe_property_item_bytes, tvb, offset, property_length, ENC_NA);
break;
}
}
offset += property_length;
length -= property_length;
}
}
@ -1199,7 +1333,7 @@ static void decode_evt(proto_tree *tree,
length -= 2;
if (length > 0)
decode_tlv(tree, tvb, offset, length);
decode_tlv(tree, tvb, C_INVALID, offset, length);
break;
}
}
@ -1246,7 +1380,7 @@ static void decode_mtd(proto_tree *tree,
offset += 1;
length -= 1;
if (length > 0)
decode_tlv(tree, tvb, offset, length);
decode_tlv(tree, tvb, noe_class, offset, length);
break;
}
case METHOD_DELETE_ITEM:
@ -1262,7 +1396,7 @@ static void decode_mtd(proto_tree *tree,
default:
{
if (length > 0)
decode_tlv(tree, tvb, offset, length);
decode_tlv(tree, tvb, noe_class, offset, length);
break;
}
}
@ -1540,6 +1674,18 @@ void proto_register_noe(void)
HFILL
}
},
{ &hf_noe_property_item_bool,
{
"Value",
"noe.property_item.bool",
FT_UINT8,
BASE_DEC,
VALS(noe_true_false_str_vals),
0x0,
NULL,
HFILL
}
},
{ &hf_noe_property_item_u8,
{
"Value",
@ -1600,6 +1746,18 @@ void proto_register_noe(void)
HFILL
}
},
{ &hf_noe_property_item_utf8,
{
"Value",
"noe.property_item.utf8",
FT_STRING,
BASE_NONE,
NULL,
0x0,
NULL,
HFILL
}
},
{ &hf_event_bt_key,
{
"Value",