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
This commit is contained in:
Anders Broman 2007-04-23 21:26:27 +00:00
parent d6fc852779
commit c0dc340d5d
6 changed files with 134 additions and 46 deletions

View File

@ -3542,6 +3542,16 @@ Mt-forwardSM-Res ::= SEQUENCE {
-- absentsubscriberSM localValue : 6}
-- ::= localValue : 44
--ForwardSM OPERATION
-- ARGUMENT
ForwardSM-Arg ::= SEQUENCE {
sm-RP-DA Sm-RP-DA,
sm-RP-OA Sm-RP-OA,
sm-RP-UI Sm-RP-UI,
moreMessagesToSend NULL OPTIONAL,
... }
-- RESULT
-- not used
-- StoredMSISDN ::= ISDN-AddressString

View File

@ -142,7 +142,7 @@ Component
%(DEFAULT_BODY)s
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));
}
#.FN_PARS GSMMAPLocalErrorcode

View File

@ -172,6 +172,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 */
@ -556,6 +557,13 @@ dissect_geographical_description(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tr
}
#include "packet-gsm_map-fn.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" },
@ -596,9 +604,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) */
@ -755,6 +763,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 *,
@ -961,14 +987,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);
@ -1561,9 +1595,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)
{

View File

@ -117,10 +117,12 @@ dissect_tcap_TheComponent(implicit_tag, tvb, offset, pinfo, tree, hf_index);
tcap_private.oid= (void*) cur_oid;
tcap_private.acv=TRUE;
#.FN_BODY UserInfoOID FN_VARIANT = _str VAL_PTR = &tcapext_oid
%(DEFAULT_BODY)s
tcap_private.oid= (void*)tcapext_oid;
tcap_private.acv=TRUE;
# Do not overwrite the ApplicationContext with the UserInfoOID !
#
# .FN_BODY UserInfoOID FN_VARIANT = _str VAL_PTR = &tcapext_oid
# %(DEFAULT_BODY)s
# tcap_private.oid= (void*)tcapext_oid;
# tcap_private.acv=TRUE;
#.FN_BODY ExternUserInfo
dissect_tcap_TheExternUserInfo(implicit_tag, tvb, offset, pinfo, tree, hf_index);

View File

@ -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 */

View File

@ -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 ");