diff options
Diffstat (limited to 'asn1/atn-cpdlc/packet-atn-cpdlc-template.c')
-rw-r--r-- | asn1/atn-cpdlc/packet-atn-cpdlc-template.c | 510 |
1 files changed, 252 insertions, 258 deletions
diff --git a/asn1/atn-cpdlc/packet-atn-cpdlc-template.c b/asn1/atn-cpdlc/packet-atn-cpdlc-template.c index 5db061e3d3..c08071ceb3 100644 --- a/asn1/atn-cpdlc/packet-atn-cpdlc-template.c +++ b/asn1/atn-cpdlc/packet-atn-cpdlc-template.c @@ -1,8 +1,3 @@ -/* c-basic-offset: 2; tab-width: 2; indent-tabs-mode: t - * vi: set shiftwidth=2 tabstop=2 noexpandtab: - * :indentSize=2:tabSize=2:noTabs=false: - */ - /* packet-atn-cpdlc-template.c * By Mathias Guettler <guettler@web.de> * Copyright 2013 @@ -42,9 +37,9 @@ /* developper comments: - Which CPDLC messages are supported ? - Protected Mode CPDLC (AeQualifier 22) and Plain Old CPDLC (AeQualifier 2) - The dissector has been tested with ICAO doc9705 Edition2 compliant traffic. + Which CPDLC messages are supported ? + Protected Mode CPDLC (AeQualifier 22) and Plain Old CPDLC (AeQualifier 2) + The dissector has been tested with ICAO doc9705 Edition2 compliant traffic. */ #include "config.h" @@ -65,25 +60,25 @@ static const char *object_identifier_id; /* forward declarations */ static int dissect_GroundPDUs_PDU( - tvbuff_t *tvb _U_, - packet_info *pinfo _U_, - proto_tree *tree _U_, - void *data _U_); + tvbuff_t *tvb _U_, + packet_info *pinfo _U_, + proto_tree *tree _U_, + void *data _U_); static int dissect_AircraftPDUs_PDU( - tvbuff_t *tvb _U_, - packet_info *pinfo _U_, - proto_tree *tree _U_, - void *data _U_); + tvbuff_t *tvb _U_, + packet_info *pinfo _U_, + proto_tree *tree _U_, + void *data _U_); static int dissect_ProtectedGroundPDUs_PDU( - tvbuff_t *tvb _U_, - packet_info *pinfo _U_, - proto_tree *tree _U_, - void *data _U_); + tvbuff_t *tvb _U_, + packet_info *pinfo _U_, + proto_tree *tree _U_, + void *data _U_); static int dissect_ProtectedAircraftPDUs_PDU( - tvbuff_t *tvb _U_, - packet_info *pinfo _U_, - proto_tree *tree _U_, - void *data _U_); + tvbuff_t *tvb _U_, + packet_info *pinfo _U_, + proto_tree *tree _U_, + void *data _U_); #include "packet-atn-cpdlc-hf.c" @@ -98,206 +93,206 @@ static int proto_atn_cpdlc = -1; static int dissect_atn_cpdlc( - tvbuff_t *tvb, - packet_info *pinfo, - proto_tree *tree, - void *data _U_) + tvbuff_t *tvb, + packet_info *pinfo, + proto_tree *tree, + void *data _U_) { - /* note: */ - /* there are two co-existing applications of CPDLC: */ - /* "plain old" (ae-qualifier 2) and */ - /* "protected mode" (ae-qualifier 22) CPDLC. */ - /* "protected mode" was introduced to cope with a */ - /* safety issue in which a message would sent to the wrong aircraft. */ - - /* note:*/ - /* The protection is an additional checksum and covers the message content, */ - /* the 24-bit address of the aircraft, the current flight id and */ - /* the current ground facility so that an aircraft would be able to reject */ - /* messages which are unexpected (i.e. messages to another flight or */ - /* messages from the wrong center). */ - - /*note:*/ - /* although "plain old" CPDLC is more or less deprecated */ - /* many aircraft cannot perform */ - /* "protected mode" for this largely depends on */ - /* upgraded avionics packages */ - - /*note:*/ - /* The use of CPDLC is *optional* as the pilot */ - /* may always use a voice radio channel to talk to the controller.*/ - - proto_tree *atn_cpdlc_tree = NULL; - atn_conversation_t *atn_cv = NULL; - - /* note: */ - /* we need the ae qualifier stored within the conversation */ - /* to decode "plain old cpdlc" or */ - /* "protected mode cpdlc correctly " */ - - /* 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 is always zero */ - if((!pinfo->clnp_dstref) && (pinfo->clnp_srcref)){ - atn_cv = find_atn_conversation( - &pinfo->src, - pinfo->clnp_srcref, - &pinfo->dst ); - } - /* CC: srcref and dstref present, always use src/srcref & dst */ - if((pinfo->clnp_dstref) && (pinfo->clnp_srcref)){ - atn_cv = find_atn_conversation( - &pinfo->src, - pinfo->clnp_srcref, - &pinfo->dst ); - } - - if(!atn_cv){ /* atn conversation not found */ - return 0; } - - atn_cpdlc_tree = proto_tree_add_subtree( - tree, tvb, 0, -1, ett_atn_cpdlc, NULL, - ATN_CPDLC_PROTO ); - - switch(atn_cv->ae_qualifier){ - case pmcpdlc: - if( check_heur_msg_type(pinfo) == um ) { - /* uplink PDU's = Ground PDU's */ - dissect_ProtectedGroundPDUs_PDU( - tvb, - pinfo, - atn_cpdlc_tree, NULL); - }else { /* downlink PDU's = Aircraft PDU's */ - dissect_ProtectedAircraftPDUs_PDU( - tvb, - pinfo, - atn_cpdlc_tree, NULL); - } - break; - case cpdlc: - if( check_heur_msg_type(pinfo) == um ) { - /* uplink PDU's = Ground PDU's */ - dissect_GroundPDUs_PDU( - tvb, - pinfo, - atn_cpdlc_tree, NULL); - }else { /* downlink PDU's = Aircraft PDU's */ - dissect_AircraftPDUs_PDU( - tvb, - pinfo, - atn_cpdlc_tree, NULL); - } - break; - default: - break; - } - return tvb_reported_length_remaining(tvb, 0); + /* note: */ + /* there are two co-existing applications of CPDLC: */ + /* "plain old" (ae-qualifier 2) and */ + /* "protected mode" (ae-qualifier 22) CPDLC. */ + /* "protected mode" was introduced to cope with a */ + /* safety issue in which a message would sent to the wrong aircraft. */ + + /* note:*/ + /* The protection is an additional checksum and covers the message content, */ + /* the 24-bit address of the aircraft, the current flight id and */ + /* the current ground facility so that an aircraft would be able to reject */ + /* messages which are unexpected (i.e. messages to another flight or */ + /* messages from the wrong center). */ + + /*note:*/ + /* although "plain old" CPDLC is more or less deprecated */ + /* many aircraft cannot perform */ + /* "protected mode" for this largely depends on */ + /* upgraded avionics packages */ + + /*note:*/ + /* The use of CPDLC is *optional* as the pilot */ + /* may always use a voice radio channel to talk to the controller.*/ + + proto_tree *atn_cpdlc_tree = NULL; + atn_conversation_t *atn_cv = NULL; + + /* note: */ + /* we need the ae qualifier stored within the conversation */ + /* to decode "plain old cpdlc" or */ + /* "protected mode cpdlc correctly " */ + + /* 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 is always zero */ + if((!pinfo->clnp_dstref) && (pinfo->clnp_srcref)){ + atn_cv = find_atn_conversation( + &pinfo->src, + pinfo->clnp_srcref, + &pinfo->dst ); + } + /* CC: srcref and dstref present, always use src/srcref & dst */ + if((pinfo->clnp_dstref) && (pinfo->clnp_srcref)){ + atn_cv = find_atn_conversation( + &pinfo->src, + pinfo->clnp_srcref, + &pinfo->dst ); + } + + if(!atn_cv){ /* atn conversation not found */ + return 0; } + + atn_cpdlc_tree = proto_tree_add_subtree( + tree, tvb, 0, -1, ett_atn_cpdlc, NULL, + ATN_CPDLC_PROTO ); + + switch(atn_cv->ae_qualifier){ + case pmcpdlc: + if( check_heur_msg_type(pinfo) == um ) { + /* uplink PDU's = Ground PDU's */ + dissect_ProtectedGroundPDUs_PDU( + tvb, + pinfo, + atn_cpdlc_tree, NULL); + }else { /* downlink PDU's = Aircraft PDU's */ + dissect_ProtectedAircraftPDUs_PDU( + tvb, + pinfo, + atn_cpdlc_tree, NULL); + } + break; + case cpdlc: + if( check_heur_msg_type(pinfo) == um ) { + /* uplink PDU's = Ground PDU's */ + dissect_GroundPDUs_PDU( + tvb, + pinfo, + atn_cpdlc_tree, NULL); + }else { /* downlink PDU's = Aircraft PDU's */ + dissect_AircraftPDUs_PDU( + tvb, + pinfo, + atn_cpdlc_tree, NULL); + } + break; + default: + break; + } + return tvb_reported_length_remaining(tvb, 0); } static gboolean dissect_atn_cpdlc_heur( - tvbuff_t *tvb, - packet_info *pinfo, - proto_tree *tree, - void *data _U_) + tvbuff_t *tvb, + packet_info *pinfo, + proto_tree *tree, + void *data _U_) { - atn_conversation_t *atn_cv = NULL; - volatile gboolean is_atn_cpdlc = FALSE; - volatile gboolean is_pm = FALSE; - int type; - - type = check_heur_msg_type(pinfo); - - switch(type){ - case um: - TRY { - dissect_ProtectedGroundPDUs_PDU(tvb, pinfo, NULL, NULL); - is_atn_cpdlc = TRUE; - is_pm = TRUE;} - CATCH_ALL{ - is_atn_cpdlc = FALSE; - is_pm = FALSE;} - ENDTRY; - if (is_atn_cpdlc) { - break; - } - TRY { - dissect_GroundPDUs_PDU(tvb, pinfo, NULL, NULL); - is_pm = FALSE; - is_atn_cpdlc = TRUE;} - CATCH_ALL{ - is_atn_cpdlc = FALSE; - is_pm = FALSE;} - ENDTRY; - break; - case dm: - TRY { - dissect_ProtectedAircraftPDUs_PDU(tvb, pinfo, NULL, NULL); - is_atn_cpdlc = TRUE; - is_pm = TRUE;} - CATCH_ALL { - is_atn_cpdlc = FALSE; - is_pm = FALSE; } - ENDTRY; - if (is_atn_cpdlc) { - break; - } - TRY{ - dissect_AircraftPDUs_PDU(tvb, pinfo, NULL, NULL); - is_atn_cpdlc = TRUE; - is_pm = FALSE;} - CATCH_ALL{ - is_atn_cpdlc = FALSE; - is_pm = FALSE;} - ENDTRY; - break; - default: - break; - } - - if(is_atn_cpdlc){ - /* note: */ - /* all subsequent PDU's belonging to this conversation */ - /* are considered CPDLC */ - /* if the first CPDLC PDU has been decoded succesfully */ - /* (This is done in "atn-ulcs" by using "call_dissector_with_data()") */ - - /* 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 is always zero */ - if((!pinfo->clnp_dstref) && (pinfo->clnp_srcref)){ - atn_cv = find_atn_conversation(&pinfo->src, - pinfo->clnp_srcref, - &pinfo->dst ); - } - /* CC: srcref and dstref present, always use src/srcref & dst */ - if((pinfo->clnp_dstref) && (pinfo->clnp_srcref)){ - atn_cv = find_atn_conversation(&pinfo->src, - pinfo->clnp_srcref, - &pinfo->dst ); - } - - if(atn_cv){ /* atn conversation found */ - if(is_pm == TRUE) { - atn_cv->ae_qualifier = pmcpdlc; } - else { - atn_cv->ae_qualifier = cpdlc; } - dissect_atn_cpdlc(tvb, pinfo, tree, NULL); - } - }else { /* there should *always* be an atn conversation */ - is_atn_cpdlc = FALSE; - } - - return is_atn_cpdlc; + atn_conversation_t *atn_cv = NULL; + volatile gboolean is_atn_cpdlc = FALSE; + volatile gboolean is_pm = FALSE; + int type; + + type = check_heur_msg_type(pinfo); + + switch(type){ + case um: + TRY { + dissect_ProtectedGroundPDUs_PDU(tvb, pinfo, NULL, NULL); + is_atn_cpdlc = TRUE; + is_pm = TRUE;} + CATCH_ALL{ + is_atn_cpdlc = FALSE; + is_pm = FALSE;} + ENDTRY; + if (is_atn_cpdlc) { + break; + } + TRY { + dissect_GroundPDUs_PDU(tvb, pinfo, NULL, NULL); + is_pm = FALSE; + is_atn_cpdlc = TRUE;} + CATCH_ALL{ + is_atn_cpdlc = FALSE; + is_pm = FALSE;} + ENDTRY; + break; + case dm: + TRY { + dissect_ProtectedAircraftPDUs_PDU(tvb, pinfo, NULL, NULL); + is_atn_cpdlc = TRUE; + is_pm = TRUE;} + CATCH_ALL { + is_atn_cpdlc = FALSE; + is_pm = FALSE; } + ENDTRY; + if (is_atn_cpdlc) { + break; + } + TRY{ + dissect_AircraftPDUs_PDU(tvb, pinfo, NULL, NULL); + is_atn_cpdlc = TRUE; + is_pm = FALSE;} + CATCH_ALL{ + is_atn_cpdlc = FALSE; + is_pm = FALSE;} + ENDTRY; + break; + default: + break; + } + + if(is_atn_cpdlc){ + /* note: */ + /* all subsequent PDU's belonging to this conversation */ + /* are considered CPDLC */ + /* if the first CPDLC PDU has been decoded succesfully */ + /* (This is done in "atn-ulcs" by using "call_dissector_with_data()") */ + + /* 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 is always zero */ + if((!pinfo->clnp_dstref) && (pinfo->clnp_srcref)){ + atn_cv = find_atn_conversation(&pinfo->src, + pinfo->clnp_srcref, + &pinfo->dst ); + } + /* CC: srcref and dstref present, always use src/srcref & dst */ + if((pinfo->clnp_dstref) && (pinfo->clnp_srcref)){ + atn_cv = find_atn_conversation(&pinfo->src, + pinfo->clnp_srcref, + &pinfo->dst ); + } + + if(atn_cv){ /* atn conversation found */ + if(is_pm == TRUE) { + atn_cv->ae_qualifier = pmcpdlc; } + else { + atn_cv->ae_qualifier = cpdlc; } + dissect_atn_cpdlc(tvb, pinfo, tree, NULL); + } + }else { /* there should *always* be an atn conversation */ + is_atn_cpdlc = FALSE; + } + + return is_atn_cpdlc; } @@ -305,56 +300,55 @@ dissect_atn_cpdlc_heur( void proto_register_atn_cpdlc (void) { static hf_register_info hf_atn_cpdlc[] = { - #include "packet-atn-cpdlc-hfarr.c" - }; - - static gint *ett[] = { - #include "packet-atn-cpdlc-ettarr.c" - &ett_atn_cpdlc - }; - - /* register CPDLC */ - proto_atn_cpdlc = proto_register_protocol( - ATN_CPDLC_PROTO , - "ATN-CPDLC", - "atn-cpdlc"); - - proto_register_field_array( - proto_atn_cpdlc, - hf_atn_cpdlc, - array_length(hf_atn_cpdlc)); - - proto_register_subtree_array( - ett, - array_length(ett)); - - new_register_dissector( - "atn-cpdlc", - dissect_atn_cpdlc, - proto_atn_cpdlc); + #include "packet-atn-cpdlc-hfarr.c" + }; + + static gint *ett[] = { + #include "packet-atn-cpdlc-ettarr.c" + &ett_atn_cpdlc + }; + + /* register CPDLC */ + proto_atn_cpdlc = proto_register_protocol( + ATN_CPDLC_PROTO , + "ATN-CPDLC", + "atn-cpdlc"); + + proto_register_field_array( + proto_atn_cpdlc, + hf_atn_cpdlc, + array_length(hf_atn_cpdlc)); + + proto_register_subtree_array( + ett, + array_length(ett)); + + new_register_dissector( + "atn-cpdlc", + dissect_atn_cpdlc, + proto_atn_cpdlc); } void proto_reg_handoff_atn_cpdlc(void) { - /* add session dissector to atn dissector list dissector list*/ - heur_dissector_add( - "atn-ulcs", - dissect_atn_cpdlc_heur, - "ATN-CPDLC over ATN-ULCS", - "atn-cpdlc-ulcs", - proto_atn_cpdlc, HEURISTIC_ENABLE); + /* add session dissector to atn dissector list dissector list*/ + heur_dissector_add( + "atn-ulcs", + dissect_atn_cpdlc_heur, + "ATN-CPDLC over ATN-ULCS", + "atn-cpdlc-ulcs", + proto_atn_cpdlc, HEURISTIC_ENABLE); } - /* * Editor modelines - http://www.wireshark.org/tools/modelines.html * * Local variables: - * c-basic-offset: 2 - * tab-width: 2 - * indent-tabs-mode: t + * c-basic-offset: 4 + * tab-width: 8 + * indent-tabs-mode: nil * End: * - * vi: set shiftwidth=2 tabstop=2 noexpandtab: - * :indentSize=2:tabSize=2:noTabs=false: + * vi: set shiftwidth=4 tabstop=8 expandtab: + * :indentSize=4:tabSize=8:noTabs=true: */ |