From Mathias Guettler:

New dissector for Air/Ground Datalink ICAO doc 9705 Ed2: ULCS, CM, CPDLC.

Just adding the files to SVN for now.

svn path=/trunk/; revision=51210
This commit is contained in:
Anders Broman 2013-08-08 05:09:13 +00:00
parent 6e0c354769
commit a4d1560fd1
19 changed files with 6165 additions and 0 deletions

12
asn1/atn-cm/Makefile.am Normal file
View File

@ -0,0 +1,12 @@
# Makefile.am
# ASN.1-based plugin atn-cm
# Contact Management (CM) version 1
# ICAO doc doc9705 Ed. 2
# Aereonautical Telecommunications Network (ATN)
#
# (c) 2013 Mathias Guettler guettler@web.de
#
include ../Makefile.preinc
include Makefile.common
include ../Makefile.inc

View File

@ -0,0 +1,28 @@
# ASN.1-based plugin atn-cm
# Contact Management (CM) version 1
# ICAO doc doc9705 Ed. 2
# Aereonautical Telecommunications Network (ATN)
#
# (c) 2013 Mathias Guettler guettler@web.de
#
PROTOCOL_NAME = atn-cm
EXT_ASN_FILE_LIST =
ASN_FILE_LIST = $(PROTOCOL_NAME).asn
EXTRA_DIST = \
Makefile.nmake \
$(ASN_FILE_LIST) \
packet-$(PROTOCOL_NAME)-template.c \
$(PROTOCOL_NAME).cnf
SRC_FILES = \
$(EXTRA_DIST) \
$(EXT_ASN_FILE_LIST)
# ASN1 PER unaligned encoding
A2W_FLAGS= -u -L
EXTRA_CNF=

View File

@ -0,0 +1,6 @@
include ../../config.nmake
include ../Makefile.preinc.nmake
include Makefile.common
include ../Makefile.inc.nmake

199
asn1/atn-cm/atn-cm.asn Normal file
View File

@ -0,0 +1,199 @@
-- c-basic-offset: 2; tab-width: 2; indent-tabs-mode: t
-- vi: set shiftwidth=2 tabstop=2 noexpandtab:
-- :indentSize=2:tabSize=2:noTabs=false:
-- ICAO doc 9705 Edition 2 Contact Management (CM)
CMMessageSetVersion1 DEFINITIONS AUTOMATIC TAGS ::=
BEGIN
-- ----------------------------------------------------------------------------------
-- CM Message Structure
-- ----------------------------------------------------------------------------------
-- Aircraft-generated messages
CMAircraftMessage ::= CHOICE
{
cmLogonRequest [0] CMLogonRequest,
cmContactResponse [1] CMContactResponse,
cmAbortReason [2] CMAbortReason,
...
}
-- Ground-generated messages
CMGroundMessage ::= CHOICE
{
cmLogonResponse [0] CMLogonResponse,
cmUpdate [1] CMUpdate,
cmContactRequest [2] CMContactRequest,
cmForwardRequest [3] CMForwardRequest,
cmAbortReason [4] CMAbortReason,
cmForwardResponse [5] CMForwardResponse,
...
}
-- ----------------------------------------------------------------------------------
-- CM Message Components
-- ----------------------------------------------------------------------------------
AircraftFlightIdentification ::= IA5String(SIZE(2..8))
Airport ::=IA5String (SIZE(4))
APAddress ::= CHOICE
{
longTsap [0] LongTsap,
shortTsap [1] ShortTsap
}
AEQualifier ::= INTEGER (0..255)
-- ATN AE-Qualifier Numeric Values are described in 4
AEQualifierVersion ::= SEQUENCE
{
aeQualifier AEQualifier,
apVersion VersionNumber
}
AEQualifierVersionAddress ::= SEQUENCE
{
aeQualifier AEQualifier,
apVersion VersionNumber,
apAddress APAddress
}
CMAbortReason ::= ENUMERATED
{
timer-expired (0),
undefined-error (1),
invalid-PDU (2),
protocol-error (3),
dialogue-acceptance-not-permitted (4),
dialogue-end-not-accepted (5),
communication-service-error (6),
communication-service-failure (7),
invalid-QOS-parameter (8),
expected-PDU-missing (9),
...
}
CMContactRequest ::= SEQUENCE
{
facilityDesignation FacilityDesignation,
address LongTsap
}
CMContactResponse ::= Response
CMForwardRequest ::= CMLogonRequest
CMForwardResponse ::= ENUMERATED
{
success (0),
incompatible-version (1),
service-not-supported (2)
}
CMLogonRequest ::= SEQUENCE
{
aircraftFlightIdentification [0] AircraftFlightIdentification,
cMLongTSAP [1] LongTsap,
groundInitiatedApplications [2] SEQUENCE SIZE (1..256) OF AEQualifierVersionAddress OPTIONAL,
airOnlyInitiatedApplications [3] SEQUENCE SIZE (1..256) OF AEQualifierVersion OPTIONAL,
facilityDesignation [4] FacilityDesignation OPTIONAL,
airportDeparture [5] Airport OPTIONAL,
airportDestination [6] Airport OPTIONAL,
dateTimeDepartureETD [7] DateTime OPTIONAL
}
CMLogonResponse ::= SEQUENCE
{
airInitiatedApplications [0] SEQUENCE SIZE (1..256) OF AEQualifierVersionAddress
OPTIONAL,
groundOnlyInitiatedApplications [1] SEQUENCE SIZE (1..256) OF AEQualifierVersion
OPTIONAL
}
CMUpdate ::= CMLogonResponse
Date ::= SEQUENCE
{
year Year,
month Month,
day Day
}
-- The Date field does not have to correspond to the flight if the field is not to be used;
-- the field's value can be assigned a meaningless, but compliant, value locally. If operational
-- use of the Date field is intended, there must be bilateral agreements in place to ensure its proper
-- use. This is a local implementation issue.
DateTime ::= SEQUENCE
{
date Date,
time Time
}
Day ::= INTEGER (1..31)
--unit = Day, Range (1..31), resolution = 1
FacilityDesignation ::= IA5String (SIZE(4..8))
LongTsap ::= SEQUENCE
{
rDP OCTET STRING (SIZE(5)),
shortTsap ShortTsap
}
Month ::= INTEGER (1..12)
--unit = Month, Range (1..12), resolution = 1
Response ::= ENUMERATED
{
contactSuccess (0),
contactNotSuccessful (1)
}
ShortTsap ::= SEQUENCE
{
aRS [0] OCTET STRING (SIZE(3)) OPTIONAL,
-- the aRS contains the ICAO 24 bit aircraft address when the ShortTsap belongs to an aircraft;
-- or a ground address when the Short Tsap belongs to a ground system
locSysNselTsel [1] OCTET STRING (SIZE(10..11))
}
Time ::= SEQUENCE
{
hours Timehours,
minutes Timeminutes
}
Timehours ::= INTEGER (0..23)
-- units = hour, range (0..23), resolution = 1 hour
Timeminutes ::= INTEGER (0..59)
-- units = minute, range (0..59), resolution = 1 minute
VersionNumber ::= INTEGER (1..255)
-- VersionNumber 0 is reserved for the Dialogue Service
Year ::= INTEGER (1996..2095)
--unit = Year, Range (1996..2095), resolution = 1
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:
--

25
asn1/atn-cm/atn-cm.cnf Normal file
View File

@ -0,0 +1,25 @@
# 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
#.EXPORTS
#.PDU
CMAircraftMessage
CMGroundMessage
#.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:
#

View File

@ -0,0 +1,261 @@
/* 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-cm.c
* By Mathias Guettler <guettler@web.de>
* Copyright 2013
*
* Routines for ATN context management protocol packet disassembly.
* ATN context management allows an aircraft
* to log on to a ground facility.
* details see:
* http://en.wikipedia.org/wiki/CPDLC
* http://members.optusnet.com.au/~cjr/introduction.htm
* standards:
* http://legacy.icao.int/anb/panels/acp/repository.cfm
* note:
* We are dealing with ATN/CPDLC aka ICAO Doc 9705 Ed2 here
* (CPDLC may also be transmitted via ACARS/AOA aka "FANS-1/A ").
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#include "config.h"
#include <glib.h>
#include <epan/packet.h>
#include <epan/conversation.h>
#include <epan/dissectors/packet-ber.h>
#include <epan/dissectors/packet-per.h>
#include <epan/emem.h>
#include <epan/conversation.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include "packet-atn-ulcs.h"
#define ATN_CM_PROTO "ICAO Doc9705 CM"
#include "packet-atn-cm-hf.c"
#include "packet-atn-cm-ett.c"
static gint ett_atn_cm = -1;
#include "packet-atn-cm-fn.c"
static int proto_atn_cm = -1;
static int
dissect_atn_cm(
tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
void *data _U_)
{
int type = no_msg;
proto_item *ti = NULL;
proto_tree *sub_tree = NULL;
ti = proto_tree_add_text(
tree,
tvb,
0,
tvb_reported_length_remaining(tvb, 0) ,
ATN_CM_PROTO);
sub_tree = proto_item_add_subtree(
ti,
ett_atn_cm);
/* ti = proto_tree_add_item(tree, proto_atn_cm, tvb, 0, 0 , FALSE); */
/* sub_tree = proto_item_add_subtree(ti, ett_atn_cm_pdu); */
/* determine whether it is uplink or downlink */
type = check_heur_msg_type(pinfo);
switch(type){
case um:
dissect_CMGroundMessage_PDU(
tvb,
pinfo,
sub_tree);
break;
case dm:
dissect_CMAircraftMessage_PDU(
tvb,
pinfo,
sub_tree);
break;
default:
break;
}
return tvb_reported_length_remaining(tvb, 0);
}
static gboolean
dissect_atn_cm_heur(
tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
void *data _U_)
{
atn_conversation_t *atn_cv = NULL;
gboolean is_atn_cm = FALSE;
int type;
/* determine whether it is uplink or downlink */
type = check_heur_msg_type(pinfo);
/* heuristically decode message */
switch(type){
case um:
TRY {
dissect_CMGroundMessage_PDU(
tvb,
pinfo,
NULL);
/* no exception thrown: looks like it is a CM PDU */
is_atn_cm = TRUE; }
CATCH_ALL {
is_atn_cm = FALSE; }
ENDTRY;
break;
case dm:
TRY {
dissect_CMAircraftMessage_PDU(
tvb,
pinfo,
NULL);
/* no exception thrown: looks like it is a CM PDU */
is_atn_cm = TRUE;}
CATCH_ALL {
is_atn_cm = FALSE; }
ENDTRY;
break;
default:
break;
}
if (is_atn_cm == TRUE) {
/* note: */
/* all subsequent PDU's belonging to this conversation are considered CM */
/* if the first CM 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 */
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 = cma;
}
dissect_atn_cm(
tvb,
pinfo,
tree,
NULL);
}
return is_atn_cm;
}
void proto_register_atn_cm (void)
{
static hf_register_info hf_atn_cm[] = {
#include "packet-atn-cm-hfarr.c"
};
static gint *ett[] = {
#include "packet-atn-cm-ettarr.c"
&ett_atn_cm
};
/* register CM application */
proto_atn_cm = proto_register_protocol(
ATN_CM_PROTO ,
"ATN-CM",
"atn-cm");
proto_register_field_array(
proto_atn_cm,
hf_atn_cm,
array_length(hf_atn_cm));
proto_register_subtree_array(
ett,
array_length(ett));
new_register_dissector(
"atn-cm",
dissect_atn_cm,
proto_atn_cm);
}
void proto_reg_handoff_atn_cm(void)
{
/* add session dissector to subdissector list*/
heur_dissector_add(
"atn-ulcs",
dissect_atn_cm_heur,
proto_atn_cm);
}
/*
* 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:
*/

