aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2019-01-05 01:23:08 +0100
committerHarald Welte <laforge@gnumonks.org>2019-09-05 19:21:02 +0200
commit9e0b50b5efcb7cb48b36a363079f07f6c3fa37fb (patch)
tree352a901acfcedbdbbefec523c36792a04b41f2cd
parentdc96b1f676e9a93e367379b471a1f20fa2652b90 (diff)
WIP: Initial dissector for DECT NWK layerlaforge/dect
-rw-r--r--epan/dissectors/CMakeLists.txt1
-rw-r--r--epan/dissectors/packet-dect-nwk.c335
2 files changed, 336 insertions, 0 deletions
diff --git a/epan/dissectors/CMakeLists.txt b/epan/dissectors/CMakeLists.txt
index b4bbdf1502..4f333d2c76 100644
--- a/epan/dissectors/CMakeLists.txt
+++ b/epan/dissectors/CMakeLists.txt
@@ -915,6 +915,7 @@ set(DISSECTOR_SRC
${CMAKE_CURRENT_SOURCE_DIR}/packet-dect.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-dect-aastra.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-dect-dlc.c
+ ${CMAKE_CURRENT_SOURCE_DIR}/packet-dect-nwk.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-devicenet.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-dhcp.c
${CMAKE_CURRENT_SOURCE_DIR}/packet-dhcp-failover.c
diff --git a/epan/dissectors/packet-dect-nwk.c b/epan/dissectors/packet-dect-nwk.c
new file mode 100644
index 0000000000..6cdb4ea4ca
--- /dev/null
+++ b/epan/dissectors/packet-dect-nwk.c
@@ -0,0 +1,335 @@
+/* packet-dect_nwk.c
+ *
+ * Dissector for the DECT (Digital Enhanced Cordless Telecommunications)
+ * NWK protocol layer as described in ETSI EN 300 175-5 V2.7.1 (2017-11)
+ *
+ * Copyright 2018 by Harald Welte <laforge@gnumonks.org>
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "config.h"
+#include <epan/packet.h>
+
+static int proto_dect_nwk = -1;
+
+static gint hf_nwk_ti = -1;
+static gint hf_nwk_pdisc = -1;
+static gint hf_nwk_msg_type_lce = -1;
+static gint hf_nwk_msg_type_cc = -1;
+static gint hf_nwk_msg_type_mm = -1;
+
+static gint ett_dect_nwk = -1;
+
+static dissector_handle_t dect_nwk_handle;
+
+/*********************************************************************************
+ * DECT DEFINITIONS
+ *********************************************************************************/
+
+/* Section 7.2 */
+enum dect_nwk_proto_disc {
+ DECT_NWK_PDISC_LCE = 0x0,
+ DECT_NWK_PDISC_CC = 0x3,
+ DECT_NWK_PDISC_CISS = 0x4,
+ DECT_NWK_PDISC_MM = 0x5,
+ DECT_NWK_PDISC_CMSS = 0x6,
+ DECT_NWK_PDISC_COMS = 0x7,
+};
+
+/* Section 7.4.1 */
+enum dect_nwk_cc_msg_type {
+ DECT_NWK_CC_ALERTING = 0x01,
+ DECT_NWK_CC_CALL_PROC = 0x02,
+ DECT_NWK_CC_SETUP = 0x05,
+ DECT_NWK_CC_CONNECT = 0x07,
+ DECT_NWK_CC_SETUP_ACK = 0x0d,
+ DECT_NWK_CC_CONNECT_ACK = 0x0f,
+ DECT_NWK_CC_SERVICE_CHANGE = 0x20,
+ DECT_NWK_CC_SERVICE_ACCEPT = 0x21,
+ DECT_NWK_CC_SERVICE_REJECT = 0x23,
+ DECT_NWK_CC_RELEASE = 0x4d,
+ DECT_NWK_CC_RELEASE_COM = 0x5a,
+ DECT_NWK_CC_IWU_INFO = 0x60,
+ DECT_NWK_CC_NOTIFY = 0x6e,
+ DECT_NWK_CC_INFO = 0x7b,
+};
+
+/* Section 7.4.2 */
+enum dect_nwk_ss_msg_type {
+ DECT_NWK_SS_CISS_RELEASE_COM = 0x5a,
+ DECT_NWK_SS_CISS_FACILITY = 0x62,
+ DECT_NWK_SS_CISS_REGISTER = 0x64,
+
+ DECT_NWK_SS_CRSS_HOLD = 0x24,
+ DECT_NWK_SS_CRSS_HOLD_ACK = 0x28,
+ DECT_NWK_SS_CRSS_HOLD_REJ = 0x30,
+ DECT_NWK_SS_CRSS_RETRIEVE = 0x31,
+ DECT_NWK_SS_CRSS_RETRIEVE_ACK = 0x33,
+ DECT_NWK_SS_CRSS_RETRIEVE_REJ = 0x37,
+#define DECT_NWK_SS_CRSS_FACILITY DECT_NWK_SS_CISS_FACILITY
+};
+
+/* Section 7.4.3 */
+enum dect_nwk_coms_msg_type {
+ DECT_NWK_COMS_SETUP = 0x05,
+ DECT_NWK_COMS_CONNECT = 0x07,
+ DECT_NWK_COMS_NOTIFY = 0x08,
+ DECT_NWK_COMS_RELEASE = 0x4d,
+ DECT_NWK_COMS_RELEASE_COM = 0x5a,
+ DECT_NWK_COMS_INFO = 0x7b,
+ DECT_NWK_COMS_ACK = 0x78,
+};
+
+/* Section 7.4.4 */
+enum dect_nwk_clms_msg_type {
+ DECT_NWK_CLMS_VARIABLE = 0x01,
+};
+
+/* Section 7.4.5 */
+enum dect_nwk_mm_msg_type {
+ DECT_NWK_MM_AUTH_REQ = 0x40,
+ DECT_NWK_MM_AUTH_REPLY = 0x41,
+ DECT_NWK_MM_KEY_ALLOC = 0x42,
+ DECT_NWK_MM_AUTH_REJ = 0x43,
+ DECT_NWK_MM_ACC_RIGHTS_REQ = 0x44,
+ DECT_NWK_MM_ACC_RIGHTS_ACK = 0x45,
+ DECT_NWK_MM_ACC_RIGHTS_REJ = 0x47,
+ DECT_NWK_MM_ACC_RIGHTS_TERM_REQ = 0x48,
+ DECT_NWK_MM_ACC_RIGHTS_TERM_ACK = 0x49,
+ DECT_NWK_MM_ACC_RIGHTS_TERM_REJ = 0x4b,
+ DECT_NWK_MM_CIPH_REQ = 0x4c,
+ DECT_NWK_MM_CIPH_SUGGEST = 0x4e,
+ DECT_NWK_MM_CIPH_REJ = 0x4f,
+ DECT_NWK_MM_INFO_REQ = 0x50,
+ DECT_NWK_MM_INFO_ACK = 0x51,
+ DECT_NWK_MM_INFO_SUGGEST = 0x52,
+ DECT_NWK_MM_INFO_REJ = 0x53,
+ DECT_NWK_MM_LOCATE_REQ = 0x54,
+ DECT_NWK_MM_LOCATE_ACK = 0x55,
+ DECT_NWK_MM_DETACH = 0x56,
+ DECT_NWK_MM_LOCATE_REJ = 0x57,
+ DECT_NWK_MM_ID_REQ = 0x58,
+ DECT_NWK_MM_ID_REPLY = 0x59,
+ DECT_NWK_MM_IWU = 0x5b,
+ DECT_NWK_MM_TID_ASSIGN = 0x5c,
+ DECT_NWK_MM_TID_ASSIGN_ACK = 0x5d,
+ DECT_NWK_MM_TID_ASSIGN_REJ = 0x5f,
+ DECT_NWK_MM_NOTIFY = 0x6e,
+};
+
+/* Section 7.4.6 */
+enum dect_nwk_lce_msg_type {
+ DECT_NWK_LCE_PAGE_RESP = 0x71,
+ DECT_NWK_LCE_PAGE_REJ = 0x72,
+};
+
+/*********************************************************************************
+ * DECT VALUE STRINGS
+ *********************************************************************************/
+
+/* Section 7.2 */
+static const value_string nwk_pdisc_vals[] = {
+ { DECT_NWK_PDISC_LCE, "Link Control Entity (LCE)" },
+ { DECT_NWK_PDISC_CC, "Call Control (CC)" },
+ { DECT_NWK_PDISC_CISS, "Call Independent Supplementary Services (CISS)" },
+ { DECT_NWK_PDISC_MM, "Mobility Management (MM)" },
+ { DECT_NWK_PDISC_CMSS, "ConnectionLess Message Service (CMSS)" },
+ { DECT_NWK_PDISC_COMS, "Connection Oriented Message Service (COMS)" },
+ { 0, NULL }
+};
+
+/* Section 7.4.1 */
+static const value_string nwk_cc_msgt_vals[] = {
+ { DECT_NWK_CC_ALERTING, "CC-ALERTING" },
+ { DECT_NWK_CC_CALL_PROC, "CC-CALL-PROC" },
+ { DECT_NWK_CC_SETUP, "CC-SETUP" },
+ { DECT_NWK_CC_CONNECT, "CC-CONNECT" },
+ { DECT_NWK_CC_SETUP_ACK, "CC-SETUP-ACK" },
+ { DECT_NWK_CC_CONNECT_ACK, "CC-CONNECT-ACK" },
+ { DECT_NWK_CC_SERVICE_CHANGE, "CC-SERVICE-CHANGE" },
+ { DECT_NWK_CC_SERVICE_ACCEPT, "CC-SERVICE-ACCEPT" },
+ { DECT_NWK_CC_SERVICE_REJECT, "CC-SERVICE-REJECT" },
+ { DECT_NWK_CC_RELEASE, "CC-RELEASE" },
+ { DECT_NWK_CC_RELEASE_COM, "CC-RELEASE-COM" },
+ { DECT_NWK_CC_IWU_INFO, "CC-IWU-INFO" },
+ { DECT_NWK_CC_NOTIFY, "CC-NOTIFY" },
+ { DECT_NWK_CC_INFO, "CC-INFO" },
+ { 0, NULL }
+};
+
+/* Section 7.4.5 */
+static const value_string nwk_mm_msgt_vals[] = {
+ { DECT_NWK_MM_AUTH_REQ, "MM-AUTH-REQ" },
+ { DECT_NWK_MM_AUTH_REPLY, "MM-AUTH-REPLY" },
+ /* FIXME: all other MM messages */
+ { 0, NULL }
+};
+
+/* Section 7.4.6 */
+static const value_string nwk_lce_msgt_vals[] = {
+ { DECT_NWK_LCE_PAGE_RESP, "LCE-PAGE-RESPONSE" },
+ { DECT_NWK_LCE_PAGE_REJ, "LCE-PAGE-REJECT" },
+ { 0, NULL }
+};
+
+/* TOOD: value_string for other protocols */
+
+
+/*********************************************************************************
+ * DECT dissector code
+ *********************************************************************************/
+
+static int dissect_dect_nwk_lce(tvbuff_t *tvb, guint8 msg_type, guint offset, packet_info *pinfo, proto_tree *tree, void _U_ *data)
+{
+ proto_tree_add_item(tree, hf_nwk_msg_type_lce, tvb, offset, 1, ENC_NA);
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s ",
+ val_to_str(msg_type, nwk_lce_msgt_vals, "Unknown 0x%02x"));
+ offset++;
+
+ /* TOOD: dissection of TLVs/IEs */
+
+ return offset;
+}
+
+static int dissect_dect_nwk_cc(tvbuff_t *tvb, guint8 msg_type, guint offset, packet_info *pinfo, proto_tree *tree, void _U_ *data)
+{
+ proto_tree_add_item(tree, hf_nwk_msg_type_cc, tvb, offset, 1, ENC_NA);
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s ",
+ val_to_str(msg_type, nwk_cc_msgt_vals, "Unknown 0x%02x"));
+ offset++;
+
+ /* TOOD: dissection of TLVs/IEs */
+
+ return offset;
+}
+
+static int dissect_dect_nwk_mm(tvbuff_t *tvb, guint8 msg_type, guint offset, packet_info *pinfo, proto_tree *tree, void _U_ *data)
+{
+ proto_tree_add_item(tree, hf_nwk_msg_type_mm, tvb, offset, 1, ENC_NA);
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s ",
+ val_to_str(msg_type, nwk_mm_msgt_vals, "Unknown 0x%02x"));
+ offset++;
+
+ /* TOOD: dissection of TLVs/IEs */
+
+ return offset;
+}
+
+
+static int dissect_dect_nwk(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data)
+{
+ proto_tree *nwk_tree;
+ proto_item *nwk_ti;
+ guint8 pdisc, msg_type;
+ guint len;
+ guint offset = 0;
+ int available_length;
+
+ len = tvb_reported_length(tvb);
+
+ col_append_str(pinfo->cinfo, COL_INFO, "(NWK) ");
+
+ nwk_ti = proto_tree_add_item(tree, proto_dect_nwk, tvb, 0, len, ENC_NA);
+ nwk_tree = proto_item_add_subtree(nwk_ti, ett_dect_nwk);
+
+ proto_tree_add_item(nwk_tree, hf_nwk_ti, tvb, 0, 1, ENC_NA);
+ proto_tree_add_item(nwk_tree, hf_nwk_pdisc, tvb, 0, 1, ENC_NA);
+ pdisc = tvb_get_guint8(tvb, 0) & 0x0F;
+ msg_type = tvb_get_guint8(tvb, 1);
+
+ switch (pdisc) {
+ case DECT_NWK_PDISC_LCE:
+ offset = dissect_dect_nwk_lce(tvb, msg_type, 1, pinfo, nwk_tree, data);
+ break;
+ case DECT_NWK_PDISC_CC:
+ offset = dissect_dect_nwk_cc(tvb, msg_type, 1, pinfo, nwk_tree, data);
+ break;
+ case DECT_NWK_PDISC_MM:
+ offset = dissect_dect_nwk_mm(tvb, msg_type, 1, pinfo, nwk_tree, data);
+ break;
+ case DECT_NWK_PDISC_CISS:
+ case DECT_NWK_PDISC_CMSS:
+ case DECT_NWK_PDISC_COMS:
+ /* FIXME */
+ default:
+ break;
+ }
+
+ /* whatever was not dissected: Use generic data dissector */
+ available_length = tvb_captured_length(tvb) - offset;
+ if (available_length) {
+ tvbuff_t *payload = tvb_new_subset_length_caplen(tvb, offset, MIN(len-offset, available_length), len);
+ call_data_dissector(payload, pinfo, tree);
+ }
+ return tvb_captured_length(tvb);
+}
+
+void proto_register_dect_nwk(void)
+{
+ static hf_register_info hf[] =
+ {
+ { &hf_nwk_ti,
+ { "Transaction Identifier", "dect_nwk.ti", FT_UINT8, BASE_HEX,
+ NULL, 0xF0, NULL, HFILL
+ }
+ },
+ { &hf_nwk_pdisc,
+ { "Proticol Discriminator", "dect_nwk.pdisc", FT_UINT8, BASE_HEX,
+ VALS(nwk_pdisc_vals), 0x0F, NULL, HFILL
+ }
+ },
+ { &hf_nwk_msg_type_cc,
+ { "Message Type", "dect_nwk.msg_type", FT_UINT8, BASE_HEX,
+ VALS(nwk_cc_msgt_vals), 0x0, NULL, HFILL
+ }
+ },
+ { &hf_nwk_msg_type_mm,
+ { "Message Type", "dect_nwk.msg_type", FT_UINT8, BASE_HEX,
+ VALS(nwk_mm_msgt_vals), 0x0, NULL, HFILL
+ }
+ },
+ { &hf_nwk_msg_type_lce,
+ { "Message Type", "dect_nwk.msg_type", FT_UINT8, BASE_HEX,
+ VALS(nwk_lce_msgt_vals), 0x0, NULL, HFILL
+ }
+ },
+
+
+ };
+
+ static gint *ett[] = {
+ &ett_dect_nwk,
+ };
+
+ /* Register protocol */
+ proto_dect_nwk = proto_register_protocol("DECT NWK", "DECT-NWK", "dect_nwk");
+
+ proto_register_subtree_array(ett, array_length(ett));
+ proto_register_field_array(proto_dect_nwk, hf, array_length(hf));
+
+ dect_nwk_handle = register_dissector("dect_nwk", dissect_dect_nwk, proto_dect_nwk);
+}
+
+void proto_reg_handoff_dect_nwk(void)
+{
+ dissector_add_uint("dect_dlc.sapi", 0, dect_nwk_handle);
+ dissector_add_uint("dect_dlc.sapi", 3, dect_nwk_handle);
+}
+
+/*
+ * Editor modelines - http://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 8
+ * tab-width: 8
+ * indent-tabs-mode: t
+ * End:
+ *
+ * vi: set shiftwidth=8 tabstop=8 noexpandtab:
+ * :indentSize=8:tabSize=8:noTabs=false:
+ */