guint8 oui[3]; guint32 oui32; guint16 pid; oui_info_t *oui_info; dissector_table_t subdissector_table; int hf; col_set_str(pinfo->cinfo, COL_PROTOCOL, "IEEE802a"); col_clear(pinfo->cinfo, COL_INFO); ti = proto_tree_add_item(tree, proto_ieee802a, tvb, 0, 5, ENC_NA); ieee802a_tree = proto_item_add_subtree(ti, ett_ieee802a); tvb_memcpy(tvb, oui, 0, 3); oui32 = oui[0] << 16 | oui[1] << 8 | oui[2]; manuf = get_manuf_name_if_known(oui); pid = tvb_get_ntohs(tvb, 3); col_add_fstr(pinfo->cinfo, COL_INFO, "OUI %s (%s), PID 0x%04X", bytestring_to_str(wmem_packet_scope(), oui, 3, ':'), manuf ? manuf : "Unknown", pid); proto_tree_add_uint_format_value(ieee802a_tree, hf_ieee802a_oui, tvb, 0, 3, oui32, "%s (%s)", bytestring_to_str(wmem_packet_scope(), oui, 3, ':'), manuf ? manuf : "Unknown"); /* * Do we have information for this OUI? */ if (oui_info_table != NULL && (oui_info = (oui_info_t *)g_hash_table_lookup(oui_info_table,
static void dissect_ieee802a(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { proto_tree *ieee802a_tree = NULL; proto_item *ti; tvbuff_t *next_tvb; const gchar *manuf; guint8 oui[3]; guint16 pid; oui_info_t *oui_info; dissector_table_t subdissector_table; int hf; col_set_str(pinfo->cinfo, COL_PROTOCOL, "IEEE802a"); col_clear(pinfo->cinfo, COL_INFO); if (tree) { ti = proto_tree_add_item(tree, proto_ieee802a, tvb, 0, 5, ENC_NA); ieee802a_tree = proto_item_add_subtree(ti, ett_ieee802a); } tvb_memcpy(tvb, oui, 0, 3); manuf = get_manuf_name_if_known(oui); pid = tvb_get_ntohs(tvb, 3); col_add_fstr(pinfo->cinfo, COL_INFO, "OUI %s (%s), PID 0x%04X", bytes_to_str_punct(oui, 3, ':'), manuf ? manuf : "Unknown", pid); proto_tree_add_uint_format_value(ieee802a_tree, hf_ieee802a_oui, tvb, 0, 3, oui[0] << 16 | oui[1] << 8 | oui[2], "%s (%s)", bytes_to_str_punct(oui, 3, ':'), manuf ? manuf : "Unknown"); /* * Do we have information for this OUI? */ if (oui_info_table != NULL && (oui_info = (oui_info_t *)g_hash_table_lookup(oui_info_table, GUINT_TO_POINTER(oui))) != NULL) { /* * Yes - use it. */ hf = *oui_info->field_info->p_id; subdissector_table = oui_info->table; } else { /* * No, use hf_ieee802a_pid for the PID and just dissect * the payload as data. */ hf = hf_ieee802a_pid; subdissector_table = NULL; } if (tree) proto_tree_add_uint(ieee802a_tree, hf, tvb, 3, 2, pid); next_tvb = tvb_new_subset_remaining(tvb, 5); if (subdissector_table != NULL) { /* do lookup with the subdissector table */ if (dissector_try_uint(subdissector_table, pid, next_tvb, pinfo, tree)) return; } call_dissector(data_handle, next_tvb, pinfo, tree); }