View File

@ -0,0 +1,14 @@
# Makefile.am
# ASN.1-based plugin atn-cpdlc
# Controller Pilot DataLink Communication (CPDLC) version 1
# (Plain Old CPDLC and Protected Mode CPDLC)
# ICAO doc doc9705 Ed. 2
# Aereonautical Telecommunications Network (ATN)
#
# (c) 2013 Mathias Guettler guettler@web.de
#
include ../Makefile.preinc
include Makefile.common
include ../Makefile.inc

View File

@ -0,0 +1,30 @@
# Makefile.common
# ASN.1-based plugin atn-cpdlc
# Controller Pilot DataLink Communication (CPDLC) version 1
# (Plain Old CPDLC and Protected Mode CPDLC)
# ICAO doc doc9705 Ed. 2
# Aereonautical Telecommunications Network (ATN)
#
# (c) 2013 Mathias Guettler guettler@web.de
PROTOCOL_NAME = atn-cpdlc
EXT_ASN_FILE_LIST =
ASN_FILE_LIST = $(PROTOCOL_NAME).asn
EXTRA_DIST = \
Makefile.nmake \
$(ASN_FILE_LIST) \
packet-$(PROTOCOL_NAME)-template.c \
$(PROTOCOL_NAME).cnf
SRC_FILES = \
$(EXTRA_DIST) \
$(EXT_ASN_FILE_LIST)
# ASN1 PER unaligned encoding
A2W_FLAGS= -u -L
EXTRA_CNF=

View File

@ -0,0 +1,6 @@
include ../../config.nmake
include ../Makefile.preinc.nmake
include Makefile.common
include ../Makefile.inc.nmake

2935
asn1/atn-cpdlc/atn-cpdlc.asn Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,138 @@
# c-basic-offset: 2; tab-width: 2; indent-tabs-mode: t
# vi: set shiftwidth=2 tabstop=2 noexpandtab:
# :indentSize=2:tabSize=2:noTabs=false:
# $Id$
#.MODULE_IMPORT
#.END
#.EXPORTS
#.END
#.OMIT_ASSIGNMENT
#.END
#.PDU
AircraftPDUs
GroundPDUs
ProtectedAircraftPDUs
ProtectedGroundPDUs
#.END
#.FIELD_RENAME
AircraftPDUs/send aircraftpdus_send
GroundPDUs/send groundpdus_send
ATCUplinkMessageData/constrainedData atcuplinkmessagedata_constraineddata
ATCDownlinkMessageData/constrainedData atcdownlinkmessagedata_constraineddata
ATCDownlinkMessageData/elementIds/_item atcdownlinkmessagedata_elementids_item
ATCUplinkMessageData/elementIds/_item atcuplinkmessagedata_elementids_item
ATCDownlinkMessageData/elementIds atcdownlinkmessagedata_elementids
ATCUplinkMessageData/elementIds atcuplinkmessagedata_elementids
ATCUplinkMessage/messageData atcuplinkmessage_messagedata
ATCDownlinkMessage/messageData atcdownlinkmessage_messagedata
Runway/direction runway_direction
Winds/direction winds_direction
DirectionDegrees/direction direction
DistanceSpecifiedDirection/direction direction
Holdatwaypoint/direction direction
HoldClearance/direction direction
VerticalChange/direction vertical_direction
FixName/name fixname_name
Navaid/name navaid_name
Winds/speed winds_speed
LevelSpeed/speed levelspeed_speed
ProtectedGroundPDUs/abortProvider pmcpdlcproviderabortreason
ProtectedAircraftPDUs/abortProvider pmcpdlcproviderabortreason
ProtectedGroundPDUs/abortUser pmcpdlcuserabortreason
ProtectedAircraftPDUs/abortUser pmcpdlcuserabortreason
ProtectedStartDownMessage/mode protectedmode
ProtectedGroundPDUs/send protecteduplinkmessage
ProtectedStartDownMessage/startDownlinkMessage protecteddownlinkmessage
ProtectedGroundPDUs/startup protecteduplinkmessage
ProtectedAircraftPDUs/startdown protectedstartDownmessage
#.END
#.FN_BODY CPDLCMessage
tvbuff_t *tvb_usr = NULL;
offset = dissect_per_bit_string(tvb, offset, actx, tree, hf_index, NO_BOUND, NO_BOUND, FALSE, &tvb_usr);
switch(check_heur_msg_type(actx->pinfo)){
case dm:
dissect_atn_cpdlc_ATCDownlinkMessage(tvb_new_subset_remaining(tvb_usr, 0), 0, actx, tree, hf_index);
break;
case um:
dissect_atn_cpdlc_ATCUplinkMessage(tvb_new_subset_remaining(tvb_usr, 0), 0, actx , tree, hf_index);
break;
default:
break;
}
#.END
#.FN_BODY AlgorithmIdentifier
proto_tree *top_tree=NULL;
offset=call_ber_oid_callback(object_identifier_id, tvb, offset, actx->pinfo, top_tree);
#.END
#.FN_BODY AircraftFlightIdentification
offset = dissect_per_restricted_character_string(tvb, offset, actx, tree, hf_index,2, 8, FALSE, ia5alpha , 127, NULL);
#.END
#.FN_BODY Airport
offset = dissect_per_restricted_character_string(tvb, offset, actx, tree, hf_index,4, 4, FALSE, ia5alpha , 127, NULL);
#.END
#.FN_BODY FacilityDesignation
offset = dissect_per_restricted_character_string(tvb, offset, actx, tree, hf_index,4, 8, FALSE, ia5alpha , 127, NULL);
#.END
#.FN_BODY FreeText
offset = dissect_per_restricted_character_string(tvb, offset, actx, tree, hf_index,1, 256, FALSE, ia5alpha , 127, NULL);
#.END
#.FN_BODY NavaidName
offset = dissect_per_restricted_character_string(tvb, offset, actx, tree, hf_index,1, 4, FALSE, ia5alpha , 127, NULL);
#.END
#.FN_BODY Procedure
offset = dissect_per_restricted_character_string(tvb, offset, actx, tree, hf_index,1, 20, FALSE, ia5alpha , 127, NULL);
#.END
#.FN_BODY ProcedureTransition
offset = dissect_per_restricted_character_string(tvb, offset, actx, tree, hf_index,1, 5, FALSE, ia5alpha , 127, NULL);
#.END
#.FN_BODY Fix
offset = dissect_per_restricted_character_string(tvb, offset, actx, tree, hf_index,1, 5, FALSE, ia5alpha , 127, NULL);
#.END
#.FN_BODY ATISCode
offset = dissect_per_restricted_character_string(tvb, offset, actx, tree, hf_index,1, 1, FALSE, ia5alpha , 127, NULL);
#.END
#.FN_BODY ATSRouteDesignator
offset = dissect_per_restricted_character_string(tvb, offset, actx, tree, hf_index,2, 7, FALSE, ia5alpha , 127, NULL);
#.END
#.FN_BODY FacilityName
offset = dissect_per_restricted_character_string(tvb, offset, actx, tree, hf_index,3, 18, FALSE, ia5alpha , 127, NULL);
#.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:
#

View File

