/* packet-dpnss.c
 * Routines for DPNSS/DASS2 dissection
 * Copyright 2007, Anders Broman <anders.broman[at]ericsson.com>
 *
 * Supplementary string parameter table and testing by Tomas Muehlhoff.
 *
 * Wireshark - Network traffic analyzer
 * By Gerald Combs <gerald@wireshark.org>
 * Copyright 1998 Gerald Combs
 *
 * SPDX-License-Identifier: GPL-2.0-or-later
 *
 * References:
 * ND1301:2001/03  http://www.nicc.org.uk/nicc-public/Public/interconnectstandards/dpnss/nd1301_2004_11.pdf
 * http://acacia-net.com/wwwcla/protocol/dass2_l3.htm
 */

#include "config.h"

#include <stdlib.h>

#include <epan/packet.h>
#include <epan/expert.h>

#include <wsutil/strtoi.h>

void proto_register_dpnss(void);

/* Initialize the protocol and registered fields */
static int proto_dpnss                        = -1;
static int hf_dpnss_msg_grp_id                = -1;
static int hf_dpnss_cc_msg_type               = -1;
static int hf_dpnss_e2e_msg_type              = -1;
static int hf_dpnss_LbL_msg_type              = -1;
static int hf_dpnss_ext_bit                   = -1;
static int hf_dpnss_ext_bit_notall            = -1;
static int hf_dpnss_sic_type                  = -1;
static int hf_dpnss_sic_details_for_speech    = -1;
static int hf_dpnss_sic_details_for_data1     = -1;
static int hf_dpnss_sic_details_for_data2     = -1;
static int hf_dpnss_dest_addr                 = -1;
static int hf_dpnss_sic_oct2_data_type        = -1;
static int hf_dpnss_sic_oct2_duplex           = -1;
static int hf_dpnss_sic_oct2_sync_data_format = -1;
static int hf_dpnss_sic_oct2_sync_byte_timing = -1;
static int hf_dpnss_sic_oct2_net_ind_clk      = -1;
static int hf_dpnss_sic_oct2_async_data       = -1;
static int hf_dpnss_sic_oct2_async_flow_ctrl  = -1;
static int hf_dpnss_clearing_cause            = -1;
static int hf_dpnss_rejection_cause           = -1;
static int hf_dpnss_man_code                  = -1;
static int hf_dpnss_subcode                   = -1;
static int hf_dpnss_maintenance_action        = -1;
/* Generated from convert_proto_tree_add_text.pl */
static int hf_dpnss_indication_field          = -1;
static int hf_dpnss_user_information          = -1;
static int hf_dpnss_selection_field           = -1;
static int hf_dpnss_sup_str                   = -1;
static int hf_dpnss_parameter                 = -1;

/* parameters */
static int hf_dpnss_a_b_party_addr            = -1;
static int hf_dpnss_call_idx                  = -1;

#define DPNNS_MESSAGE_GROUP_CC           0
#define DPNNS_MESSAGE_GROUP_E2E          2
#define DPNNS_MESSAGE_GROUP_LbL          4

#define DPNSS_CC_MSG_ISRM_C              0
#define DPNSS_CC_MSG_ISRM_I              1
#define DPNSS_CC_MSG_RM_C                2
#define DPNSS_CC_MSG_RM_I                3
#define DPNSS_CC_MSG_CS                  4
#define DPNSS_CC_MSG_CCM                 5
#define DPNSS_CC_MSG_NIM                 6
#define DPNSS_CC_MSG_CA                  7
#define DPNSS_CC_MSG_CRM                 8
#define DPNSS_CC_MSG_NAM                 9
#define DPNSS_CC_MSG_RRM                10
#define DPNSS_CC_MSG_SSRM_I             11
#define DPNSS_CC_MSG_SSRM_C             12

/* Initialize the subtree pointers */
static int ett_dpnss            = -1;
static int ett_dpnss_sel_field  = -1;
static int ett_dpnss_sic_field  = -1;
static int ett_dpnss_ind_field  = -1;
static int ett_dpnss_sup_str    = -1;

static expert_field ei_dpnss_not_supported_yet = EI_INIT;
static expert_field ei_dpnss_msg_grp_id = EI_INIT;


static const value_string dpnss_msg_grp_id_vals[] = {
    {0,     "Call Control Message Group"},
    {2,     "End-to-End Message Group"},
    {4,     "Link-by-Link Message Group"},
    {0, NULL }
};

static const value_string dpnss_cc_msg_type_vals[] = {
    {DPNSS_CC_MSG_ISRM_C,       "INITIAL SERVICE REQUEST Message (COMPLETE) - ISRM(C)"},
    {DPNSS_CC_MSG_ISRM_I,       "INITIAL SERVICE REQUEST Message (INCOMPLETE) - ISRM(I)"},
    {DPNSS_CC_MSG_RM_C,         "RECALL Message (COMPLETE) - RM(C)"},
    {DPNSS_CC_MSG_RM_I,         "RECALL Message (INCOMPLETE) - RM(I)"},
    {DPNSS_CC_MSG_CS,           "CHANNEL SEIZED - CS"},
    {DPNSS_CC_MSG_CCM,          "CALL CONNECTED Message - CCM"},
    {DPNSS_CC_MSG_NIM,          "NETWORK INDICATION Message - NIM"},
    {DPNSS_CC_MSG_CA,           "CALL ARRIVAL Message - CA"},
    {DPNSS_CC_MSG_CRM,          "CLEAR REQUEST Message - CRM/CLEAR INDICATION Message - CIM"}, /* Humm chek 2.1.7/2.1.8 - depends on dir? */
    {DPNSS_CC_MSG_NAM,          "NUMBER ACKNOWLEDGE Message - NAM"},
    {DPNSS_CC_MSG_RRM,          "RECALL REJECTION Message - RRM"},
    {DPNSS_CC_MSG_SSRM_I,       "SUBSEQUENT SERVICE REQUEST Message (INCOMPLETE) - SSRM(I)"},
    {DPNSS_CC_MSG_SSRM_C,       "SUBSEQUENT SERVICE REQUEST Message (COMPLETE) - SSRM(C)"},
    { 0,    NULL }
};


static const value_string dpnss_cc_msg_short_type_vals[] = {
    {DPNSS_CC_MSG_ISRM_C,       "ISRM(C)"},
    {DPNSS_CC_MSG_ISRM_I,       "ISRM(I)"},
    {DPNSS_CC_MSG_RM_C,         "RM(C)"},
    {DPNSS_CC_MSG_RM_I,         "RM(I)"},
    {DPNSS_CC_MSG_CS,           "CS"},
    {DPNSS_CC_MSG_CCM,          "CCM"},
    {DPNSS_CC_MSG_CA,           "CA"},
    {DPNSS_CC_MSG_NIM,          "NIM"},
    {DPNSS_CC_MSG_CRM,          "CRM/CIM"}, /* Humm chek 2.1.7/2.1.8 - depends on dir? */
    {DPNSS_CC_MSG_NAM,          "NAM"},
    {DPNSS_CC_MSG_RRM,          "RRM"},
    {DPNSS_CC_MSG_SSRM_I,       "SSRM(I)"},
    {DPNSS_CC_MSG_SSRM_C,       "SSRM(C)"},
    {0, NULL }
};

#define DPNSS_E2E_MSG_EEM_C             2
#define DPNSS_E2E_MSG_EEM_I             3
#define DPNSS_E2E_MSG_SCRM              4
#define DPNSS_E2E_MSG_SCIM              5
#define DPNSS_E2E_MSG_ERM_C             6
#define DPNSS_E2E_MSG_ERM_I             7
#define DPNSS_E2E_MSG_NSIM              8


/* 2.2 END-TO-END MESSAGE GROUP */
static const value_string dpnss_e2e_msg_type_vals[] = {
    {2,     "END-to-END Message (COMPLETE) - EEM(C)"},
    {3,     "END-to-END Message (INCOMPLETE) - EEM(I)"},
    {4,     "SINGLE-CHANNEL CLEAR REQUEST Message - SCRM"},
    {5,     "SINGLE-CHANNEL CLEAR INDICATION Message - SCIM"},
    {6,     "END-to-END RECALL Message (COMPLETE) - ERM(C)"},
    {7,     "END-to-END RECALL Message (INCOMPLETE) - ERM(I)"},
    {8,     "NON SPECIFIED INFORMATION Message - NSIM"},
    { 0,    NULL }
};

static const value_string dpnss_e2e_msg_short_type_vals[] = {
    {2,     "EEM(C)"},
    {3,     "EEM(I)"},
    {4,     "SCRM"},
    {5,     "SCIM"},
    {6,     "ERM(C)"},
    {7,     "ERM(I)"},
    {8,     "NSIM"},
    { 0,    NULL }
};

#define DPNSS_LbL_MSG_LLM_C             0
#define DPNSS_LbL_MSG_LLM_I             1
#define DPNSS_LbL_MSG_LLRM              2
#define DPNSS_LbL_MSG_SM                4
#define DPNSS_LbL_MSG_LMM               5
#define DPNSS_LbL_MSG_LMRM              6

/* 2.3 LINK-BY-LINK MESSAGE GROUP */
static const value_string dpnss_LbL_msg_type_vals[] = {
    {0,     "LINK-by-LINK Message (COMPLETE) - LLM(C)"},
    {1,     "LINK-by-LINK Message (INCOMPLETE) - LLM(I)"},
    {2,     "LINK-by-LINK REJECT Message - LLRM"},
    {4,     "SWAP Message - SM"},
    {5,     "LINK MAINTENANCE Message - LMM"},
    {6,     "LINK MAINTENANCE REJECT Message - LMRM"},
    { 0,    NULL }
};

static const value_string dpnss_LbL_msg_short_type_vals[] = {
    {0,     "LLM(C)"},
    {1,     "LLM(I)"},
    {2,     "LLRM"},
    {4,     "SM"},
    {5,     "LMM"},
    {6,     "LMRM"},
    { 0,    NULL }
};

static const true_false_string dpnss_ext_bit_vals = {
    "further octet(s) follow",
    "no further octets"
};

static const true_false_string dpnss_ext_bit_no_ext_vals = {
    "no further octets",
    "Invalid"
};
/* SECTION 4 ANNEX 1 */
static const value_string dpnss_sic_type_type_vals[] = {
    {0,     "invalid"},
    {1,     "speech"},
    {2,     "data"},
    {3,     "data"},
    {4,     "interworking with DASS 2 - treat as data"},
    {5,     "interworking with DASS 2 - treat as data"},
    {6,     "interworking with DASS 2 - treat as data"},
    {7,     "interworking with DASS 2 - treat as data"},
    { 0,    NULL }
};

static const value_string dpnss_sic_details_for_speech_vals[] = {
    {0,     "64 kbit/s PCM G.711 A-Law or analogue"},
    {1,     "32 kbit/s ADPCM G.721"},
    {2,     "64 kbit/s PCM G.711 u-Law or analogue"},
    {3,     "Invalid"},
    {4,     "Invalid"},
    {5,     "Invalid"},
    {6,     "Invalid"},
    {7,     "Invalid"},
    {8,     "Invalid"},
    {9,     "Invalid"},
    {10,    "Invalid"},
    {11,    "Invalid"},
    {12,    "Invalid"},
    {13,    "Invalid"},
    {14,    "Invalid"},
    {15,    "Invalid"},
    { 0,    NULL }
};

static const value_string dpnss_sic_details_for_data_rates1_vals[] = {
    {0,     "64000 bit/s"},
    {1,     "56000 bit/s"},
    {2,     "48000 bit/s"},
    {3,     "32000 bit/s"},
    {4,     "19200 bit/s"},
    {5,     "16000 bit/s"},
    {6,     "14400 bit/s"},
    {7,     "12000 bit/s"},
    {8,     "9600 bit/s"},
    {9,     "8000 bit/s"},
    {10,    "7200 bit/s"},
    {11,    "4800 bit/s"},
    {12,    "3600 bit/s"},
    {13,    "2400 bit/s"},
    {14,    "1200 bit/s"},
    {15,    "600 bit/s"},
    { 0,    NULL }
};

