Add the same workaround used in packet-ftam.c for the bad handling of the asn "IMPLICIT SEQUENCE", in the packet-gsm_map-template.c. This patch concerns Map V3 messages, not correctly decoded with the previous workaround "offset=offset+2".

Change a parameter for Provide Roaming Number decoding.

Add a decoding fonction for "Channel needed" parameter to avoid a decoding error for Paging messages
with a change to actually dissct channel needed.

svn path=/trunk/; revision=17350
This commit is contained in:
Anders Broman 2006-02-18 23:29:51 +00:00
parent accc35dd2a
commit 06d6295287
3 changed files with 155 additions and 49 deletions

View File

@ -555,7 +555,12 @@ dissect_gsm_map_Opcode(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, pac
}
static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
gint8 bug_class;
gboolean bug_pc, bug_ind_field;
gint32 bug_tag;
guint32 bug_len1;
guint8 octet;
switch(opcode){
@ -564,8 +569,12 @@ static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv
break;
case 3: /*cancelLocation*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* */
offset = offset +2;
if ( octet == 3){ /* */
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset=dissect_gsm_map_CancelLocationArg(TRUE, tvb, offset, pinfo, tree, -1);
}else{
offset=dissect_gsm_map_CancelLocationArgV2(FALSE, tvb, offset, pinfo, tree, -1);
@ -632,8 +641,12 @@ static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv
break;
case 29: /*sendEndSignal*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
offset = offset +2;
if ( octet == 3){ /* This is a V3 message ??? */
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset=dissect_gsm_map_SendEndSignalArgV3(TRUE, tvb, offset, pinfo, tree, hf_gsm_mapSendEndSignal);
}else{
offset=dissect_gsm_map_Bss_APDU(FALSE, tvb, offset, pinfo, tree, hf_gsm_mapSendEndSignal);
@ -647,8 +660,12 @@ static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv
break;
case 33: /*processAccessSignalling*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
offset = offset +2;
if ( octet == 3){ /* This is a V3 message ??? */
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset = dissect_gsm_map_ProcessAccessSignallingArgV3(TRUE, tvb, offset, pinfo, tree, hf_gsm_mapSendEndSignal);
}else{
offset=dissect_gsm_map_Bss_APDU(FALSE, tvb, offset, pinfo, tree, -1);
@ -657,7 +674,11 @@ static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv
case 34: /*forwardAccessSignalling*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
offset = offset +2;
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset=dissect_gsm_map_ForwardAccessSignallingArgV3(TRUE, tvb, offset, pinfo, tree, -1);
}else{
offset=dissect_gsm_map_Bss_APDU(FALSE, tvb, offset, pinfo, tree, -1);
@ -748,8 +769,12 @@ static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv
break;
case 68: /*prepareHandover*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
offset = offset +2;
if ( octet == 3){ /* This is a V3 message ??? */
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset=dissect_gsm_map_PrepareHO_ArgV3(TRUE, tvb, offset, pinfo, tree, -1);
}else{
offset=dissect_gsm_map_PrepareHO_Arg(FALSE, tvb, offset, pinfo, tree, -1);
@ -814,6 +839,11 @@ static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv
static int dissect_returnResultData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
gint8 bug_class;
gboolean bug_pc, bug_ind_field;
gint32 bug_tag;
guint32 bug_len1;
guint8 octet;
switch(opcode){
@ -830,7 +860,7 @@ static int dissect_returnResultData(packet_info *pinfo, proto_tree *tree, tvbuff
offset=dissect_gsm_map_CancelLocationRes(FALSE, tvb, offset, pinfo, tree, -1);
break;
case 4: /*provideRoamingNumber*/
offset=dissect_gsm_map_ProvideRoamingNumberRes(TRUE, tvb, offset, pinfo, tree, -1);
offset=dissect_gsm_map_ProvideRoamingNumberRes(FALSE, tvb, offset, pinfo, tree, -1); // TRUE florent
break;
case 6: /*resumeCallHandling*/
offset=dissect_gsm_map_ResumeCallHandlingRes(FALSE, tvb, offset, pinfo, tree, -1);
@ -875,7 +905,8 @@ static int dissect_returnResultData(packet_info *pinfo, proto_tree *tree, tvbuff
break;
case 22: /*sendRoutingInfo*/
/* This is done to get around a problem with IMPLICIT tag:s */
offset = offset +2;
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset=dissect_gsm_map_SendRoutingInfoRes(TRUE, tvb, offset, pinfo, tree, -1);
break;
case 23: /*updateGprsLocation*/
@ -934,20 +965,29 @@ static int dissect_returnResultData(packet_info *pinfo, proto_tree *tree, tvbuff
* however if the tag (3) is stripped of it should work with the 'new' def.(?)
*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
offset = offset +2;
if ( octet == 3){ /* This is a V3 message ??? */
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
}
offset=dissect_gsm_map_SendIdentificationRes(TRUE, tvb, offset, pinfo, tree, -1);
break;
case 56: /*sendAuthenticationInfo*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
offset = offset + 2;
offset=dissect_gsm_map_SendAuthenticationInfoResV3(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_SendAuthenticationInfoRes);
}else{
offset=dissect_gsm_map_SendAuthenticationInfoRes(FALSE, tvb, offset, pinfo, tree, -1);
}
break;
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset=dissect_gsm_map_SendAuthenticationInfoResV3(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_SendAuthenticationInfoRes);
}else{
offset=dissect_gsm_map_SendAuthenticationInfoRes(FALSE, tvb, offset, pinfo, tree, -1);
}
break;
case 57: /*restoreData*/
offset=dissect_gsm_map_RestoreDataRes(FALSE, tvb, offset, pinfo, tree, -1);
break;
@ -979,7 +1019,11 @@ static int dissect_returnResultData(packet_info *pinfo, proto_tree *tree, tvbuff
case 68: /*prepareHandover*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
offset = offset +2;
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset=dissect_gsm_map_PrepareHO_ResV3(TRUE, tvb, offset, pinfo, tree, hf_gsm_mapSendEndSignal);
}else{
offset=dissect_gsm_map_PrepareHO_Res(FALSE, tvb, offset, pinfo, tree, -1);

View File

@ -2765,6 +2765,7 @@ be_ciph_resp_mode(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gc
return(curr_offset - offset);
}
/*
* [2] 3.2.2.35
*/
@ -2793,6 +2794,23 @@ be_l3_msg(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add
return(curr_offset - offset);
}
/*
* [2] 3.2.2.36 Channel Needed
*/static guint8
be_cha_needed(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint len, gchar *add_string _U_, int string_len _U_)
{
guint32 curr_offset;
len = len;
curr_offset = offset;
/* no length check possible */
proto_tree_add_item(tree, hf_gsm_a_rr_chnl_needed_ch1, tvb, curr_offset, 1, FALSE);
return(curr_offset - offset);
}
/*
* [2] 3.2.2.43
*/
@ -12429,7 +12447,7 @@ static guint8 (*bssmap_elem_fcn[])(tvbuff_t *tvb, proto_tree *tree, guint32 offs
be_chosen_chan, /* Chosen Channel */
NULL, /* Total Resource Accessible */
be_ciph_resp_mode, /* Cipher Response Mode */
NULL, /* Channel Needed */
be_cha_needed, /* Channel Needed */
NULL, /* Trace Type */
NULL, /* TriggerID */
NULL, /* Trace Reference */

View File

@ -14651,7 +14651,12 @@ dissect_gsm_map_Opcode(gboolean implicit_tag _U_, tvbuff_t *tvb, int offset, pac
}
static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
gint8 bug_class;
gboolean bug_pc, bug_ind_field;
gint32 bug_tag;
guint32 bug_len1;
guint8 octet;
switch(opcode){
@ -14660,8 +14665,12 @@ static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv
break;
case 3: /*cancelLocation*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* */
offset = offset +2;
if ( octet == 3){ /* */
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset=dissect_gsm_map_CancelLocationArg(TRUE, tvb, offset, pinfo, tree, -1);
}else{
offset=dissect_gsm_map_CancelLocationArgV2(FALSE, tvb, offset, pinfo, tree, -1);
@ -14728,8 +14737,12 @@ static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv
break;
case 29: /*sendEndSignal*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
offset = offset +2;
if ( octet == 3){ /* This is a V3 message ??? */
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset=dissect_gsm_map_SendEndSignalArgV3(TRUE, tvb, offset, pinfo, tree, hf_gsm_mapSendEndSignal);
}else{
offset=dissect_gsm_map_Bss_APDU(FALSE, tvb, offset, pinfo, tree, hf_gsm_mapSendEndSignal);
@ -14743,8 +14756,12 @@ static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv
break;
case 33: /*processAccessSignalling*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
offset = offset +2;
if ( octet == 3){ /* This is a V3 message ??? */
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset = dissect_gsm_map_ProcessAccessSignallingArgV3(TRUE, tvb, offset, pinfo, tree, hf_gsm_mapSendEndSignal);
}else{
offset=dissect_gsm_map_Bss_APDU(FALSE, tvb, offset, pinfo, tree, -1);
@ -14753,7 +14770,11 @@ static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv
case 34: /*forwardAccessSignalling*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
offset = offset +2;
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset=dissect_gsm_map_ForwardAccessSignallingArgV3(TRUE, tvb, offset, pinfo, tree, -1);
}else{
offset=dissect_gsm_map_Bss_APDU(FALSE, tvb, offset, pinfo, tree, -1);
@ -14844,8 +14865,12 @@ static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv
break;
case 68: /*prepareHandover*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
offset = offset +2;
if ( octet == 3){ /* This is a V3 message ??? */
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset=dissect_gsm_map_PrepareHO_ArgV3(TRUE, tvb, offset, pinfo, tree, -1);
}else{
offset=dissect_gsm_map_PrepareHO_Arg(FALSE, tvb, offset, pinfo, tree, -1);
@ -14910,6 +14935,11 @@ static int dissect_invokeData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tv
static int dissect_returnResultData(packet_info *pinfo, proto_tree *tree, tvbuff_t *tvb, int offset) {
gint8 bug_class;
gboolean bug_pc, bug_ind_field;
gint32 bug_tag;
guint32 bug_len1;
guint8 octet;
switch(opcode){
@ -14926,7 +14956,7 @@ static int dissect_returnResultData(packet_info *pinfo, proto_tree *tree, tvbuff
offset=dissect_gsm_map_CancelLocationRes(FALSE, tvb, offset, pinfo, tree, -1);
break;
case 4: /*provideRoamingNumber*/
offset=dissect_gsm_map_ProvideRoamingNumberRes(TRUE, tvb, offset, pinfo, tree, -1);
offset=dissect_gsm_map_ProvideRoamingNumberRes(FALSE, tvb, offset, pinfo, tree, -1); // TRUE florent
break;
case 6: /*resumeCallHandling*/
offset=dissect_gsm_map_ResumeCallHandlingRes(FALSE, tvb, offset, pinfo, tree, -1);
@ -14971,7 +15001,8 @@ static int dissect_returnResultData(packet_info *pinfo, proto_tree *tree, tvbuff
break;
case 22: /*sendRoutingInfo*/
/* This is done to get around a problem with IMPLICIT tag:s */
offset = offset +2;
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset=dissect_gsm_map_SendRoutingInfoRes(TRUE, tvb, offset, pinfo, tree, -1);
break;
case 23: /*updateGprsLocation*/
@ -15030,20 +15061,29 @@ static int dissect_returnResultData(packet_info *pinfo, proto_tree *tree, tvbuff
* however if the tag (3) is stripped of it should work with the 'new' def.(?)
*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
offset = offset +2;
if ( octet == 3){ /* This is a V3 message ??? */
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
}
offset=dissect_gsm_map_SendIdentificationRes(TRUE, tvb, offset, pinfo, tree, -1);
break;
case 56: /*sendAuthenticationInfo*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
offset = offset + 2;
offset=dissect_gsm_map_SendAuthenticationInfoResV3(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_SendAuthenticationInfoRes);
}else{
offset=dissect_gsm_map_SendAuthenticationInfoRes(FALSE, tvb, offset, pinfo, tree, -1);
}
break;
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset=dissect_gsm_map_SendAuthenticationInfoResV3(TRUE, tvb, offset, pinfo, tree, hf_gsm_map_SendAuthenticationInfoRes);
}else{
offset=dissect_gsm_map_SendAuthenticationInfoRes(FALSE, tvb, offset, pinfo, tree, -1);
}
break;
case 57: /*restoreData*/
offset=dissect_gsm_map_RestoreDataRes(FALSE, tvb, offset, pinfo, tree, -1);
break;
@ -15075,7 +15115,11 @@ static int dissect_returnResultData(packet_info *pinfo, proto_tree *tree, tvbuff
case 68: /*prepareHandover*/
octet = tvb_get_guint8(tvb,0) & 0xf;
if ( octet == 3){ /* This is a V3 message ??? */
offset = offset +2;
/* XXX asn2eth can not yet handle tagged assignment yes so this
* XXX is some conformance file magic to work around that bug
*/
offset = get_ber_identifier(tvb, offset, &bug_class, &bug_pc, &bug_tag);
offset = get_ber_length(tree, tvb, offset, &bug_len1, &bug_ind_field);
offset=dissect_gsm_map_PrepareHO_ResV3(TRUE, tvb, offset, pinfo, tree, hf_gsm_mapSendEndSignal);
}else{
offset=dissect_gsm_map_PrepareHO_Res(FALSE, tvb, offset, pinfo, tree, -1);
@ -19212,7 +19256,7 @@ void proto_register_gsm_map(void) {
"", HFILL }},
/*--- End of included file: packet-gsm_map-hfarr.c ---*/
#line 1847 "packet-gsm_map-template.c"
#line 1891 "packet-gsm_map-template.c"
};
/* List of subtrees */
@ -19631,7 +19675,7 @@ void proto_register_gsm_map(void) {
&ett_gsm_map_ExtensionContainer,
/*--- End of included file: packet-gsm_map-ettarr.c ---*/
#line 1865 "packet-gsm_map-template.c"
#line 1909 "packet-gsm_map-template.c"
};
/* Register protocol */