/* isi-network.c * Dissector for ISI's network resource * Copyright 2010, Sebastian Reichel * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include #include #include #include "packet-isi.h" #include "isi-network.h" static const value_string isi_network_id[] = { {0x07, "NET_SET_REQ"}, {0x08, "NET_SET_RESP"}, {0x0B, "NET_RSSI_GET_REQ"}, {0x0C, "NET_RSSI_GET_RESP"}, {0x1E, "NET_RSSI_IND"}, {0x20, "NET_CIPHERING_IND"}, {0x35, "NET_RAT_IND"}, {0x36, "NET_RAT_REQ"}, {0x37, "NET_RAT_RESP"}, {0x42, "NET_CELL_INFO_IND"}, {0xE0, "NET_REG_STATUS_GET_REQ"}, {0xE1, "NET_REG_STATUS_GET_RESP"}, {0xE2, "NET_REG_STATUS_IND"}, {0xE3, "NET_AVAILABLE_GET_REQ"}, {0xE4, "NET_AVAILABLE_GET_RESP"}, {0xE5, "NET_OPER_NAME_READ_REQ"}, {0xE6, "NET_OPER_NAME_READ_RESP"}, {0xF0, "NET_COMMON_MESSAGE"}, {0x00, NULL} }; static const value_string isi_network_status_sub_id[] = { {0x00, "NET_REG_INFO_COMMON"}, {0x02, "NET_OPERATOR_INFO_COMMON"}, {0x04, "NET_RSSI_CURRENT"}, {0x09, "NET_GSM_REG_INFO"}, {0x0B, "NET_DETAILED_NETWORK_INFO"}, {0x0C, "NET_GSM_OPERATOR_INFO"}, {0x11, "NET_GSM_BAND_INFO"}, {0x2C, "NET_RAT_INFO"}, {0xE1, "NET_AVAIL_NETWORK_INFO_COMMON"}, {0xE7, "NET_OPER_NAME_INFO"}, {0x00, NULL} }; static const value_string isi_network_cell_info_sub_id[] = { {0x46, "NET_GSM_CELL_INFO"}, {0x47, "NET_WCDMA_CELL_INFO"}, {0x50, "NET_EPS_CELL_INFO"}, {0x00, NULL} }; static dissector_handle_t isi_network_handle; static void dissect_isi_network(tvbuff_t *tvb, packet_info *pinfo, proto_item *tree); static guint32 hf_isi_network_cmd = -1; static guint32 hf_isi_network_data_sub_pkgs = -1; static guint32 hf_isi_network_status_sub_type = -1; static guint32 hf_isi_network_status_sub_len = -1; static guint32 hf_isi_network_status_sub_lac = -1; static guint32 hf_isi_network_status_sub_cid = -1; static guint32 hf_isi_network_status_sub_msg = -1; static guint32 hf_isi_network_status_sub_msg_len = -1; static guint32 hf_isi_network_cell_info_sub_type = -1; static guint32 hf_isi_network_cell_info_sub_len = -1; static guint32 hf_isi_network_cell_info_sub_operator = -1; static guint32 hf_isi_network_gsm_band_900 = -1; static guint32 hf_isi_network_gsm_band_1800 = -1; static guint32 hf_isi_network_gsm_band_1900 = -1; static guint32 hf_isi_network_gsm_band_850 = -1; static const int *gsm_band_fields[] = { &hf_isi_network_gsm_band_900, &hf_isi_network_gsm_band_1800, &hf_isi_network_gsm_band_1900, &hf_isi_network_gsm_band_850, NULL }; void proto_reg_handoff_isi_network(void) { static gboolean initialized=FALSE; if (!initialized) { isi_network_handle = create_dissector_handle(dissect_isi_network, proto_isi); dissector_add("isi.resource", 0x0a, isi_network_handle); } } void proto_register_isi_network(void) { static hf_register_info hf[] = { { &hf_isi_network_cmd, { "Command", "isi.network.cmd", FT_UINT8, BASE_HEX, isi_network_id, 0x0, "Command", HFILL }}, { &hf_isi_network_data_sub_pkgs, { "Number of Subpackets", "isi.network.pkgs", FT_UINT8, BASE_DEC, NULL, 0x0, "Number of Subpackets", HFILL }}, { &hf_isi_network_status_sub_type, { "Subpacket Type", "isi.network.sub.type", FT_UINT8, BASE_HEX, isi_network_status_sub_id, 0x0, "Subpacket Type", HFILL }}, { &hf_isi_network_status_sub_len, { "Subpacket Length", "isi.network.sub.len", FT_UINT8, BASE_DEC, NULL, 0x0, "Subpacket Length", HFILL }}, { &hf_isi_network_status_sub_lac, { "Location Area Code (LAC)", "isi.network.sub.lac", FT_UINT16, BASE_HEX_DEC, NULL, 0x0, "Location Area Code (LAC)", HFILL }}, { &hf_isi_network_status_sub_cid, { "Cell ID (CID)", "isi.network.sub.cid", FT_UINT32, BASE_HEX_DEC, NULL, 0x0, "Cell ID (CID)", HFILL }}, { &hf_isi_network_status_sub_msg_len, { "Message Length", "isi.network.sub.msg", FT_UINT16, BASE_DEC, NULL, 0x0, "Message Length", HFILL }}, { &hf_isi_network_status_sub_msg, { "Message", "isi.network.sub.msg", FT_STRING, BASE_NONE, NULL, 0x0, "Message", HFILL }}, { &hf_isi_network_cell_info_sub_type, { "Subpacket Type", "isi.network.sub.type", FT_UINT8, BASE_HEX, isi_network_cell_info_sub_id, 0x0, "Subpacket Type", HFILL }}, { &hf_isi_network_cell_info_sub_len, { "Subpacket Length", "isi.network.sub.len", FT_UINT8, BASE_DEC, NULL, 0x0, "Subpacket Length", HFILL }}, { &hf_isi_network_cell_info_sub_operator, { "Operator Code", "isi.network.sub.operator", FT_UINT24, BASE_HEX, NULL, 0x0, "Operator Code", HFILL }}, { &hf_isi_network_gsm_band_900, { "900 Mhz Band", "isi.network.sub.gsm_band_900", FT_BOOLEAN, 32, NULL, 0x00000001, "", HFILL }}, { &hf_isi_network_gsm_band_1800, { "1800 Mhz Band", "isi.network.sub.gsm_band_1800", FT_BOOLEAN, 32, NULL, 0x00000002, "", HFILL }}, { &hf_isi_network_gsm_band_1900, { "1900 Mhz Band", "isi.network.sub.gsm_band_1900", FT_BOOLEAN, 32, NULL, 0x00000004, "", HFILL }}, { &hf_isi_network_gsm_band_850, { "850 Mhz Band", "isi.network.sub.gsm_band_850", FT_BOOLEAN, 32, NULL, 0x00000008, "", HFILL }} }; proto_register_field_array(proto_isi, hf, array_length(hf)); register_dissector("isi.network", dissect_isi_network, proto_isi); } /* would be nice if wireshark could handle unicode... */ static void* utf16_to_ascii(char *in, guint16 len) { char *out = malloc(len+1); int i; for(i=0; ilength; int i; guint8 pkgcount = tvb_get_guint8(tvb, 0x02); proto_tree_add_item(tree, hf_isi_network_data_sub_pkgs, tvb, 0x02, 1, FALSE); size_t offset = 0x03; // subpackets start here for(i=0; ilength; int i; guint8 pkgcount = tvb_get_guint8(tvb, 0x02); proto_tree_add_item(tree, hf_isi_network_data_sub_pkgs, tvb, 0x02, 1, FALSE); size_t offset = 0x03; for(i=0; icinfo, COL_INFO, "Network Selection Request"); expert_add_info_format(pinfo, item, PI_PROTOCOL, PI_WARN, "unsupported packet"); break; case 0x20: col_set_str(pinfo->cinfo, COL_INFO, "Network Ciphering Indication"); expert_add_info_format(pinfo, item, PI_PROTOCOL, PI_WARN, "unsupported packet"); break; case 0xE2: col_set_str(pinfo->cinfo, COL_INFO, "Network Status Indication"); dissect_isi_network_status(tvb, pinfo, item, tree); break; case 0x42: col_set_str(pinfo->cinfo, COL_INFO, "Network Cell Info Indication"); dissect_isi_network_cell_info_ind(tvb, pinfo, item, tree); break; default: col_set_str(pinfo->cinfo, COL_INFO, "unknown Network packet"); expert_add_info_format(pinfo, item, PI_PROTOCOL, PI_WARN, "unsupported packet"); break; } } }