/* 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 * * Wireshark - Network traffic analyzer * By Gerald Combs * Copyright 1998 Gerald Combs * * SPDX-License-Identifier: GPL-2.0-or-later */ #include "config.h" #include 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 gint ett_dect_nwk_ie = -1; static gint hf_nwk_ie_var_type = -1; //static gint hf_nwk_ie_fix_single_type = -1; //static gint hf_nwk_ie_fix_double_type = -1; static gint hf_nwk_ie_len = -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, }; /* Section 7.6.1 */ enum dect_nwk_info_fix_single_type { DECT_NWK_INFO_FIX_SHIFT = 0x90, DECT_NWK_INFO_FIX_SEND_COMPLETE = 0xa1, DECT_NWK_INFO_FIX_DELIMITER_REQ = 0xa2, DECT_NWK_INFO_FIX_USE_TPUI = 0xa3, DECT_NWK_INFO_FIX_REPEAT_IND = 0xd0, DECT_NWK_DOUBLE_OCTET_ELEMENT = 0xe0, }; enum dect_nwk_info_fix_double_type { DECT_NWK_INFO_FIX_BASIC_SVC = 0xe0, DECT_NWK_INFO_FIX_REL_REASON = 0xe2, DECT_NWK_INFO_FIX_SIGNAL = 0xe4, DECT_NWK_INFO_FIX_TIMER_RESTART = 0xe5, DECT_NWK_INFO_FIX_TEST_HOOK_C = 0xe6, DECT_NWK_INFO_FIX_SINGLE_DISP = 0xe8, DECT_NWK_INFO_FIX_SINGLE_KEYPAD = 0xe9, DECT_NWK_INFO_FIX_RESERVED = 0xef, }; /* Section 7.7.1 */ enum dect_nwk_info_var_type { DECT_NWK_INFO_VAR_INFO_TYPE = 0x01, DECT_NWK_INFO_VAR_IDENTITY_TYPE = 0x02, DECT_NWK_INFO_VAR_PORTABLE_ID = 0x05, DECT_NWK_INFO_VAR_FIXED_ID = 0x06, DECT_NWK_INFO_VAR_LOC_AREA = 0x07, DECT_NWK_INFO_VAR_NWK_ID = 0x08, DECT_NWK_INFO_VAR_AUTH_TYPE = 0x0a, DECT_NWK_INFO_VAR_ALLOC_TYPE = 0x0b, DECT_NWK_INFO_VAR_RAND = 0x0c, DECT_NWK_INFO_VAR_RES = 0x0d, DECT_NWK_INFO_VAR_RS = 0x0e, DECT_NWK_INFO_VAR_IWU_ATTR = 0x12, DECT_NWK_INFO_VAR_CALL_ATTR = 0x13, DECT_NWK_INFO_VAR_SVC_CHANGE = 0x16, DECT_NWK_INFO_VAR_CON_ATTR = 0x17, DECT_NWK_INFO_VAR_CIPH_INFO = 0x19, DECT_NWK_INFO_VAR_CALL_ID = 0x1a, DECT_NWK_INFO_VAR_CON_ID = 0x1b, DECT_NWK_INFO_VAR_FACILITY = 0x1c, DECT_NWK_INFO_VAR_PROGRESS_IND = 0x1e, DECT_NWK_INFO_VAR_MMS_GEN_HEAD = 0x20, DECT_NWK_INFO_VAR_MMS_OBJ_HEAD = 0x21, DECT_NWK_INFO_VAR_MMS_EXT_HEAD = 0x22, DECT_NWK_INFO_VAR_TIME_DATE = 0x23, DECT_NWK_INFO_VAR_MULTI_DISP = 0x28, DECT_NWK_INFO_VAR_MULTI_KEYPAD = 0x2c, DECT_NWK_INFO_VAR_FEATURE_ACT = 0x38, DECT_NWK_INFO_VAR_FEATURE_IND = 0x39, DECT_NWK_INFO_VAR_NET_PARAM = 0x41, DECT_NWK_INFO_VAR_EXT_HO_IND = 0x42, DECT_NWK_INFO_VAR_ZAP_FIELD = 0x52, DECT_NWK_INFO_VAR_SVC_CLASS = 0x54, DECT_NWK_INFO_VAR_KEY = 0x56, DECT_NWK_INFO_VAR_REJECT_REASON = 0x60, DECT_NWK_INFO_VAR_SETUP_CAP = 0x62, DECT_NWK_INFO_VAR_TERM_CAP = 0x63, DECT_NWK_INFO_VAR_E2E_COMP = 0x64, DECT_NWK_INFO_VAR_RATE_PARAM = 0x65, DECT_NWK_INFO_VAR_TRANS_DELAY = 0x66, DECT_NWK_INFO_VAR_WINDOW_SIZE = 0x67, DECT_NWK_INFO_VAR_CALLING_NR = 0x6c, DECT_NWK_INFO_VAR_CALLING_NAME = 0x6d, DECT_NWK_INFO_VAR_CALLED_NR = 0x70, DECT_NWK_INFO_VAR_CALLED_SUBA = 0x71, DECT_NWK_INFO_VAR_DURATION = 0x72, DECT_NWK_INFO_VAR_CALLED_NAME = 0x73, DECT_NWK_INFO_VAR_SEGMENT_INFO = 0x75, DECT_NWK_INFO_VAR_ALPHANUM = 0x76, DECT_NWK_INFO_VAR_IWU2IWU = 0x77, DECT_NWK_INFO_VAR_MODEL_ID = 0x78, DECT_NWK_INFO_VAR_IWU_PACKET = 0x7a, DECT_NWK_INFO_VAR_ESC_PROP = 0x7b, DECT_NWK_INFO_VAR_CODEC_LIST = 0x7c, DECT_NWK_INFO_VAR_EVENTS_NOTI = 0x7d, DECT_NWK_INFO_VAR_CALL_INFO = 0x7e, DECT_NWK_INFO_VAR_ESC_EXTENSION = 0x7f }; /* Section 7.7.2 */ enum dect_nwk_info_alloc_type { DECT_NWK_INFO_ALLOC_AUTH_ALG_DSAA = 0x01, DECT_NWK_INFO_ALLOC_AUTH_ALG_DSAA2 = 0x02 }; /* Section 7.7.4 */ enum dect_nwk_info_auth_type { DECT_NWK_INFO_AUTH_AUTH_ALG_DSAA = 0x01, DECT_NWK_INFO_AUTH_AUTH_ALG_DSAA2 = 0x02, DECT_NWK_INFO_AUTH_AUTH_ALG_GSM = 0x40, DECT_NWK_INFO_AUTH_AUTH_ALG_UMTS = 0x20, DECT_NWK_INFO_AUTH_AUTH_ESC_PROP_ALG = 0x7f }; /* Section 7.7.7 and 7.7.9 */ enum dect_nwk_info_num_plan_type { DECT_NWK_INFO_NUM_PLAN_UNKNOWN = 0x0, DECT_NWK_INFO_NUM_PLAN_ISDN = 0x1, DECT_NWK_INFO_NUM_PLAN_DATA_X121 = 0x3, DECT_NWK_INFO_NUM_PLAN_TCPIP_ADDR = 0x7, DECT_NWK_INFO_NUM_PLAN_NATIONAL = 0x8, DECT_NWK_INFO_NUM_PLAN_PRIVATE = 0x9, DECT_NWK_INFO_NUM_PLAN_SIP = 0xa, DECT_NWK_INFO_NUM_PLAN_INTERNET = 0xb, DECT_NWK_INFO_NUM_PLAN_LAN_MAC = 0xc, DECT_NWK_INFO_NUM_PLAN_ITUT_X400 = 0xd, DECT_NWK_INFO_NUM_PLAN_PROFILE_SVC = 0xe, DECT_NWK_INFO_NUM_PLAN_RESERVED = 0xf }; /* Section 7.7.13 */ enum dect_nwk_info_time_limits_type { DECT_NWK_INFO_TIME_LIMITS_ERASE = 0x0, DECT_NWK_INFO_TIME_LIMITS_DEFINED1 = 0x1, DECT_NWK_INFO_TIME_LIMITS_DEFINED2 = 0x2, DECT_NWK_INFO_TIME_LIMITS_STANDARD = 0x4, DECT_NWK_INFO_TIME_LIMITS_INFINITE = 0xf }; /* Section 7.7.19 */ enum dect_nwk_info_id_group_coding_type { DECT_NWK_INFO_ID_GROUP_CODING_PORTABLE = 0x0, DECT_NWK_INFO_ID_GROUP_CODING_NETWORK = 0x1, DECT_NWK_INFO_ID_GROUP_CODING_FIXED = 0x4, DECT_NWK_INFO_ID_GROUP_CODING_APP = 0x8, DECT_NWK_INFO_ID_GROUP_CODING_PROP = 0xf }; /********************************************************************************* * 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" }, { DECT_NWK_MM_KEY_ALLOC, "MM-KEY-ALLOC"}, { DECT_NWK_MM_AUTH_REJ, "MM-AUTH-REJECT"}, { DECT_NWK_MM_ACC_RIGHTS_REQ, "MM-ACC-RIGHTS-REQ"}, { DECT_NWK_MM_ACC_RIGHTS_ACK, "MM-ACC-RIGHTS-ACK"}, { DECT_NWK_MM_ACC_RIGHTS_REJ, "MM-ACC-RIGHTS-REJ"}, { DECT_NWK_MM_ACC_RIGHTS_TERM_REQ, "MM-ACC-RIGHTS-TERM-REQ"}, { DECT_NWK_MM_ACC_RIGHTS_TERM_ACK, "MM-ACC-RIGHTS-TERM-ACK"}, { DECT_NWK_MM_ACC_RIGHTS_TERM_REJ, "MM-ACC-RIGHTS-TERM-REJ"}, { DECT_NWK_MM_CIPH_REQ, "MM-CIPH-REQ"}, { DECT_NWK_MM_CIPH_SUGGEST, "MM-CIPH-SUGGEST"}, { DECT_NWK_MM_CIPH_REJ, "MM-CIPH-REJ"}, { DECT_NWK_MM_INFO_REQ, "MM-INFO-REQ"}, { DECT_NWK_MM_INFO_ACK, "MM-INFO-ACK"}, { DECT_NWK_MM_INFO_SUGGEST, "MM-INFO-SUGGEST"}, { DECT_NWK_MM_INFO_REJ, "MM-INFO-REJ"}, { DECT_NWK_MM_LOCATE_REQ, "MM-LOCATE-REQ"}, { DECT_NWK_MM_LOCATE_ACK, "MM-LOCATE-ACK"}, { DECT_NWK_MM_DETACH, "MM-DETACH"}, { DECT_NWK_MM_LOCATE_REJ, "MM-LOCATE-REJ"}, { DECT_NWK_MM_ID_REQ, "MM-ID-REQ"}, { DECT_NWK_MM_ID_REPLY, "MM-ID-REPLY"}, { DECT_NWK_MM_IWU, "MM-IWU"}, { DECT_NWK_MM_TID_ASSIGN, "MM-TID-ASSIGN"}, { DECT_NWK_MM_TID_ASSIGN_ACK, "MM-TID-ASSIGN-ACK"}, { DECT_NWK_MM_TID_ASSIGN_REJ, "MM-TID-ASSIGN-REJ"}, { DECT_NWK_MM_NOTIFY, "MM-NOTIFY"}, { 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 } }; /* Section 7.7.1 */ static const value_string nwk_info_var_vals[] = { { DECT_NWK_INFO_VAR_INFO_TYPE , "Info Type"}, { DECT_NWK_INFO_VAR_IDENTITY_TYPE , "Identity Type"}, { DECT_NWK_INFO_VAR_PORTABLE_ID , "Portable Identity"}, { DECT_NWK_INFO_VAR_FIXED_ID , "Fixed Identity"}, { DECT_NWK_INFO_VAR_LOC_AREA , "Location area"}, { DECT_NWK_INFO_VAR_NWK_ID , "NWK assigned Identity"}, { DECT_NWK_INFO_VAR_AUTH_TYPE , "AUTH-Type"}, { DECT_NWK_INFO_VAR_ALLOC_TYPE , "Allocation Type"}, { DECT_NWK_INFO_VAR_RAND , "RAND"}, { DECT_NWK_INFO_VAR_RES , "RES"}, { DECT_NWK_INFO_VAR_RS , "RS"}, { DECT_NWK_INFO_VAR_IWU_ATTR , "IWU attributes"}, { DECT_NWK_INFO_VAR_CALL_ATTR , "Call attributes"}, { DECT_NWK_INFO_VAR_SVC_CHANGE , "Service change info"}, { DECT_NWK_INFO_VAR_CON_ATTR , "Connection attributes"}, { DECT_NWK_INFO_VAR_CIPH_INFO , "Cipher Info"}, { DECT_NWK_INFO_VAR_CALL_ID , "Call identity"}, { DECT_NWK_INFO_VAR_CON_ID , "Connection identity"}, { DECT_NWK_INFO_VAR_FACILITY , "Facility"}, { DECT_NWK_INFO_VAR_PROGRESS_IND , "Progress Indicator"}, { DECT_NWK_INFO_VAR_MMS_GEN_HEAD , "MMS Generic Header"}, { DECT_NWK_INFO_VAR_MMS_OBJ_HEAD , "Object Header"}, { DECT_NWK_INFO_VAR_MMS_EXT_HEAD , "Extended Header"}, { DECT_NWK_INFO_VAR_TIME_DATE , "Time-Date"}, { DECT_NWK_INFO_VAR_MULTI_DISP , "Multi Display"}, { DECT_NWK_INFO_VAR_MULTI_KEYPAD , "Multi-Keypad"}, { DECT_NWK_INFO_VAR_FEATURE_ACT , "Feature Activate"}, { DECT_NWK_INFO_VAR_FEATURE_IND , "Feature Indicate"}, { DECT_NWK_INFO_VAR_NET_PARAM , "Network parameter"}, { DECT_NWK_INFO_VAR_EXT_HO_IND , "Ext h/o indicator"}, { DECT_NWK_INFO_VAR_ZAP_FIELD , "ZAP field"}, { DECT_NWK_INFO_VAR_SVC_CLASS , "Serice Class"}, { DECT_NWK_INFO_VAR_KEY , "Key"}, { DECT_NWK_INFO_VAR_REJECT_REASON , "Reject Reason"}, { DECT_NWK_INFO_VAR_SETUP_CAP , "Setup capability"}, { DECT_NWK_INFO_VAR_TERM_CAP , "Terminal capability"}, { DECT_NWK_INFO_VAR_E2E_COMP , "End-to-End compatibility"}, { DECT_NWK_INFO_VAR_RATE_PARAM , "Rate parameters"}, { DECT_NWK_INFO_VAR_TRANS_DELAY , "Transit Delay"}, { DECT_NWK_INFO_VAR_WINDOW_SIZE , "Window size"}, { DECT_NWK_INFO_VAR_CALLING_NR , "Calling Party Number"}, { DECT_NWK_INFO_VAR_CALLING_NAME , "Calling Party Name"}, { DECT_NWK_INFO_VAR_CALLED_NR , "Called Paty Number"}, { DECT_NWK_INFO_VAR_CALLED_SUBA , "Called Party Subaddr"}, { DECT_NWK_INFO_VAR_DURATION , "Duration"}, { DECT_NWK_INFO_VAR_CALLED_NAME , "Called Party Name"}, { DECT_NWK_INFO_VAR_SEGMENT_INFO , "Segmented Info"}, { DECT_NWK_INFO_VAR_ALPHANUM , "Alphanumeric"}, { DECT_NWK_INFO_VAR_IWU2IWU , "IWU-to-IWU"}, { DECT_NWK_INFO_VAR_MODEL_ID , "Model identifier"}, { DECT_NWK_INFO_VAR_IWU_PACKET , "IWU-PACKET"}, { DECT_NWK_INFO_VAR_ESC_PROP , "Escape to proprietary"}, { DECT_NWK_INFO_VAR_CODEC_LIST , "Codec List"}, { DECT_NWK_INFO_VAR_EVENTS_NOTI , "Events notification"}, { DECT_NWK_INFO_VAR_CALL_INFO , "Call information"}, { DECT_NWK_INFO_VAR_ESC_EXTENSION , "Escape for extension"}, { 0, NULL } }; /* TOOD: value_string for other protocols */ /********************************************************************************* * DECT dissector code *********************************************************************************/ static int dissect_dect_nwk_ie(tvbuff_t *tvb, guint offset, packet_info _U_ *pinfo, proto_tree *tree, void _U_ *data) { guint8 ie_type; guint8 ie_len; guint8 type_offset; guint len; proto_item *ie_ti; proto_tree *ie_tree; len = tvb_reported_length(tvb); type_offset = offset; ie_type = tvb_get_guint8(tvb, offset); offset++; if ((ie_type & 0xf0) == 0xe0) { /* double octet ie */ offset++; } else if (ie_type & 0x80) { /* single octet ie */ } else { /* variable length ie */ ie_len = tvb_get_guint8(tvb, offset); ie_ti = proto_tree_add_item(tree, hf_nwk_ie_var_type, tvb, type_offset, 1, ENC_NA); ie_tree = proto_item_add_subtree(ie_ti, ett_dect_nwk_ie); proto_tree_add_item(ie_tree, hf_nwk_ie_len, tvb, offset, 1, ENC_NA); offset++; offset += ie_len; } return offset; } static int dissect_dect_nwk_lce(tvbuff_t *tvb, guint8 msg_type, guint offset, packet_info *pinfo, proto_tree *tree, void _U_ *data) { guint len; 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++; len = tvb_reported_length(tvb); while (offset < len) { offset = dissect_dect_nwk_ie(tvb, offset, pinfo, tree, data); } 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) { guint len; 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++; len = tvb_reported_length(tvb); while (offset < len) { offset = dissect_dect_nwk_ie(tvb, offset, pinfo, tree, data); } 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) { guint len; 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++; len = tvb_reported_length(tvb); while (offset < len) { offset = dissect_dect_nwk_ie(tvb, offset, pinfo, tree, data); } 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; guint 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 } }, { &hf_nwk_ie_var_type, { "Information Element", "dect_nwk.ie_type", FT_UINT8, BASE_HEX, VALS(nwk_info_var_vals), 0x0, NULL, HFILL } }, { &hf_nwk_ie_len, { "IE Length", "dect_nwk.ie_len", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } } }; static gint *ett[] = { &ett_dect_nwk, &ett_dect_nwk_ie, }; /* 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: */