diff options
author | Darien Spencer <cusneud@mail.com> | 2018-08-17 10:41:59 +0300 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2018-08-17 13:00:51 +0000 |
commit | 46ea37d5923eab708c9239f4dcfbc6e623e62aa4 (patch) | |
tree | 718e79aac98479307bb0497d9d50ea171f2506f9 /epan/dissectors/packet-at.c | |
parent | 041c79b1d1bed8c3968b18ef7beaaa7d38837968 (diff) |
AT: Reorder commands dissection functions
Now in alphabetical order
Change-Id: I9c572e04e422cc595c66681ff77cd37a944383b9
Reviewed-on: https://code.wireshark.org/review/29171
Petri-Dish: Anders Broman <a.broman58@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-at.c')
-rw-r--r-- | epan/dissectors/packet-at.c | 479 |
1 files changed, 239 insertions, 240 deletions
diff --git a/epan/dissectors/packet-at.c b/epan/dissectors/packet-at.c index 8f528cc6cb..be6cc874f0 100644 --- a/epan/dissectors/packet-at.c +++ b/epan/dissectors/packet-at.c @@ -446,14 +446,13 @@ static gboolean check_chup(gint role, guint16 type) { return FALSE; } -static gboolean check_cimi(gint role, guint16 type) { - if (role == ROLE_DTE && (type == TYPE_ACTION_SIMPLY || type == TYPE_TEST)) return TRUE; +static gboolean check_ciev(gint role, guint16 type) { if (role == ROLE_DCE && type == TYPE_RESPONSE) return TRUE; return FALSE; } -static gboolean check_clcc(gint role, guint16 type) { +static gboolean check_cimi(gint role, guint16 type) { if (role == ROLE_DTE && (type == TYPE_ACTION_SIMPLY || type == TYPE_TEST)) return TRUE; if (role == ROLE_DCE && type == TYPE_RESPONSE) return TRUE; @@ -467,15 +466,21 @@ static gboolean check_cind(gint role, guint16 type) { return FALSE; } -static gboolean check_cmer(gint role, guint16 type) { +static gboolean check_clcc(gint role, guint16 type) { + if (role == ROLE_DTE && (type == TYPE_ACTION_SIMPLY || type == TYPE_TEST)) return TRUE; + if (role == ROLE_DCE && type == TYPE_RESPONSE) return TRUE; + + return FALSE; +} + +static gboolean check_clip(gint role, guint16 type) { if (role == ROLE_DTE && (type == TYPE_ACTION || type == TYPE_READ || type == TYPE_TEST)) return TRUE; if (role == ROLE_DCE && type == TYPE_RESPONSE) return TRUE; return FALSE; } -static gboolean check_cops(gint role, guint16 type) { - if (role == ROLE_DTE && (type == TYPE_ACTION || type == TYPE_READ)) return TRUE; +static gboolean check_cme(gint role, guint16 type) { if (role == ROLE_DCE && type == TYPE_RESPONSE) return TRUE; return FALSE; @@ -489,20 +494,22 @@ static gboolean check_cmee(gint role, guint16 type) { return FALSE; } -static gboolean check_cme(gint role, guint16 type) { +static gboolean check_cmer(gint role, guint16 type) { + if (role == ROLE_DTE && (type == TYPE_ACTION || type == TYPE_READ || type == TYPE_TEST)) return TRUE; if (role == ROLE_DCE && type == TYPE_RESPONSE) return TRUE; return FALSE; } -static gboolean check_clip(gint role, guint16 type) { - if (role == ROLE_DTE && (type == TYPE_ACTION || type == TYPE_READ || type == TYPE_TEST)) return TRUE; +static gboolean check_cnum(gint role, guint16 type) { + if (role == ROLE_DTE && type == TYPE_ACTION_SIMPLY) return TRUE; if (role == ROLE_DCE && type == TYPE_RESPONSE) return TRUE; return FALSE; } -static gboolean check_ciev(gint role, guint16 type) { +static gboolean check_cops(gint role, guint16 type) { + if (role == ROLE_DTE && (type == TYPE_ACTION || type == TYPE_READ)) return TRUE; if (role == ROLE_DCE && type == TYPE_RESPONSE) return TRUE; return FALSE; @@ -529,84 +536,6 @@ static gboolean check_vts(gint role, guint16 type) { return FALSE; } -static gboolean check_cnum(gint role, guint16 type) { - if (role == ROLE_DTE && type == TYPE_ACTION_SIMPLY) return TRUE; - if (role == ROLE_DCE && type == TYPE_RESPONSE) return TRUE; - - return FALSE; -} - -static gint -dissect_cind_parameter(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, - gint offset, gint role, guint16 type, guint8 *parameter_stream _U_, - guint parameter_number, gint parameter_length, void **data _U_) -{ - if (!check_cind(role, type)) return FALSE; - if (parameter_number > 19) return FALSE; - - proto_tree_add_item(tree, hf_indicator[parameter_number], tvb, offset, - parameter_length, ENC_NA | ENC_ASCII); - - return TRUE; -} - -static gint -dissect_chld_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - gint offset, gint role, guint16 type, guint8 *parameter_stream, - guint parameter_number, gint parameter_length, void **data _U_) -{ - guint32 value; - - if (!check_chld(role, type)) return FALSE; - - if (role == ROLE_DTE && type == TYPE_ACTION && parameter_number == 0) { - value = get_uint_parameter(parameter_stream, 1); - - if (parameter_length >= 2) { - if (tvb_get_guint8(tvb, offset + 1) == 'x') { - if (value == 1) - proto_tree_add_item(tree, hf_chld_mode_1x, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); - else if (value == 2) - proto_tree_add_item(tree, hf_chld_mode_2x, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); - } - - if (tvb_get_guint8(tvb, offset + 1) != 'x' || value > 4) { - proto_tree_add_expert(tree, pinfo, &ei_chld_mode, tvb, offset, parameter_length); - } - } - - proto_tree_add_uint(tree, hf_chld_mode, tvb, offset, parameter_length, value); - return TRUE; - } - - /* Type == Test */ - proto_tree_add_item(tree, hf_chld_supported_modes, tvb, offset, - parameter_length, ENC_NA | ENC_ASCII); - - return TRUE; -} - -static gint -dissect_cimi_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - gint offset, gint role, guint16 type, guint8 *parameter_stream _U_, - guint parameter_number, gint parameter_length, void **data _U_) -{ - proto_item *pitem; - - if (!check_cimi(role, type)) return FALSE; - - if (role == ROLE_DTE) return FALSE; - if (parameter_number > 0) return FALSE; - - /* Only parameter is found in the response from DCE - the IMSI */ - pitem = proto_tree_add_item(tree, hf_cimi_imsi, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); - /* Hiding the AT IMSI item because we are showing the detailed E.212 item */ - PROTO_ITEM_SET_HIDDEN(pitem); - dissect_e212_utf8_imsi(tvb, pinfo, tree, offset, parameter_length); - - return TRUE; -} - static gint dissect_ccwa_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset, gint role, guint16 type, guint8 *parameter_stream, @@ -741,159 +670,103 @@ dissect_cgmm_parameter(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, } static gint -dissect_cmer_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, +dissect_chld_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset, gint role, guint16 type, guint8 *parameter_stream, guint parameter_number, gint parameter_length, void **data _U_) { - proto_item *pitem; guint32 value; - if (!((role == ROLE_DTE && type == TYPE_ACTION))) { - return FALSE; - } + if (!check_chld(role, type)) return FALSE; - if (parameter_number > 4) return FALSE; + if (role == ROLE_DTE && type == TYPE_ACTION && parameter_number == 0) { + value = get_uint_parameter(parameter_stream, 1); - value = get_uint_parameter(parameter_stream, parameter_length); + if (parameter_length >= 2) { + if (tvb_get_guint8(tvb, offset + 1) == 'x') { + if (value == 1) + proto_tree_add_item(tree, hf_chld_mode_1x, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); + else if (value == 2) + proto_tree_add_item(tree, hf_chld_mode_2x, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); + } - switch (parameter_number) { - case 0: - pitem = proto_tree_add_uint(tree, hf_cmer_mode, tvb, offset, parameter_length, value); - if (value > 3) - expert_add_info(pinfo, pitem, &ei_cmer_mode); - break; - case 1: - pitem = proto_tree_add_uint(tree, hf_cmer_keyp, tvb, offset, parameter_length, value); - if (value > 2) - expert_add_info(pinfo, pitem, &ei_cmer_keyp); - break; - case 2: - pitem = proto_tree_add_uint(tree, hf_cmer_disp, tvb, offset, parameter_length, value); - if (value > 2) - expert_add_info(pinfo, pitem, &ei_cmer_disp); - break; - case 3: - pitem = proto_tree_add_uint(tree, hf_cmer_ind, tvb, offset, parameter_length, value); - if (value > 2) - expert_add_info(pinfo, pitem, &ei_cmer_ind); - break; - case 4: - pitem = proto_tree_add_uint(tree, hf_cmer_bfr, tvb, offset, parameter_length, value); - if (value > 1) - expert_add_info(pinfo, pitem, &ei_cmer_bfr); - break; + if (tvb_get_guint8(tvb, offset + 1) != 'x' || value > 4) { + proto_tree_add_expert(tree, pinfo, &ei_chld_mode, tvb, offset, parameter_length); + } + } + + proto_tree_add_uint(tree, hf_chld_mode, tvb, offset, parameter_length, value); + return TRUE; } + /* Type == Test */ + proto_tree_add_item(tree, hf_chld_supported_modes, tvb, offset, + parameter_length, ENC_NA | ENC_ASCII); + return TRUE; } static gint -dissect_clip_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, +dissect_ciev_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset, gint role, guint16 type, guint8 *parameter_stream, - guint parameter_number, gint parameter_length, void **data _U_) + guint parameter_number, gint parameter_length, void **data) { - proto_item *pitem; guint32 value; + guint indicator_index; - if (!check_clip(role, type)) - return FALSE; - - if (role == ROLE_DTE && type == TYPE_ACTION && parameter_number > 1) - return FALSE; - else if (role == ROLE_DCE && parameter_number > 5) - return FALSE; + if (!(role == ROLE_DCE && type == TYPE_RESPONSE)) return TRUE; + if (parameter_number > 1) return FALSE; - if (role == ROLE_DTE && type == TYPE_ACTION) switch (parameter_number) { - case 0: - value = get_uint_parameter(parameter_stream, parameter_length); - proto_tree_add_uint(tree, hf_clip_mode, tvb, offset, parameter_length, value); - break; - case 1: - value = get_uint_parameter(parameter_stream, parameter_length); - proto_tree_add_uint(tree, hf_clip_status, tvb, offset, parameter_length, value); - break; - } else { - switch (parameter_number) { - case 0: - proto_tree_add_item(tree, hf_at_number, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); - break; - case 1: - value = get_uint_parameter(parameter_stream, parameter_length); - pitem = proto_tree_add_uint(tree, hf_at_type, tvb, offset, parameter_length, value); - if (value < 128 || value > 175) - expert_add_info(pinfo, pitem, &ei_at_type); - break; - case 2: - proto_tree_add_item(tree, hf_at_subaddress, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); - break; - case 3: - value = get_uint_parameter(parameter_stream, parameter_length); - proto_tree_add_uint(tree, hf_at_subaddress_type, tvb, offset, parameter_length, value); - break; - case 4: - proto_tree_add_item(tree, hf_at_alpha, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); - break; - case 5: - value = get_uint_parameter(parameter_stream, parameter_length); - proto_tree_add_uint(tree, hf_at_cli_validity, tvb, offset, parameter_length, value); - break; + switch (parameter_number) { + case 0: + value = get_uint_parameter(parameter_stream, parameter_length); + proto_tree_add_uint(tree, hf_ciev_indicator_index, tvb, offset, parameter_length, value); + *data = wmem_alloc(wmem_packet_scope(), sizeof(guint)); + *((guint *) *data) = value; + break; + case 1: + indicator_index = *((guint *) *data) - 1; + if (indicator_index > 19) { + proto_tree_add_expert(tree, pinfo, &ei_ciev_indicator, tvb, offset, parameter_length); + } else { + proto_tree_add_item(tree, hf_indicator[indicator_index], tvb, offset, parameter_length, ENC_NA | ENC_ASCII); } + break; } return TRUE; } static gint -dissect_cmee_parameter(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, - gint offset, gint role, guint16 type, guint8 *parameter_stream, +dissect_cimi_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + gint offset, gint role, guint16 type, guint8 *parameter_stream _U_, guint parameter_number, gint parameter_length, void **data _U_) { - guint32 value; + proto_item *pitem; - if (!(role == ROLE_DTE && type == TYPE_ACTION) && - !(role == ROLE_DCE && type == TYPE_RESPONSE)) { - return FALSE; - } + if (!check_cimi(role, type)) return FALSE; - if (parameter_number > 0) return FALSE; + if (role == ROLE_DTE) return FALSE; + if (parameter_number > 0) return FALSE; - value = get_uint_parameter(parameter_stream, parameter_length); - proto_tree_add_uint(tree, hf_cmee, tvb, offset, parameter_length, value); + /* Only parameter is found in the response from DCE - the IMSI */ + pitem = proto_tree_add_item(tree, hf_cimi_imsi, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); + /* Hiding the AT IMSI item because we are showing the detailed E.212 item */ + PROTO_ITEM_SET_HIDDEN(pitem); + dissect_e212_utf8_imsi(tvb, pinfo, tree, offset, parameter_length); - return TRUE; + return TRUE; } static gint -dissect_cops_parameter(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, - gint offset, gint role, guint16 type, guint8 *parameter_stream, +dissect_cind_parameter(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, + gint offset, gint role, guint16 type, guint8 *parameter_stream _U_, guint parameter_number, gint parameter_length, void **data _U_) { - guint32 value; - - if (!((role == ROLE_DTE && (type == TYPE_ACTION || type == TYPE_READ)) || - (role == ROLE_DCE && type == TYPE_RESPONSE))) { - return FALSE; - } - - if (parameter_number > 3) return FALSE; + if (!check_cind(role, type)) return FALSE; + if (parameter_number > 19) return FALSE; - switch (parameter_number) { - case 0: - value = get_uint_parameter(parameter_stream, parameter_length); - proto_tree_add_uint(tree, hf_cops_mode, tvb, offset, parameter_length, value); - break; - case 1: - value = get_uint_parameter(parameter_stream, parameter_length); - proto_tree_add_uint(tree, hf_cops_format, tvb, offset, parameter_length, value); - break; - case 2: - proto_tree_add_item(tree, hf_cops_operator, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); - break; - case 3: - value = get_uint_parameter(parameter_stream, parameter_length); - proto_tree_add_uint(tree, hf_cops_act, tvb, offset, parameter_length, value); - break; - } + proto_tree_add_item(tree, hf_indicator[parameter_number], tvb, offset, + parameter_length, ENC_NA | ENC_ASCII); return TRUE; } @@ -955,6 +828,61 @@ dissect_clcc_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, return TRUE; } +static gint +dissect_clip_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + gint offset, gint role, guint16 type, guint8 *parameter_stream, + guint parameter_number, gint parameter_length, void **data _U_) +{ + proto_item *pitem; + guint32 value; + + if (!check_clip(role, type)) + return FALSE; + + if (role == ROLE_DTE && type == TYPE_ACTION && parameter_number > 1) + return FALSE; + else if (role == ROLE_DCE && parameter_number > 5) + return FALSE; + + if (role == ROLE_DTE && type == TYPE_ACTION) switch (parameter_number) { + case 0: + value = get_uint_parameter(parameter_stream, parameter_length); + proto_tree_add_uint(tree, hf_clip_mode, tvb, offset, parameter_length, value); + break; + case 1: + value = get_uint_parameter(parameter_stream, parameter_length); + proto_tree_add_uint(tree, hf_clip_status, tvb, offset, parameter_length, value); + break; + } else { + switch (parameter_number) { + case 0: + proto_tree_add_item(tree, hf_at_number, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); + break; + case 1: + value = get_uint_parameter(parameter_stream, parameter_length); + pitem = proto_tree_add_uint(tree, hf_at_type, tvb, offset, parameter_length, value); + if (value < 128 || value > 175) + expert_add_info(pinfo, pitem, &ei_at_type); + break; + case 2: + proto_tree_add_item(tree, hf_at_subaddress, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); + break; + case 3: + value = get_uint_parameter(parameter_stream, parameter_length); + proto_tree_add_uint(tree, hf_at_subaddress_type, tvb, offset, parameter_length, value); + break; + case 4: + proto_tree_add_item(tree, hf_at_alpha, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); + break; + case 5: + value = get_uint_parameter(parameter_stream, parameter_length); + proto_tree_add_uint(tree, hf_at_cli_validity, tvb, offset, parameter_length, value); + break; + } + } + + return TRUE; +} static gint dissect_cme_error_parameter(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, @@ -988,6 +916,73 @@ dissect_cme_error_parameter(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t } static gint +dissect_cmee_parameter(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, + gint offset, gint role, guint16 type, guint8 *parameter_stream, + guint parameter_number, gint parameter_length, void **data _U_) +{ + guint32 value; + + if (!(role == ROLE_DTE && type == TYPE_ACTION) && + !(role == ROLE_DCE && type == TYPE_RESPONSE)) { + return FALSE; + } + + if (parameter_number > 0) return FALSE; + + value = get_uint_parameter(parameter_stream, parameter_length); + proto_tree_add_uint(tree, hf_cmee, tvb, offset, parameter_length, value); + + return TRUE; +} + +static gint +dissect_cmer_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + gint offset, gint role, guint16 type, guint8 *parameter_stream, + guint parameter_number, gint parameter_length, void **data _U_) +{ + proto_item *pitem; + guint32 value; + + if (!((role == ROLE_DTE && type == TYPE_ACTION))) { + return FALSE; + } + + if (parameter_number > 4) return FALSE; + + value = get_uint_parameter(parameter_stream, parameter_length); + + switch (parameter_number) { + case 0: + pitem = proto_tree_add_uint(tree, hf_cmer_mode, tvb, offset, parameter_length, value); + if (value > 3) + expert_add_info(pinfo, pitem, &ei_cmer_mode); + break; + case 1: + pitem = proto_tree_add_uint(tree, hf_cmer_keyp, tvb, offset, parameter_length, value); + if (value > 2) + expert_add_info(pinfo, pitem, &ei_cmer_keyp); + break; + case 2: + pitem = proto_tree_add_uint(tree, hf_cmer_disp, tvb, offset, parameter_length, value); + if (value > 2) + expert_add_info(pinfo, pitem, &ei_cmer_disp); + break; + case 3: + pitem = proto_tree_add_uint(tree, hf_cmer_ind, tvb, offset, parameter_length, value); + if (value > 2) + expert_add_info(pinfo, pitem, &ei_cmer_ind); + break; + case 4: + pitem = proto_tree_add_uint(tree, hf_cmer_bfr, tvb, offset, parameter_length, value); + if (value > 1) + expert_add_info(pinfo, pitem, &ei_cmer_bfr); + break; + } + + return TRUE; +} + +static gint dissect_cnum_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset, gint role, guint16 type, guint8 *parameter_stream, guint parameter_number, gint parameter_length, void **data _U_) @@ -1033,56 +1028,34 @@ dissect_cnum_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, } static gint -dissect_vts_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, +dissect_cops_parameter(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, gint offset, gint role, guint16 type, guint8 *parameter_stream, guint parameter_number, gint parameter_length, void **data _U_) { - proto_item *pitem; guint32 value; - if (!(role == ROLE_DTE && type == TYPE_ACTION)) return TRUE; - if (parameter_number > 1) return FALSE; - - switch (parameter_number) { - case 0: - pitem = proto_tree_add_item(tree, hf_vts_dtmf, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); - if (parameter_length != 1) - expert_add_info(pinfo, pitem, &ei_vts_dtmf); - break; - case 1: - value = get_uint_parameter(parameter_stream, parameter_length); - proto_tree_add_uint(tree, hf_vts_duration, tvb, offset, parameter_length, value); - break; + if (!((role == ROLE_DTE && (type == TYPE_ACTION || type == TYPE_READ)) || + (role == ROLE_DCE && type == TYPE_RESPONSE))) { + return FALSE; } - return TRUE; -} - -static gint -dissect_ciev_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, - gint offset, gint role, guint16 type, guint8 *parameter_stream, - guint parameter_number, gint parameter_length, void **data) -{ - guint32 value; - guint indicator_index; - - if (!(role == ROLE_DCE && type == TYPE_RESPONSE)) return TRUE; - if (parameter_number > 1) return FALSE; + if (parameter_number > 3) return FALSE; switch (parameter_number) { case 0: value = get_uint_parameter(parameter_stream, parameter_length); - proto_tree_add_uint(tree, hf_ciev_indicator_index, tvb, offset, parameter_length, value); - *data = wmem_alloc(wmem_packet_scope(), sizeof(guint)); - *((guint *) *data) = value; + proto_tree_add_uint(tree, hf_cops_mode, tvb, offset, parameter_length, value); break; case 1: - indicator_index = *((guint *) *data) - 1; - if (indicator_index > 19) { - proto_tree_add_expert(tree, pinfo, &ei_ciev_indicator, tvb, offset, parameter_length); - } else { - proto_tree_add_item(tree, hf_indicator[indicator_index], tvb, offset, parameter_length, ENC_NA | ENC_ASCII); - } + value = get_uint_parameter(parameter_stream, parameter_length); + proto_tree_add_uint(tree, hf_cops_format, tvb, offset, parameter_length, value); + break; + case 2: + proto_tree_add_item(tree, hf_cops_operator, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); + break; + case 3: + value = get_uint_parameter(parameter_stream, parameter_length); + proto_tree_add_uint(tree, hf_cops_act, tvb, offset, parameter_length, value); break; } @@ -1214,6 +1187,32 @@ dissect_csim_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, } static gint +dissect_vts_parameter(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + gint offset, gint role, guint16 type, guint8 *parameter_stream, + guint parameter_number, gint parameter_length, void **data _U_) +{ + proto_item *pitem; + guint32 value; + + if (!(role == ROLE_DTE && type == TYPE_ACTION)) return TRUE; + if (parameter_number > 1) return FALSE; + + switch (parameter_number) { + case 0: + pitem = proto_tree_add_item(tree, hf_vts_dtmf, tvb, offset, parameter_length, ENC_NA | ENC_ASCII); + if (parameter_length != 1) + expert_add_info(pinfo, pitem, &ei_vts_dtmf); + break; + case 1: + value = get_uint_parameter(parameter_stream, parameter_length); + proto_tree_add_uint(tree, hf_vts_duration, tvb, offset, parameter_length, value); + break; + } + + return TRUE; +} + +static gint dissect_no_parameter(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_tree *tree _U_, gint offset _U_, gint role _U_, guint16 type _U_, guint8 *parameter_stream _U_, guint parameter_number _U_, gint parameter_length _U_, void **data _U_) |