@ -0,0 +1,362 @@
/* 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
* Routines for ATN Cpdlcc protocol packet disassembly
* details see:
* http://en.wikipedia.org/wiki/CPDLC
* http://members.optusnet.com.au/~cjr/introduction.htm
* standards:
* http://legacy.icao.int/anb/panels/acp/repository.cfm
* note:
* We are dealing with ATN/CPDLC aka ICAO Doc 9705 Ed2 here
* (CPDLC may also be transmitted via ACARS/AOA aka "FANS-1/A ").
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/*
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.
*/
#include "config.h"
#include <glib.h>
#include <epan/packet.h>
#include <epan/conversation.h>
#include <epan/dissectors/packet-ber.h>
#include <epan/dissectors/packet-per.h>
#include <epan/emem.h>
#include <stdio.h>
#include <string.h>
#include "packet-atn-ulcs.h"
#define ATN_CPDLC_PROTO "ICAO Doc9705 CPDLC"
static const char *object_identifier_id;
/* forward declarations */
static void dissect_GroundPDUs_PDU(
tvbuff_t *tvb _U_,
packet_info *pinfo _U_,
proto_tree *tree _U_);
static void dissect_AircraftPDUs_PDU(
tvbuff_t *tvb _U_,
packet_info *pinfo _U_,
proto_tree *tree _U_);
static void dissect_ProtectedGroundPDUs_PDU(
tvbuff_t *tvb _U_,
packet_info *pinfo _U_,
proto_tree *tree _U_);
static void dissect_ProtectedAircraftPDUs_PDU(
tvbuff_t *tvb _U_,
packet_info *pinfo _U_,
proto_tree *tree _U_);
#include "packet-atn-cpdlc-hf.c"
#include "packet-atn-cpdlc-ett.c"
static gint ett_atn_cpdlc = -1;
#include "packet-atn-cpdlc-fn.c"
/* Wireshark ID of CPDLC protocol */
static int proto_atn_cpdlc = -1;
static int
dissect_atn_cpdlc(
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_item *ti = NULL;
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; }
ti = proto_tree_add_text(
tree,
tvb,
0,
tvb_reported_length_remaining(tvb, 0) ,
ATN_CPDLC_PROTO );
atn_cpdlc_tree = proto_item_add_subtree(
ti,
ett_atn_cpdlc);
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);
}else { /* downlink PDU's = Aircraft PDU's */
dissect_ProtectedAircraftPDUs_PDU(
tvb,
pinfo,
atn_cpdlc_tree);
}
break;
case cpdlc:
if( check_heur_msg_type(pinfo) == um ) {
/* uplink PDU's = Ground PDU's */
dissect_GroundPDUs_PDU(
tvb,
pinfo,
atn_cpdlc_tree);
}else { /* downlink PDU's = Aircraft PDU's */
dissect_AircraftPDUs_PDU(
tvb,
pinfo,
atn_cpdlc_tree);
}
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_)
{
atn_conversation_t *atn_cv = NULL;
gboolean is_atn_cpdlc = FALSE;
gboolean is_pm = FALSE;
int type = no_msg;
type = check_heur_msg_type(pinfo);
switch(type){
case um:
TRY {
dissect_ProtectedGroundPDUs_PDU(tvb, pinfo, NULL);
is_atn_cpdlc = TRUE;
is_pm = TRUE;}
break;
CATCH_ALL{
is_atn_cpdlc = FALSE;
is_pm = FALSE;}
ENDTRY;
TRY {
dissect_GroundPDUs_PDU(tvb, pinfo, NULL);
is_pm = FALSE;
is_atn_cpdlc = TRUE;
break;}
CATCH_ALL{
is_atn_cpdlc = FALSE;
is_pm = FALSE;}
ENDTRY;
break;
case dm:
TRY {
dissect_ProtectedAircraftPDUs_PDU(tvb, pinfo, NULL);
is_atn_cpdlc = TRUE;
is_pm = TRUE;
break;}
CATCH_ALL {
is_atn_cpdlc = FALSE;
is_pm = FALSE; }
ENDTRY;
TRY{
dissect_AircraftPDUs_PDU(tvb, pinfo, NULL);
is_atn_cpdlc = TRUE;
is_pm = FALSE;
break;}
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;
}
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);
}
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,
proto_atn_cpdlc);
}
/*
* 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:
*/

11
asn1/atn-ulcs/Makefile.am Normal file
View File

@ -0,0 +1,11 @@
# Makefile.am
# ASN.1-based plugin atn-pres
# presentation layer for the Aereonautical Telecommunications Network (ATN)
#
# (c) 2012 Mathias Guettler guettler@web.de
#
include ../Makefile.preinc
include Makefile.common
include ../Makefile.inc

View File

@ -0,0 +1,28 @@
# Makefile.common
# ASN.1-based plugin atn-pres
# presentation layer for the Aereonautical Telecommunications Network (ATN)
#
# (c) 2012 Mathias Guettler guettler@web.de
#
PROTOCOL_NAME = atn-ulcs
EXT_ASN_FILE_LIST =
ASN_FILE_LIST = $(PROTOCOL_NAME).asn
EXTRA_DIST = \
Makefile.nmake \
$(ASN_FILE_LIST) \
packet-$(PROTOCOL_NAME)-template.c \
packet-$(PROTOCOL_NAME)-template.h \
$(PROTOCOL_NAME).cnf
SRC_FILES = \
$(EXTRA_DIST) \
$(EXT_ASN_FILE_LIST)
# default behavoiur ASN1 PER encoding
A2W_FLAGS= -u -L
EXTRA_CNF=

View File

@ -0,0 +1,6 @@
include ../../config.nmake
include ../Makefile.preinc.nmake
include Makefile.common
include ../Makefile.inc.nmake

512
asn1/atn-ulcs/atn-ulcs.asn Normal file
View File