static const value_string dpnss_sic_details_for_data_rates2_vals[] = {
    {0,     "300 bit/s"},
    {1,     "200 bit/s"},
    {2,     "150 bit/s"},
    {3,     "134.5 bit/s"},
    {4,     "110 bit/s"},
    {5,     "100 bit/s"},
    {6,     "75 bit/s"},
    {7,     "50 bit/s"},
    {8,     "75/1200 bit/s"},
    {9,     "1200/75 bit/s"},
    {10,    "invalid"},
    {11,    "invalid"},
    {12,    "invalid"},
    {13,    "invalid"},
    {14,    "invalid"},
    {15,    "invalid"},
    { 0,    NULL }
};
/* Octet 2 */

static const value_string dpnss_sic_oct2_data_type_vals[] = {
    {0,     "Invalid"},
    {1,     "Invalid"},
    {2,     "Invalid"},
    {3,     "Synchronous"},
    {4,     "Synchronous"},
    {5,     "Asynchronous"},
    {6,     "Asynchronous"},
    {7,     "Asynchronous"},
    { 0,    NULL }
};

static const true_false_string dpnss_duplex_vals = {
    "Half Duplex (HDX)",
    "Full Duplex (FDX)"
};

static const true_false_string dpnss_sic_oct2_sync_data_format_vals = {
    "X.25 Packet Mode",
    "Anonymous or Unformatted"
};

static const true_false_string dpnss_sic_oct2_net_ind_clk_vals = {
    "Bits E4/E5/E6 indicate phase",
    "Clock Locked to Transmission"
};

static const true_false_string dpnss_provided_vals = {
    "Provided",
    "Not Provided"
};

static const value_string dpnss_sic_oct2_async_data_type_vals[] = {
    {0,     "Unspecified"},
    {1,     "5 data bits"},
    {2,     "7 data bits"},
    {3,     "8 data bits"},
    { 0,    NULL }
};
static const true_false_string dpnss_flow_control_vals = {
  "TA has ESRA capability",
  "TA does not have ESRA capability"
};

/* SECTION 4 Global Issue 7
 * ANNEX 3 CLEARING/REJECTION CAUSE CODES
 */
static const value_string dpnss_clearing_cause_code_vals[] = {
    {0x29,      "Access Barred"},
    {0x14,      "Acknowledgement"},
    {0x01,      "Address Incomplete"},
    {0x08,      "Busy"},
    {0x23,      "Channel Out of Service"},
    {0x2d,      "DTE Controlled Not Ready"},
    {0x07,      "Congestion"},
    {0x30,      "Call Termination"},
    {0x18,      "Facility Not Registered"},
    {0x0a,      "Incoming Calls Barred"},
    {0x13,      "Service Incompatible"},
    {0x1a,      "Message Not Understood"},
    {0x1e,      "Network Address Extension-Error"},
    {0x02,      "Network Termination"},
    {0x00,      "Number Unobtainable"},
    {0x24,      "Priority Forced Release"},
    {0x19,      "Reject"},
    {0x1c,      "Route Out of Service"},
    {0x04,      "Subscriber Incompatible"},
    {0x15,      "Signal Not Understood"},
    {0x16,      "Signal Not Valid"},
    {0x09,      "Subscriber Out of Service"},
    {0x1b,      "Signalling System Incompatible"},
    {0x17,      "Service Temporarily Unavailable"},
    {0x03,      "Service Unavailable"},
    {0x1d,      "Transferred"},
    {0x2e,      "DTE Uncontrolled Not Ready"},
    { 0,    NULL }
};
/* ANNEX 6 : MAINTENANCE ACTIONS (p235) */
static const value_string dpnss_maintenance_actions_vals[] = {
    {0x1,       "BBC - Back-Busy Control"},
    {0x2,       "LBC - Loop-Back Control"},
    {0x3,       "LBA - Loop-Back Abort"},
    {0x4,       "TCS-R - Traffic Channel Status Request"},
    {0x5,       "ACK - Acknowledge"},
    {0x6,       "NTC - Non-Looped-Back Test Control"},
    { 0,    NULL }
};

/* ANNEX 7 : CODING OF USAGE IDENTIFIERS */
static const value_string dpnss_man_code_vals[] = {
    {0x0,       "Reserved"},
    {0x1,       "BT"},
    {0x2,       "Ericsson"},
    {0x3,       "Lucent"},
    {0x4,       "Philips"},
    {0x5,       "Siemens"},
    {0x6,       "Westell"},
    {0x7,       "Mitel"},
    { 0,    NULL }
};



#define DPNSS_NONE                               0
#define DPNSS_SERV_MAR                           1
#define DPNSS_STATUS                             2
#define DPNSS_ROUTE_RES_CLASS                    3
#define DPNSS_CBR_GRP                            4
#define DPNSS_FAC_LST_CODE                       5
#define DPNSS_NO_OF_FUR_TRANS                    6
#define DPNSS_NO_OF_FUR_ALT_R                    7
#define DPNSS_INT_CAP_LEV                        8
#define DPNSS_NESTING_LEVEL                      9
#define DPNSS_C_PARTY_ADDR                      10
#define DPNSS_B_PARTY_ADDR                      11
#define DPNSS_SIC                               12
#define DPNSS_A_B_PARTY_ADDR                    13
#define DPNSS_DIVERSION_TYPE                    14
#define DPNSS_NSI_IDENTIFIER                    15
#define DPNSS_USER_DEFINED                      16
#define DPNSS_TEXT                              17
#define DPNSS_CALL_INDEX                        18
#define DPNSS_PASSWORD                          19
#define DPNSS_CALL_DIR                          20
#define DPNSS_DPNSS_ISDN_TYPE                   21
#define DPNSS_HC_CLC                            22
#define DPNSS_ENHANCED_STR_ID                   23
#define DPNSS_STRING_ID                         24
#define DPNSS_STRING_ID_LIST                    25
#define DPNSS_TEXT_TYPE                         26
#define DPNSS_CHANNEL_STATUS                    27
#define DPNSS_CHANNEL_NUMBER                    28
#define DPNSS_BPL                               29
#define DPNSS_BCL                               30
#define DPNSS_DEVICE_INDEX                      31
#define DPNSS_CR_NO                             32
#define DPNSS_CALL_ID_LENGTH                    33
#define DPNSS_STATE_OF_DEST                     34
#define DPNSS_STATE_OF_DEST_QUAL                35
#define DPNSS_REASON_FOR_REDIR                  36
#define DPNSS_CLEARING_CAUSE                    37
#define DPNSS_RECONT_ADDR                       38
#define DPNSS_STATE_OF_OPERATOR                 39
#define DPNSS_NIGHT_SERVICE                     40
#define DPNSS_PBX_FLAG                          41
#define DPNSS_NUMBER_OF_CALLS                   42
#define DPNSS_NUMBER_OF_SERVERS                 43
#define DPNSS_PRIORITY_LEVEL                    44
#define DPNSS_LOCATION                          45
#define DPNSS_SUBADDRESS                        46
#define DPNSS_ALARM_LEVEL                       47
#define DPNSS_STAFF_PRESENT                     48
#define DPNSS_TIME_AND_DATE                     49
#define DPNSS_SERVICES                          50
#define DPNSS_PBX_REFERENCE                     51
#define DPNSS_TRUNK_GROUP_REF_NUMBER            52
#define DPNSS_TRUNK_MEMBER_REF_NUMBER           53
#define DPNSS_CONF_PARTY_INDEX                  54
#define DPNSS_CONF_PARTY_DET                    55
#define DPNSS_ACCOUNT_CODE                      56
#define DPNSS_CONF_BRIDGE_ADDR                  57
#define DPNSS_COST_QUALIFIER                    58
#define DPNSS_CURRENCY_INDICATION               59
#define DPNSS_CURRENCY_UNITS                    60
#define DPNSS_TIME_INTERVAL                     61
#define DPNSS_UNITS                             62
#define DPNSS_REMOTE_ADDRESS                    63
#define DPNSS_TEST_INDEX                        64
#define DPNSS_TEST_RESULT                       65
#define DPNSS_TYPE_OF_ASSISTANCE                66
#define DPNSS_REST_DOMAIN                       67
#define DPNSS_GRP_PICK_UP_CODE                  68
#define DPNSS_PICK_UP_CALL_TYPE                 69
#define DPNSS_MALICIOUS_CALL_REF                70
#define DPNSS_TIMER_VALUE                       71
#define DPNSS_BEARER_CAP                        72
#define DPNSS_ISDN_NUM_ATTR                     73
#define DPNSS_ISDN_DPNSS_SUBADDRESS             74
#define DPNSS_ISDN_NUMBER_DIGITS                75
#define DPNSS_HIGH_LAYER_COMP                   76
#define DPNSS_LOW_LAYER_COMP                    77
#define DPNSS_PROGRESS_INDICATOR                78
#define DPNSS_VPN_ACCESS_REF_NUM                79
#define DPNSS_INDEX_NUMBER                      80
#define DPNSS_RESTRICTION_INDICATOR             81
#define DPNSS_CAUSE                             82


typedef struct {
    gint        id_code_no;
    const char *compact_name;
    const char *name;
    gint        par1_num;
    gint        par2_num;
    gint        par3_num;
    gint        par4_num;
} dpnns_sup_serv_set_t;

