void dissect_umts_cell_broadcast_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { guint8 sms_encoding; guint32 offset = 0; guint32 len; proto_item *cbs_item; proto_tree *cbs_tree, *cbs_subtree; guint msg_len; guint8 *msg; tvbuff_t * cbs_msg_tvb = NULL; len = tvb_length(tvb); col_append_str(pinfo->cinfo, COL_PROTOCOL, " Cell Broadcast"); col_append_str(pinfo->cinfo, COL_INFO, " (CBS Message)"); cbs_item = proto_tree_add_protocol_format(proto_tree_get_root(tree), proto_cell_broadcast, tvb, 0, len, "Cell Broadcast"); cbs_tree = proto_item_add_subtree(cbs_item, ett_cbs_msg); sms_encoding = dissect_cbs_data_coding_scheme(tvb, pinfo, cbs_tree, 0); offset++; cbs_msg_tvb = dissect_cbs_data(sms_encoding, tvb, cbs_tree, pinfo, offset ); msg_len = tvb_length(cbs_msg_tvb); cbs_subtree = proto_tree_add_subtree_format(cbs_tree, tvb, offset, -1, ett_cbs_msg, NULL, "Cell Broadcast Message Contents (length: %d)", msg_len); msg = tvb_get_string_enc(wmem_packet_scope(), cbs_msg_tvb, 0, msg_len, ENC_ASCII); proto_tree_add_string_format(cbs_subtree, hf_gsm_cbs_message_content, cbs_msg_tvb, 0, -1, msg, "%s", msg); }
void dissect_umts_cell_broadcast_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { guint8 sms_encoding; guint32 offset = 0; guint32 len; proto_item *cbs_item = NULL, *cbs_item2 = NULL; proto_tree *cbs_tree = NULL, *cbs_subtree = NULL; guint16 msg_len; tvbuff_t * cbs_msg_tvb = NULL; len = tvb_length(tvb); col_append_str(pinfo->cinfo, COL_PROTOCOL, " Cell Broadcast"); col_append_str(pinfo->cinfo, COL_INFO, " (CBS Message)"); cbs_item = proto_tree_add_protocol_format(proto_tree_get_root(tree), proto_cell_broadcast, tvb, 0, len, "Cell Broadcast"); cbs_tree = proto_item_add_subtree(cbs_item, ett_cbs_msg); sms_encoding = dissect_cbs_data_coding_scheme(tvb, pinfo, cbs_tree, 0); offset++; cbs_msg_tvb = dissect_cbs_data(sms_encoding, tvb, cbs_tree, pinfo, offset ); msg_len = tvb_length(cbs_msg_tvb); cbs_item2 = proto_tree_add_text(cbs_tree, tvb, offset, -1, "Cell Broadcast Message Contents (length: %d)", msg_len); cbs_subtree = proto_item_add_subtree(cbs_item2, ett_cbs_msg); proto_tree_add_text(cbs_subtree, cbs_msg_tvb , 0, tvb_length(cbs_msg_tvb), "%s", tvb_get_ephemeral_string(cbs_msg_tvb, 0, msg_len)); }
tvbuff_t *cbs_msg_tvb = NULL; fragment_head * frag_data = NULL; len = tvb_reported_length(tvb); col_append_str(pinfo->cinfo, COL_PROTOCOL, " Cell Broadcast"); col_append_str(pinfo->cinfo, COL_INFO, " (CBS Page)"); cbs_page_item = proto_tree_add_protocol_format(proto_tree_get_root(tree), proto_cell_broadcast, tvb, 0, len, "GSM Cell Broadcast"); cbs_page_tree = proto_item_add_subtree(cbs_page_item, ett_gsm_cbs_page); serial_number = tvb_get_ntohs(tvb, offset); offset = dissect_cbs_serial_number(tvb, cbs_page_tree, offset); message_id = tvb_get_ntohs(tvb, offset); offset = dissect_cbs_message_identifier(tvb, cbs_page_tree, offset); sms_encoding = dissect_cbs_data_coding_scheme(tvb, pinfo, cbs_page_tree, offset++); total_pages = tvb_get_guint8(tvb, offset); current_page = (total_pages & 0xF0) >> 4; total_pages &= 0x0F; proto_tree_add_item(cbs_page_tree, hf_gsm_cbs_current_page, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(cbs_page_tree, hf_gsm_cbs_total_pages, tvb, offset++, 1, ENC_BIG_ENDIAN); cbs_page_tvb = dissect_cbs_data(sms_encoding, tvb, cbs_page_tree, pinfo, offset ); if (cbs_page_tvb != NULL) { text_len = tvb_reported_length(cbs_page_tvb); while (text_len && (tvb_get_guint8(cbs_page_tvb, text_len-1) == '\r')) { text_len--; } if (tree != NULL) {
static void dissect_gsm_cell_broadcast(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { guint8 sms_encoding, total_pages, current_page; guint32 offset = 0; guint len, text_len; guint32 msg_key; proto_item *cbs_page_item = NULL; proto_tree *cbs_page_tree = NULL; guint16 serial_number, message_id; tvbuff_t *cbs_page_tvb = NULL; tvbuff_t *cbs_msg_tvb = NULL; fragment_head * frag_data = NULL; len = tvb_length(tvb); col_append_str(pinfo->cinfo, COL_PROTOCOL, " Cell Broadcast"); col_append_str(pinfo->cinfo, COL_INFO, " (CBS Page)"); cbs_page_item = proto_tree_add_protocol_format(proto_tree_get_root(tree), proto_cell_broadcast, tvb, 0, len, "GSM Cell Broadcast"); cbs_page_tree = proto_item_add_subtree(cbs_page_item, ett_gsm_cbs_page); serial_number = tvb_get_ntohs(tvb, offset); offset = dissect_cbs_serial_number(tvb, cbs_page_tree, offset); message_id = tvb_get_ntohs(tvb, offset); offset = dissect_cbs_message_identifier(tvb, cbs_page_tree, offset); sms_encoding = dissect_cbs_data_coding_scheme(tvb, pinfo, cbs_page_tree, offset++); total_pages = tvb_get_guint8(tvb, offset); current_page = (total_pages & 0xF0) >> 4; total_pages &= 0x0F; proto_tree_add_item(cbs_page_tree, hf_gsm_cbs_current_page, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(cbs_page_tree, hf_gsm_cbs_total_pages, tvb, offset++, 1, ENC_BIG_ENDIAN); cbs_page_tvb = dissect_cbs_data(sms_encoding, tvb, cbs_page_tree, pinfo, offset ); if (cbs_page_tvb != NULL) { text_len = tvb_length(cbs_page_tvb); while (text_len && (tvb_get_guint8(cbs_page_tvb, text_len-1) == '\r')) { text_len--; } if (tree != NULL) { proto_tree *cbs_page_subtree = proto_tree_add_subtree(cbs_page_tree, tvb, offset, -1, ett_gsm_cbs_page_content, NULL, "Cell Broadcast Page Contents"); len = tvb_length(cbs_page_tvb); proto_tree_add_string(cbs_page_subtree, hf_gsm_cbs_page_content, cbs_page_tvb, 0, text_len, tvb_get_string_enc(wmem_packet_scope(), cbs_page_tvb, 0, text_len, ENC_ASCII)); len -= text_len; if (len) { proto_tree_add_string(cbs_page_subtree, hf_gsm_cbs_page_content_padding, cbs_page_tvb, text_len, len, tvb_get_string_enc(wmem_packet_scope(), cbs_page_tvb, text_len, len, ENC_ASCII)); } } if (text_len) { cbs_page_tvb = tvb_new_subset_length(cbs_page_tvb, 0, text_len); if (total_pages == 1) { /* no need for reassembly */ cbs_msg_tvb = cbs_page_tvb; } else { /* now we have a complete page, try to concatenate the full message */ /* we can use the serial number and message ID as keys, as they are the same for all pages of a message */ msg_key = (serial_number << 16) + message_id; frag_data = fragment_add_seq_check(&gsm_cbs_reassembly_table, cbs_page_tvb, 0, pinfo, msg_key, NULL, (current_page -1), text_len, (current_page!=total_pages)); cbs_msg_tvb = process_reassembled_data(cbs_page_tvb, 0, pinfo, "Reassembled Cell Broadcast message", frag_data, &gsm_page_items, NULL, cbs_page_tree); } } } if (cbs_msg_tvb != NULL) { proto_item *cbs_msg_item = NULL; proto_tree *cbs_msg_tree = NULL; len = tvb_length(cbs_msg_tvb); col_append_str(pinfo->cinfo, COL_INFO, " (CBS Message)"); cbs_msg_item = proto_tree_add_protocol_format(proto_tree_get_root(tree), proto_cell_broadcast, cbs_msg_tvb, 0, len, "GSM Cell Broadcast Message"); cbs_msg_tree = proto_item_add_subtree(cbs_msg_item, ett_cbs_msg); proto_tree_add_string(cbs_msg_tree, hf_gsm_cbs_message_content, cbs_msg_tvb, 0, len, tvb_get_string_enc(wmem_packet_scope(), cbs_msg_tvb, 0, len, ENC_ASCII)); } }
static gint dissect_cbsp_tlvs(tvbuff_t *tvb, int base_offs, int length, packet_info *pinfo, proto_tree *tree) { guint8 sms_encoding = SMS_ENCODING_7BIT; int offset = base_offs; while (offset - base_offs < length) { guint8 tag; /* Information Element Identifier */ unsigned int len; /* Length of payload */ unsigned int len_len = 0;/* Length of "length" field (may be 0) */ proto_item *ti; proto_tree *att_tree, *subtree; guint32 tmp_u; int secs; tag = tvb_get_guint8(tvb, offset); offset++; switch (cbsp_att_tlvdef.def[tag].type) { case TLV_TYPE_TV: len = 1; len_len = 0; break; case TLV_TYPE_FIXED: len = cbsp_att_tlvdef.def[tag].fixed_len; len_len = 0; break; case TLV_TYPE_TLV: len = tvb_get_guint8(tvb, offset); break; case TLV_TYPE_TL16V: len = tvb_get_guint16(tvb, offset, ENC_BIG_ENDIAN); len_len = 2; break; default: return length; } att_tree = proto_tree_add_subtree_format(tree, tvb, offset-1, 1+len_len+len, ett_cbsp_ie, &ti, "IE: %s", val_to_str(tag, cbsp_iei_names, "Unknown 0x%02x")); proto_tree_add_item(att_tree, hf_cbsp_iei, tvb, offset-1, 1, ENC_NA); if (len_len) proto_tree_add_uint(att_tree, hf_cbsp_ie_len, tvb, offset, len_len, len); offset += len_len; switch (tag) { case CBSP_IEI_MSG_CONTENT: dissect_cbsp_content_ie(tvb, pinfo, offset, len, att_tree, sms_encoding, ti); break; case CBSP_IEI_OLD_SERIAL_NR: proto_tree_add_item_ret_uint(att_tree, hf_cbsp_old_serial_nr, tvb, offset, len, ENC_BIG_ENDIAN, &tmp_u); proto_item_append_text(ti, ": 0x%04x", tmp_u); break; case CBSP_IEI_NEW_SERIAL_NR: proto_tree_add_item_ret_uint(att_tree, hf_cbsp_new_serial_nr, tvb, offset, len, ENC_BIG_ENDIAN, &tmp_u); proto_item_append_text(ti, ": 0x%04x", tmp_u); break; case CBSP_IEI_CATEGORY: proto_tree_add_item_ret_uint(att_tree, hf_cbsp_category, tvb, offset, len, ENC_NA,&tmp_u); proto_item_append_text(ti, ": %s", val_to_str_const(tmp_u, cbsp_category_names, "")); break; case CBSP_IEI_REP_PERIOD: proto_tree_add_item_ret_uint(att_tree, hf_cbsp_rep_period, tvb, offset, len, ENC_BIG_ENDIAN, &tmp_u); proto_item_append_text(ti, ": %u", tmp_u); break; case CBSP_IEI_NUM_BCAST_REQ: proto_tree_add_item_ret_uint(att_tree, hf_cbsp_num_bcast_req, tvb, offset, len, ENC_BIG_ENDIAN, &tmp_u); proto_item_append_text(ti, ": %u", tmp_u); break; case CBSP_IEI_CAUSE: proto_tree_add_item_ret_uint(att_tree, hf_cbsp_cause, tvb, offset, len, ENC_NA, &tmp_u); proto_item_append_text(ti, ": %s", val_to_str_const(tmp_u, cbsp_cause_vals, "")); break; case CBSP_IEI_DCS: proto_tree_add_item_ret_uint(att_tree, hf_cbsp_dcs, tvb, offset, len, ENC_NA, &tmp_u); subtree = proto_item_add_subtree(att_tree, ett_cbsp_cbs_data_coding); sms_encoding = dissect_cbs_data_coding_scheme(tvb, pinfo, subtree, offset); proto_item_append_text(ti, ": 0x%02x", tmp_u); break; case CBSP_IEI_RECOVERY_IND: proto_tree_add_item(att_tree, hf_cbsp_recovery_ind, tvb, offset, len, ENC_NA); break; case CBSP_IEI_MSG_ID: proto_tree_add_item_ret_uint(att_tree, hf_cbsp_msg_id, tvb, offset, len, ENC_BIG_ENDIAN, &tmp_u); proto_item_append_text(ti, ": 0x%04x", tmp_u); break; case CBSP_IEI_EMERG_IND: proto_tree_add_item_ret_uint(att_tree, hf_cbsp_emerg_ind, tvb, offset, len, ENC_NA, &tmp_u); proto_item_append_text(ti, ": %s", val_to_str_const(tmp_u, cbsp_emerg_ind_vals, "")); break; case CBSP_IEI_WARN_TYPE: proto_tree_add_item(att_tree, hf_cbsp_warn_type, tvb, offset, len, ENC_NA); break; case CBSP_IEI_CHANNEL_IND: proto_tree_add_item_ret_uint(att_tree, hf_cbsp_channel_ind, tvb, offset, len, ENC_NA, &tmp_u); proto_item_append_text(ti, ": %s", val_to_str_const(tmp_u, cbsp_chan_ind_vals, "")); break; case CBSP_IEI_NUM_OF_PAGES: proto_tree_add_item_ret_uint(att_tree, hf_cbsp_num_of_pages, tvb, offset, len, ENC_NA, &tmp_u); proto_item_append_text(ti, ": %u", tmp_u); break; case CBSP_IEI_SCHEDULE_PERIOD: proto_tree_add_item(att_tree, hf_cbsp_sched_period, tvb, offset, len, ENC_NA); break; case CBSP_IEI_NUM_OF_RES_SLOTS: proto_tree_add_item(att_tree, hf_cbsp_num_of_res_slots, tvb, offset, len, ENC_NA); break; case CBSP_IEI_BCAST_MSG_TYPE: proto_tree_add_item_ret_uint(att_tree, hf_cbsp_bcast_msg_type, tvb, offset, len, ENC_NA, &tmp_u); proto_item_append_text(ti, ": %s", val_to_str_const(tmp_u, cbsp_bcast_msg_type_vals, "")); break; case CBSP_IEI_WARNING_PERIOD: secs = cbsp_warn_period_to_secs(tvb_get_guint8(tvb, offset)); proto_tree_add_uint(att_tree, hf_cbsp_warning_period, tvb, offset, len, secs); proto_item_append_text(ti, ": %u (s)", secs); break; case CBSP_IEI_KEEP_ALIVE_REP_PERIOD: secs = cbsp_warn_period_to_secs(tvb_get_guint8(tvb, offset)); proto_tree_add_uint(att_tree, hf_cbsp_keepalive_period, tvb, offset, len, secs); proto_item_append_text(ti, ": %u (s)", secs); break; case CBSP_IEI_CELL_LIST: dissect_cell_id_list_ie(tvb, pinfo, offset, len, att_tree, ti); break; case CBSP_IEI_NUM_BCAST_COMPL_LIST: dissect_bc_compl_list_ie(tvb, pinfo, offset, len, att_tree, ti); break; case CBSP_IEI_FAILURE_LIST: dissect_failure_list_ie(tvb, pinfo, offset, len, att_tree, ti); break; case CBSP_IEI_RR_LOADING_LIST: dissect_rr_load_list_ie(tvb, pinfo, offset, len, att_tree, ti); break; case CBSP_IEI_WARN_SEC_INFO: /* this element is bogus / not used anyway, no need for a dissector */ default: /* Unknown/unsupported IE: Print raw payload in addition to IEI + Length printed above */ proto_tree_add_item(att_tree, hf_cbsp_ie_payload, tvb, offset, len, ENC_NA); break; } offset += len; } return offset; }