forked from osmocom/wireshark
4e1b5ea866
Change-Id: I1a317b19d8076588c9305dae6287bb80cc14da64 Reviewed-on: https://code.wireshark.org/review/4494 Petri-Dish: Stig Bjørlykke <stig@bjorlykke.org> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net> Reviewed-by: Stig Bjørlykke <stig@bjorlykke.org> Tested-by: Stig Bjørlykke <stig@bjorlykke.org>
559 lines
14 KiB
INI
559 lines
14 KiB
INI
# c-basic-offset: 2; tab-width: 2; indent-tabs-mode: t
|
|
# vi: set shiftwidth=2 tabstop=2 noexpandtab:
|
|
# :indentSize=2:tabSize=2:noTabs=false:
|
|
|
|
#.MODULE_IMPORT
|
|
|
|
#.FIELD_RENAME
|
|
AARQ-apdu/protocol-version aarq-apdu_protocol-version
|
|
AARE-apdu/protocol-version aare-apdu_protocol-version
|
|
RLRE-apdu/reason rlre-apdu_response_reason
|
|
RLRQ-apdu/reason rlrq-apdu_request_reason
|
|
EXTERNALt/encoding/single-ASN1-type externalt_encoding_single-asn1-type
|
|
EXTERNALt/encoding/arbitrary externalt_encoding_arbitrary
|
|
EXTERNALt/encoding/octet-aligned externalt_encoding_octet-aligned
|
|
PDV-list/presentation-data-values/single-ASN1-type pdv-list_presentation-data-values_single-asn1-type
|
|
PDV-list/presentation-data-values/arbitrary pdv-list_presentation-data-values_arbitrary
|
|
#.END
|
|
|
|
#.PDU_NEW
|
|
Fully-encoded-data
|
|
ACSE-apdu
|
|
#.END
|
|
|
|
|
|
#.FN_PARS Release-request-reason
|
|
VAL_PTR=&reason
|
|
#.END
|
|
|
|
|
|
#.FN_BODY Presentation-context-identifier
|
|
|
|
offset = dissect_per_constrained_integer(
|
|
tvb,
|
|
offset,
|
|
actx,
|
|
tree,
|
|
hf_index,
|
|
1U,
|
|
127U,
|
|
&ulcs_context_value,
|
|
TRUE);
|
|
|
|
#.END
|
|
|
|
#.FN_BODY PDV-list/presentation-data-values/arbitrary
|
|
|
|
packet_info * pinfo = actx->pinfo;
|
|
tvbuff_t *tvb_usr = NULL;
|
|
proto_tree *atn_ulcs_tree = NULL;
|
|
atn_conversation_t *atn_cv = NULL;
|
|
heur_dtbl_entry_t *hdtbl_entry;
|
|
|
|
/* extract bitstring into new tvb buffer */
|
|
offset = dissect_per_bit_string(
|
|
tvb,
|
|
offset,
|
|
actx,
|
|
tree,
|
|
hf_index,
|
|
NO_BOUND,
|
|
NO_BOUND,
|
|
FALSE,
|
|
&tvb_usr,
|
|
NULL);
|
|
|
|
if (tvb_usr) {
|
|
/* call appropiate dissector for bitstring data */
|
|
switch(ulcs_context_value){
|
|
case 1: /* ACSE PDU*/
|
|
atn_ulcs_tree = proto_tree_add_subtree(
|
|
root_tree, tvb, offset, 0,
|
|
ett_atn_acse, NULL, ATN_ACSE_PROTO );
|
|
|
|
dissect_ACSE_apdu_PDU(
|
|
tvb_new_subset_remaining(tvb_usr, 0),
|
|
pinfo,
|
|
atn_ulcs_tree, NULL);
|
|
break;
|
|
case 3: /* USER data; call subdissector for CM, CPDLC ... */
|
|
|
|
/* using dstref for PDV-list only occurrs in DT */
|
|
atn_cv = find_atn_conversation(
|
|
&pinfo->dst,
|
|
pinfo->clnp_dstref,
|
|
&pinfo->src);
|
|
|
|
if(atn_cv) {
|
|
switch(atn_cv->ae_qualifier){
|
|
case cma: /* contact management */
|
|
call_dissector_with_data(
|
|
atn_cm_handle,
|
|
tvb_new_subset_remaining(tvb_usr, 0),
|
|
pinfo,
|
|
root_tree,
|
|
NULL);
|
|
break;
|
|
case cpdlc: /* plain old cpdlc */
|
|
case pmcpdlc: /* protected mode cpdlc */
|
|
call_dissector_with_data(
|
|
atn_cpdlc_handle,
|
|
tvb_new_subset_remaining(tvb_usr, 0),
|
|
pinfo,
|
|
root_tree,
|
|
NULL);
|
|
break;
|
|
default: /* unknown or unhandled datalink application */
|
|
dissector_try_heuristic(
|
|
atn_ulcs_heur_subdissector_list,
|
|
tvb_new_subset_remaining(tvb_usr,0),
|
|
actx->pinfo,
|
|
root_tree,
|
|
&hdtbl_entry,
|
|
NULL);
|
|
break;
|
|
}
|
|
}
|
|
else{
|
|
dissector_try_heuristic(
|
|
atn_ulcs_heur_subdissector_list,
|
|
tvb_new_subset_remaining(tvb_usr,0),
|
|
actx->pinfo,
|
|
root_tree,
|
|
&hdtbl_entry,
|
|
NULL);
|
|
}
|
|
break;
|
|
default:
|
|
break;
|
|
} /* switch(ulcs_context_value) */
|
|
}
|
|
|
|
#.END
|
|
|
|
|
|
#.FN_BODY Authentication-value/other/other-mechanism-value
|
|
|
|
offset=call_ber_oid_callback(
|
|
object_identifier_id,
|
|
tvb,
|
|
offset,
|
|
actx->pinfo,
|
|
tree, NULL);
|
|
|
|
#.END
|
|
|
|
#.FN_BODY Mechanism-name
|
|
|
|
offset = dissect_per_object_identifier(
|
|
tvb,
|
|
offset,
|
|
actx,
|
|
tree,
|
|
hf_index,
|
|
NULL);
|
|
|
|
#.END
|
|
|
|
|
|
#.FN_BODY Authentication-value/other/other-mechanism-value
|
|
|
|
offset=call_ber_oid_callback(
|
|
object_identifier_id,
|
|
tvb,
|
|
offset,
|
|
actx->pinfo,
|
|
tree, NULL);
|
|
|
|
#.END
|
|
|
|
#.FN_BODY AE-qualifier-form2
|
|
packet_info * pinfo = actx->pinfo;
|
|
atn_conversation_t *atn_cv = NULL;
|
|
guint32 ae_qualifier = 0;
|
|
|
|
/* dissect ae-qualifier */
|
|
offset = dissect_per_integer(
|
|
tvb,
|
|
offset,
|
|
actx,
|
|
tree,
|
|
hf_index,
|
|
&ae_qualifier);
|
|
|
|
|
|
/*note: */
|
|
/* the field "calling-AE-qualifier" is optional, */
|
|
/* which means that we can exploit it only if it is present. */
|
|
/* We still depend on heuristical decoding of CM, CPDLC PDU's otherwise. */
|
|
|
|
/* AARQ/DT: dstref present, srcref is always zero */
|
|
if((pinfo->clnp_dstref) && (!pinfo->clnp_srcref)){
|
|
atn_cv = find_atn_conversation(&pinfo->dst,
|
|
pinfo->clnp_dstref,
|
|
&pinfo->src );
|
|
}
|
|
|
|
/* AARQ/CR: srcref present, dstref is always zero */
|
|
if((!pinfo->clnp_dstref) && (pinfo->clnp_srcref)){
|
|
atn_cv = find_atn_conversation(&pinfo->src,
|
|
pinfo->clnp_srcref,
|
|
&pinfo->dst );
|
|
}
|
|
|
|
if(atn_cv){
|
|
atn_cv->ae_qualifier = ae_qualifier;
|
|
}
|
|
#.END
|
|
|
|
#.FN_BODY AARQ-apdu
|
|
packet_info * pinfo = actx->pinfo;
|
|
aarq_data_t *aarq_data = NULL;
|
|
atn_conversation_t *atn_cv = NULL;
|
|
guint32 aircraft_24_bit_address = 0;
|
|
|
|
/* AARQ/DT: dstref present, srcref is always zero */
|
|
if((pinfo->clnp_dstref) && (!pinfo->clnp_srcref)){
|
|
|
|
atn_cv = find_atn_conversation(
|
|
&pinfo->dst,
|
|
pinfo->clnp_dstref,
|
|
&pinfo->src );
|
|
if(!atn_cv){
|
|
atn_cv = wmem_new(wmem_file_scope(), atn_conversation_t);
|
|
atn_cv->ae_qualifier = unknown;
|
|
create_atn_conversation(&pinfo->dst,
|
|
pinfo->clnp_dstref,
|
|
&pinfo->src ,
|
|
atn_cv);
|
|
}
|
|
}
|
|
|
|
/* AARQ/CR: srcref present, dstref is always zero */
|
|
if((!pinfo->clnp_dstref) && (pinfo->clnp_srcref)){
|
|
atn_cv = find_atn_conversation(&pinfo->src,
|
|
pinfo->clnp_srcref,
|
|
&pinfo->dst );
|
|
if(!atn_cv){
|
|
atn_cv = wmem_new(wmem_file_scope(), atn_conversation_t);
|
|
atn_cv->ae_qualifier = unknown;
|
|
create_atn_conversation(&pinfo->src,
|
|
pinfo->clnp_srcref,
|
|
&pinfo->dst ,
|
|
atn_cv);
|
|
}
|
|
}
|
|
|
|
/* conversation is to be created prior to decoding */
|
|
/* of "AE-qualifier-form2" which takes place here: */
|
|
%(DEFAULT_BODY)s
|
|
|
|
|
|
/* save AARQ packet data to create a conversation */
|
|
/* when decoding the following AARE PDU */
|
|
/* ATN applications CM and CPDLC are air/ground applications */
|
|
/* so there is always an aircraft (with its 24-bit address) */
|
|
/* and a ground facility. */
|
|
/* the assumption is that there is only one open AARQ/AARE */
|
|
/* dialog per aircraft at a time. */
|
|
/* the aircraft's 24-bit address is used as a key to each AARQ */
|
|
/* data. AARQ data is used to create a conversation with */
|
|
/* air and ground endpoints (based on NSAP's and transport references) */
|
|
/* when decoding AARE.*/
|
|
/* note: */
|
|
/* it may be more robust to create the conversation */
|
|
/* in the "ositp" dissector an to merely use the conversation here */
|
|
aircraft_24_bit_address =
|
|
get_aircraft_24_bit_address_from_nsap(pinfo);
|
|
|
|
/* search for aarq entry */
|
|
aarq_data = (aarq_data_t *) wmem_tree_lookup32(
|
|
aarq_data_tree,
|
|
aircraft_24_bit_address);
|
|
|
|
if(!aarq_data){ /* aarq data not found, create new record */
|
|
|
|
/* alloc aarq data */
|
|
aarq_data = wmem_new(wmem_file_scope(), aarq_data_t);
|
|
aarq_data-> aarq_pending = FALSE;
|
|
|
|
/* insert aarq data */
|
|
wmem_tree_insert32(aarq_data_tree ,aircraft_24_bit_address,(void*)aarq_data);
|
|
}
|
|
|
|
/* check for pending AARQ/AARE sequences */
|
|
/* if "aarq_data-> aarq_pending" is set this means that there is already one */
|
|
/* AARQ/AARE sequence pending (is unwise to overwrite AARE/AARQ) */
|
|
if (aarq_data-> aarq_pending == FALSE ) {
|
|
|
|
/* init aarq data */
|
|
memset(aarq_data,0,sizeof(aarq_data_t));
|
|
|
|
aarq_data->cv = atn_cv;
|
|
aarq_data-> aarq_pending = TRUE;
|
|
}
|
|
|
|
#.END
|
|
|
|
|
|
#.FN_BODY AARE-apdu
|
|
packet_info * pinfo = actx->pinfo;
|
|
guint32 aircraft_24_bit_address = 0 ;
|
|
atn_conversation_t *atn_cv = NULL;
|
|
aarq_data_t *aarq_data = NULL;
|
|
|
|
/* get AARQ data and use it to create a new conversation, */
|
|
/* the conversation is used along with */
|
|
/* AARQ's "calling ae qualifier" to determine the */
|
|
/* type of air/ground application of each subsequent frame.*/
|
|
/* we use this information to invoke the correct application dissector. */
|
|
/* note: */
|
|
/* heuristical decoding of ASN1 will not work for all cases, */
|
|
/* for there may be CM PDU's which will exactly look like CPDLC PDU'S */
|
|
|
|
/* get 24-bit icao address */
|
|
aircraft_24_bit_address = get_aircraft_24_bit_address_from_nsap(pinfo);
|
|
|
|
/* search for aarq entry */
|
|
aarq_data = (aarq_data_t *) wmem_tree_lookup32(
|
|
aarq_data_tree,
|
|
aircraft_24_bit_address);
|
|
|
|
/* no aarq data present, do nothing */
|
|
/* without both ends of the conversation and without */
|
|
/* the "calling ae-qualifier there is no point in setting up "*/
|
|
/* a conversation */
|
|
if(!aarq_data) {
|
|
|
|
return offset;
|
|
}
|
|
|
|
/* AARE/DT: dstref present, srcref is always zero */
|
|
if((pinfo->clnp_dstref) && (!pinfo->clnp_srcref)){
|
|
|
|
atn_cv = find_atn_conversation(&pinfo->dst,
|
|
pinfo->clnp_dstref,
|
|
&pinfo->src );
|
|
|
|
if(!atn_cv){ /* conversation not fond */
|
|
|
|
/* DT has only dstref - create new conversation */
|
|
create_atn_conversation(&pinfo->dst,
|
|
pinfo->clnp_dstref,
|
|
&pinfo->src ,
|
|
aarq_data->cv);
|
|
}
|
|
}
|
|
|
|
/* AARE/CC: srcref and dstref present */
|
|
if((pinfo->clnp_dstref) && (pinfo->clnp_srcref)){
|
|
|
|
atn_cv = find_atn_conversation(
|
|
&pinfo->src,
|
|
pinfo->clnp_srcref,
|
|
&pinfo->dst);
|
|
|
|
if(atn_cv){ /* conversation found. */
|
|
|
|
/* create new conversation for dstref */
|
|
create_atn_conversation(&pinfo->dst,
|
|
pinfo->clnp_dstref,
|
|
&pinfo->src ,
|
|
aarq_data->cv);
|
|
|
|
}else { /* no conversation found */
|
|
/* as CC contains srcref *and* dstref we use both to create new records */
|
|
create_atn_conversation(&pinfo->src,
|
|
pinfo->clnp_srcref,
|
|
&pinfo->dst ,
|
|
aarq_data->cv);
|
|
create_atn_conversation(&pinfo->dst,
|
|
pinfo->clnp_dstref,
|
|
&pinfo->src ,
|
|
aarq_data->cv);
|
|
}
|
|
}
|
|
|
|
/* clear aarq data */
|
|
memset(aarq_data,0,sizeof(aarq_data_t));
|
|
aarq_data-> aarq_pending = FALSE;
|
|
|
|
%(DEFAULT_BODY)s
|
|
|
|
|
|
#.END
|
|
|
|
|
|
#.FN_BODY Associate-result
|
|
/* extension present: last param set to true. asn2wrs didn't take notice of that */
|
|
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
|
|
0U, 2U, NULL, TRUE);
|
|
#.END
|
|
|
|
#.FN_BODY Release-request-reason
|
|
/* extension present: last param set to true. asn2wrs didn't take notice of that */
|
|
offset = dissect_per_constrained_integer(tvb, offset, actx, tree, hf_index,
|
|
0U, 30U, NULL, TRUE);
|
|
#.END
|
|
|
|
#.FN_BODY Release-response-reason
|
|
|
|
/* extension present: last param set to true. asn2wrs didn't take notice of that */
|
|
offset = dissect_per_constrained_integer(
|
|
tvb,
|
|
offset,
|
|
actx,
|
|
tree,
|
|
hf_index,
|
|
0U,
|
|
30U,
|
|
NULL,
|
|
TRUE);
|
|
|
|
#.END
|
|
|
|
#.FN_BODY Mechanism-name
|
|
|
|
offset = dissect_per_object_identifier(
|
|
tvb,
|
|
offset,
|
|
actx,
|
|
tree,
|
|
hf_index,
|
|
NULL);
|
|
|
|
#.END
|
|
|
|
#.FN_BODY EXTERNALt/data-value-descriptor
|
|
|
|
offset = dissect_per_octet_string(
|
|
tvb,
|
|
offset,
|
|
actx,
|
|
tree,
|
|
hf_index,
|
|
-1,
|
|
-1,
|
|
FALSE,
|
|
&actx->external.data_value_descriptor);
|
|
actx->external.data_value_descr_present = TRUE;
|
|
|
|
#.END
|
|
|
|
#.FN_BODY EXTERNALt/encoding/single-ASN1-type
|
|
|
|
%(DEFAULT_BODY)s
|
|
|
|
#.END
|
|
|
|
#.FN_BODY EXTERNALt/encoding/octet-aligned
|
|
|
|
%(DEFAULT_BODY)s
|
|
|
|
#.END
|
|
|
|
#.FN_BODY EXTERNALt/encoding/arbitrary
|
|
tvbuff_t *tvb_usr = NULL;
|
|
packet_info * pinfo = actx->pinfo;
|
|
atn_conversation_t *atn_cv = NULL;
|
|
heur_dtbl_entry_t *hdtbl_entry;
|
|
|
|
/* decode bit-string user data within ACSE */
|
|
offset = dissect_per_bit_string(
|
|
tvb,
|
|
offset,
|
|
actx,
|
|
tree, hf_index,
|
|
NO_BOUND,
|
|
NO_BOUND,
|
|
FALSE,
|
|
&tvb_usr,
|
|
NULL);
|
|
|
|
if (tvb_usr) {
|
|
/* DT: dstref present, srcref is always zero */
|
|
if((pinfo->clnp_dstref) && (!pinfo->clnp_srcref)){
|
|
|
|
atn_cv = find_atn_conversation(
|
|
&pinfo->dst,
|
|
pinfo->clnp_dstref,
|
|
&pinfo->src);
|
|
}
|
|
/* CR: srcref present, dstref always zero */
|
|
if((pinfo->clnp_srcref) && (!pinfo->clnp_dstref)){
|
|
|
|
atn_cv = find_atn_conversation(
|
|
&pinfo->src,
|
|
pinfo->clnp_srcref,
|
|
&pinfo->dst);
|
|
}
|
|
/* CC: srcref and dstref present */
|
|
if((pinfo->clnp_srcref) && (pinfo->clnp_dstref)){
|
|
|
|
atn_cv = find_atn_conversation(
|
|
&pinfo->src,
|
|
pinfo->clnp_srcref,
|
|
&pinfo->dst);
|
|
}
|
|
|
|
if(atn_cv) {
|
|
switch(atn_cv->ae_qualifier){
|
|
case cma: /* contact management */
|
|
|
|
call_dissector_with_data(
|
|
atn_cm_handle,
|
|
tvb_new_subset_remaining(tvb_usr, 0),
|
|
pinfo,
|
|
root_tree,
|
|
NULL);
|
|
break;
|
|
case cpdlc: /* plain old cpdlc */
|
|
case pmcpdlc: /* protected mode cpdlc */
|
|
|
|
call_dissector_with_data(
|
|
atn_cpdlc_handle,
|
|
tvb_new_subset_remaining(tvb_usr, 0),
|
|
pinfo,
|
|
root_tree,
|
|
NULL);
|
|
break;
|
|
default: /* unknown or unhandled datalink application */
|
|
|
|
dissector_try_heuristic(
|
|
atn_ulcs_heur_subdissector_list,
|
|
tvb_new_subset_remaining(tvb_usr,0),
|
|
actx->pinfo,
|
|
root_tree,
|
|
&hdtbl_entry,
|
|
NULL);
|
|
break;
|
|
}
|
|
}else {
|
|
|
|
dissector_try_heuristic(
|
|
atn_ulcs_heur_subdissector_list,
|
|
tvb_new_subset_remaining(tvb_usr,0),
|
|
actx->pinfo,
|
|
root_tree,
|
|
&hdtbl_entry,
|
|
NULL);
|
|
}
|
|
}
|
|
|
|
offset += tvb_reported_length_remaining(tvb, offset);
|
|
|
|
#.END
|
|
|
|
#
|
|
# Editor modelines - http://www.wireshark.org/tools/modelines.html
|
|
#
|
|
# Local variables:
|
|
# c-basic-offset: 2
|
|
# tab-width: 2
|
|
# indent-tabs-mode: t
|
|
# End:
|
|
#
|
|
# vi: set shiftwidth=2 tabstop=2 noexpandtab:
|
|
# :indentSize=2:tabSize=2:noTabs=false:
|
|
#
|