static const dpnns_sup_serv_set_t dpnns_sup_serv_set[] = {
    {0, "NOT USED",     "NOT USED",                                     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {1, "CLC-ORD",      "CALLING/CALLED LINE CATEGORY ORDINARY",        DPNSS_SERV_MAR,         DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {2, "CLC-DEC",      "CALLING/CALLED LINE CATEGORY DECADIC",         DPNSS_STATUS,           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {3, "CLC-ISDN",     "CALLING/CALLED LINE CATEGORY-PUBLIC ISDN",     DPNSS_STATUS,           DPNSS_DPNSS_ISDN_TYPE,  DPNSS_NONE,             DPNSS_NONE },
    {4, "CLC-PSTN",     "CALLING/CALLED LINE CATEGORY-PSTN",            DPNSS_STATUS,           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {5, "CLC-MF5",      "CALLING/CALLED LINE CATEGORY-SSMF5",           DPNSS_STATUS,           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {6, "CLC-OP",       "CALLING/CALLED LINE CATEGORY-OPERATOR",        DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {7, "CLC-NET",      "CALLING/CALLED LINE CATEGORY-NETWORK",         DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {8, "undefined",    "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {9, "undefined",    "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {10, "CBWF-R",      "CALL BACK WHEN FREE-REQUEST",                  DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {11, "CBWF-FN",     "CALL BACK WHEN FREE-FREE NOTIFICATION",        DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {12, "CBWF-CSUI",   "CALL BACK WHEN FREE-CALL SET-UP(IMMEDIATE)",   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {13, "CBWF-C",      "CALL BACK WHEN FREE-CANCEL",                   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {14, "RO",          "RING OUT",                                     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {15, "CBC",         "CALL BACK COMPLETE",                           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {16, "CBWF-CSUD",   "CALL BACK WHEN FREE -CALL SET-UP(DELAYED)",    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {17, "CBWNU-R",     "CALL BACK WHEN NEXT USEDREQUEST",              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {18, "COS",         "CLASS OF SERVICE",                             DPNSS_ROUTE_RES_CLASS,  DPNSS_CBR_GRP,          DPNSS_FAC_LST_CODE,     DPNSS_NONE},
    {19, "LA",          "LOOP AVOIDANCE",                               DPNSS_NO_OF_FUR_TRANS,  DPNSS_NO_OF_FUR_ALT_R,  DPNSS_NONE,             DPNSS_NONE },
    {20, "EI-PVR",      "EXECUTIVE INTRUSION-PRIOR VALIDATION",         DPNSS_INT_CAP_LEV,      DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {21, "EI-R",        "EXECUTIVE INTRUSION-REQUEST",                  DPNSS_INT_CAP_LEV,      DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {22, "IPL-R",       "INTRUSION PROTECTION LEVEL-REQUEST",           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {23, "IPL",         "INTRUSION PROTECTION LEVEL",                   DPNSS_INT_CAP_LEV,      DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {24, "EI-C",        "EXECUTIVE INTRUSION-CONVERT",                  DPNSS_INT_CAP_LEV,      DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {25, "EI-I",        "EXECUTIVE INTRUSION-INTRUDED",                 DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {26, "CW",          "CALL WAITING",                                 DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {27, "CO",          "CALL OFFER",                                   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {28, "SN-REQ",      "SEND NEXT-REQUEST",                            DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {29, "HGF",         "HUNT GROUP FORWARDED",                         DPNSS_NESTING_LEVEL,    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {30, "DIV-V",       "DIVERSION-VALIDATION",                         DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {31, "DIV-FM",      "DIVERSION-FOLLOW ME",                          DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {32, "DIV-BY",      "DIVERSION-BY PASS",                            DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {33, "DIV-CI",      "DIVERSION CANCEL-IMMEDIATE",                   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {34, "DIV-CR",      "DIVERSION CANCEL-ON NO REPLY",                 DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {35, "DIV-CB",      "DIVERSION CANCEL-ON BUSY",                     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {36, "DIV-CA",      "DIVERSION CANCEL-ALL",                         DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {37, "DVG-I",       "DIVERTING IMMEDIATE",                          DPNSS_B_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {38, "DVG-B",       "DIVERTING ON BUSY",                            DPNSS_B_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {39, "DVG-R",       "DIVERTING ON NO REPLY",                        DPNSS_B_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {40, "DVT-I",       "DIVERT IMMEDIATE",                             DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {41, "DVT-B",       "DIVERT ON BUSY",                               DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {42, "DVD-I",       "DIVERTED IMMEDIATE",                           DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {43, "DVD-B",       "DIVERTED ON BUSY",                             DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {44, "DVD-R",       "DIVERTED ON NO REPLY",                         DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {45, "DVT-R",       "DIVERT ON NO REPLY",                           DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {46, "SIC",         "SERVICE INDICATOR CODE",                       DPNSS_SIC,              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {47, "BSS-M",       "BEARER SERVICE SELECTION-MANDATORY",           DPNSS_SIC,              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {48, "BSS-P",       "BEARER SERVICE SELECTION-PREFERRED",           DPNSS_SIC,              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {49, "BSS-N",       "BEARER SERVICE SELECTION-NOTIFICATION",        DPNSS_SIC,              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {50, "OLI/CLI",     "ORIGINATING LINE IDENTITY/CALLED LINE IDENTITY", DPNSS_A_B_PARTY_ADDR, DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {51, "RTI",         "ROUTING INFORMATION, ROUTING INFORMATION",     DPNSS_DPNSS_ISDN_TYPE,  DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {52, "undefined",   "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {53, "DVD-E",       "DIVERTED-EXTERNALLY",                          DPNSS_DIVERSION_TYPE,   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {54, "REJ",         "REJECT",                                       DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {55, "ACK",         "ACKNOWLEDGE",                                  DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {56, "SN",          "SEND NEXT",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {57, "D-SIC",       "DASS 2-SERVICE INDICATOR CODE",                DPNSS_SIC,              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {58, "NSI",         "NON-SPECIFIED INFORMATION",                    DPNSS_NSI_IDENTIFIER,   DPNSS_USER_DEFINED,     DPNSS_USER_DEFINED,     DPNSS_NONE },
    {59, "OCP",         "ORIGINALLY CALLED PARTY",                      DPNSS_B_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {60, "HOLD-REQ",    "HOLD REQUEST",                                 DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {61, "RECON",       "RECONNECTED",                                  DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {62, "HDG",         "HOLDING",                                      DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {63, "CD-Q",        "CALL DISTRIBUTION-QUEUE",                      DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {64, "TEXT-M",      "TEXT MESSAGE",                                 DPNSS_TEXT,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {65, "SOD-B",       "STATE OF DESTINATION-BUSY",                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {66, "SOD-F",       "STATE OF DESTINATION-FREE",                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {67, "CD-DNQ",      "CALL DISTRIBUTION-DO NOT QUEUE",               DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {68, "undefined",   "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {69, "CD-LINK",     "CALL DISTRIBUTION-LINKED",                     DPNSS_CALL_INDEX,       DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {70, "DIV-RSI",     "DIVERSION-REMOTE SET IMMEDIATE",               DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {71, "DIV-RSB",     "DIVERSION-REMOTE SET ON BUSY",                 DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {72, "DIV-RSR",     "DIVERSION-REMOTE SET ON NO REPLY",             DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {73, "DIV-RCI",     "DIVERSION-REMOTE CANCEL IMMEDIATE",            DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {74, "DIV-RCB",     "DIVERSION-REMOTE CANCEL ON BUSY",              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {75, "DIV-RCR",     "DIVERSION-REMOTE CANCEL ON NO REPLY",          DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {76, "DIV-RCA",     "DIVERSION-REMOTE CANCEL ALL",                  DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {77, "PASSW",       "PASSWORD",                                     DPNSS_PASSWORD,         DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {78, "SPL",         "SPLIT",                                        DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {79, "TWP",         "TWO PARTY",                                    DPNSS_CALL_DIR,         DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {80, "ENQ",         "ENQUIRY CALL",                                 DPNSS_HC_CLC,           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {81, "SCE",         "SINGLE CHANNEL ENQUIRY",                       DPNSS_HC_CLC,           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {82, "TRFD",        "TRANSFERRED",                                  DPNSS_CALL_DIR,         DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {83, "SHTL",        "SHUTTLE",                                      DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {84, "COC",         "CONNECTED CALL",                               DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {85, "TRFR",        "TRANSFER",                                     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {86, "CD-FN",       "CALL DISTRIBUTION-FREE NOTIFY",                DPNSS_CALL_INDEX,       DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {87, "ICC",         "INTERCOM CALL",                                DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {88, "AD-RQ",       "ADD-ON REQUEST",                               DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {89, "AD-V",        "ADD-ON VALIDATION",                            DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {90, "AD-O",        "ADDED-ON",                                     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {91, "ENH",         "ENHANCED SSMF5",                               DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {92, "BAS",         "BASIC SSMF5",                                  DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {93, "CD-UNLINK",   "CALL DISTRIBUTION-UNLINKED",                   DPNSS_CALL_INDEX,       DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {94, "SNU",         "SIGNAL NOT UNDERSTOOD",                        DPNSS_ENHANCED_STR_ID,  DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {95, "SU",          "SERVICE UNAVAILABLE",                          DPNSS_STRING_ID,        DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {96, "RR-SNU",      "RECALL REJECTED SIGNAL NOT UNDERSTOOD",        DPNSS_ENHANCED_STR_ID,  DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {97, "CD-CSU",      "CALL DISTRIBUTION-CALL SET UP",                DPNSS_CALL_INDEX,       DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {98, "IG-SNU",      "IGNORED-SIGNAL NOT UNDERSTOOD",                DPNSS_STRING_ID_LIST,   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {99, "IG-SU",       "IGNORED-SERVICE UNAVAILABLE",                  DPNSS_STRING_ID_LIST,   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {100, "TEXT",       "TEXTUAL DISPLAY",                              DPNSS_TEXT,             DPNSS_TEXT_TYPE,        DPNSS_NONE,             DPNSS_NONE },
    {101, "SIM-A",      "SIMULATED ANSWER",                             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {102, "ACT",        "ACTIVATE",                                     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {103, "DEACT",      "DEACTIVATE",                                   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {104, "TCS",        "TRAFFIC-CHANNEL STATUS",                       DPNSS_CHANNEL_STATUS,   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {105, "CHID",       "CHANNEL IDENTITY",                             DPNSS_CHANNEL_NUMBER,   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {106, "FR-R",       "FORCED RELEASE-REQUEST",                       DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {107, "PB-P",       "PRIORITY BREAKDOWN-PROTECTION",                DPNSS_BPL,              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {108, "PB-R",       "PRIORITY BREAKDOWN-REQUEST",                   DPNSS_BCL,              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {109, "DI",         "DEVICE IDENTITY",                              DPNSS_DEVICE_INDEX,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {110, "ROP-R",      "ROUTE OPTIMISATION-REQUEST",                   DPNSS_CR_NO,            DPNSS_CALL_ID_LENGTH,   DPNSS_NONE,             DPNSS_NONE },
    {111, "ROP-CSU",    "ROUTE OPTIMISATION-CALL SET UP",               DPNSS_CALL_ID_LENGTH,   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {112, "ROP-CON",    "ROUTE OPTIMISATION-CONNECTED",                 DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {113, "DND",        "DO NOT DISTURB",                               DPNSS_STATE_OF_DEST,    DPNSS_STATE_OF_DEST_QUAL, DPNSS_NONE,           DPNSS_NONE },
    {114, "DND-O",      "DO NOT DISTURB-OVERRIDE",                      DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {115, "DND-S",      "DO NOT DISTURB-SET",                           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {116, "DND-C",      "DO NOT DISTURB-CLEAR",                         DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {117, "undefined",  "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {118, "EST",        "EXTENSION STATUS CALL",                        DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {119, "CDIV",       "CONTROLLED DIVERSION",                         DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {120, "RDG",        "REDIRECTING",                                  DPNSS_REASON_FOR_REDIR, DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {121, "RCF",        "REDIRECTING ON CALL FAILURE",                  DPNSS_CLEARING_CAUSE,   DPNSS_B_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE },
    {122, "TOV-R",      "TAKEOVER REQUEST",                             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {123, "TOV-V",      "TAKEOVER VALIDATION",                          DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {124, "SER-R",      "SERIES CALL REQUEST",                          DPNSS_RECONT_ADDR,      DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {125, "SER-C",      "SERIES CALL-CANCEL",                           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {126, "SER-E",      "SERIES CALL-ESTABLISHMENT",                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {127, "NS-N, NIGHT","SERVICE-NOTIFICATION",                         DPNSS_STATE_OF_OPERATOR, DPNSS_NONE,            DPNSS_NONE,             DPNSS_NONE },
    {128, "NS-DVT",     "NIGHT SERVICE-DIVERT",                         DPNSS_NIGHT_SERVICE,    DPNSS_PBX_FLAG,         DPNSS_NONE,             DPNSS_NONE },
    {129, "NS-DVG",     "DPNSS_NIGHT_SERVICE-DIVERTING",                DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {130, "NS-DVD",     "DPNSS_NIGHT_SERVICE-DIVERTED",                 DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {131, "NS-RDVT",    "DPNSS_NIGHT_SERVICE-REDIVERT",                 DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {132, "NS-RDVG",    "DPNSS_NIGHT_SERVICE-REDIVERTING",              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {133, "NS-RDVD",    "DPNSS_NIGHT_SERVICE-REDIVERTED",               DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {134, "NS-DA",      "DPNSS_NIGHT_SERVICE-DEACTIVATED",              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {135, "Q-INFO",     "QUEUE INFORMATION",                            DPNSS_NUMBER_OF_CALLS,  DPNSS_NUMBER_OF_SERVERS, DPNSS_NONE,            DPNSS_NONE },
    {136, "Q-PRIO",     "QUEUE PRIORITY",                               DPNSS_PRIORITY_LEVEL,   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {137, "SW-V",       "SWAP - VALIDATION",                            DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {138, "SW-R",       "SWAP - REJECTED",                              DPNSS_LOCATION,         DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {139, "undefined",  "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {140, "A2",         "SSMF5 SIGNAL 'A-2'",                           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {141, "undefined",  "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {142, "A5",         "SSMF5 SIGNAL 'A-5'",                           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {143, "undefined",  "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {144, "A8",         "SSMF5 SIGNAL 'A-8'",                           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {145, "A10",        "SSMF5 SIGNAL 'A-10'",                          DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {146, "undefined",  "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {147, "A13",        "SSMF5 SIGNAL 'A-13'",                          DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {148, "A14",        "SSMF5 SIGNAL 'A-14'",                          DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {149, "A12",        "SSMF5 SIGNAL 'A-12'",                          DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {150, "A7",         "SSMF5 SIGNAL 'A-7'",                           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {151, "CBWF-CLB",   "CALL BACK WHEN FREE-CALL BACK",                DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {152, "DVT",        "DIVERT", DPNSS_C_PARTY_ADDR,                   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {153, "SOD-I",      "DPNSS_STATE_OF_DEST-INDETERMINABLE",           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {154, "DVG",        "DIVERTING",                                    DPNSS_B_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {155, "SOD-REQ",    "REQUEST DPNSS_STATE_OF_DEST",                  DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {156, "CBWF-CB",    "CALL BACK WHEN FREE-CALL BACK REQUEST",        DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {157, "NAE-DC",     "NETWORK ADDRESS EXTENSION",                    DPNSS_SUBADDRESS,       DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {158, "SFI",        "SUPPLEMENTARY FACILITIES INHIBITED",           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {159, "NAE-DI",     "NETWORK ADDRESS EXTENSION-DESTINATION INCOMPLETE", DPNSS_SUBADDRESS,   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {160, "DRS",        "DIRECT ROUTE SELECT",                          DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {161, "AS",         "ALARM STATUS",                                 DPNSS_ALARM_LEVEL,      DPNSS_STAFF_PRESENT,    DPNSS_NONE, DPNSS_NONE },
    {162, "AS-R",       "ALARM STATUS-REQUEST",                         DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {163, "TAD-R",      "TIME AND DATE-REQUEST",                        DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {164, "TAD",        "TIME AND DATE",                                DPNSS_TIME_AND_DATE,    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {165, "SATB",       "SATELLITE BARRED",                             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {166, "SERV",       "SERVICE INFORMATION",                          DPNSS_SERVICES,         DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {167, "TID",        "TRUNK IDENTITY",                               DPNSS_PBX_REFERENCE,    DPNSS_TRUNK_GROUP_REF_NUMBER, DPNSS_TRUNK_MEMBER_REF_NUMBER, DPNSS_NONE},
    {168, "PARK",       "PARK REQUEST",                                 DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {169, "PKD",        "PARKED",                                       DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {170, "AC-NAO",     "ADD-ON CONFERENCE-NO ADD ON CURRENTLY AVAILABLE", DPNSS_NONE,          DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {171, "CBM-R",      "CALL BACK MESSAGING-REQUEST",                  DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {172, "CBM-C",      "CALL BACK MESSAGING-CANCEL",                   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {173, "NAE-CC",     "NETWORK ADDRESS EXTENSION-CALLING/CALLED IDENTITY COMPLETE", DPNSS_SUBADDRESS, DPNSS_NONE,     DPNSS_NONE,             DPNSS_NONE },
    {174, "NAE-CI",     "NETWORK ADDRESS EXTENSION-CALLING/CALLED IDENTITY INCOMPLETE", DPNSS_SUBADDRESS, DPNSS_NONE,   DPNSS_NONE,             DPNSS_NONE },
    {175, "undefined",  "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {176, "AC-CDC",     "ADD-ON CONFERENCE-CLEARDOWN CONFERENCE",       DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {177, "AC-PI",      "ADD-ON CONFERENCE-PARTY INDEX",                DPNSS_CONF_PARTY_INDEX, DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {178, "undefined",  "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {179, "AC-DR",      "ADD-ON CONFERENCE - DETAILS REQUEST",          DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {180, "AC-PD",      "ADD-ON CONFERENCE - PARTY",                    DPNSS_CONF_PARTY_DET,   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {181, "AC-CBI",     "ADD-ON CONFERENCE - CONFERENCE BRIDGE IDENTITY", DPNSS_CONF_BRIDGE_ADDR, DPNSS_NONE,               DPNSS_NONE,             DPNSS_NONE },
    {182, "CH-AC",      "CHARGE REPORTING ACCOUNT CODE",                DPNSS_ACCOUNT_CODE,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {183, "CH-ACR",     "CHARGE REPORTING ACCOUNT CODE REQUEST",        DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {184, "CH-ACT",     "CHARGE REPORTING - ACTIVE",                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {185, "CH-CLR",     "CHARGE REPORTING - CLEAR",                     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {186, "CH-CR",      "CHARGE REPORTING - COST REQUEST",              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {187, "CH-CST",     "CHARGE REPORTING - COST, CURRENCY UNITS",      DPNSS_COST_QUALIFIER,   DPNSS_CURRENCY_INDICATION, DPNSS_NONE, DPNSS_NONE },
    {188, "CH-TR",      "CHARGE REPORTING - TIME RATE",                 DPNSS_CURRENCY_UNITS,   DPNSS_TIME_INTERVAL, DPNSS_COST_QUALIFIER, DPNSS_CURRENCY_INDICATION},
    {189, "CH-UR",      "CHARGE REPORTING - UNIT",                      DPNSS_CURRENCY_UNITS,   DPNSS_COST_QUALIFIER, DPNSS_CURRENCY_INDICATION, DPNSS_NONE},
    {190, "CH-UU",      "CHARGE REPORTING - UNITS USED",                DPNSS_UNITS,            DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {191, "OPD",        "OUTPUT DIGITS",                                DPNSS_REMOTE_ADDRESS,   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {192, "OPD-R",      "OUTPUT DIGITS - REQUEST",                      DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {193, "IRD",        "INTERNAL REROUTING DISABLED",                  DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {194, "ERD",        "EXTERNAL REROUTING DISABLED",                  DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {195, "NLT-PT",     "NON-LOOPED BACK TEST-PERFORM TEST",            DPNSS_TEST_INDEX,       DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {196, "NLT-RQ",     "NON-LOOPED BACK TEST-TEST REQUEST",            DPNSS_TEST_INDEX,       DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {197, "NLT-SC",     "NON-LOOPED BACK TEST-SEQUENCE COMPLETE",       DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {198, "NLT-RES",    "NON-LOOPED BACK TEST-RESULT",                  DPNSS_TEST_RESULT,      DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {199, "AUTO-A",     "AUTOANSWER",                                   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {200, "HF-A",       "HANDS-FREE - ACTIVATED",                       DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {201, "HF-D",       "HANDS-FREE - DEACTIVATED",                     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {202, "EI-W",       "EXECUTIVE INTRUSION-WITHDRAW",                 DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {203, "DVT-RD",     "DIVERT-REDIRECTION",                           DPNSS_REASON_FOR_REDIR, DPNSS_C_PARTY_ADDR, DPNSS_NONE, DPNSS_NONE },
    {204, "DVT-CF",     "DIVERT-CALL FAILURE",                          DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {205, "ASST-INFO",  "ASSISTANCE-INFORMATION",                       DPNSS_TYPE_OF_ASSISTANCE, DPNSS_NONE,               DPNSS_NONE,             DPNSS_NONE },
    {206, "RED-BY",     "REDIRECTION-BYPASS",                           DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {207, "undefined",  "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {208, "VIC",        "VPN INITIATED CLEAR",                          DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {209, "NPR-A",      "NUMBER PRESENTATION RESTRICTION-A PARTY",      DPNSS_REST_DOMAIN, DPNSS_NONE,              DPNSS_NONE,             DPNSS_NONE },
    {210, "NPR-B",      "NUMBER PRESENTATION RESTRICTION-B PARTY",      DPNSS_REST_DOMAIN, DPNSS_NONE,              DPNSS_NONE,             DPNSS_NONE },
    {211, "ARC",        "AUXILIARY DPNSS_ROUTE_RES_CLASS",              DPNSS_ROUTE_RES_CLASS,  DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {212, "WOB",        "WAIT ON BUSY",                                 DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {213, "GPU-R",      "GROUP PICK-UP REQUEST",                        DPNSS_GRP_PICK_UP_CODE, DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {214, "PU-DVT",     "PICK-UP DIVERT",                               DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {215, "PU-DVG",     "PICK-UP DIVERTING",                            DPNSS_TIME_INTERVAL,    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {216, "DPU-R",      "DIRECTED PICK-UP REQUEST",                     DPNSS_PICK_UP_CALL_TYPE, DPNSS_NONE,                DPNSS_NONE,             DPNSS_NONE },
    {217, "RCC-CA",     "ROUTE CAPACITY CONTROL-CAPACITY AVAILABLE",    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {218, "undefined",  "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {219, "RCC-OI",     "ROUTE CAPACITY CONTROL-OVERRIDE INVOKED",      DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {220, "PU-DVD",     "PICK-UP DIVERTED",                             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {221, "NPR-O",      "NUMBER PRESENTATION RESTRICTION - OTHER PARTY", DPNSS_REST_DOMAIN,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {222, "MCI",        "MALICIOUS CALL INDICATION",                    DPNSS_MALICIOUS_CALL_REF, DPNSS_NONE,               DPNSS_NONE,             DPNSS_NONE },
    {223, "NSL",        "NETWORK SIGNALLING LIMIT", DPNSS_NONE,         DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {224, "undefined",  "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {225, "undefined",  "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {226, "TCOS",       "TRAVELLING CLASS OF SERVICE",                  DPNSS_ROUTE_RES_CLASS, DPNSS_CBR_GRP, DPNSS_FAC_LST_CODE, DPNSS_NONE},
    {227, "TCOS-R",     "TRAVELLING CLASS OF SERVICE-REQUEST",          DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {228, "DIV-RSC",    "DIVERSION-REMOTE SET COMBINED",                DPNSS_C_PARTY_ADDR,     DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {229, "DIV-RCC",    "DIVERSION-REMOTE CANCEL COMBINED",             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {230, "RDC",        "REDIRECTION CONTROL",                          DPNSS_TIMER_VALUE,      DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {231, "CAUSE",      "DPNSS_CLEARING_CAUSE",                         DPNSS_CLEARING_CAUSE,   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {232, "CP",         "CALL PROCEEDING",                              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {233, "I-BC",       "ISDN-BEARER CAPABILITY",                       DPNSS_BEARER_CAP,       DPNSS_NONE,         DPNSS_NONE,             DPNSS_NONE },
    {234, "I-CC",       "ISDN-DPNSS_CLEARING_CAUSE",                    DPNSS_CAUSE,            DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {235, "I-CPN",      "ISDN-CALLING PARTY/CONNECTED NUMBER",          DPNSS_ISDN_NUM_ATTR,    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {236, "I-CSA",      "ISDN-CALLING PARTY/CONNECTED DPNSS_SUBADDRESS", DPNSS_ISDN_DPNSS_SUBADDRESS, DPNSS_ISDN_NUMBER_DIGITS, DPNSS_NONE, DPNSS_NONE },
    {237, "I-DSA",      "ISDN-DESTINATION (CALLED PARTY) DPNSS_SUBADDRESS",     DPNSS_ISDN_DPNSS_SUBADDRESS, DPNSS_NONE,                DPNSS_NONE,             DPNSS_NONE },
    {238, "I-HLC",      "ISDN-HIGH LAYER COMPATIBILITY",                DPNSS_HIGH_LAYER_COMP,  DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {239, "I-LLC",      "ISDN-LOW LAYER COMPATIBILITY",                 DPNSS_LOW_LAYER_COMP,   DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {240, "I-PROG",     "ISDN-PROGRESS",                                DPNSS_PROGRESS_INDICATOR, DPNSS_NONE,               DPNSS_NONE,             DPNSS_NONE },
    {241, "IPN",        "INTERWORKING VIA A PRIVATE ISDN",              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {242, "SAVE",       "SAVE",                                         DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {243, "V-NID",      "VPN-NODAL IDENTITY",                           DPNSS_VPN_ACCESS_REF_NUM, DPNSS_NONE,               DPNSS_NONE,             DPNSS_NONE },
    {244, "M-INDEX",    "MESSAGE INDEX",                                DPNSS_INDEX_NUMBER, DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {245, "CBM-CSU",    "CALL BACK MESSAGING CALL SET-UP",              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {246, "INT-A",      "INTERIM ANSWER",                               DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {247, "undefined",  "undefined",                                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {248, "DVL",        "DIVERSION - LAST CONTROLLING EXTENSION IDENTITY", DPNSS_B_PARTY_ADDR, DPNSS_DIVERSION_TYPE, DPNSS_RESTRICTION_INDICATOR, DPNSS_NONE},
    {249, "ROP-INV",    "ROUTE OPTIMISATION INVITE",                    DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {250, "ROP-INVA",   "ROUTE OPTIMISATION INVITE WITH ACKNOWLEDGEMENT", DPNSS_NONE,               DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {251, "PCLG-P",     "PUBLIC CALLING PARTY NUMBER-PROVIDED",         DPNSS_ISDN_NUM_ATTR, DPNSS_ISDN_NUMBER_DIGITS, DPNSS_NONE, DPNSS_NONE },
    {252, "PCLG-D",     "PUBLIC CALLING PARTY NUMBER-DEFAULT",          DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
    {253, "PCON-P",     "PUBLIC CONNECTED NUMBER-PROVIDED",             DPNSS_ISDN_NUM_ATTR, DPNSS_ISDN_NUMBER_DIGITS, DPNSS_NONE, DPNSS_NONE },
    {254, "PCON-D",     "PUBLIC CONNECTED NUMBER-DEFAULT",              DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE,             DPNSS_NONE },
};

static int
dissect_dpnss_sic(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, int offset)
{
    guint8 octet, type_of_data;

    octet = tvb_get_guint8(tvb,offset);
    type_of_data = (octet & 0x70)>>4;
    proto_tree_add_item(tree, hf_dpnss_ext_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
    proto_tree_add_item(tree, hf_dpnss_sic_type, tvb, offset, 1, ENC_BIG_ENDIAN);
    switch (type_of_data) {
    case 1:
        /* Type of Data (001) : Details for Speech */
        proto_tree_add_item(tree, hf_dpnss_sic_details_for_speech, tvb, offset, 1, ENC_BIG_ENDIAN);
        break;
    case 2:
        /* Type of Data (010) : Data Rates */
        proto_tree_add_item(tree, hf_dpnss_sic_details_for_data1, tvb, offset, 1, ENC_BIG_ENDIAN);
        break;
    case 3:
        /* Type of Data (011) : Data Rates */
        proto_tree_add_item(tree, hf_dpnss_sic_details_for_data2, tvb, offset, 1, ENC_BIG_ENDIAN);
        break;
    default:
        /* Illegal */
        break;
    }
    offset++;
    if ((octet&0x80)==0x80) {
        /* Extension bit set
         * Synch/Asynchronous Information
         */
        octet = tvb_get_guint8(tvb,offset);
        type_of_data = octet&0x7;
        proto_tree_add_item(tree, hf_dpnss_ext_bit_notall, tvb, offset, 1, ENC_BIG_ENDIAN);
        switch (type_of_data) {
        case 3:
            /* Synchronous */
        case 4:
            /* Synchronous */
            proto_tree_add_item(tree, hf_dpnss_sic_oct2_net_ind_clk, tvb, offset, 1, ENC_BIG_ENDIAN);
            proto_tree_add_item(tree, hf_dpnss_sic_oct2_sync_data_format, tvb, offset, 1, ENC_BIG_ENDIAN);
            proto_tree_add_item(tree, hf_dpnss_sic_oct2_sync_byte_timing, tvb, offset, 1, ENC_BIG_ENDIAN);
            break;
        case 5:
            /* Asynchronous */
        case 6:
            /* Asynchronous */
        case 7:
            /* Asynchronous */
            proto_tree_add_item(tree, hf_dpnss_sic_oct2_async_flow_ctrl, tvb, offset, 1, ENC_BIG_ENDIAN);
            proto_tree_add_item(tree, hf_dpnss_sic_oct2_async_data, tvb, offset, 1, ENC_BIG_ENDIAN);
            break;
        default:
            break;
        }
        proto_tree_add_item(tree, hf_dpnss_sic_oct2_duplex, tvb, offset, 1, ENC_BIG_ENDIAN);
        proto_tree_add_item(tree, hf_dpnss_sic_oct2_data_type, tvb, offset, 1, ENC_BIG_ENDIAN);
        offset++;
    }
    return offset;
}
/*
static const value_string dpnss_serv_mark_vals[] = {
    { 1,        "PSTN BARRED"},
    { 2,        "EMERGENCY TELEPHONE"},
    { 3,        "HUNT GROUP"},
    { 4,        "DISTRIBUTED GROUP"},
    { 5,        "UNABLE TO INITIATE CLEARING AFTER ANSWER"},
    { 6,        "RING GROUP"},
    { 0,    NULL }
};
*/
/* Supplementary Information parameters
 * TODO Add decoding of parameters where needed.
 */

static const value_string dpnss_sup_serv_par_str_vals[] = {
    { DPNSS_NONE,                   "None"},
    { DPNSS_SERV_MAR,               "Servive Marking"},
    { DPNSS_STATUS,                 "Status"},
    { DPNSS_ROUTE_RES_CLASS,        "Route Restriction Class"},
    { DPNSS_CBR_GRP,                "Call Barring Group"},
    { DPNSS_FAC_LST_CODE,           "Facility list code"},
    { DPNSS_NO_OF_FUR_TRANS,        "Number of Further Transits"},
    { DPNSS_NO_OF_FUR_ALT_R,        "Number of Further Alternative routes"},
    { DPNSS_INT_CAP_LEV,            "Intrusion Capability level"},
    { DPNSS_NESTING_LEVEL,          "Nesting level"},
    { DPNSS_C_PARTY_ADDR,           "C Party Address"},
    { DPNSS_B_PARTY_ADDR,           "B Party Address"},
    { DPNSS_SIC,                    "SIC"},
    { DPNSS_A_B_PARTY_ADDR,         "A/B Party Address"},
    { DPNSS_DIVERSION_TYPE,         "Diversion Type"},
    { DPNSS_NSI_IDENTIFIER,         "NSI Identifier"},
    { DPNSS_USER_DEFINED,           "User Defined"},
    { DPNSS_TEXT,                   "Text"},
    { DPNSS_CALL_INDEX,             "Call Index"},
    { DPNSS_PASSWORD,               "Password"},
    { DPNSS_CALL_DIR,               "Call Direction"},
    { DPNSS_DPNSS_ISDN_TYPE,        "DPNNS ISDN Type"},
    { DPNSS_HC_CLC,                 "HC CLC"},
    { DPNSS_ENHANCED_STR_ID,        "Enhanced String Identity"},
    { DPNSS_STRING_ID,              "String Identity"},
    { DPNSS_STRING_ID_LIST,         "String Identity List"},
    { DPNSS_TEXT_TYPE,              "Text Type"},
    { DPNSS_CHANNEL_STATUS,         "Channel Status"},
    { DPNSS_CHANNEL_NUMBER,         "Channel Number"},
    { DPNSS_BPL,                    "BPL"},
    { DPNSS_BCL,                    "BCL"},
    { DPNSS_DEVICE_INDEX,           "Device Index"},
    { DPNSS_CR_NO,                  "Call Reference Number"},
    { DPNSS_CALL_ID_LENGTH,         "Call Identity Length"},
    { DPNSS_STATE_OF_DEST,          "State of Destination"},
    { DPNSS_STATE_OF_DEST_QUAL,     "State of Destination Qualifier"},
    { DPNSS_REASON_FOR_REDIR,       "Reason For Redirection"},
    { DPNSS_CLEARING_CAUSE,         "Clearing Cause"},
    { DPNSS_RECONT_ADDR,            "Reconnect Address"},
    { DPNSS_STATE_OF_OPERATOR,      "State of Operator"},
    { DPNSS_NIGHT_SERVICE,          "Night Service"},
    { DPNSS_PBX_FLAG,               "PBX flag"},
    { DPNSS_NUMBER_OF_CALLS,        "Number of Calls"},
    { DPNSS_NUMBER_OF_SERVERS,      "Number of Servers"},
    { DPNSS_PRIORITY_LEVEL,         "Priority Level"},
    { DPNSS_LOCATION,               "Location"},
    { DPNSS_SUBADDRESS,             "Subaddress"},
    { DPNSS_ALARM_LEVEL,            "Alarm Level"},
    { DPNSS_STAFF_PRESENT,          "Staff Present"},
    { DPNSS_TIME_AND_DATE,          "Time and Date"},
    { DPNSS_SERVICES,               "Services"},
    { DPNSS_PBX_REFERENCE,          "PBX Reference"},
    { DPNSS_TRUNK_GROUP_REF_NUMBER, "Trunk Group reference Number"},
    { DPNSS_TRUNK_MEMBER_REF_NUMBER,"Trunk Member Reference Number"},
    { DPNSS_CONF_PARTY_INDEX,       "Conference Party Index"},
    { DPNSS_CONF_PARTY_DET,         "Conference Party Details"},
    { DPNSS_ACCOUNT_CODE,           "Account code"},
    { DPNSS_CONF_BRIDGE_ADDR,       "Conference Bridge Address"},
    { DPNSS_COST_QUALIFIER,         "Cost Qualifier"},
    { DPNSS_CURRENCY_INDICATION,    "Currency Indication"},
    { DPNSS_CURRENCY_UNITS,         "Currency Units"},
    { DPNSS_TIME_INTERVAL,          "Time Interval"},
    { DPNSS_UNITS,                  "Units"},
    { DPNSS_REMOTE_ADDRESS,         "Remote Address"},
    { DPNSS_TEST_INDEX,             "Test Index"},
    { DPNSS_TEST_RESULT,            "Test Result"},
    { DPNSS_TYPE_OF_ASSISTANCE,     "Type of assistance"},
    { DPNSS_REST_DOMAIN,            "Restriction Domain"},
    { DPNSS_GRP_PICK_UP_CODE,       "Group Pick-Up Code"},
    { DPNSS_PICK_UP_CALL_TYPE,      "Pick-Up call type"},
    { DPNSS_MALICIOUS_CALL_REF,     "Malicious call reference"},
    { DPNSS_TIMER_VALUE,            "Timer Value"},
    { DPNSS_BEARER_CAP,             "Bearer capability"},
    { DPNSS_ISDN_NUM_ATTR,          "ISDM number attribute"},
    { DPNSS_ISDN_DPNSS_SUBADDRESS,  "ISDN DPNNS Subaddress"},
    { DPNSS_ISDN_NUMBER_DIGITS,     "ISDN Number Digits"},
    { DPNSS_HIGH_LAYER_COMP,        "High Layer Compatibility"},
    { DPNSS_LOW_LAYER_COMP,         "Low layer Compatibility"},
    { DPNSS_PROGRESS_INDICATOR,     "Progress Indicator"},
    { DPNSS_VPN_ACCESS_REF_NUM,     "VPN Access reference Number"},
    { DPNSS_INDEX_NUMBER,           "Index Number"},
    { DPNSS_RESTRICTION_INDICATOR,  "Restriction Indicator"},
    { DPNSS_CAUSE,                  "Cause"},
    { 0,    NULL }
};

static void
dissect_dpnns_sup_str_par(tvbuff_t *tvb, proto_tree * tree, int par_type_num, int par_start_offset, int par_end_offset)
{

    int     par_len;
    gchar * par_data;

    par_len = par_end_offset - par_start_offset;
    if (par_len==0) {
        par_type_num = DPNSS_NONE;
    }
    switch (par_type_num) {
    case DPNSS_NONE:
        proto_tree_add_string(tree, hf_dpnss_parameter, tvb, par_start_offset, par_len, "None");
        break;

/* TODO: Use individual dissection of parameters if hf fields needed or in the case where
        special handling is needed for greater detail

    case DPNSS_SERV_MAR:
         * p 173
         * More than one Service Marking character can be
         * included in the Parameter, each being separated
         * by the IA5 character space (2/0).
         * If decoded use: dpnss_serv_mark_vals
         *
    case DPNSS_STATUS:
    case DPNSS_ROUTE_RES_CLASS:
    case DPNSS_CBR_GRP:
    case DPNSS_FAC_LST_CODE:
    case DPNSS_NO_OF_FUR_TRANS:
    case DPNSS_NO_OF_FUR_ALT_R:
    case DPNSS_INT_CAP_LEV:
    case DPNSS_NESTING_LEVEL:
    case DPNSS_C_PARTY_ADDR:
    case DPNSS_B_PARTY_ADDR:
    case DPNSS_SIC:
    */
    case DPNSS_A_B_PARTY_ADDR:
        proto_tree_add_item(tree, hf_dpnss_a_b_party_addr, tvb, par_start_offset, par_len, ENC_ASCII);
        break;

        /*
    case DPNSS_DIVERSION_TYPE:
    case DPNSS_NSI_IDENTIFIER:
    case DPNSS_USER_DEFINED:
    case DPNSS_TEXT:
    */
    case DPNSS_CALL_INDEX:
        proto_tree_add_item(tree, hf_dpnss_call_idx, tvb, par_start_offset, par_len, ENC_ASCII);
        break;
        /*

    case DPNSS_PASSWORD:
    case DPNSS_CALL_DIR:
    case DPNSS_DPNSS_ISDN_TYPE:
    case DPNSS_HC_CLC:
    case DPNSS_ENHANCED_STR_ID:
    case DPNSS_STRING_ID:
    case DPNSS_STRING_ID_LIST:
    case DPNSS_TEXT_TYPE:
    case DPNSS_CHANNEL_STATUS:
    case DPNSS_CHANNEL_NUMBER:
    case DPNSS_BPL:
    case DPNSS_BCL:
    case DPNSS_DEVICE_INDEX:
    case DPNSS_CR_NO:
    case DPNSS_CALL_ID_LENGTH:
    case DPNSS_STATE_OF_DEST:
    case DPNSS_STATE_OF_DEST_QUAL:
    case DPNSS_REASON_FOR_REDIR:
    case DPNSS_CLEARING_CAUSE:
    case DPNSS_RECONT_ADDR:
    case DPNSS_STATE_OF_OPERATOR:
    case DPNSS_NIGHT_SERVICE:
    case DPNSS_PBX_FLAG:
    case DPNSS_NUMBER_OF_CALLS:
    case DPNSS_NUMBER_OF_SERVERS:
    case DPNSS_PRIORITY_LEVEL:
    case DPNSS_LOCATION:
    case DPNSS_SUBADDRESS:
    case DPNSS_ALARM_LEVEL:
    case DPNSS_STAFF_PRESENT:
    case DPNSS_TIME_AND_DATE:
    case DPNSS_SERVICES:
         * More than one Service Marking character can be
         * included in the Parameter, each being separated
         * by the IA5 character space (2/0).
         * 1 = Call Offer not possible
         * 2 = Executive Intrusion not possible
         * 3 = Call Back When Free not possible
         * 4 = Call Back Messaging not possible (see Note)
         * 5 = Hold not possible
         * 6 = Call Back When Next Used not possible
    case DPNSS_PBX_REFERENCE:
    case DPNSS_TRUNK_GROUP_REF_NUMBER:
    case DPNSS_TRUNK_MEMBER_REF_NUMBER:
    case DPNSS_CONF_PARTY_INDEX:
    case DPNSS_CONF_PARTY_DET:
    case DPNSS_ACCOUNT_CODE:
    case DPNSS_CONF_BRIDGE_ADDR:
    case DPNSS_COST_QUALIFIER:
    case DPNSS_CURRENCY_INDICATION:
    case DPNSS_CURRENCY_UNITS:
    case DPNSS_TIME_INTERVAL:
    case DPNSS_UNITS:
    case DPNSS_REMOTE_ADDRESS:
    case DPNSS_TEST_INDEX:
    case DPNSS_TEST_RESULT:
    case DPNSS_TYPE_OF_ASSISTANCE:
    case DPNSS_REST_DOMAIN:
    case DPNSS_GRP_PICK_UP_CODE:
    case DPNSS_PICK_UP_CALL_TYPE:
    case DPNSS_MALICIOUS_CALL_REF:
    case DPNSS_TIMER_VALUE:
    case DPNSS_BEARER_CAP:
    case DPNSS_ISDN_NUM_ATTR:
    case DPNSS_ISDN_DPNSS_SUBADDRESS:
    case DPNSS_ISDN_NUMBER_DIGITS:
    case DPNSS_HIGH_LAYER_COMP:
    case DPNSS_LOW_LAYER_COMP:
    case DPNSS_PROGRESS_INDICATOR:
    case DPNSS_VPN_ACCESS_REF_NUM:
    case DPNSS_INDEX_NUMBER:
    case DPNSS_RESTRICTION_INDICATOR:
    case DPNSS_CAUSE:
*/
    default:
        par_data = tvb_format_text(wmem_packet_scope(), tvb,par_start_offset, par_len);
        /* Used to print all pars without any special handling */
        proto_tree_add_string_format(tree, hf_dpnss_parameter, tvb, par_start_offset, par_len, par_data, "Parameter %s: %s",
            val_to_str(par_type_num, dpnss_sup_serv_par_str_vals, "Unknown (%d)" ), par_data);
        break;
    }

}

/* 3.1 Supplementary Information Strings
 * A Supplementary Information String comprises a Supplementary
 * Information Identifier which may be followed by one or more
 * Parameters. A Supplementary Information String starts with the
 * IA5 character * and ends with the IA5 character #.
 *
 *  When the Supplementary Information String includes Parameters
 * these are separated from the identifier and each other by a *.
 * eg * Supplementary Information Identifier code #
 * or * Supplementary Information Identifier code * Parameter #
 * or * Supplementary Information Identifier code * Parameter * Parameter #
 * A Supplementary Information String shall be wholly contained
 * within one Selection or Indication Field (ie it shall not be
 * split between messages).
 *
 * 3.2 Supplementary Information String Identifier
 * The identifier comprises one or more IA5 numerals 0-9 which may
 * be followed by a single IA5 alpha-character suffix in the range A-Z.
 * The numerals of the identifier indicate the main function of the
 * Supplementary Information String, eg "39F" indicates "Diverting
 * on No Reply". "F" is the suffix.
 *
 * 3.5 Destination Address
 * The Destination Address comprises one or more IA5 numerals 0 to
 * 9, has no identifier code and is not prefixed by a * or
 * terminated by a #. The digits are always the last characters in
 * the Selection Block. The first Destination Address digit
 * immediately follows the # of the last Supplementary Information
 * String.
 */

static int
dissect_dpnss_sup_info_str(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset)
{
    proto_tree *sup_str_tree;
    gint        start_offset, hash_offset, tvb_end_offset, sup_inf_str_end_offset, str_no;
    gint        par_start_offset, par_end_offset, number_of_found_par;
    gint        sup_inf_str_len, par_type_num;
    guint       sup_str_num = 0;
    guint8      octet;
    gboolean    last_string = FALSE;
    gboolean    has_par;

    tvb_end_offset = tvb_reported_length(tvb);

    str_no = 1;
    while ((offset<tvb_end_offset)&&(last_string == FALSE)) {
        octet = tvb_get_guint8(tvb,offset);
        if (octet == '*') {
            /* Supplementary Information String */
            start_offset = offset;
            has_par = TRUE;
            number_of_found_par = 0;
            /* offset points to start of supplementary information string */
            offset++;
            hash_offset = tvb_find_guint8(tvb, offset, -1, '#');
            sup_str_tree = proto_tree_add_subtree_format(tree, tvb, start_offset, hash_offset-start_offset+1,
                                               ett_dpnss_sup_str, NULL, "Supplementary Information %u: %s",str_no,
                                               tvb_format_text(pinfo->pool, tvb,start_offset,hash_offset-start_offset+1));
            /* SUPPLEMENTARY INFORMATION STRING IDENTIFIER
             * Get the parameter number string and translate it to an index into the dpnns_sup_serv_set.
             * The number may have a trailing alpha character at the end.
             */
            sup_inf_str_end_offset = tvb_find_guint8(tvb, offset, hash_offset-offset, '*');
            if (sup_inf_str_end_offset==-1) {
                /* no parameters */
                has_par = FALSE;
                sup_inf_str_end_offset = hash_offset;
            }
            sup_inf_str_len = sup_inf_str_end_offset - offset;
            ws_strtou32(tvb_format_text(pinfo->pool, tvb, offset, sup_inf_str_len), NULL, &sup_str_num);
            if ((sup_str_num != 0) && (sup_str_num < array_length(dpnns_sup_serv_set))) {
                proto_tree_add_string(sup_str_tree, hf_dpnss_sup_str, tvb, offset, sup_inf_str_len,
                                    dpnns_sup_serv_set[sup_str_num].compact_name);
                offset = sup_inf_str_end_offset+1;
                /* Find parameter(s) */
                while (has_par) {
                    number_of_found_par++;
                    /* 1:st Parameter */
                    par_start_offset = offset;
                    par_end_offset = tvb_find_guint8(tvb, offset, -1, '*');
                    if (par_end_offset == -1) {
                        /* last parameter */
                        par_end_offset = hash_offset;
                        has_par = FALSE;
                    }
                    switch (number_of_found_par) {
                    case 1:
                        par_type_num = dpnns_sup_serv_set[sup_str_num].par1_num;
                        dissect_dpnns_sup_str_par(tvb,sup_str_tree, par_type_num, par_start_offset, par_end_offset);
                        break;
                    case 2:
                        par_type_num = dpnns_sup_serv_set[sup_str_num].par2_num;
                        dissect_dpnns_sup_str_par(tvb,sup_str_tree, par_type_num, par_start_offset, par_end_offset);
                        break;
                    case 3:
                        par_type_num = dpnns_sup_serv_set[sup_str_num].par3_num;
                        dissect_dpnns_sup_str_par(tvb,sup_str_tree, par_type_num, par_start_offset, par_end_offset);
                        break;
                    case 4:
                        par_type_num = dpnns_sup_serv_set[sup_str_num].par4_num;
                        dissect_dpnns_sup_str_par(tvb,sup_str_tree, par_type_num, par_start_offset, par_end_offset);
                        break;
                    default:
                        break;
                    }
                    /* More parameters ? */
                    offset = par_end_offset+1;

                }
            }
            offset = hash_offset+1;
            str_no++;
        } else {
            last_string = TRUE;
            proto_tree_add_item(tree, hf_dpnss_dest_addr, tvb, offset, -1, ENC_ASCII);
        }
    }
    return offset;
}


static int
dissect_dpnss_LbL_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
    proto_item *ind_field_item;
    proto_tree *sic_field_tree, *ind_field_tree;
    int         offset = 0;
    int         tvb_end_offset;
    guint8      octet;

    tvb_end_offset = tvb_reported_length(tvb);

    proto_tree_add_item(tree, hf_dpnss_LbL_msg_type, tvb, offset, 1, ENC_BIG_ENDIAN);
    octet = tvb_get_guint8(tvb,offset)&0x0f;
    offset++;
    col_add_fstr(pinfo->cinfo, COL_INFO, "%s ",
            val_to_str(octet, dpnss_LbL_msg_short_type_vals, "Unknown (%d)" ));
    if (tree) {
        switch (octet) {
        case DPNSS_LbL_MSG_LLM_C:
            /* 2.3.1 LINK-by-LINK Message (COMPLETE) - LLM(C)*/
        case DPNSS_LbL_MSG_LLM_I:
            /* 2.3.2 LINK-by-LINK Message (INCOMPLETE) - LLM(I) */
            /* Indication Field */
            ind_field_item = proto_tree_add_item(tree, hf_dpnss_indication_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
            ind_field_tree = proto_item_add_subtree(ind_field_item, ett_dpnss_ind_field);
            offset = dissect_dpnss_sup_info_str(tvb, pinfo, ind_field_tree, offset);
            break;
        case DPNSS_LbL_MSG_LLRM:
            /* 2.3.3 LINK-by-LINK REJECT Message - LLRM */
            /* Rejection Cause */
            proto_tree_add_item(tree, hf_dpnss_rejection_cause, tvb, offset, 1, ENC_BIG_ENDIAN);
            /* Indication Field (Optional) */
            if (tvb_end_offset>offset) {
                ind_field_item = proto_tree_add_item(tree, hf_dpnss_indication_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
                ind_field_tree = proto_item_add_subtree(ind_field_item, ett_dpnss_ind_field);
                offset = dissect_dpnss_sup_info_str(tvb, pinfo, ind_field_tree, offset);
            }
            break;
        case DPNSS_LbL_MSG_SM:
            /* 2.3.4 SWAP Message - SM */
            /* Service Indicator Code
             * Note: On data calls the SIC may comprise more than one octet.
             * The Service Indicator Code is coded in accordance with ANNEX 1.
             */
            sic_field_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_dpnss_sic_field, NULL, "Service Indicator Code");
            offset =dissect_dpnss_sic(tvb, pinfo, sic_field_tree, offset);
            /* Indication Field */
            ind_field_item = proto_tree_add_item(tree, hf_dpnss_indication_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
            ind_field_tree = proto_item_add_subtree(ind_field_item, ett_dpnss_ind_field);
            offset = dissect_dpnss_sup_info_str(tvb, pinfo, ind_field_tree, offset);
            break;
        case DPNSS_LbL_MSG_LMM:
            /* 2.3.5 LINK MAINTENANCE Message - LMM */
            /* Maintenance Action
             * respond to a request for,maintenance actions to be performed.
             * The Maintenance Action field identifies the action required or
             * the response being made. The Maintenance Action field is coded
             * as shown in ANNEX 6.
             */
            proto_tree_add_item(tree, hf_dpnss_maintenance_action, tvb, offset, 1, ENC_BIG_ENDIAN);
            offset++;
            /* Indication Field */
            ind_field_item = proto_tree_add_item(tree, hf_dpnss_indication_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
            ind_field_tree = proto_item_add_subtree(ind_field_item, ett_dpnss_ind_field);
            offset = dissect_dpnss_sup_info_str(tvb, pinfo, ind_field_tree, offset);
            break;
        case DPNSS_LbL_MSG_LMRM:
            /* 2.3.6 LINK MAINTENANCE REJECT Message - LMRM */
            proto_tree_add_item(tree, hf_dpnss_clearing_cause, tvb, offset, 1, ENC_BIG_ENDIAN);
            offset++;
            /* Indication Field */
            ind_field_item = proto_tree_add_item(tree, hf_dpnss_indication_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
            ind_field_tree = proto_item_add_subtree(ind_field_item, ett_dpnss_ind_field);
            offset = dissect_dpnss_sup_info_str(tvb, pinfo, ind_field_tree, offset);
            break;
        default:
            proto_tree_add_expert(tree, pinfo, &ei_dpnss_not_supported_yet, tvb, offset, -1);
            break;
        }
    }
    return offset;
}


static int
dissect_dpnss_e2e_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
    proto_item *sel_field_item, *ind_field_item;
    proto_tree *sel_field_tree, *sic_field_tree, *ind_field_tree;
    int         offset = 0;
    int         tvb_end_offset;
    guint8      octet;

    tvb_end_offset = tvb_reported_length(tvb);

    proto_tree_add_item(tree, hf_dpnss_e2e_msg_type, tvb, offset, 1, ENC_BIG_ENDIAN);
    octet = tvb_get_guint8(tvb,offset)&0x0f;
    offset++;
    col_add_fstr(pinfo->cinfo, COL_INFO, "%s ",
            val_to_str(octet, dpnss_e2e_msg_short_type_vals, "Unknown (%d)" ));
    if (tree) {
        switch (octet) {
        case DPNSS_E2E_MSG_EEM_C:
        /* 2.2.1 END-to-END Message (COMPLETE) - EEM(C) */
        case DPNSS_E2E_MSG_EEM_I:
            /* Fall trough */
            /* Indication Field */
            ind_field_item = proto_tree_add_item(tree, hf_dpnss_indication_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
            ind_field_tree = proto_item_add_subtree(ind_field_item, ett_dpnss_ind_field);
            offset = dissect_dpnss_sup_info_str(tvb, pinfo, ind_field_tree, offset);
            break;
        case DPNSS_E2E_MSG_SCRM:
            /* 2.2.3 SINGLE-CHANNEL CLEAR REQUEST Message - SCRM */
        case DPNSS_E2E_MSG_SCIM:
            /* 2.2.4 SINGLE-CHANNEL CLEAR INDICATION Message - SCIM */
            /* Clearing Cause */
            proto_tree_add_item(tree, hf_dpnss_clearing_cause, tvb, offset, 1, ENC_BIG_ENDIAN);
            offset++;
            /* Indication Field (Optional) */
            if (tvb_end_offset>offset) {
                ind_field_item = proto_tree_add_item(tree, hf_dpnss_indication_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
                ind_field_tree = proto_item_add_subtree(ind_field_item, ett_dpnss_ind_field);
                offset = dissect_dpnss_sup_info_str(tvb, pinfo, ind_field_tree, offset);
            }
            break;
        case DPNSS_E2E_MSG_ERM_C:
            /* 2.2.5 END-to-END RECALL Message (COMPLETE) - ERM(C) */
        case DPNSS_E2E_MSG_ERM_I:
            /* 2.2.6 END-to-END RECALL Message (INCOMPLETE) - ERM(I) */
            /* Service Indicator Code
             * Note: On data calls the SIC may comprise more than one octet.
             * The Service Indicator Code is coded in accordance with ANNEX 1.
             */
            sic_field_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_dpnss_sic_field, NULL, "Service Indicator Code");
            offset =dissect_dpnss_sic(tvb, pinfo, sic_field_tree, offset);
            /*
             * Selection Field
             * The Selection Field contains the selection information relating
             * to a call set-up or Supplementary Service Request, and is
             * structured as shown in Subsection 3.
             */
            sel_field_item = proto_tree_add_item(tree, hf_dpnss_selection_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
            sel_field_tree = proto_item_add_subtree(sel_field_item, ett_dpnss_sel_field);
            offset = dissect_dpnss_sup_info_str(tvb, pinfo, sel_field_tree, offset);
            break;
        case DPNSS_E2E_MSG_NSIM:
            /* 2.2.7 NON SPECIFIED INFORMATION Message - NSIM */
            /* Usage Identifier Oct 1 -
             * coding of the Usage Identifier, as described in section 49.
             * The use of NSIMs is described in greater detail in SECTION 49.
             * BIT  8       7 6 5 4 3          2 1
             *     ext | Manufacturer code | subcode
             */
            octet = tvb_get_guint8(tvb,offset);
            proto_tree_add_item(tree, hf_dpnss_ext_bit, tvb, offset, 1, ENC_BIG_ENDIAN);
            proto_tree_add_item(tree, hf_dpnss_man_code, tvb, offset, 1, ENC_BIG_ENDIAN);
            proto_tree_add_item(tree, hf_dpnss_subcode, tvb, offset, 1, ENC_BIG_ENDIAN);
            offset++;
            if ((octet&0x80)==0x80) {
                /* Extension bit set */
                offset++;
            }
            /* User Information oct 2 + n
             */
            proto_tree_add_item(tree, hf_dpnss_user_information, tvb, offset, -1, ENC_NA);
            break;
        default:
            proto_tree_add_expert(tree, pinfo, &ei_dpnss_not_supported_yet, tvb, offset, -1);
            break;
        }
    }
    return offset;
}

static int
dissect_dpnss_cc_msg(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
    proto_item *sel_field_item, *ind_field_item;
    proto_tree *sel_field_tree, *sic_field_tree, *ind_field_tree;
    int         offset = 0;
    int         tvb_end_offset;
    guint8      octet;

    tvb_end_offset = tvb_reported_length(tvb);
    proto_tree_add_item(tree, hf_dpnss_cc_msg_type, tvb, offset, 1, ENC_BIG_ENDIAN);
    octet = tvb_get_guint8(tvb,offset)&0x0f;
    offset++;
    col_add_fstr(pinfo->cinfo, COL_INFO, "%s ",
            val_to_str(octet, dpnss_cc_msg_short_type_vals, "Unknown (%d)" ));

    if (tree) {
        switch (octet) {
        case DPNSS_CC_MSG_ISRM_C:
            /* 2.1.1 INITIAL SERVICE REQUEST Message (COMPLETE) - ISRM (C) */
            /* fall trough */
        case DPNSS_CC_MSG_ISRM_I:
            /* 2.1.2 INITIAL SERVICE REQUEST Message (INCOMPLETE) - ISRM(I) */
        case DPNSS_CC_MSG_RM_C:
            /* 2.1.3 RECALL Message (COMPLETE) - RM(C) */
            /* fall trough */
        case DPNSS_CC_MSG_RM_I:
            /* 2.1.4 RECALL Message (INCOMPLETE) - RM(I)*/
            /* fall trough */
            /* Service Indicator Code
             * Note: On data calls the SIC may comprise more than one octet.
             * The Service Indicator Code is coded in accordance with ANNEX 1.
             */
            sic_field_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_dpnss_sic_field, NULL, "Service Indicator Code");
            offset =dissect_dpnss_sic(tvb, pinfo, sic_field_tree, offset);
            /*
             * Selection Field
             * The Selection Field contains the selection information relating
             * to a call set-up or Supplementary Service Request, and is
             * structured as shown in Subsection 3.
             */
            sel_field_item = proto_tree_add_item(tree, hf_dpnss_selection_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
            sel_field_tree = proto_item_add_subtree(sel_field_item, ett_dpnss_sel_field);
            offset = dissect_dpnss_sup_info_str(tvb, pinfo, sel_field_tree, offset);
            break;
        case DPNSS_CC_MSG_CCM:
            /* 2.1.5 CALL CONNECTED Message - CCM */
            if (tvb_end_offset>offset) {
                /* Indication Field (Optional) */
                ind_field_item = proto_tree_add_item(tree, hf_dpnss_indication_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
                ind_field_tree = proto_item_add_subtree(ind_field_item, ett_dpnss_ind_field);
                offset = dissect_dpnss_sup_info_str(tvb, pinfo, ind_field_tree, offset);
            }
            break;
        case DPNSS_CC_MSG_NIM:
            /* 2.1.6 NETWORK INDICATION Message - NIM */
            /* fall trough */
        case DPNSS_CC_MSG_NAM:
            /* 2.1.9 NUMBER ACKNOWLEDGE Message - NAM */
            /* Indication Field */
            ind_field_item = proto_tree_add_item(tree, hf_dpnss_indication_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
            ind_field_tree = proto_item_add_subtree(ind_field_item, ett_dpnss_ind_field);
            offset = dissect_dpnss_sup_info_str(tvb, pinfo, ind_field_tree, offset);
            break;
        case DPNSS_CC_MSG_CRM:
            /* 2.1.7 CLEAR REQUEST Message - CRM */
            /* 2.1.8 CLEAR INDICATION Message - CIM */
            /* Clearing Cause */
            proto_tree_add_item(tree, hf_dpnss_clearing_cause, tvb, offset, 1, ENC_BIG_ENDIAN);
            offset++;
            /* Indication Field (Optional) */
            if (tvb_end_offset>offset) {
                ind_field_item = proto_tree_add_item(tree, hf_dpnss_indication_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
                ind_field_tree = proto_item_add_subtree(ind_field_item, ett_dpnss_ind_field);
                offset = dissect_dpnss_sup_info_str(tvb, pinfo, ind_field_tree, offset);
            }
            break;
        case DPNSS_CC_MSG_RRM:
            /* 2.1.10 RECALL REJECTION Message - RRM */
            /* Rejection Cause */
            proto_tree_add_item(tree, hf_dpnss_rejection_cause, tvb, offset, 1, ENC_BIG_ENDIAN);
            /* Indication Field (Optional) */
            if (tvb_end_offset>offset) {
                ind_field_item = proto_tree_add_item(tree, hf_dpnss_indication_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
                ind_field_tree = proto_item_add_subtree(ind_field_item, ett_dpnss_ind_field);
                offset = dissect_dpnss_sup_info_str(tvb, pinfo, ind_field_tree, offset);
            }
            break;
        case DPNSS_CC_MSG_SSRM_I:
            /* 2.1.11 SUBSEQUENT SERVICE REQUEST Message (INCOMPLETE) - SSRM(I) */
            /* Selection Field */
            sel_field_item = proto_tree_add_item(tree, hf_dpnss_selection_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
            sel_field_tree = proto_item_add_subtree(sel_field_item, ett_dpnss_sel_field);
            offset = dissect_dpnss_sup_info_str(tvb, pinfo, sel_field_tree, offset);
            break;
        case DPNSS_CC_MSG_SSRM_C:
            /* 2.1.12 SUBSEQUENT SERVICE REQUEST Message (COMPLETE) - SSRM(C) */
            /* Selection Field (Optional) */
            if (tvb_end_offset>offset) {
                sel_field_item = proto_tree_add_item(tree, hf_dpnss_selection_field, tvb, offset, -1, ENC_NA|ENC_ASCII);
                sel_field_tree = proto_item_add_subtree(sel_field_item, ett_dpnss_sel_field);
                offset = dissect_dpnss_sup_info_str(tvb, pinfo, sel_field_tree, offset);
            }
            break;
        case DPNSS_CC_MSG_CS:
        case DPNSS_CC_MSG_CA:
            /* DASS2 ?*/
        default:
            proto_tree_add_expert_format(tree, pinfo, &ei_dpnss_not_supported_yet, tvb, offset, -1, "Unknown or Dissection of this message not supported yet");
            break;
        }
    }
    return offset;
}
/* Code to actually dissect the packets */
static int
dissect_dpnss(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
{
    int         offset = 0;
    proto_item *item, *group_item;
    proto_tree *dpnss_tree;
    guint8      octet;

/* Make entries in Protocol column and Info column on summary display */
    col_set_str(pinfo->cinfo, COL_PROTOCOL, "DPNSS");

    item = proto_tree_add_item(tree, proto_dpnss, tvb, 0, -1, ENC_NA);
    dpnss_tree = proto_item_add_subtree(item, ett_dpnss);
    group_item = proto_tree_add_item(dpnss_tree, hf_dpnss_msg_grp_id, tvb, offset, 1, ENC_BIG_ENDIAN);
    octet = tvb_get_guint8(tvb,offset)>>4;
    switch (octet) {
    case DPNNS_MESSAGE_GROUP_CC:
        /* Call Control Message Group */
        dissect_dpnss_cc_msg(tvb, pinfo, dpnss_tree);
        break;
    case DPNNS_MESSAGE_GROUP_E2E:
        /* End-to-End Message Group */
        dissect_dpnss_e2e_msg(tvb, pinfo, dpnss_tree);
        break;
    case DPNNS_MESSAGE_GROUP_LbL:
        /* Link-by-Link Message Group */
        dissect_dpnss_LbL_msg(tvb, pinfo, dpnss_tree);
        break;
    default:
        expert_add_info(pinfo, group_item, &ei_dpnss_msg_grp_id);
        break;
    }
    return tvb_captured_length(tvb);
}

void
proto_register_dpnss(void)
{
/* Setup list of header fields  See Section 1.6.1 for details*/
    static hf_register_info hf[] = {
        { &hf_dpnss_msg_grp_id,
            { "Message Group Identifier",           "dpnss.msg_grp_id",
            FT_UINT8, BASE_DEC, VALS(dpnss_msg_grp_id_vals), 0xf0,
            NULL, HFILL }
        },
        { &hf_dpnss_cc_msg_type,
            { "Call Control Message Type",           "dpnss.cc_msg_type",
            FT_UINT8, BASE_DEC, VALS(dpnss_cc_msg_type_vals), 0x0f,
            NULL, HFILL }
        },
        { &hf_dpnss_e2e_msg_type,
            { "END-TO-END Message Type",           "dpnss.e2e_msg_type",
            FT_UINT8, BASE_DEC, VALS(dpnss_e2e_msg_type_vals), 0x0f,
            NULL, HFILL }
        },
        { &hf_dpnss_LbL_msg_type,
            { "LINK-BY-LINK Message Type",           "dpnss.lbl_msg_type",
            FT_UINT8, BASE_DEC, VALS(dpnss_LbL_msg_type_vals), 0x0f,
            NULL, HFILL }
        },
        { &hf_dpnss_ext_bit,
            { "Extension bit",           "dpnss.ext_bit",
            FT_BOOLEAN, 8, TFS(&dpnss_ext_bit_vals), 0x80,
            NULL, HFILL }
        },
        { &hf_dpnss_ext_bit_notall,
            { "Extension bit",           "dpnss.ext_bit_notall",
            FT_BOOLEAN, 8, TFS(&dpnss_ext_bit_no_ext_vals), 0x80,
            NULL, HFILL }
        },
        { &hf_dpnss_sic_type,
            { "Type of data",           "dpnss.sic_type",
            FT_UINT8, BASE_DEC, VALS(dpnss_sic_type_type_vals), 0x70,
            NULL, HFILL }
        },
        { &hf_dpnss_sic_details_for_speech,
            { "Details for Speech",           "dpnss.sic_details_for_speech",
            FT_UINT8, BASE_DEC, VALS(dpnss_sic_details_for_speech_vals), 0x0f,
            NULL, HFILL }
        },
        { &hf_dpnss_sic_details_for_data1,
            { "Data Rates",           "dpnss.sic_details_for_data1",
            FT_UINT8, BASE_DEC, VALS(dpnss_sic_details_for_data_rates1_vals), 0x0f,
            "Type of Data (010) : Data Rates", HFILL }
        },
        { &hf_dpnss_sic_details_for_data2,
            { "Data Rates",           "dpnss.sic_details_data2",
            FT_UINT8, BASE_DEC, VALS(dpnss_sic_details_for_data_rates2_vals), 0x0f,
            "Type of Data (011) : Data Rates", HFILL }
        },
        { &hf_dpnss_dest_addr,
            { "Destination Address",           "dpnss.dest_addr",
            FT_STRING, BASE_NONE, NULL, 0x0,
            NULL, HFILL }
        },
        { &hf_dpnss_sic_oct2_data_type,
            { "Data Type",           "dpnss.sic_oct2_data_type",
            FT_UINT8, BASE_DEC, VALS(dpnss_sic_oct2_data_type_vals), 0x03,
            NULL, HFILL }
        },
        { &hf_dpnss_sic_oct2_duplex,
            { "Data Type",           "dpnss.sic_oct2_duplex",
            FT_BOOLEAN, 8, TFS(&dpnss_duplex_vals), 0x08,
            NULL, HFILL }
        },
        { &hf_dpnss_sic_oct2_net_ind_clk,
            { "Network Independent Clock",           "dpnss.sic_oct2_net_ind_clk",
            FT_BOOLEAN, 8, TFS(&dpnss_sic_oct2_net_ind_clk_vals), 0x40,
            NULL, HFILL }
        },
        { &hf_dpnss_sic_oct2_sync_data_format,
            { "Data Format",           "dpnss.sic_oct2_sync_data_format",
            FT_BOOLEAN, 8, TFS(&dpnss_sic_oct2_sync_data_format_vals), 0x20,
            NULL, HFILL }
        },
        { &hf_dpnss_sic_oct2_sync_byte_timing,
            { "Byte Timing",           "dpnss.sic_oct2_sync_byte_timing",
            FT_BOOLEAN, 8, TFS(&dpnss_provided_vals), 0x10,
            NULL, HFILL }
        },
        { &hf_dpnss_sic_oct2_async_data,
            { "Data Format",           "dpnss.sic_oct2_async_data",
            FT_UINT8, BASE_DEC, VALS(dpnss_sic_oct2_async_data_type_vals), 0x30,
            NULL, HFILL }
        },
        { &hf_dpnss_sic_oct2_async_flow_ctrl,
            { "Flow Control",           "dpnss.sic_oct2_async_flow_ctrl",
            FT_BOOLEAN, 8, TFS(&dpnss_flow_control_vals), 0x40,
            NULL, HFILL }
        },
        { &hf_dpnss_clearing_cause,
            { "Clearing Cause",           "dpnss.clearing_cause",
            FT_UINT8, BASE_DEC, VALS(dpnss_clearing_cause_code_vals), 0x0,
            NULL, HFILL }
        },
        { &hf_dpnss_rejection_cause,
            { "Rejection Cause",           "dpnss.rejection_cause",
            FT_UINT8, BASE_DEC, VALS(dpnss_clearing_cause_code_vals), 0x0,
            NULL, HFILL }
        },
        { &hf_dpnss_man_code,
            { "Manufacturer Code",           "dpnss.man_code",
            FT_UINT8, BASE_DEC, VALS(dpnss_man_code_vals), 0x3c,
            NULL, HFILL }
        },
        { &hf_dpnss_subcode,
            { "Subcode",           "dpnss.subcode",
            FT_UINT8, BASE_DEC, NULL, 0x03,
            NULL, HFILL }
        },
        { &hf_dpnss_maintenance_action,
            { "Maintenance action",           "dpnss.maint_act",
            FT_UINT8, BASE_DEC, VALS(dpnss_maintenance_actions_vals), 0x0,
            NULL, HFILL }
        },
        { &hf_dpnss_a_b_party_addr,
            { "A/B party Address",           "dpnss.a_b_party_addr",
            FT_STRING, BASE_NONE, NULL, 0x0,
            NULL, HFILL }
        },
        { &hf_dpnss_call_idx,
            { "Call Index",           "dpnss.call_idx",
            FT_STRING, BASE_NONE, NULL, 0x0,
            NULL, HFILL }
        },

      /* Generated from convert_proto_tree_add_text.pl */
      { &hf_dpnss_indication_field, { "Indication Field", "dpnss.indication_field", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
      { &hf_dpnss_selection_field, { "Selection Field", "dpnss.selection_field", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
      { &hf_dpnss_user_information, { "User Information", "dpnss.user_information", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
      { &hf_dpnss_sup_str, { "Sup str", "dpnss.sup_str", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
      { &hf_dpnss_parameter, { "Parameter", "dpnss.parameter", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},

    };

/* Setup protocol subtree array */
    static gint *ett[] = {
        &ett_dpnss,
        &ett_dpnss_sel_field,
        &ett_dpnss_sic_field,
        &ett_dpnss_ind_field,
        &ett_dpnss_sup_str,
    };

    static ei_register_info ei[] = {
        { &ei_dpnss_not_supported_yet, { "dpnss.not_supported_yet", PI_UNDECODED, PI_WARN, "Dissection of this message not supported yet", EXPFILL }},
        { &ei_dpnss_msg_grp_id, { "dpnss.msg_grp_id.unknown", PI_PROTOCOL, PI_WARN, "Unknown Message Group", EXPFILL }},
    };

    expert_module_t* expert_dpnss;

/* Register the protocol name and description */
    proto_dpnss = proto_register_protocol("Digital Private Signalling System No 1","DPNSS", "dpnss");
    register_dissector("dpnss", dissect_dpnss, proto_dpnss);

/* Required function calls to register the header fields and subtrees used */
    proto_register_field_array(proto_dpnss, hf, array_length(hf));
    proto_register_subtree_array(ett, array_length(ett));
    expert_dpnss = expert_register_protocol(proto_dpnss);
    expert_register_field_array(expert_dpnss, ei, array_length(ei));

}

/*
 * Editor modelines  -  https://www.wireshark.org/tools/modelines.html
 *
 * Local variables:
 * c-basic-offset: 4
 * tab-width: 8
 * indent-tabs-mode: nil
 * End:
 *
 * vi: set shiftwidth=4 tabstop=8 expandtab:
 * :indentSize=4:tabSize=8:noTabs=true:
 */
