/*--- dissect_qsig_arg ------------------------------------------------------*/ static int dissect_qsig_arg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { int offset = 0; rose_ctx_t *rctx; gint32 opcode = 0, service; const qsig_op_t *op_ptr; const gchar *p; proto_item *ti, *ti_tmp; proto_tree *qsig_tree; /* Reject the packet if data is NULL */ if (data == NULL) return 0; rctx = get_rose_ctx(data); DISSECTOR_ASSERT(rctx); if (rctx->d.pdu != 1) /* invoke */ return offset; if (rctx->d.code == 0) { /* local */ opcode = rctx->d.code_local; op_ptr = get_op(opcode); } else if (rctx->d.code == 1) { /* global */ op_ptr = (qsig_op_t *)g_hash_table_lookup(qsig_oid2op_hashtable, rctx->d.code_global); if (op_ptr) opcode = op_ptr->opcode; } else { return offset; } if (!op_ptr) return offset; service = get_service(opcode); ti = proto_tree_add_item(tree, proto_qsig, tvb, offset, tvb_captured_length(tvb), ENC_NA); qsig_tree = proto_item_add_subtree(ti, ett_qsig); proto_tree_add_uint(qsig_tree, hf_qsig_operation, tvb, 0, 0, opcode); p = try_val_to_str(opcode, VALS(qsig_str_operation)); if (p) { proto_item_append_text(ti, ": %s", p); proto_item_append_text(rctx->d.code_item, " - %s", p); if (rctx->apdu_depth >= 0) proto_item_append_text(proto_item_get_parent_nth(proto_tree_get_parent(tree), rctx->apdu_depth), " %s", p); } ti_tmp = proto_tree_add_uint(qsig_tree, hf_qsig_service, tvb, 0, 0, service); p = try_val_to_str(service, VALS(qsig_str_service_name)); if (p) proto_item_append_text(ti_tmp, " - %s", p); if (op_ptr->arg_pdu) offset = op_ptr->arg_pdu(tvb, pinfo, qsig_tree, NULL); else if (tvb_reported_length_remaining(tvb, offset) > 0) { proto_tree_add_expert(tree, pinfo, &ei_qsig_unsupported_error_type, tvb, offset, -1); offset += tvb_captured_length_remaining(tvb, offset); } return offset; }
/*--- dissect_qsig_arg ------------------------------------------------------*/ static int dissect_qsig_arg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { int offset; rose_ctx_t *rctx; gint32 opcode = 0, service; const qsig_op_t *op_ptr; const gchar *p; proto_item *ti, *ti_tmp; proto_tree *qsig_tree; offset = 0; rctx = get_rose_ctx(pinfo->private_data); DISSECTOR_ASSERT(rctx); if (rctx->d.pdu != 1) /* invoke */ return offset; if (rctx->d.code == 0) { /* local */ opcode = rctx->d.code_local; op_ptr = get_op(opcode); } else if (rctx->d.code == 1) { /* global */ op_ptr = g_hash_table_lookup(qsig_oid2op_hashtable, rctx->d.code_global); if (op_ptr) opcode = op_ptr->opcode; } else { return offset; } if (!op_ptr) return offset; service = get_service(opcode); ti = proto_tree_add_item(tree, proto_qsig, tvb, offset, tvb_length(tvb), ENC_NA); qsig_tree = proto_item_add_subtree(ti, ett_qsig); proto_tree_add_uint(qsig_tree, hf_qsig_operation, tvb, 0, 0, opcode); p = match_strval(opcode, VALS(qsig_str_operation)); if (p) { proto_item_append_text(ti, ": %s", p); proto_item_append_text(rctx->d.code_item, " - %s", p); if (rctx->apdu_depth >= 0) proto_item_append_text(proto_item_get_parent_nth(proto_tree_get_parent(tree), rctx->apdu_depth), " %s", p); } ti_tmp = proto_tree_add_uint(qsig_tree, hf_qsig_service, tvb, 0, 0, service); p = match_strval(service, VALS(qsig_str_service_name)); if (p) proto_item_append_text(ti_tmp, " - %s", p); if (op_ptr->arg_pdu) offset = op_ptr->arg_pdu(tvb, pinfo, qsig_tree); else if (tvb_length_remaining(tvb, offset) > 0) { proto_tree_add_text(qsig_tree, tvb, offset, -1, "UNSUPPORTED ARGUMENT TYPE (QSIG)"); offset += tvb_length_remaining(tvb, offset); } return offset; }
/*--- dissect_isdn_sup_arg ------------------------------------------------------*/ static int dissect_isdn_sup_arg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { int offset = 0; rose_ctx_t *rctx; gint32 opcode = 0; const gchar *p; const isdn_sup_op_t *op_ptr; proto_item *ti; proto_tree *isdn_sup_tree; /* Reject the packet if data is NULL */ if (data == NULL) return 0; rctx = get_rose_ctx(data); DISSECTOR_ASSERT(rctx); if (rctx->d.pdu != 1) /* invoke */ return offset; if (rctx->d.code == 0) { /* local */ opcode = rctx->d.code_local; } else { return offset; } op_ptr = get_op(opcode); if (!op_ptr) return offset; ti = proto_tree_add_item(tree, proto_isdn_sup, tvb, offset, -1, ENC_NA); isdn_sup_tree = proto_item_add_subtree(ti, ett_isdn_sup); proto_tree_add_uint(isdn_sup_tree, hf_isdn_sup_operation, tvb, 0, 0, opcode); p = try_val_to_str(opcode, VALS(isdn_sup_str_operation)); if (p) { proto_item_append_text(ti, ": %s", p); proto_item_append_text(rctx->d.code_item, " - %s", p); if (rctx->apdu_depth >= 0) proto_item_append_text(proto_item_get_parent_nth(proto_tree_get_parent(tree), rctx->apdu_depth), " %s", p); } if (op_ptr->arg_pdu) offset = op_ptr->arg_pdu(tvb, pinfo, isdn_sup_tree, NULL); else if (tvb_reported_length_remaining(tvb, offset) > 0) { proto_tree_add_expert(tree, pinfo, &ei_isdn_sup_unsupported_error_type, tvb, offset, -1); offset += tvb_reported_length_remaining(tvb, offset); } return offset; }
/*--- dissect_qsig_err ------------------------------------------------------*/ static int dissect_qsig_err(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { int offset = 0; rose_ctx_t *rctx; gint32 errcode; const qsig_err_t *err_ptr; const gchar *p; proto_item *ti; proto_tree *qsig_tree; /* Reject the packet if data is NULL */ if (data == NULL) return 0; rctx = get_rose_ctx(data); DISSECTOR_ASSERT(rctx); if (rctx->d.pdu != 3) /* returnError */ return offset; if (rctx->d.code != 0) /* local */ return offset; errcode = rctx->d.code_local; err_ptr = get_err(errcode); if (!err_ptr) return offset; ti = proto_tree_add_item(tree, proto_qsig, tvb, offset, tvb_captured_length(tvb), ENC_NA); qsig_tree = proto_item_add_subtree(ti, ett_qsig); proto_tree_add_uint(qsig_tree, hf_qsig_error, tvb, 0, 0, errcode); p = try_val_to_str(errcode, VALS(qsig_str_error)); if (p) { proto_item_append_text(ti, ": %s", p); proto_item_append_text(rctx->d.code_item, " - %s", p); if (rctx->apdu_depth >= 0) proto_item_append_text(proto_item_get_parent_nth(proto_tree_get_parent(tree), rctx->apdu_depth), " %s", p); } if (err_ptr->err_pdu) offset = err_ptr->err_pdu(tvb, pinfo, qsig_tree, NULL); else if (tvb_reported_length_remaining(tvb, offset) > 0) { proto_tree_add_expert(tree, pinfo, &ei_qsig_unsupported_error_type, tvb, offset, -1); offset += tvb_captured_length_remaining(tvb, offset); } return offset; }
static void dissect_mac_mgmt_msg_decoder(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { guint offset = 0; guint message_type; proto_item *message_item; proto_tree *message_tree; const char* mgt_msg_str; message_item = proto_tree_add_protocol_format(tree, proto_mac_mgmt_msg_decoder, tvb, offset, -1, "MAC Management Message Type (%u bytes)", tvb_reported_length(tvb)); message_tree = proto_item_add_subtree(message_item, ett_mac_mgmt_msg_decoder); if (tvb_reported_length(tvb) == 0) { expert_add_info(pinfo, message_item, &ei_empty_payload); return; } /* Get the payload type */ message_type = tvb_get_guint8(tvb, offset); proto_tree_add_item(message_tree, hf_mac_mgmt_msg_type, tvb, offset, 1, ENC_NA); mgt_msg_str = val_to_str_ext_const(message_type, &mgt_msg_abbrv_vals_ext, "Unknown"); /* Display message type in Info column */ col_append_sep_str(pinfo->cinfo, COL_INFO, ", ", mgt_msg_str); /* add the payload type into the info column */ if (try_val_to_str_ext(message_type, &mgt_msg_abbrv_vals_ext) == NULL) { /* display the MAC payload in Hex */ proto_tree_add_item(message_tree, hf_mac_mgmt_msg_values, tvb, offset, -1, ENC_NA); return; } /* add the MAC header info to parent*/ proto_item_append_text(proto_tree_get_parent(tree), ", %s", mgt_msg_str); /* Decode and display the MAC payload */ if (!dissector_try_uint(subdissector_message_table, message_type, tvb_new_subset_remaining(tvb, 1), pinfo, tree)) { proto_tree_add_item(message_tree, hf_mac_mgmt_msg_values, tvb, offset, -1, ENC_NA); } }
/*--- dissect_qsig_err ------------------------------------------------------*/ static int dissect_qsig_err(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { int offset; rose_ctx_t *rctx; gint32 errcode; const qsig_err_t *err_ptr; const gchar *p; proto_item *ti; proto_tree *qsig_tree; offset = 0; rctx = get_rose_ctx(pinfo->private_data); DISSECTOR_ASSERT(rctx); if (rctx->d.pdu != 3) /* returnError */ return offset; if (rctx->d.code != 0) /* local */ return offset; errcode = rctx->d.code_local; err_ptr = get_err(errcode); if (!err_ptr) return offset; ti = proto_tree_add_item(tree, proto_qsig, tvb, offset, tvb_length(tvb), ENC_NA); qsig_tree = proto_item_add_subtree(ti, ett_qsig); proto_tree_add_uint(qsig_tree, hf_qsig_error, tvb, 0, 0, errcode); p = match_strval(errcode, VALS(qsig_str_error)); if (p) { proto_item_append_text(ti, ": %s", p); proto_item_append_text(rctx->d.code_item, " - %s", p); if (rctx->apdu_depth >= 0) proto_item_append_text(proto_item_get_parent_nth(proto_tree_get_parent(tree), rctx->apdu_depth), " %s", p); } if (err_ptr->err_pdu) offset = err_ptr->err_pdu(tvb, pinfo, qsig_tree); else if (tvb_length_remaining(tvb, offset) > 0) { proto_tree_add_text(qsig_tree, tvb, offset, -1, "UNSUPPORTED ERROR TYPE (QSIG)"); offset += tvb_length_remaining(tvb, offset); } return offset; }
/*--- dissect_h450_err ------------------------------------------------------*/ static int dissect_h450_err(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { proto_item *hidden_item; int offset = 0; rose_ctx_t *rctx; gint32 errcode; const h450_err_t *err_ptr; const gchar *p; /* Reject the packet if data is NULL */ if (data == NULL) return 0; rctx = get_rose_ctx(data); DISSECTOR_ASSERT(rctx); if (rctx->d.pdu != 3) /* returnError */ return offset; if (rctx->d.code != 0) /* local */ return offset; errcode = rctx->d.code_local; err_ptr = get_err(errcode); if (!err_ptr) return offset; hidden_item = proto_tree_add_uint(tree, hf_h450_error, tvb, 0, 0, errcode); PROTO_ITEM_SET_HIDDEN(hidden_item); p = try_val_to_str(errcode, VALS(h450_str_error)); if (p) { proto_item_append_text(rctx->d.code_item, " - %s", p); if (rctx->apdu_depth >= 0) proto_item_append_text(proto_item_get_parent_nth(proto_tree_get_parent(tree), rctx->apdu_depth), " %s", p); } if (err_ptr->err_pdu && (tvb_reported_length_remaining(tvb, offset) > 0)) offset = err_ptr->err_pdu(tvb, pinfo, tree, NULL); else if (tvb_reported_length_remaining(tvb, offset) > 0) { proto_tree_add_expert(tree, pinfo, &ei_h450_unsupported_error_type, tvb, offset, -1); offset += tvb_reported_length_remaining(tvb, offset); } return offset; }
static void xmpp_jingle_cont_desc_rtp_payload_param(proto_tree* tree, tvbuff_t* tvb, packet_info *pinfo, xmpp_element_t* element) { proto_item *param_item; proto_tree *param_tree; proto_item *parent_item; xmpp_attr_t *name, *value; xmpp_attr_info attrs_info[] = { {"xmlns", hf_xmpp_xmlns, FALSE, FALSE, NULL, NULL}, {"name", hf_xmpp_jingle_cont_desc_payload_param_name, TRUE, TRUE, NULL, NULL}, {"value", hf_xmpp_jingle_cont_desc_payload_param_value, TRUE, TRUE, NULL, NULL} }; name = xmpp_get_attr(element, "name"); value = xmpp_get_attr(element, "value"); if(name && value) { gchar *parent_item_label; parent_item = proto_tree_get_parent(tree); parent_item_label = proto_item_get_text(parent_item); if(parent_item_label) { parent_item_label[strlen(parent_item_label)-1]= '\0'; proto_item_set_text(parent_item, "%s param(\"%s\")=%s]", parent_item_label ,name->value, value->value); } } param_item = proto_tree_add_item(tree, hf_xmpp_jingle_cont_desc_payload_param, tvb, element->offset, element->length, ENC_BIG_ENDIAN); param_tree = proto_item_add_subtree(param_item, ett_xmpp_jingle_cont_desc_payload_param); xmpp_display_attrs(param_tree, element, pinfo, tvb, attrs_info, array_length(attrs_info)); xmpp_unknown(param_tree, tvb, pinfo, element); }
static void dissect_hpsw_tlv(tvbuff_t *tvb, packet_info *pinfo, int offset, int length, proto_tree *tree, proto_item *ti, guint8 type) { switch (type) { case HPFOO_DEVICE_NAME: if (length > 0) { proto_tree_add_item(tree, hf_hpsw_device_name, tvb, offset, length, ENC_NA|ENC_ASCII); } else { expert_add_info_format(pinfo, ti, &ei_hpsw_tlvlength_bad, "Device Name: Bad length %u", length); } break; case HPFOO_DEVICE_VERSION: if (length > 0) { proto_tree_add_item(tree, hf_hpsw_device_version, tvb, offset, length, ENC_NA|ENC_ASCII); } else { expert_add_info_format(pinfo, ti, &ei_hpsw_tlvlength_bad, "Version: Bad length %u", length); } break; case HPFOO_CONFIG_NAME: if (length > 0) { proto_tree_add_item(tree, hf_hpsw_config_name, tvb, offset, length, ENC_NA|ENC_ASCII); } else { expert_add_info_format(pinfo, ti, &ei_hpsw_tlvlength_bad, "Config Name: Bad length %u", length); } break; case HPFOO_ROOT_MAC_ADDR: if (length == 6) { proto_tree_add_item(tree, hf_hpsw_root_mac_addr, tvb, offset, length, ENC_NA); } else { expert_add_info_format(pinfo, ti, &ei_hpsw_tlvlength_bad, "Root MAC Addr: Bad length %u", length); } break; case HPFOO_IP_ADDR: if (length == 4) { proto_tree_add_item(tree, hf_hpsw_ip_addr, tvb, offset, length, ENC_BIG_ENDIAN); } else { expert_add_info_format(pinfo, ti, &ei_hpsw_tlvlength_bad, "IP Addr: Bad length %u", length); } break; case HPFOO_FIELD_6: if (length == 2) { proto_tree_add_item(tree, hf_hpsw_field_6, tvb, offset, length, ENC_BIG_ENDIAN); } else { expert_add_info_format(pinfo, ti, &ei_hpsw_tlvlength_bad, "Field 6: Bad length %u", length); } break; case HPFOO_DOMAIN: if (length > 0) { proto_tree_add_item(tree, hf_hpsw_domain, tvb, offset, length, ENC_NA|ENC_ASCII); } else { expert_add_info_format(pinfo, ti, &ei_hpsw_tlvlength_bad, "Domain: Bad length %u", length); } break; case HPFOO_FIELD_8: if (length == 2) { proto_tree_add_item(tree, hf_hpsw_field_8, tvb, offset, length, ENC_BIG_ENDIAN); } else { expert_add_info_format(pinfo, ti, &ei_hpsw_tlvlength_bad, "Field 8: Bad length %u", length); } break; case HPFOO_FIELD_9: if (length == 2) { proto_tree_add_item(tree, hf_hpsw_field_9, tvb, offset, length, ENC_BIG_ENDIAN); } else { expert_add_info_format(pinfo, ti, &ei_hpsw_tlvlength_bad, "Field 9: Bad length %u", length); } break; case HPFOO_FIELD_10: if (length == 4) { proto_tree_add_item(tree, hf_hpsw_field_10, tvb, offset, length, ENC_BIG_ENDIAN); } else { expert_add_info_format(pinfo, ti, &ei_hpsw_tlvlength_bad, "Field 10: Bad length %u", length); } break; case HPFOO_NEIGHBORS: if (!(length % 6)) { int i = length/6; proto_item_set_text(proto_tree_get_parent(tree), "Number of neighbor MAC Addresses: %u", i); for ( ; i; i--) { proto_tree_add_item(tree, hf_hpsw_neighbor_mac_addr, tvb, offset, 6, ENC_NA); offset += 6; } } else { expert_add_info_format(pinfo, ti, &ei_hpsw_tlvlength_bad, "Neighbors: Bad length %u", length); } break; case HPFOO_FIELD_12: if (length == 1) { proto_tree_add_item(tree, hf_hpsw_field_12, tvb, offset, length, ENC_BIG_ENDIAN); } else { expert_add_info_format(pinfo, ti, &ei_hpsw_tlvlength_bad, "Field 12: Bad length %u", length); } break; case HPFOO_DEVICE_ID: if (length > 6) { proto_tree_add_item(tree, hf_hpsw_device_id, tvb, offset, 6, ENC_NA); proto_tree_add_item(tree, hf_hpsw_device_id_data, tvb, offset+6, length-6, ENC_NA); } else { expert_add_info_format(pinfo, ti, &ei_hpsw_tlvlength_bad, "Device ID: Bad length %u", length); } break; case HPFOO_OWN_MAC_ADDR: if (length == 6) { proto_tree_add_item(tree, hf_hpsw_own_mac_addr, tvb, offset, length, ENC_NA); } else { expert_add_info_format(pinfo, ti, &ei_hpsw_tlvlength_bad, "Own MAC Addr: Bad length %u", length); } break; default: proto_tree_add_item(tree, hf_hpsw_data, tvb, offset, length, ENC_NA); break; } }
if(child->default_ns_abbrev) proto_item_append_text(unknown_item,"(%s)",child->default_ns_abbrev); xmpp_unknown_items(unknown_tree, tvb, pinfo, child, 1); proto_item_append_text(unknown_item, " [UNKNOWN]"); expert_add_info_format(pinfo, unknown_item, &ei_xmpp_unknown_element, "Unknown element: %s", child->name); } childs = childs->next; } } void xmpp_unknown_attrs(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo _U_, xmpp_element_t *element, gboolean displ_short_list) { proto_item *item = proto_tree_get_parent(tree); GList *keys = g_hash_table_get_keys(element->attrs); GList *values = g_hash_table_get_values(element->attrs); GList *keys_head = keys, *values_head = values; gboolean short_list_started = FALSE; while(keys && values) { xmpp_attr_t *attr = (xmpp_attr_t*) values->data; if (!attr->was_read) { if (displ_short_list) { if (!short_list_started) proto_item_append_text(item, " [");