@ -0,0 +1,512 @@
-- c-basic-offset: 2; tab-width: 2; indent-tabs-mode: t
-- vi: set shiftwidth=2 tabstop=2 noexpandtab:
-- :indentSize=2:tabSize=2:noTabs=false:
-- File: atn-ulcs.asn
-- Sub-Volume IV ASN.1 reference definitions for ICAO Doc. 9705,
-- Second Edition
-- Version 1.1, 03 Oct 2001
-- The majority of the ULCS protocol definitions are specified in the ULCS
-- Technical Provisions by reference to ISO/IEC Standards and/or ITU-T
-- Recommendations. The ASN.1 definitions are reproduced here for ease of
-- reference and to allow explanatory annotations to be added. In the case of
-- any discrepancy between the definitions here and the corresponding
-- definitions defined in or referenced by the ULCS Technical Provisions,
-- the latter are assumed to take precedence.
-- The following ASN.1 modules are included here:
-- * General ULCS types. These are ASN.1 definitions used in the ULCS
-- Technical Provisions, though there is no equivalent ASN.1 module
-- defined there. The definitions in this module would generally be
-- incorporated into a wider "user" protocol module if using ASN.1 automated
-- tools. They are defined in a separate module here so that their syntax can
-- easily be verified by an ASN.1 syntax checker.
-- * Connection-oriented ACSE definitions. This is equivalent to the "ACSE-1"
-- module defined in the connection-oriented ACSE protocol standard.
-- * Information Framework. This is an extract of relevant definitions from the
-- InformationFramework module in the OSI standard "Directory : Models". The
-- types defined in this module are not actively used in the ULCS protocol, but
-- they are needed to satisfy IMPORTS statements in the ACSE definitions, and
-- to allow certain CHOICE types in the ACSE definitions to be sorted correctly
-- into canonical order.
-- Note.- In the following definitions, the ASN.1 comment " X" indicates
-- choice elements and optional elements in sequence types that are defined as
-- "Excluded" in the ULCS profile. That is, implementations of ULCS provisions
-- are never required to encode values for such elements (though they are
-- required to indicate the absence of these elements in all instances, by means
-- of bits in the appropriate PER preamble or choice index).
-- General ULCS types
ULCS DEFINITIONS ::= BEGIN
-- ***************************************************************************
-- The following ASN.1 definitions are from Doc 9705 Sub-Volume IV,
-- section 4.3.2.6.2
-- ***************************************************************************
--Presentation User Data is Fully-encoded-data from
--ISO/IEC 8823-1:1994/Amd.1:1997 | ITU-T Rec. X.226/Amd. 1
--Fully-encoded-data ::= SEQUENCE SIZE (1, ...) OF PDV-list
Fully-encoded-data ::= SEQUENCE SIZE (1, ..., 2..MAX) OF PDV-list
-- contains one or more presentation-data-value-list (PDV-list) values
-- ATN commentary: The SIZE constraint above differs from the referenced
-- standard, which specifies (in 8.2):
-- Fully-encoded-data ::= SEQUENCE SIZE (1, ..., 2..MAX) OF PDV-list.
-- The ULCS provisions specify a simplified, but compatible, efficiency
-- constraint as there will never be more than one element in the SEQUENCE OF
-- for the foreseeable future.
-- This simplifies matters for some compilers.
PDV-list ::= SEQUENCE {
transfer-syntax-name Transfer-syntax-name OPTIONAL, -- X
presentation-context-identifier Presentation-context-identifier,
presentation-data-values CHOICE
{ single-ASN1-type [0] ABSTRACT-SYNTAX.&Type
(CONSTRAINED BY {
-- Type corresponding to presentation context identifier -- }) , -- X
octet-aligned [1] IMPLICIT OCTET STRING, -- X
arbitrary [2] IMPLICIT BIT STRING }
-- contains one or more presentation data values from the same
-- presentation context.
-- ATN Commentary: only the arbitrary BIT STRING encoding choice is used.
}
Transfer-syntax-name ::= OBJECT IDENTIFIER -- ATN: not used for ATN Upper Layers
Presentation-context-identifier::= INTEGER -- ATN: the following values are
-- ATN-specific
{ acse-apdu (1),
reserved (2),
user-ase-apdu (3) } (1..127, ... )
-- ATN commentary: The SIZE constraint above differs from the referenced
-- standard, which specifies (in 8.2):
-- Presentation-context-identifier::= INTEGER (1..127, ..., 128..MAX ).
-- The ULCS provisions specify a simplified, but compatible, efficiency
-- constraint as there will never be more than 127 presentation contexts in
-- ATN for the foreseeable future.
-- This simplifies matters for some compilers. The list of defined values is
-- shown here for guidance only, and has no effect on the PER encoding.
END -- of ULCS definitions
-- Connection-oriented ACSE definitions
--*************************************************************************
-- The ACSE abstract syntax from ISO/IEC 8650-1/Amd.1 | ITU-T Rec. X.227/
-- Amd. 1 is reproduced here for ease of reference. In case of any discrepancy,
-- the ISO/IEC standard takes precedence.
--*************************************************************************
ACSE-1 {joint-iso-itu-t association-control(2) modules(0) apdus(0) version1(1)}
-- ACSE-1 refers to ACSE version 1
DEFINITIONS ::=
BEGIN
EXPORTS
acse-as-id, ACSE-apdu, aCSE-id, Application-context-name, AP-title,
AE-qualifier, -- AE-title, (ATN: AE-title is not needed)
AP-invocation-identifier,
AE-invocation-identifier, Mechanism-name, Authentication-value,
ACSE-requirements;
IMPORTS Name, RelativeDistinguishedName
FROM InformationFramework
{ joint-iso-ccitt ds(5) module(1) informationFramework(1) 2 };
-- The data types Name and RelativeDistinguishedName are imported
-- from ISO/IEC 9594-2 | ITU-T Rec. X.501.
-- ATN Commentary: The relevant InformationFramework extracts are given
-- below.
-- *************************************************************************
-- EXTERNAL
-- *************************************************************************
-- EXTERNAL is an ASN.1 UNIVERSAL type. The definition in the PER standard
-- ISO/IEC 8825-2 | ITU-T Rec. X.691 is assumed for ACSE.
-- The type is used in ACSE user-information
-- fields. ASN.1 compilers will not in general allow EXTERNAL to be
-- redefined (therefore 'EXTERNALt'),
-- and it is invalid ASN.1 to define a type with tag [UNIVERSAL 8]
--
-- Workaround for bug in asn2wrs in the .cnf file
-- to handle the lack of support for tagged assignments.
-- remove that workaround once asn2wrs learns how to handle
-- tagged assignments.
--
EXTERNALt ::= [8] IMPLICIT SEQUENCE {
direct-reference OBJECT IDENTIFIER OPTIONAL, -- X
indirect-reference INTEGER OPTIONAL,
data-value-descriptor ObjectDescriptor OPTIONAL, -- X
encoding CHOICE {
single-ASN1-type [0] ABSTRACT-SYNTAX.&Type,
octet-aligned [1] IMPLICIT OCTET STRING, -- X
arbitrary [2] IMPLICIT BIT STRING }}
-- ATN: implementations are advised to use arbitrary (BIT STRING)
-- encodings only (see Guidance Material section 2.6.5.21).
-- BIT STRING values are not padded to octet boundaries.
-- object identifier assignments
acse-as-id OBJECT IDENTIFIER ::=
{joint-iso-itu-t association-control(2) abstract-syntax(1) apdus(0) version1(1)}
-- may be used to reference the abstract syntax of the ACSE APDUs
aCSE-id OBJECT IDENTIFIER ::=
{ joint-iso-itu-t association-control(2) ase-id(3) acse-ase(1) version(1) }
-- may be used to identify the Association Control ASE.
-- top level CHOICE
ACSE-apdu ::= CHOICE
{
aarq AARQ-apdu, -- ACSE associate request pdu
aare AARE-apdu, -- ACSE associate response pdu
rlrq RLRQ-apdu, -- ACSE release request pdu
rlre RLRE-apdu, -- ACSE release response pdu
abrt ABRT-apdu, -- ACSE abort pdu
...
}
AARQ-apdu ::= [ APPLICATION 0 ] IMPLICIT SEQUENCE
{ protocol-version [0] IMPLICIT BIT STRING { version1 (0) } DEFAULT { version1 }, -- X
application-context-name [1] Application-context-name,
called-AP-title [2] AP-title OPTIONAL, -- X
called-AE-qualifier [3] AE-qualifier OPTIONAL, -- X
called-AP-invocation-identifier [4] AP-invocation-identifier OPTIONAL, -- X
called-AE-invocation-identifier [5] AE-invocation-identifier OPTIONAL, -- X
calling-AP-title [6] AP-title OPTIONAL,
calling-AE-qualifier [7] AE-qualifier OPTIONAL,
calling-AP-invocation-identifier [8] AP-invocation-identifier OPTIONAL, -- X
calling-AE-invocation-identifier [9] AE-invocation-identifier OPTIONAL, -- X
-- The following field is not present if only the Kernel is used.
-- ATN: For Doc 9705 ed 1/ed 2, only the Kernel is required.
sender-acse-requirements [10] IMPLICIT ACSE-requirements OPTIONAL,
-- The following field is only present if the Authentication functional
-- unit is selected. ATN: not used in Doc 9705 ed 1/ed 2.
mechanism-name [11] IMPLICIT Mechanism-name OPTIONAL,
-- The following field is only present if the Authentication functional
-- unit is selected. ATN: use is deprecated in Doc 9705 ed 1/ed 2.
calling-authentication-value [12] EXPLICIT Authentication-value OPTIONAL,
application-context-name-list [13] IMPLICIT Application-context-name-list OPTIONAL, -- X
-- The above field is only present if the Application Context Negotiation
-- functional unit is selected - never for ATN
implementation-information [29] IMPLICIT Implementation-data OPTIONAL, -- X
..., ..., -- ATN: Note use of extension marker pair
user-information [30] IMPLICIT Association-information OPTIONAL
}
AARE-apdu ::= [ APPLICATION 1 ] IMPLICIT SEQUENCE
{ protocol-version [0] IMPLICIT BIT STRING{ version1 (0) }
DEFAULT { version1 }, -- X
application-context-name [1] Application-context-name,
result [2] Associate-result,
result-source-diagnostic [3] Associate-source-diagnostic,
responding-AP-title [4] AP-title OPTIONAL, -- X
responding-AE-qualifier [5] AE-qualifier OPTIONAL, -- X
responding-AP-invocation-identifier [6] AP-invocation-identifier OPTIONAL, -- X
responding-AE-invocation-identifier [7] AE-invocation-identifier OPTIONAL, -- X
-- The following field is not present if only the Kernel is used.
-- ATN: For Doc 9705 ed 1/ed 2, only the Kernel is required.
responder-acse-requirements [8] IMPLICIT ACSE-requirements OPTIONAL,
-- The following field is only present if the Authentication functional
-- unit is selected. ATN: not used in Doc 9705 ed 1/ed 2.
mechanism-name [9] IMPLICIT Mechanism-name OPTIONAL,
-- The following field is only present if the Authentication functional
-- unit is selected. ATN: use is deprecated in Doc 9705 ed 1/ed 2.
responding-authentication-value [10] EXPLICIT Authentication-value OPTIONAL,
application-context-name-list [11] IMPLICIT Application-context-name-list
OPTIONAL, -- X
-- The above field is only present if the Application Context Negotiation
-- functional unit is selected - never for ATN
implementation-information [29] IMPLICIT Implementation-data OPTIONAL, --X
..., ..., -- ATN: Note use of extension marker pair
user-information [30] IMPLICIT Association-information OPTIONAL
}
RLRQ-apdu ::= [ APPLICATION 2 ] IMPLICIT SEQUENCE
{ reason [0] IMPLICIT Release-request-reason OPTIONAL,
..., ..., -- ATN: Note use of extension marker pair
user-information [30] IMPLICIT Association-information OPTIONAL
}
RLRE-apdu ::= [ APPLICATION 3 ] IMPLICIT SEQUENCE
{ reason [0] IMPLICIT Release-response-reason OPTIONAL,
..., ..., -- ATN: Note use of extension marker pair
user-information [30] IMPLICIT Association-information OPTIONAL
}
ABRT-apdu ::= [ APPLICATION 4 ] IMPLICIT SEQUENCE
{ abort-source [0] IMPLICIT ABRT-source,
abort-diagnostic [1] IMPLICIT ABRT-diagnostic OPTIONAL,
-- The above field is not present if only the Kernel is used.
-- ATN: For Doc 9705 ed 1/ed 2, only the Kernel is required.
..., ..., -- ATN: Note use of extension marker pair
user-information [30] IMPLICIT Association-information OPTIONAL
}
ABRT-diagnostic ::= ENUMERATED
{ no-reason-given (1),
protocol-error (2),
authentication-mechanism-name-not-recognized (3),
authentication-mechanism-name-required (4),
authentication-failure (5),
authentication-required (6),
... }
ABRT-source ::= INTEGER { acse-service-user (0), acse-service-provider (1)} (0..1, ...)
ACSE-requirements ::= BIT STRING
{ authentication (0), application-context-negotiation(1) }
-- ATN commentary: application-context-negotiation (bit 1) is
-- never set for ATN ULCS. Use of authentication is deprecated
-- for Doc 9705 ed 1/ed 2.
Application-context-name-list ::= SEQUENCE OF Application-context-name
-- ATN Commentary: the above type is not used for ATN ULCS.
Application-context-name ::= OBJECT IDENTIFIER
-- ***************************************************************************
-- Application-entity title productions follow (not in alphabetical order)
-- ***************************************************************************
-- MG: asn2wrs cannot handle untagged CHOICEs within either a SET or a SEQUENCE.
-- http://wiki.wireshark.org/Asn2wrs_Handmassaging_the_ASN_file
AP-title ::= CHOICE { -- ATN: See encoding guidance in 2.5.11
-- "form2" is encoded as 0 and "form1" as 1
ap-title-form2 [0] IMPLICIT AP-title-form2, -- Object Identifier form
ap-title-form1 [1] IMPLICIT AP-title-form1, -- X (Directory name form)
... }
AE-qualifier ::= CHOICE {-- ATN: See encoding guidance in 2.5.11
-- "form2" is encoded as 0 and "form1" as 1
ae-qualifier-form2 [0] IMPLICIT AE-qualifier-form2, -- INTEGER form
ae-qualifier-form1 [1] IMPLICIT AE-qualifier-form1, -- X (RDN form)
... }
-- ATN commentary: AE-qualifier is set to "app-type" in Doc 9705 1st and
-- 2nd editions. For forward compatibility, the value should not be
-- analysed.
-- When both AP-title and AE-qualifier data values are present in an AARQ or
-- AARE APDU, both have the same form to allow the construction of an
-- AE-title as discussed in CCITT Rec. X.665 | ISO/IEC 9834-6.
AP-title-form1 ::= Name -- ATN: Not used for ATN ULCS
-- The value assigned to AP-title-form1 is The Directory Name of an
-- application-process title.
AE-qualifier-form1 ::= RelativeDistinguishedName -- ATN: Not used for ULCS
-- The value assigned to AE-qualifier-form1 is the relative distinguished name
-- of a particular application-entity of the application-process identified by
-- AP-title-form1.
AP-title-form2 ::= OBJECT IDENTIFIER
AE-qualifier-form2 ::= INTEGER
-- ATN commentary: The AE-title productions below are commented out,
-- as they are not required for ATN ULCS.
-- AE-title ::= CHOICE {
-- ae-title-form1 AE-title-form1,
-- ae-title-form2 AE-title-form2,
-- ... }
--
-- As defined in CCITT Rec. X.650 | ISO 7498-3, an application-entity title is
-- composed of an application-process title and an application-entity qualifier.
-- The ACSE protocol provides for the transfer of an application-entity title
-- value by the transfer of its component values. However, the following data
-- type is provided for International Standards that reference a single
-- syntactic structure for AE titles. (Not used for ATN ULCS)
--
-- AE-title-form1 ::= Name
-- For access to The Directory (ITU-T Rec. X.500-Series | ISO/IEC 9594), an
-- AE title has AE-title-form1.
-- This value can be constructed from AP-title-form1 and AE-qualifier-form1
-- values contained in an AARQ or AARE APDU. A discussion of forming an
-- AE-title-form1 from AP-title-form1 and AE-qualifier-form1 may be found in
-- CCITT Rec. X.665 | ISO/IEC 9834-6.
--
-- AE-title-form2 ::= OBJECT IDENTIFIER
-- A discussion of forming an AE-title-form2 from AP-title-form2 and
-- AE-qualifier-form2 may be found in CCITT Rec. X.665 | ISO/IEC 9834-6.
AE-invocation-identifier ::= INTEGER -- ATN: not used in ULCS
AP-invocation-identifier ::= INTEGER -- ATN: not used in ULCS
-- End of Application-entity title productions
-- ***************************************************************************
Associate-result ::= INTEGER
{ accepted (0),
rejected-permanent (1),
rejected-transient (2) } (0..2, ...)
Associate-source-diagnostic ::= CHOICE
{ acse-service-user [1] INTEGER
{ null (0),
no-reason-given (1),
application-context-name-not-supported (2),
calling-AP-title-not-recognized (3),
calling-AP-invocation-identifier-not-recognized (4),
calling-AE-qualifier-not-recognized (5),
calling-AE-invocation-identifier-not-recognized (6),
called-AP-title-not-recognized (7),
called-AP-invocation-identifier-not-recognized (8),
called-AE-qualifier-not-recognized (9),
called-AE-invocation-identifier-not-recognized (10),
authentication-mechanism-name-not-recognized (11),
authentication-mechanism-name-required (12),
authentication-failure (13),
authentication-required (14) } (0..14 , ...),
acse-service-provider [2] INTEGER
{ null (0),
no-reason-given (1),
no-common-acse-version (2) } (0..2 , ...)
}
Association-information ::= SEQUENCE SIZE (1, ..., 0 | 2..MAX) OF EXTERNALt
-- ATN: No SIZE extensions are defined, only one EXTERNAL element is present
Implementation-data ::= OCTET STRING -- ATN: Not used for ULCS
Mechanism-name ::= OBJECT IDENTIFIER -- ATN: Not used for ULCS
MECHANISM-NAME ::=TYPE-IDENTIFIER -- ATN: Not used for ULCS
ObjectSet MECHANISM-NAME ::= {...} -- ATN: Not used for ULCS
Release-request-reason ::= INTEGER {normal (0), urgent (1), user-defined (30)} (0 | 1 | 30, ...)
Release-response-reason ::= INTEGER {normal (0), not-finished (1), user-defined (30)} (0 | 1 | 30, ...)
-- ATN commentary: For the above two types, see the encoding guidance in 2.5.10
-- Values are encoded in 5 bits, not 3 as might be expected.
Authentication-value ::= CHOICE -- ATN: use is deprecated in ed 1/ed 2
{ charstring [0] IMPLICIT OCTET STRING,
bitstring [1] IMPLICIT BIT STRING,
external [2] IMPLICIT EXTERNAL,
other [3] IMPLICIT SEQUENCE {
-- other-mechanism-name MECHANISM-NAME.&id ({ObjectSet}),
other-mechanism-name OBJECT IDENTIFIER,
-- other-mechanism-value MECHANISM-NAME.&Type ({ObjectSet}{@.other-mechanism-name})
other-mechanism-value ANY
} -- X
}
-- The abstract syntax of (calling/responding) authentication-value is
-- determined by the authentication mechanism used during association
-- establishment. The authentication mechanism is either explicitly
-- denoted by the &id field (of type OBJECT IDENTIFIER) for a mechanism
-- belonging to the class MECHANISM-NAME, or it is known implicitly by
-- prior agreement between the communicating partners. If the "other"
-- component is chosen, then the "mechanism-name" component is present
-- in accordance with ITU-T Rec. X.680|ISO/IEC 8824. If the value
-- "mechanism-name" occurs in the AARQ-apdu or the AARE-apdu, then that
-- value is the same as the value for "other-mechanism-name"
END -- of Connection-Oriented ACSE definitions
-- *************************************************************************
-- The following definitions are adapted from the Directory standard
-- ISO/IEC 9594-2:1993 | ITU-T Rec. X.501 (1993 E). In case of any discrepancy,
-- the ISO/IEC standard takes precedence.
-- *************************************************************************
InformationFramework {joint-iso-ccitt ds(5) module(1) informationFramework(1) 2}
DEFINITIONS ::=
BEGIN
EXPORTS Name, RelativeDistinguishedName;
Name ::= CHOICE {rdnSequence RDNSequence}
-- only one CHOICE defined
RDNSequence ::= SEQUENCE OF RelativeDistinguishedName
RelativeDistinguishedName ::= SET SIZE (1 .. MAX) OF AttributeTypeAndValue
AttributeTypeAndValue ::= SEQUENCE {
-- ATN commentary: The following line has been inserted to allow the Name and
-- RelativeDistinguishedName types, as used by ACSE, to be resolved by an
-- ASN.1 compiler, without introducing the unnecessary complexity
-- Of the ATTRIBUTE information object class, which is used in the
-- Directory standards.
null NULL}
-- The "real" components of AttributeTypeAndValue follow. They have been
-- commented out here, but could be restored if required, for example, for
-- sharing data types with a Directory implementation. The syntax has been
-- verified by the OSS syntax checker.
-- type ATTRIBUTE.&id ({SupportedAttributes}),
-- value ATTRIBUTE.&Type ({SupportedAttributes} {@type})
--}
--SupportedAttributes ATTRIBUTE ::=
-- {objectClass | aliasedEntryName, ...}
-- ATN Commentary: ATTRIBUTE is an information object class, specified in
-- ISO/IEC 9594-2 | ITU-T Rec. X.501, using the notation defined in
-- ISO/IEC 8824-2 | ITU-T Rec. X.681. However, for ULCS implementation, it
-- is only necessary to note that the ACSE CHOICE types AP-title,
-- AE-qualifier and AE-title are all constrained to be the "form 2" variants,
-- with types Object Identifier, Integer and Object Identifier, respectively.
-- It is however necessary to know the syntax of the "form 1" variants (Name,
-- RelativeDistinguishedName and Name, respectively) so that the CHOICE
-- elements can be sorted into canonical order, based on their ASN.1 types,
-- for PER encoding (see 2.5.11).
--
--ATTRIBUTE ::= CLASS {
-- &derivation ATTRIBUTE OPTIONAL,
-- &Type OPTIONAL,
-- &equality-match MATCHING-RULE OPTIONAL,
-- &ordering-match MATCHING-RULE OPTIONAL,
-- &substrings-match MATCHING-RULE OPTIONAL,
-- &single-valued BOOLEAN DEFAULT FALSE,
-- &collective BOOLEAN DEFAULT FALSE,
-- &no-user-modification BOOLEAN DEFAULT FALSE,
-- &usage AttributeUsage DEFAULT userApplications,
-- &id OBJECT IDENTIFIER UNIQUE }
--
--MATCHING-RULE ::= CLASS {
-- &AssertionType OPTIONAL,
-- &id OBJECT IDENTIFIER UNIQUE }
--objectClass ATTRIBUTE ::= {
-- &Type OBJECT IDENTIFIER,
-- &id id-at-objectClass
--}
--
--aliasedEntryName ATTRIBUTE ::= {
-- &Type OBJECT IDENTIFIER,
-- &id id-at-aliasedEntryName
--}
--
--AttributeUsage ::= ENUMERATED {
-- userApplications (0),
-- directoryOperation (1),
-- distributedOperation (2),
-- dSAOperation (3) }
--
--id-at-objectClass OBJECT IDENTIFIER ::= {id-at 0}
--id-at-aliasedEntryName OBJECT IDENTIFIER ::= {id-at 1}
--id-at OBJECT IDENTIFIER ::= {joint-iso-ccitt ds(5) attributeType(4)}
END -- of Directory Information Framework extracts
--
-- 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:
--

