diff options
author | Anders Broman <anders.broman@ericsson.com> | 2007-04-23 21:26:27 +0000 |
---|---|---|
committer | Anders Broman <anders.broman@ericsson.com> | 2007-04-23 21:26:27 +0000 |
commit | c0dc340d5d35e53f9d0db1e02e70551b64c649a7 (patch) | |
tree | 44371952c073b077c46e1289b24952371b4356fd /epan | |
parent | d6fc852779ce0014dd5323d41eea8be3ba0909a7 (diff) |
From Florent DROUIN:
I have made some changes to the final patch to have the operation code decoded
as ForwardSM. A change for TCAP is included too, to be sure that the
application context is not overwritten by the User Info OID (this was the case,
when a MAP open dialog was included in the request).
Fix bug:
http://bugs.wireshark.org/bugzilla/show_bug.cgi?id=1498
svn path=/trunk/; revision=21543
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-gsm_map.c | 76 | ||||
-rw-r--r-- | epan/dissectors/packet-tcap.c | 33 |
2 files changed, 77 insertions, 32 deletions
diff --git a/epan/dissectors/packet-gsm_map.c b/epan/dissectors/packet-gsm_map.c index dbb74c5131..5473100aee 100644 --- a/epan/dissectors/packet-gsm_map.c +++ b/epan/dissectors/packet-gsm_map.c @@ -1356,6 +1356,7 @@ static gint ett_gsm_map_Sm_RP_OA = -1; static gint ett_gsm_map_Sm_RP_DA = -1; static gint ett_gsm_map_Mt_forwardSM_Arg = -1; static gint ett_gsm_map_Mt_forwardSM_Res = -1; +static gint ett_gsm_map_ForwardSM_Arg = -1; static gint ett_gsm_map_ReportSM_DeliveryStatusArg = -1; static gint ett_gsm_map_ReportSM_DeliveryStatusRes = -1; static gint ett_gsm_map_InformServiceCentreArg = -1; @@ -1554,6 +1555,7 @@ static int gsm_map_tap = -1; static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset); static int dissect_returnResultData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset); static int dissect_returnErrorData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset); +const gchar* gsm_map_opr_code(guint32 val); /* Value strings */ @@ -2058,7 +2060,7 @@ dissect_gsm_map_GSMMAPOperationLocalvalue(gboolean implicit_tag _U_, tvbuff_t *t &opcode); if (check_col(pinfo->cinfo, COL_INFO)){ - col_append_fstr(pinfo->cinfo, COL_INFO, val_to_str(opcode, gsm_map_opr_code_strings, "Unknown GSM-MAP (%u)")); + col_append_fstr(pinfo->cinfo, COL_INFO, gsm_map_opr_code(opcode)); } @@ -11927,6 +11929,23 @@ dissect_gsm_map_Mt_forwardSM_Res(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, i } +static const ber_sequence_t ForwardSM_Arg_sequence[] = { + { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_sm_RP_DA }, + { BER_CLASS_ANY/*choice*/, -1/*choice*/, BER_FLAGS_NOOWNTAG|BER_FLAGS_NOTCHKTAG, dissect_sm_RP_OA }, + { BER_CLASS_UNI, BER_UNI_TAG_OCTETSTRING, BER_FLAGS_NOOWNTAG, dissect_sm_RP_UI }, + { BER_CLASS_UNI, BER_UNI_TAG_NULL, BER_FLAGS_OPTIONAL|BER_FLAGS_NOOWNTAG, dissect_moreMessagesToSend }, + { 0, 0, 0, NULL } +}; + +static int +dissect_gsm_map_ForwardSM_Arg(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) { + offset = dissect_ber_sequence(implicit_tag, pinfo, tree, tvb, offset, + ForwardSM_Arg_sequence, hf_index, ett_gsm_map_ForwardSM_Arg); + + return offset; +} + + static const value_string gsm_map_Sm_DeliveryOutcome_vals[] = { { 0, "memoryCapacityExceeded" }, { 1, "absentSubscriber" }, @@ -15652,8 +15671,15 @@ static void dissect_Component_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, pro /*--- End of included file: packet-gsm_map-fn.c ---*/ -#line 558 "packet-gsm_map-template.c" +#line 559 "packet-gsm_map-template.c" +/* Specific translation for MAP V3 */ +const value_string gsm_map_V3_opr_code_strings[] = { + { 44, "mt-forwardSM" }, + { 46, "mo-forwardSM" }, + { 0, NULL } +}; +/* Generic translation for MAP operation */ const value_string gsm_map_opr_code_strings[] = { { 2, "updateLocation" }, { 3, "cancelLocation" }, @@ -15694,9 +15720,9 @@ const value_string gsm_map_opr_code_strings[] = { { 41, "processGroupCallSignalling" }, { 42, "forwardGroupCallSignalling" }, { 43, "checkIMEI" }, - { 44, "mt-forwardSM" }, + { 44, "forwardSM" }, { 45, "sendRoutingInfoForSM" }, - { 46, "mo-forwardSM" }, + { 46, "forwardSM" }, { 47, "reportSM-DeliveryStatus" }, { 48, "noteSubscriberPresent" }, /* map-ac mwdMngt (24) version1 (1) */ { 49, "alertServiceCentreWithoutResult" }, /* map-ac shortMsgAlert (23) version1 (1) */ @@ -15853,6 +15879,24 @@ static const true_false_string gsm_map_Ss_Status_a_values = { "not Active" }; +/* + * Translate the MAP operation code value to a text string + * Take into account the MAP version for ForwardSM + */ +const gchar* gsm_map_opr_code(guint32 val) { + switch (val) { + case 44: /*mt-forwardSM*/ + case 46: /*mo-forwardSM*/ + if (application_context_version == 3) { + return val_to_str(val, gsm_map_V3_opr_code_strings, "Unknown GSM-MAP (%%u)"); + } + /* Else use the default map operation translation */ + default: + return val_to_str(val, gsm_map_opr_code_strings, "Unknown GSM-MAP (%%u)"); + break; + } +} + /* Prototype for a decoding function */ typedef int (* dissect_function_t)( gboolean, tvbuff_t *, @@ -16059,14 +16103,22 @@ static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv FALSE, dissect_gsm_map_CheckIMEIArgV3, -1, TRUE , NULL, -1); /* no [3] SEQUENCE */ break; - case 44: /*mt-forwardSM*/ - offset=dissect_gsm_map_Mt_forwardSM_Arg(FALSE, tvb, offset, pinfo, tree, -1); + case 44: /*mt-forwardSM(v3) or ForwardSM(v1/v2)*/ + if (application_context_version == 3) + offset=dissect_gsm_map_Mt_forwardSM_Arg(FALSE, tvb, offset, pinfo, tree, -1); + else { + offset=dissect_gsm_map_ForwardSM_Arg(FALSE, tvb, offset, pinfo, tree, -1); + } break; case 45: /*sendRoutingInfoForSM*/ offset=dissect_gsm_map_RoutingInfoForSMArg(FALSE, tvb, offset, pinfo, tree, -1); break; - case 46: /*mo-forwardSM*/ - offset=dissect_gsm_map_Mo_forwardSM_Arg(FALSE, tvb, offset, pinfo, tree, -1); + case 46: /*mo-forwardSM(v3) or ForwardSM(v1/v2)*/ + if (application_context_version == 3) + offset=dissect_gsm_map_Mo_forwardSM_Arg(FALSE, tvb, offset, pinfo, tree, -1); + else { + offset=dissect_gsm_map_ForwardSM_Arg(FALSE, tvb, offset, pinfo, tree, -1); + } break; case 47: /*reportSM-DeliveryStatus*/ offset=dissect_gsm_map_ReportSM_DeliveryStatusArg(FALSE, tvb, offset, pinfo, tree, -1); @@ -16659,9 +16711,6 @@ dissect_gsm_map_GSMMAPPDU(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, return offset; } - - - static void dissect_gsm_map(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree) { @@ -21102,7 +21151,7 @@ void proto_register_gsm_map(void) { "", HFILL }}, /*--- End of included file: packet-gsm_map-hfarr.c ---*/ -#line 2247 "packet-gsm_map-template.c" +#line 2278 "packet-gsm_map-template.c" }; /* List of subtrees */ @@ -21381,6 +21430,7 @@ void proto_register_gsm_map(void) { &ett_gsm_map_Sm_RP_DA, &ett_gsm_map_Mt_forwardSM_Arg, &ett_gsm_map_Mt_forwardSM_Res, + &ett_gsm_map_ForwardSM_Arg, &ett_gsm_map_ReportSM_DeliveryStatusArg, &ett_gsm_map_ReportSM_DeliveryStatusRes, &ett_gsm_map_InformServiceCentreArg, @@ -21553,7 +21603,7 @@ void proto_register_gsm_map(void) { &ett_gsm_map_ExtensionContainer, /*--- End of included file: packet-gsm_map-ettarr.c ---*/ -#line 2269 "packet-gsm_map-template.c" +#line 2300 "packet-gsm_map-template.c" }; /* Register protocol */ diff --git a/epan/dissectors/packet-tcap.c b/epan/dissectors/packet-tcap.c index 6b5de322a5..317463815d 100644 --- a/epan/dissectors/packet-tcap.c +++ b/epan/dissectors/packet-tcap.c @@ -368,6 +368,7 @@ dissect_tcap_Applicationcontext(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, in + return offset; } static int dissect_application_context_name(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_t *tvb _U_, int offset _U_) { @@ -686,13 +687,7 @@ offset = dissect_ber_length(pinfo, tree, tvb, offset, &len, &ind_field); static int dissect_tcap_UserInfoOID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) { -#line 121 "tcap.cnf" - offset = dissect_ber_object_identifier_str(implicit_tag, pinfo, tree, tvb, offset, hf_index, &tcapext_oid); - - tcap_private.oid= (void*)tcapext_oid; - tcap_private.acv=TRUE; - - + offset = dissect_ber_object_identifier(implicit_tag, pinfo, tree, tvb, offset, hf_index, NULL); return offset; } @@ -704,7 +699,7 @@ static int dissect_useroid(packet_info *pinfo _U_, proto_tree *tree _U_, tvbuff_ static int dissect_tcap_ExternUserInfo(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) { -#line 126 "tcap.cnf" +#line 128 "tcap.cnf" dissect_tcap_TheExternUserInfo(implicit_tag, tvb, offset, pinfo, tree, hf_index); @@ -1367,7 +1362,7 @@ static int dissect_unidirectional_impl(packet_info *pinfo _U_, proto_tree *tree static int dissect_tcap_OrigTransactionID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) { -#line 157 "tcap.cnf" +#line 159 "tcap.cnf" tvbuff_t *parameter_tvb; guint8 len, i; proto_item *tid_item; @@ -1423,7 +1418,7 @@ static const ber_sequence_t Begin_sequence[] = { static int dissect_tcap_Begin(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) { -#line 230 "tcap.cnf" +#line 232 "tcap.cnf" gp_tcapsrt_info->ope=TC_BEGIN; if (check_col(pinfo->cinfo, COL_INFO)) @@ -1445,7 +1440,7 @@ static int dissect_begin_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbu static int dissect_tcap_DestTransactionID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) { -#line 195 "tcap.cnf" +#line 197 "tcap.cnf" tvbuff_t *parameter_tvb; guint8 len , i; proto_item *tid_item; @@ -1498,7 +1493,7 @@ static const ber_sequence_t End_sequence[] = { static int dissect_tcap_End(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) { -#line 238 "tcap.cnf" +#line 240 "tcap.cnf" gp_tcapsrt_info->ope=TC_END; if (check_col(pinfo->cinfo, COL_INFO)) @@ -1527,7 +1522,7 @@ static const ber_sequence_t Continue_sequence[] = { static int dissect_tcap_Continue(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) { -#line 246 "tcap.cnf" +#line 248 "tcap.cnf" gp_tcapsrt_info->ope=TC_CONT; if (check_col(pinfo->cinfo, COL_INFO)) @@ -1601,7 +1596,7 @@ static const ber_sequence_t Abort_sequence[] = { static int dissect_tcap_Abort(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) { -#line 254 "tcap.cnf" +#line 256 "tcap.cnf" gp_tcapsrt_info->ope=TC_ABORT; if (check_col(pinfo->cinfo, COL_INFO)) @@ -1623,7 +1618,7 @@ static int dissect_abort_impl(packet_info *pinfo _U_, proto_tree *tree _U_, tvbu static int dissect_tcap_TransactionID(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) { -#line 286 "tcap.cnf" +#line 288 "tcap.cnf" tvbuff_t *next_tvb; @@ -1835,7 +1830,7 @@ static int dissect_operationCode(packet_info *pinfo _U_, proto_tree *tree _U_, t static int dissect_tcap_ANSIParameters(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) { -#line 129 "tcap.cnf" +#line 131 "tcap.cnf" /* we are doing the ParamSet here so need to look at the tags*/ guint32 len; len = tvb_length_remaining(tvb, offset); @@ -2101,7 +2096,7 @@ static const ber_choice_t ComponentPDU_choice[] = { static int dissect_tcap_ComponentPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) { -#line 140 "tcap.cnf" +#line 142 "tcap.cnf" tvbuff_t *next_tvb; dissector_handle_t subdissector_handle; @@ -2171,7 +2166,7 @@ static const ber_sequence_t TransactionPDU_sequence[] = { static int dissect_tcap_TransactionPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) { -#line 268 "tcap.cnf" +#line 270 "tcap.cnf" if ((hf_index == hf_tcap_ansiqueryWithPerm)&&(check_col(pinfo->cinfo, COL_INFO))) col_append_fstr(pinfo->cinfo, COL_INFO, " QueryWithPerm"); @@ -2273,7 +2268,7 @@ static const ber_sequence_t AbortPDU_sequence[] = { static int dissect_tcap_AbortPDU(gboolean implicit_tag _U_, tvbuff_t *tvb _U_, int offset _U_, packet_info *pinfo _U_, proto_tree *tree _U_, int hf_index _U_) { -#line 262 "tcap.cnf" +#line 264 "tcap.cnf" if (check_col(pinfo->cinfo, COL_INFO)) col_append_fstr(pinfo->cinfo, COL_INFO, " Abort "); |