553
asn1/atn-ulcs/atn-ulcs.cnf Normal file
View File

@ -0,0 +1,553 @@
# 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
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_item *ti = NULL;
proto_tree *atn_ulcs_tree = NULL;
atn_conversation_t *atn_cv = NULL;
/* extract bitstring into new tvb buffer */
offset = dissect_per_bit_string(
tvb,
offset,
actx,
tree,
hf_index,
NO_BOUND,
NO_BOUND,
FALSE,
&tvb_usr);
/* call appropiate dissector for bitstring data */
switch(ulcs_context_value){
case 1: /* ACSE PDU*/
ti = proto_tree_add_text(
root_tree,
tvb,
offset,
0,
ATN_ACSE_PROTO );
atn_ulcs_tree = proto_item_add_subtree(ti, ett_atn_acse);
dissect_ACSE_apdu_PDU(
tvb_new_subset_remaining(tvb_usr, 0),
pinfo,
atn_ulcs_tree);
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,
NULL);
break;
}
}
else{
dissector_try_heuristic(
atn_ulcs_heur_subdissector_list,
tvb_new_subset_remaining(tvb_usr,0),
actx->pinfo,
root_tree,
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);
#.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);
#.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 = (atn_conversation_t*)
se_alloc(sizeof(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 = (atn_conversation_t*)
se_alloc(sizeof(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 *) se_tree_lookup32(
aarq_data_tree,
aircraft_24_bit_address);
if(!aarq_data){ /* aarq data not found, create new record */
/* alloc aarq data */
aarq_data = (aarq_data_t*) se_alloc(sizeof(aarq_data_t));
aarq_data-> aarq_pending = FALSE;
/* insert aarq data */
se_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 *) se_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;
/* 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);
/* 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,
NULL);
break;
}
}else {
dissector_try_heuristic(
atn_ulcs_heur_subdissector_list,
tvb_new_subset_remaining(tvb_usr,0),
actx->pinfo,
root_tree,
NULL);
}
offset += tvb_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:
#

View File

@ -0,0 +1,925 @@
/* 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-ulcs.c
* By Mathias Guettler <guettler@web.de>
* Copyright 2013
*
* Routines for ATN upper layer
* protocol packet disassembly
* ATN upper layers are embedded within OSI Layer 4 (COTP).
*
* ATN upper layers contain:
* Session Layer (NUL protocol option)
* Presentation Layer (NUL protocol option)
* ATN upper Layer/Application (ACSE PDU or PDV-list PDU)
* ATN applications protocols (i.e. CM or CPDLC) are contained within
* ACSE user-information or PDV presentation data.
* details see:
* http://en.wikipedia.org/wiki/CPDLC
* http://members.optusnet.com.au/~cjr/introduction.htm
* standards:
* http://legacy.icao.int/anb/panels/acp/repository.cfm
* note:
* We are dealing with ATN/ULCS aka ICAO Doc 9705 Ed2 here
* (don't think there is an ULCS equivalent for "FANS-1/A ").
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
/*
developper comments:
why not using existing ses, pres and acse dissectors ?
ATN upper layers are derived from OSI standards for session,
presentation and application but the encoding differs
(it's PER instead of BER encoding to save bandwith).
Session and presentation use the "null" encoding option,
meaning that they are only present at connection establishment
and ommitted otherwise.
Instead of adapting existing dissectors it seemed simpler and cleaner
to implement everything the new atn-ulcs dissector.
why using conversations ?
PER encoded user data is ambigous; the same encoding may apply to a CM or
CPDLC PDU. The workaround is to decode on a transport connection basis.
I use my own version of conversations to identify
the transport connection the PDU belongs to for the standard functions
from "conversation.h" didn't work out.
what is the use of AARQ/AARE data ?
Converstions should be maintained on the COTP layer in a standard way
for there are usually more packets available than in the layers above.
In the worst case my dissector is called from a DT packet which
has destination references but no source reference.
I have to guess the reference used the other way round
(curently I am using ACSE PDU'S used during OSI connection establishment for that).
The idea is that each ACSE AARQ is answered by ACSE AARE and having this sequence
I have all the source/destination references for this transport connection.
I use AARQ/AARE data to store the source/destination reference of AARQ as well
as the optional ae-qualifier which tells me the application and
the dissector I have to use.
This approach donesn't work well when there are interleaving AARQ/AARE sequences for
the same aircraft.
which ATN standard is supported ?
The dissector has been tested with ICAO doc9705 Edition2 compliant traffic.
No ATN Secutity is supported.
note:
The ATN upper layers are derived from OSI standards (ICAO DOC 9705)
while ATN/IPS (ICAO DOC 9896) which is entirely based on IPV6.
*/
/*
known defects/deficiencies:
- user-information within AARE is sometines not decoded due to an unset flag
(the field is optional). As far as I can tell asn2wrs is right here,
but on the other hand I know that in all of this cases user-information
is present and is processed by the ATN end system.
Maybe a true ATN expert may help me out here.
- The conversation handling is based on src/dst addresses as well as
source or destination references depending on the TP4 packet type.
This means that after some time these references get reused for
new conversations. This almost certain happens for traces longer
than one day rendering this dissector unsuitable for captures exceeding
this one day.
*/
#include "config.h"
#include <glib.h>
#include <epan/packet.h>
#include <epan/dissectors/packet-ber.h>
#include <epan/dissectors/packet-per.h>
#include <epan/emem.h>
#include <epan/address.h>
#include <epan/conversation.h>
#include <stdio.h>
#include <string.h>
#include <stdint.h>
#include "packet-atn-ulcs.h"
#define ATN_ACSE_PROTO "ICAO Doc9705 ULCS ACSE (ISO 8649/8650-1:1996)"
#define ATN_ULCS_PROTO "ICAO Doc9705 ULCS"
static heur_dissector_list_t atn_ulcs_heur_subdissector_list;
/* presentation subdissectors i.e. CM, CPDLC */
static dissector_handle_t atn_cm_handle = NULL;
static dissector_handle_t atn_cpdlc_handle = NULL;
static int proto_atn_ulcs = -1;
static guint32 ulcs_context_value = 0;
static const char *object_identifier_id;
static emem_tree_t *aarq_data_tree = NULL;
static emem_tree_t *atn_conversation_tree = NULL;
static proto_tree *root_tree = NULL;
/* forward declarations for functions generated from asn1 */
static int dissect_atn_ulcs_T_externalt_encoding_single_asn1_type(
tvbuff_t *tvb _U_,
int offset _U_,
asn1_ctx_t *actx _U_,
proto_tree *tree _U_,
int hf_index
_U_);
static int dissect_atn_ulcs_T_externalt_encoding_octet_aligned(
tvbuff_t *tvb _U_,
int offset _U_,
asn1_ctx_t *actx _U_,
proto_tree *tree _U_,
int hf_index _U_);
static int dissect_atn_ulcs_T_externalt_encoding_arbitrary(
tvbuff_t *tvb _U_,
int offset _U_,
asn1_ctx_t *actx _U_,
proto_tree *tree _U_,
int hf_index _U_);
static void dissect_ACSE_apdu_PDU(
tvbuff_t *tvb _U_,
packet_info *pinfo _U_,
proto_tree *tree _U_);
guint32 dissect_per_object_descriptor_t(
tvbuff_t *tvb,
guint32 offset,
asn1_ctx_t *actx,
proto_tree *tree,
int hf_index,
tvbuff_t **value_tvb);
static gint dissect_atn_ulcs(
tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
void *data _U_);
#include "packet-atn-ulcs-hf.c"
#include "packet-atn-ulcs-ett.c"
static gint ett_atn_ulcs = -1;
static gint ett_atn_acse = -1;
#include "packet-atn-ulcs-fn.c"
/* re-implementing external data: packet-per.c */
static const value_string per_External_encoding_vals[] = {
{ 0, "single-ASN1-type" },
{ 1, "octet-aligned" },
{ 2, "arbitrary" },
{ 0, NULL }
};
/* re-implementing external data: packet-per.c */
static const per_choice_t External_encoding_choice[] =
{
{ 0,
&hf_atn_ulcs_externalt_encoding_single_asn1_type,
ASN1_NO_EXTENSIONS,
dissect_atn_ulcs_T_externalt_encoding_single_asn1_type
},
{ 1,
&hf_atn_ulcs_externalt_encoding_octet_aligned,
ASN1_NO_EXTENSIONS,
dissect_atn_ulcs_T_externalt_encoding_octet_aligned
},
{ 2,
&hf_atn_ulcs_externalt_encoding_arbitrary,
ASN1_NO_EXTENSIONS,
dissect_atn_ulcs_T_externalt_encoding_arbitrary
},
{ 0,
NULL,
0,
NULL
}
};
/* ATN Session layer */
#define SES_PDU_TYPE_MASK 0xf8
#define SES_PARAM_IND_MASK 0x04
#define SES_PARAM_B2_MASK 0x02
#define SES_PARAM_B1_MASK 0x01
static int hf_atn_ses_type = -1;
static int hf_atn_ses_param_ind = -1;
static int hf_atn_ses_param_b1 = -1;
static int hf_atn_ses_param_b2 = -1;
static gint ett_atn_ses = -1;
#define ATN_SES_PROTO "ICAO Doc9705 ULCS Session (ISO 8326/8327-1:1994)"
const value_string atn_ses_param_ind[] =
{
{0, "No Parameter Indication "},
{1, "Parameter Indication "},
{0, NULL }
};
const value_string srf_b2[] =
{
{0, "Transport Connection is kept"},
{1, "Transport Connection is released" },
{0, NULL }
};
const value_string srf_b1[] =
{
{0, "Transport Connection is transient"},
{1, "Transport Connection is persistent"},
{0, NULL }
};
#define SES_ATN_SCN 0xe8
#define SES_ATN_SCNC 0xf8
#define SES_ATN_SAC 0xf0
#define SES_ATN_SACC 0xd8
#define SES_ATN_SRF 0xe0
#define SES_ATN_SRFC 0xa0
const value_string atn_ses_type[] =
{
{ 0x1d, "Short Connect (SCN) SPDU" },
{ 0x1f, "Short Connect Accept (SAC) SPDU" },
{ 0x1e, "Short Connect Accept Continue (SACC) SPDU" },
{ 0x1c, "Short Refuse (SRF) SPDU" },
{ 0x14, "Short Refuse Continue (SRFC) SPDU" },
{0, NULL }
};
/* ATN Presentation layer */
#define ATN_PRES_PROTO "ICAO Doc9705 ULCS Presentation (ISO 8822/8823-1:1994)"
static int hf_atn_pres_err = -1;
static gint ett_atn_pres = -1;
#define ATN_SES_PRES_MASK 0xf803
#define PRES_CPR_ER_MASK 0x70
/* type determined by SPDU and PPDU */
const value_string atn_pres_vals[] =
{
{ 0xe802, "Short Presentation Connect PPDU (CP) " },
{ 0xf802, "Short Presentation Connect PPDU (CP) " },
{ 0xf002, "Short Presentation Connect Accept PPDU (CPA)" },
{ 0xd802, "Short Presentation Connect Accept PPDU (CPA)" },
{ 0xe002, "Short Presentation Connect Reject PPDU (CPR)" },
{ 0xa002, "Short Presentation Connect Reject PPDU (CPR)" },
{0, NULL }
};
/* Short Presentation Connect Reject PPDU's 0yyy 00zz */
const value_string atn_pres_err[] =
{
{ 0x00, "Presentation-user" },
{ 0x01, "Reason not specified (transient)"},
{ 0x02, "Temporary congestion (transient)"},
{ 0x03, "Local limit exceeded (transient)"},
{ 0x04, "Called presentation-address unknown (permanent)"},
{ 0x05, "Protocol version not supported (permanent)"},
{ 0x06, "Default context not supported (permanent)"},
{ 0x07, "User data not readable (permanent)"},
{ 0, NULL }
};
/* re-implementing external data: packet-per.c */
static int atn_ulcs_Externalt_encoding(
tvbuff_t *tvb _U_,
int offset _U_,
asn1_ctx_t *actx _U_,
proto_tree *tree _U_,
int hf_index _U_)
{
offset = dissect_per_choice(
tvb,
offset,
actx,
tree,
hf_index,
ett_atn_ulcs_EXTERNALt,
External_encoding_choice,
&actx->external.encoding);
return offset;
}
/* re-implementing external data: packet-per.c */
guint32 atn_per_external_type(
tvbuff_t *tvb _U_,
guint32 offset,
asn1_ctx_t *actx,
proto_tree *tree _U_,
int hf_index _U_,
per_type_fn type_cb)
{
memset(&actx->external, '\0', sizeof(actx->external));
actx->external.hf_index = -1;
actx->external.encoding = -1;
actx->external.u.per.type_cb = type_cb;
offset = atn_ulcs_Externalt_encoding(
tvb,
offset,
actx,
tree,
hf_index);
memset(
&actx->external,
'\0',
sizeof(actx->external));
actx->external.hf_index = -1;
actx->external.encoding = -1;
return offset;
}
/* determine 24-bit aircraft address(ARS) */
/* from 20-byte ATN NSAP. */
guint32 get_aircraft_24_bit_address_from_nsap(
packet_info *pinfo)
{
guint8* addr = NULL;
guint32 ars =0;
guint32 adr_prefix =0;
/* check NSAP address type*/
if( (pinfo->src.type != AT_OSI) ||
(pinfo->dst.type != AT_OSI)) {
return ars; }
/* 20 octets address length required */
/* for ATN */
if( (pinfo->src.len != 20) ||
(pinfo->dst.len != 20)) {
return ars; }
/* first try source address */
/* if the src address originates */
/* from an aircraft it's downlink */
/* convert addr into 32-bit integer */
addr = (guint8*) pinfo->src.data;
adr_prefix =
((addr[0]<<24) |
(addr[1]<<16) |
(addr[2]<<8) |
addr[3] );
/* according to ICAO doc9507 Ed2 SV5 */
/* clause 5.4.3.8.1.5 and 5.4.3.8.1.3 */
/* mobile addresses contain "c1" of "41" */
/* in the VER subfield of the NSAP */
if((adr_prefix == 0x470027c1) ||
(adr_prefix == 0x47002741)) {
/* ICAO doc9507 Ed2 SV5 5.4.3.8.4.4 */
/* states that the ARS subfield containes */
/* the 24-bitaddress of the aircraft */
ars = ((addr[8])<<16) |
((addr[9])<<8) |
(addr[10]);
}
/* try destination address */
/* if the src address originates */
/* from an aircraft it's downlink */
/* convert addr into 32-bit integer */
addr = (guint8*) pinfo->dst.data;
adr_prefix = ((addr[0]<<24) |
(addr[1]<<16) |
(addr[2]<<8) |
addr[3] );
/* according to ICAO doc9507 Ed2 SV5 */
/* clause 5.4.3.8.1.5 and 5.4.3.8.1.3 */
/* mobile addresses contain "c1" of "41" */
/* in the VER subfield of the NSAP */
if((adr_prefix == 0x470027c1) ||
(adr_prefix == 0x47002741)) {
/* ICAO doc9507 Ed2 SV5 5.4.3.8.4.4 */
/* states that the ARS subfield containes */
/* the 24-bitaddress of the aircraft */
ars = ((addr[8])<<16) |
((addr[9])<<8) |
(addr[10]);
}
return ars;
}
/* determine whether a PDU is uplink or downlink */
/* by checking for known aircraft address prefices*/
int check_heur_msg_type(packet_info *pinfo _U_)
{
int t = no_msg;
guint8* addr = NULL;
guint32 adr_prefix =0;
/* check NSAP address type*/
if( (pinfo->src.type != AT_OSI) || (pinfo->dst.type != AT_OSI)) {
return t; }
/* check NSAP address length; 20 octets address length required */
if( (pinfo->src.len != 20) || (pinfo->dst.len != 20)) {
return t; }
addr = (guint8*) pinfo->src.data;
/* convert address to 32-bit integer */
adr_prefix = ((addr[0]<<24) | (addr[1]<<16) | (addr[2]<<8) | addr[3] );
/* According to the published ATN NSAP adddressing scheme */
/* in ICAO doc9705 Ed2 SV5 5.4.3.8.1.3 and 5.4.3.8.1.5 */
/* the "VER" field shall be 0x41 ("all Mobile AINSC") or */
/* 0xc1 ("all Mobile ATSC") for mobile stations (aka aircraft).*/
if((adr_prefix == 0x470027c1) || (adr_prefix == 0x47002741)) {
t = dm; /* source is an aircraft: it's a downlink PDU */
}
addr = (guint8*) pinfo->dst.data;
/* convert address to 32-bit integer */
adr_prefix = ((addr[0]<<24) | (addr[1]<<16) | (addr[2]<<8) | addr[3] );
/* According to the published ATN NSAP adddressing scheme */
/* in ICAO doc9705 Ed2 SV5 5.4.3.8.1.3 and 5.4.3.8.1.5 */
/* the "VER" field shall be 0x41 ("all Mobile AINSC") or */
/* 0xc1 ("all Mobile ATSC") for mobile stations (aka aircraft).*/
if((adr_prefix == 0x470027c1) || (adr_prefix == 0x47002741)) {
t = um; /* destination is aircraft: uplink PDU */
}
return t;
}
/* conversation may be used by other dissectors */
emem_tree_t *get_atn_conversation_tree(void){
return atn_conversation_tree;
}
/* find a atn conversation tree node by an endpoint */
/* an endpoint is identified by atn src and dst addresses */
/* and srcref or dstref (depends on the transport packet type) */
/* IMHO it's a hack - conversations should be maintained */
/* at transport layer (cotp) but this isn't working yet. */
atn_conversation_t * find_atn_conversation(
address *address1,
guint16 clnp_ref1,
address *address2 )
{
atn_conversation_t *cv = NULL;
guint32 key = 0;
guint32 tmp = 0;
ADD_ADDRESS_TO_HASH( tmp, address1);
key = (tmp << 16) | clnp_ref1 ;
ADD_ADDRESS_TO_HASH( tmp, address2);
key = (tmp << 24) | key ;
/* search for atn conversation */
cv = (atn_conversation_t *)
se_tree_lookup32(get_atn_conversation_tree(),key);
return cv;
}
/* create a atn conversation tree node */
/* conversation data is to be allocated externally */
/* a conversation may be referenced from both endpoints */
atn_conversation_t * create_atn_conversation(
address *address1,
guint16 clnp_ref1,
address *address2,
atn_conversation_t *conversation)
{
atn_conversation_t *cv = NULL;
guint32 key = 0;
guint32 tmp = 0;
ADD_ADDRESS_TO_HASH( tmp, address1);
key = (tmp << 16) | clnp_ref1 ;
ADD_ADDRESS_TO_HASH( tmp, address2);
key = (tmp << 24) | key ;
/* search for aircraft entry */
cv = (atn_conversation_t *)
se_tree_lookup32(
get_atn_conversation_tree(),
key);
/* tree node already present */
if(cv) {
return NULL; }
/* insert conversation data in tree*/
se_tree_insert32(
get_atn_conversation_tree(),
key,
(void*)conversation);
return conversation;
}
static int
dissect_atn_ulcs(
tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
void *data _U_)
{
int offset = 0;
proto_item *ti = NULL;
proto_tree *atn_ulcs_tree = NULL;
guint8 value_pres = 0;
guint8 value_ses = 0;
guint16 value_ses_pres = 0;
root_tree = tree;
/* data pointer */
/* decode as PDV-list */
if ( (int)(intptr_t) data == FALSE )
{
ti = proto_tree_add_item(
tree,
proto_atn_ulcs,
tvb,
0,
0 ,
FALSE);
atn_ulcs_tree = proto_item_add_subtree(
ti,
ett_atn_ulcs);
dissect_Fully_encoded_data_PDU(
tvb,
pinfo,
atn_ulcs_tree);
return offset +
tvb_reported_length_remaining(tvb, offset ) ;
}
/* decode as SPDU, PPDU and ACSE PDU */
if ( (int)(intptr_t) data == TRUE )
{
/* get session and presentation PDU's */
value_ses_pres = tvb_get_ntohs(tvb, offset);
/* SPDU: dissect session layer */
ti = proto_tree_add_text(
tree,
tvb,
offset,
0,
ATN_SES_PROTO );
atn_ulcs_tree = proto_item_add_subtree(
ti,
ett_atn_ses);
/* get SPDU (1 octet) */
value_ses = tvb_get_guint8(tvb, offset);
/* SPDU type/identifier */
proto_tree_add_item(atn_ulcs_tree,
hf_atn_ses_type,
tvb,
offset,
1,
ENC_BIG_ENDIAN );
/* SPDU parameters may be present in Short Refuse */
/* or Short Refuse Continue SPDU's */
switch(value_ses & SES_PDU_TYPE_MASK){
case SES_ATN_SRF:
case SES_ATN_SRFC:
/* SPDU parameter presence */
proto_tree_add_item(atn_ulcs_tree,
hf_atn_ses_param_ind,
tvb,
offset,
1,
ENC_BIG_ENDIAN );
/* parameter B2 */
proto_tree_add_item(atn_ulcs_tree,
hf_atn_ses_param_b2,
tvb,
offset,
1,
ENC_BIG_ENDIAN );
/* parameter B1 */
proto_tree_add_item(atn_ulcs_tree,
hf_atn_ses_param_b1,
tvb,
offset,
1,
ENC_BIG_ENDIAN );
break;
default:
break;
}
offset++;
/* PPDU: dissect presentation layer */
ti = proto_tree_add_text(
tree,
tvb,
offset,
0,
ATN_PRES_PROTO );
atn_ulcs_tree = proto_item_add_subtree(ti, ett_atn_pres);
value_pres = tvb_get_guint8(tvb, offset);
/* need session context to identify PPDU type */
/* note: */
/* it is *unfeasible* to use proto_tree_add_item here: */
/* presentation type is always the same constant but its type */
/* is implicitly determined by preceding session context */
proto_tree_add_text(atn_ulcs_tree,
tvb,
offset,
1,
"%s (0x%02x)",
val_to_str( value_ses_pres & ATN_SES_PRES_MASK , atn_pres_vals, "?"),
value_pres);
/* PPDU errorcode in case of SRF/CPR */
switch(value_ses & SES_PDU_TYPE_MASK){
case SES_ATN_SRF:
case SES_ATN_SRFC:
proto_tree_add_item(
atn_ulcs_tree,
hf_atn_pres_err,
tvb,
offset,
1,
ENC_BIG_ENDIAN );
break;
default:
break;
}
offset++;
/* ACSE PDU: dissect application layer */
ti = proto_tree_add_text(
tree,
tvb,
offset,
0,
ATN_ACSE_PROTO );
atn_ulcs_tree = proto_item_add_subtree(
ti,
ett_atn_acse);
dissect_ACSE_apdu_PDU(
tvb_new_subset_remaining(tvb, offset),
pinfo,
atn_ulcs_tree);
return offset +
tvb_reported_length_remaining(tvb, offset );
}
return offset;
}
static gboolean dissect_atn_ulcs_heur(
tvbuff_t *tvb,
packet_info *pinfo,
proto_tree *tree,
void *data _U_)
{
/* do we have enough data*/
/* at least session + presentation data or pdv-list */
if (tvb_reported_length_remaining(tvb, 0) < 2){
return FALSE; }
/* check for session/presentation/ACSE PDU's */
/* SPDU and PPDU are one octet each */
switch( tvb_get_ntohs(tvb, 0) & 0xf8ff ){
case 0xe802: /* SCN + CP*/
case 0xf802: /* SCNC + CP */
case 0xf002: /* SAC + CPA */
case 0xd802: /* SACC + CPA */
case 0xe002: /* SRF + CPR + R0 */
case 0xe012: /* SRF + CPR + R1 */
case 0xe022: /* SRF + CPR + R2 */
case 0xe032: /* SRF + CPR + R3 */
case 0xe042: /* SRF + CPR + R4 */
case 0xe052: /* SRF + CPR + R5 */
case 0xe062: /* SRF + CPR + R6 */
case 0xe072: /* SRF + CPR + R7 */
case 0xa002: /* SRFC + CPR + R0*/
case 0xa012: /* SRFC + CPR + R1*/
case 0xa022: /* SRFC + CPR + R2*/
case 0xa032: /* SRFC + CPR + R3*/
case 0xa042: /* SRFC + CPR + R4*/
case 0xa052: /* SRFC + CPR + R5*/
case 0xa062: /* SRFC + CPR + R6*/
case 0xa072: /* SRFC + CPR + R7*/
/* indicate to dissector routine */
/* that a least SPDU, PPDU and */
/* ACSE PDU is present */
dissect_atn_ulcs(
tvb,
pinfo,
tree,
(void*) TRUE);
return TRUE;
default: /* no SPDU */
break;
}
/* try to detect "Fully-encoded-data" heuristically */
/* the constants listed match the ASN.1 PER encoding */
/* of PDV-List */
switch( tvb_get_ntohs(tvb, 0) & 0xfff0 ){
case 0x0020: /* acse-apdu */
case 0x00a0: /* user-ase-apdu */
/* indicate to dissector routine */
/* that a PDV-list PDU is present */
/* */
/* PDV-list PDU may contain */
/* application protocol data (CM, CPDLC) */
/* or an ACSE PDU */
dissect_atn_ulcs(tvb, pinfo, tree, (void*) FALSE);
return TRUE;
break;
default: /* no or unsupported PDU */
break;
}
return FALSE;
}
void proto_register_atn_ulcs (void)
{
static hf_register_info hf_atn_ulcs[] = {
#include "packet-atn-ulcs-hfarr.c"
{&hf_atn_ses_type,
{ "SPDU Type",
"atn-ulcs.ses.type",
FT_UINT8,
BASE_HEX,
VALS(atn_ses_type),
0xf8,
"Indicates presence of session parameters",
HFILL}},
{&hf_atn_ses_param_ind,
{ "SPDU Parameter Indication",
"atn-ulcs.ses.parameter-indication",
FT_UINT8,
BASE_HEX,
VALS(atn_ses_param_ind),
SES_PARAM_IND_MASK,
"Indicates presence of session parameters",
HFILL}},
{&hf_atn_ses_param_b1,
{ "SRF Parameter B1",
"atn-ulcs.ses.srf-b1",
FT_UINT8,
BASE_HEX,
VALS(srf_b1),
0x01,
"Determines if transport connection reject is \
transient or persistent",
HFILL}},
{&hf_atn_ses_param_b2,
{ "SRF Parameter B2",
"atn-ulcs.ses.srf-b2",
FT_UINT8,
BASE_HEX,
VALS(srf_b2),
0x02,
"Determines if transport connection is \
retained or released",
HFILL}},
{ &hf_atn_pres_err,
{ "Error Code", "atn-ulcs.pres.cpr-error",
FT_UINT8,
BASE_HEX,
VALS(atn_pres_err),
PRES_CPR_ER_MASK,
NULL,
HFILL}},
};
static gint *ett[] = {
#include "packet-atn-ulcs-ettarr.c"
&ett_atn_ses,
&ett_atn_pres,
&ett_atn_acse,
&ett_atn_ulcs
};
proto_atn_ulcs = proto_register_protocol (
ATN_ULCS_PROTO ,
"ATN-ULCS",
"atn-ulcs");
proto_register_field_array (
proto_atn_ulcs,
hf_atn_ulcs,
array_length(hf_atn_ulcs));
proto_register_subtree_array (
ett,
array_length (ett));
new_register_dissector(
"atn-ulcs",
dissect_atn_ulcs,
proto_atn_ulcs);
atn_cm_handle = find_dissector("atn-cm");
atn_cpdlc_handle = find_dissector("atn-cpdlc");
/* initiate sub dissector list */
register_heur_dissector_list(
"atn-ulcs",
&atn_ulcs_heur_subdissector_list);
/* init aare/aare data */
if(!aarq_data_tree) {
aarq_data_tree = se_tree_create(
EMEM_TREE_TYPE_RED_BLACK,
"aarq-data"); }
if(!atn_conversation_tree) {
atn_conversation_tree = se_tree_create(
EMEM_TREE_TYPE_RED_BLACK,
"atn-conversations"); }
}
void proto_reg_handoff_atn_ulcs(void)
{
/* add session dissector to cotp dissector list dissector list*/
heur_dissector_add(
"cotp",
dissect_atn_ulcs_heur,
proto_atn_ulcs);
}
/*
* 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:
*/

View File

@ -0,0 +1,114 @@
/* 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-ulcs.h
* Definitions for atn packet disassembly structures and routines
*
*
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifndef PACKET_ATN_ULCS_H
#define PACKET_ATN_ULCS_H
#include "config.h"
#include "packet.h"
/* IA5 charset (7-bit) for PER IA5 decoding */
static const gchar ia5alpha[] = {
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, \
0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, \
0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, \
0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, \
0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, \
0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, \
0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, \
0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, \
0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, '\0'
};
enum msg_type {
um,
dm,
no_msg
};
enum ae_qualifier {
ads = 0,
cma =1, /* contact management (CM) */
cpdlc = 2, /* "plain old" CPDLC */
ati = 3 ,
arf =10 ,
met =11,
gac =12,
pmcpdlc =22, /* "protected mode" CPDLC */
unknown = -1
};
typedef struct atn_conversation_t {
gint ae_qualifier; /* A/G application type */
} atn_conversation_t;
atn_conversation_t * create_atn_conversation(
address*,
guint16,
address*,
atn_conversation_t*);
atn_conversation_t * find_atn_conversation(
address*,
guint16,
address*);
/* struct for conversation data reconstruction used in AARQ and AARE */
/* if transport data is larger than 32 octets AARQ/AARE is contained */
/* within DT frames which have only dest_ref, but no src_ref */
/* if AARQ/AARQ is contained within CR/CC only src_ref is present in CR */
/* while CC provides src_ref and dstref */
typedef struct aarq_data_t {
gboolean aarq_pending; /* flag tells whether AARQ/sequence is pending (true) */
/* required not to mix up different AARQ/AARE sequences */
/* during simoultanous establishment of transport connections */
/* i.e. GND facility initialises cpcstart and cmcontact at the same time */
atn_conversation_t* cv; /* pointer to AARQ conversation */
} aarq_data_t;
emem_tree_t *get_atn_conversation_tree(void);
guint32 get_aircraft_24_bit_address_from_nsap(packet_info *);
int check_heur_msg_type(packet_info *);
#endif
/*
* 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:
*/