aboutsummaryrefslogtreecommitdiffstats
path: root/asn1
diff options
context:
space:
mode:
authorAnders Broman <anders.broman@ericsson.com>2013-08-08 05:09:13 +0000
committerAnders Broman <anders.broman@ericsson.com>2013-08-08 05:09:13 +0000
commita4d1560fd1557820d69f8c8e106e368c2357340c (patch)
treea8006d104cf51073c1d266f468e2159f8a747186 /asn1
parent6e0c354769120a73c6a0c65b97e7841d18db606c (diff)
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
Diffstat (limited to 'asn1')
-rw-r--r--asn1/atn-cm/Makefile.am12
-rw-r--r--asn1/atn-cm/Makefile.common28
-rw-r--r--asn1/atn-cm/Makefile.nmake6
-rw-r--r--asn1/atn-cm/atn-cm.asn199
-rw-r--r--asn1/atn-cm/atn-cm.cnf25
-rw-r--r--asn1/atn-cm/packet-atn-cm-template.c261
-rw-r--r--asn1/atn-cpdlc/Makefile.am14
-rw-r--r--asn1/atn-cpdlc/Makefile.common30
-rw-r--r--asn1/atn-cpdlc/Makefile.nmake6
-rw-r--r--asn1/atn-cpdlc/atn-cpdlc.asn2935
-rw-r--r--asn1/atn-cpdlc/atn-cpdlc.cnf138
-rw-r--r--asn1/atn-cpdlc/packet-atn-cpdlc-template.c362
-rw-r--r--asn1/atn-ulcs/Makefile.am11
-rw-r--r--asn1/atn-ulcs/Makefile.common28
-rw-r--r--asn1/atn-ulcs/Makefile.nmake6
-rw-r--r--asn1/atn-ulcs/atn-ulcs.asn512
-rw-r--r--asn1/atn-ulcs/atn-ulcs.cnf553
-rw-r--r--asn1/atn-ulcs/packet-atn-ulcs-template.c925
-rw-r--r--asn1/atn-ulcs/packet-atn-ulcs-template.h114
19 files changed, 6165 insertions, 0 deletions
diff --git a/asn1/atn-cm/Makefile.am b/asn1/atn-cm/Makefile.am
new file mode 100644
index 0000000000..b252c3329f
--- /dev/null
+++ b/asn1/atn-cm/Makefile.am
@@ -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
+
diff --git a/asn1/atn-cm/Makefile.common b/asn1/atn-cm/Makefile.common
new file mode 100644
index 0000000000..4f4af95c4e
--- /dev/null
+++ b/asn1/atn-cm/Makefile.common
@@ -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=
+
diff --git a/asn1/atn-cm/Makefile.nmake b/asn1/atn-cm/Makefile.nmake
new file mode 100644
index 0000000000..78b3419d2b
--- /dev/null
+++ b/asn1/atn-cm/Makefile.nmake
@@ -0,0 +1,6 @@
+
+include ../../config.nmake
+include ../Makefile.preinc.nmake
+include Makefile.common
+include ../Makefile.inc.nmake
+
diff --git a/asn1/atn-cm/atn-cm.asn b/asn1/atn-cm/atn-cm.asn
new file mode 100644
index 0000000000..ccd9bbe198
--- /dev/null
+++ b/asn1/atn-cm/atn-cm.asn
@@ -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:
+--
+
diff --git a/asn1/atn-cm/atn-cm.cnf b/asn1/atn-cm/atn-cm.cnf
new file mode 100644
index 0000000000..077fbef454
--- /dev/null
+++ b/asn1/atn-cm/atn-cm.cnf
@@ -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:
+# \ No newline at end of file
diff --git a/asn1/atn-cm/packet-atn-cm-template.c b/asn1/atn-cm/packet-atn-cm-template.c
new file mode 100644
index 0000000000..6d6eed1fa6
--- /dev/null
+++ b/asn1/atn-cm/packet-atn-cm-template.c
@@ -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:
+ */
+
diff --git a/asn1/atn-cpdlc/Makefile.am b/asn1/atn-cpdlc/Makefile.am
new file mode 100644
index 0000000000..7a03acb19a
--- /dev/null
+++ b/asn1/atn-cpdlc/Makefile.am
@@ -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
+
diff --git a/asn1/atn-cpdlc/Makefile.common b/asn1/atn-cpdlc/Makefile.common
new file mode 100644
index 0000000000..3c222c7b7a
--- /dev/null
+++ b/asn1/atn-cpdlc/Makefile.common
@@ -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=
+
diff --git a/asn1/atn-cpdlc/Makefile.nmake b/asn1/atn-cpdlc/Makefile.nmake
new file mode 100644
index 0000000000..78b3419d2b
--- /dev/null
+++ b/asn1/atn-cpdlc/Makefile.nmake
@@ -0,0 +1,6 @@
+
+include ../../config.nmake
+include ../Makefile.preinc.nmake
+include Makefile.common
+include ../Makefile.inc.nmake
+
diff --git a/asn1/atn-cpdlc/atn-cpdlc.asn b/asn1/atn-cpdlc/atn-cpdlc.asn
new file mode 100644
index 0000000000..a957edad69
--- /dev/null
+++ b/asn1/atn-cpdlc/atn-cpdlc.asn
@@ -0,0 +1,2935 @@
+# 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:
+#
+-- c-basic-offset: 2; tab-width: 2; indent-tabs-mode: t
+-- vi: set shiftwidth=2 tabstop=2 noexpandtab:
+-- :indentSize=2:tabSize=2:noTabs=false:
+
+-- Sub-Volume IV ASN.1 reference definitions for ICAO Doc. 9705,
+-- Second Edition
+-- Version 1.1, 03 Oct 2001
+
+-- protected mode PDR's
+-- 2011-10-25 Doc 9705 Draft Ed 3 (ICAO web site - 11/00) including "9705 PDRS FOR CPDLC"
+-- based on "ACP WGN SG/N2 Version 1.1 (Output Montreal - May 2005)"
+
+
+-- plain old CPDLC
+CPDLCAPDUsVersion1 DEFINITIONS ::=
+BEGIN
+
+IMPORTS
+ ATCUplinkMessage, ATCDownlinkMessage
+ FROM PMCPDLCMessageSetVersion1
+ ATCForwardMessage, ATCForwardResponse
+ FROM PMCPDLCAPDUsVersion1;
+
+-- ----------------------------------------------------------------------------------
+-- Ground Generated Messages - Top level
+-- ----------------------------------------------------------------------------------
+GroundPDUs ::= CHOICE
+{
+ abortUser [0] CPDLCUserAbortReason,
+ abortProvider [1] CPDLCProviderAbortReason,
+ startup [2] UplinkMessage,
+ send [3] ATCUplinkMessage,
+ forward [4] ATCForwardMessage,
+ forwardresponse [5] ATCForwardResponse,
+ ...
+}
+
+UplinkMessage ::= CHOICE
+{
+ noMessage [0] NULL,
+ aTCUplinkMessage [1] ATCUplinkMessage
+}
+
+AircraftPDUs::= CHOICE
+{
+ abortUser [0] CPDLCUserAbortReason,
+ abortProvider [1] CPDLCProviderAbortReason,
+ startdown [2] StartDownMessage,
+ send [3] ATCDownlinkMessage,
+ ...
+}
+
+StartDownMessage ::= SEQUENCE
+{
+ mode Mode DEFAULT cpdlc,
+ startDownlinkMessage DownlinkMessage
+}
+
+Mode ::= ENUMERATED
+{
+ cpdlc (0),
+ dsc (1)
+}
+
+DownlinkMessage ::= CHOICE
+{
+ noMessage [0] NULL,
+ aTCDownlinkMessage [1] ATCDownlinkMessage
+}
+
+CPDLCUserAbortReason ::= ENUMERATED
+{
+ undefined (0),
+ no-message-identification-numbers-available (1),
+ duplicate-message-identification-numbers (2),
+ no-longer-next-data-authority (3),
+ current-data-authority-abort (4),
+ commanded-termination (5),
+ invalid-response (6),
+ ...
+}
+
+
+CPDLCProviderAbortReason ::= ENUMERATED
+{
+ timer-expired (0),
+ undefined-error (1),
+ invalid-PDU (2),
+ protocol-error (3),
+ communication-service-error (4),
+ communication-service-failure (5),
+ invalid-QOS-parameter (6),
+ expected-PDU-missing (7),
+ ...
+ }
+
+END
+
+-- protected mode PMCPDLC
+PMCPDLCAPDUsVersion1 DEFINITIONS::=
+BEGIN
+
+IMPORTS
+DateTimeGroup,
+AircraftFlightIdentification,
+AircraftAddress
+FROM PMCPDLCMessageSetVersion1;
+
+-- ----------------------------------------------------------------------------------
+-- Ground Generated Messages - Top level
+-- ----------------------------------------------------------------------------------
+ProtectedGroundPDUs ::= CHOICE
+{
+ abortUser [0] PMCPDLCUserAbortReason,
+ abortProvider [1] PMCPDLCProviderAbortReason,
+ startup [2] ProtectedUplinkMessage,
+ send [3] ProtectedUplinkMessage,
+ forward [4] ATCForwardMessage,
+ forwardresponse [5] ATCForwardResponse,
+ ...
+}
+
+ProtectedUplinkMessage::= SEQUENCE
+{
+ algorithmIdentifier [0] AlgorithmIdentifier OPTIONAL,
+ protectedMessage [1] CPDLCMessage OPTIONAL,
+-- PER encoded ATCUplinkMessage
+-- (see Module PMCPDLCMessageSetVersion1)
+ integrityCheck [2] BIT STRING,
+ ...
+}
+
+ATCForwardMessage ::= SEQUENCE
+{
+ forwardHeader ForwardHeader,
+ forwardMessage ForwardMessage
+}
+
+ForwardHeader ::= SEQUENCE
+{
+ dateTime DateTimeGroup,
+ aircraftID AircraftFlightIdentification,
+ aircraftAddress AircraftAddress
+}
+
+ForwardMessage ::= CHOICE
+{
+ upElementIDs [0] BIT STRING,
+--PER encoded ATCUplinkMessageData,
+-- (see Module PMCPDLCMessageSetVersion1)
+ downElementIDs [1] BIT STRING
+--PER encoded ATCDownlinkMessageData,
+-- (see Module PMCPDLCMessageSetVersion1)
+}
+
+ATCForwardResponse ::= ENUMERATED
+{
+ success (0),
+ service-not-supported (1),
+ version-not-equal (2),
+ ...
+}
+-- ----------------------------------------------------------------------------------
+-- Aircraft Generated Messages - Top level
+-- ----------------------------------------------------------------------------------
+ProtectedAircraftPDUs::= CHOICE
+{
+ abortUser [0] PMCPDLCUserAbortReason,
+ abortProvider [1] PMCPDLCProviderAbortReason,
+ startdown [2] ProtectedStartDownMessage,
+ send [3] ProtectedDownlinkMessage,
+ ...
+}
+
+
+ProtectedStartDownMessage ::= SEQUENCE
+{
+ mode ProtectedMode DEFAULT cpdlc,
+ startDownlinkMessage ProtectedDownlinkMessage
+}
+
+ProtectedMode ::= ENUMERATED
+{
+ cpdlc (0),
+ dsc (1)
+}
+
+ProtectedDownlinkMessage::= SEQUENCE
+{
+ algorithmIdentifier [0] AlgorithmIdentifier OPTIONAL,
+ protectedMessage [1] CPDLCMessage OPTIONAL,
+--PER encoded ATCDownlinkMessage,
+-- (see Module PMCPDLCMessageSetVersion1)
+ integrityCheck [2] BIT STRING,
+ ...
+}
+
+-- ----------------------------------------------------------------------------------
+-- Uplink and Downlink messages - Common Elements
+-- ----------------------------------------------------------------------------------
+AlgorithmIdentifier ::= RELATIVE-OID
+--root is {icao-arc atn-algorithms(9)}
+
+CPDLCMessage ::= BIT STRING
+
+PMCPDLCUserAbortReason ::= ENUMERATED
+{
+ undefined (0),
+ no-message-identification-numbers-available (1),
+ duplicate-message-identification-numbers (2),
+ no-longer-next-data-authority (3),
+ current-data-authority-abort (4),
+ commanded-termination (5),
+ invalid-response (6),
+ time-out-of-synchronisation (7),
+ unknown-integrity-check (8),
+ validation-failure (9),
+ unable-to-decode-message (10),
+ invalid-pdu (11),
+ invalid-CPDLC-message (12),
+ ...
+}
+
+PMCPDLCProviderAbortReason ::= ENUMERATED
+{
+ timer-expired (0),
+ undefined-error (1),
+ invalid-PDU (2),
+ protocol-error (3),
+ communication-service-error (4),
+ communication-service-failure (5),
+ invalid-QOS-parameter (6),
+ expected-PDU-missing (7),
+ ...
+}
+
+END
+
+PMCPDLCMessageSetVersion1 DEFINITIONS::=
+BEGIN
+
+ATCUplinkMessage ::= SEQUENCE
+{
+ header ATCMessageHeader,
+ messageData ATCUplinkMessageData
+}
+
+ATCUplinkMessageData ::= SEQUENCE
+{
+ elementIds SEQUENCE SIZE (1..5) OF ATCUplinkMsgElementId,
+ constrainedData SEQUENCE
+ {
+ routeClearanceData SEQUENCE SIZE (1..2) OF RouteClearance OPTIONAL,
+ ...
+ } OPTIONAL
+}
+
+ATCDownlinkMessage ::= SEQUENCE
+{
+ header ATCMessageHeader,
+ messageData ATCDownlinkMessageData
+}
+
+ATCDownlinkMessageData ::= SEQUENCE
+{
+ elementIds SEQUENCE SIZE (1..5) OF ATCDownlinkMsgElementId,
+ constrainedData SEQUENCE
+ {
+ routeClearanceData SEQUENCE SIZE (1..2) OF RouteClearance OPTIONAL,
+ ...
+ } OPTIONAL
+}
+
+-- ----------------------------------------------------------------------------------
+-- Uplink and Downlink messages - Common Elements
+-- ----------------------------------------------------------------------------------
+ATCMessageHeader ::= SEQUENCE
+{
+ messageIdNumber [0] MsgIdentificationNumber,
+ messageRefNumber [1] MsgReferenceNumber OPTIONAL,
+ dateTime [2] DateTimeGroup,
+ logicalAck [3] LogicalAck DEFAULT notRequired
+}
+
+MsgIdentificationNumber ::= INTEGER (0..63)
+
+MsgReferenceNumber ::= INTEGER (0..63)
+
+LogicalAck ::= ENUMERATED
+{
+ required (0),
+ notRequired (1)
+}
+
+-- ----------------------------------------------------------------------------------
+-- Uplink message element
+-- ----------------------------------------------------------------------------------
+ATCUplinkMsgElementId ::= CHOICE
+{
+ -- UNABLE
+ -- Urg(N)/Alr(M)/Resp(N)
+ uM0NULL [0] NULL,
+
+ -- STANDBY
+ -- Urg(N)/Alr(L)/Resp(N)
+ uM1NULL [1] NULL,
+
+ -- REQUEST DEFERRED
+ -- Urg(N)/Alr(L)/Resp(N)
+ uM2NULL [2] NULL,
+
+ -- ROGER
+ -- Urg(N)/Alr(L)/Resp(N)
+ uM3NULL [3] NULL,
+
+ -- AFFIRM
+ -- Urg(N)/Alr(L)/Resp(N)
+ uM4NULL [4] NULL,
+
+ -- NEGATIVE Urg(N)/Alr(L)/Resp(N)
+ uM5NULL [5] NULL,
+
+ -- EXPECT [level] Urg(L)/Alr(L)/Resp(R)
+ uM6Level [6] Level,
+
+ -- EXPECT CLIMB AT [time]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM7Time [7] Time,
+
+ -- EXPECT CLIMB AT [position]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM8Position [8] Position,
+
+ -- EXPECT DESCENT AT [time]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM9Time [9] Time,
+
+ -- EXPECT DESCENT AT [position]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM10Position [10] Position,
+
+ -- EXPECT CRUISE CLIMB AT [time]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM11Time [11] Time,
+
+ -- EXPECT CRUISE CLIMB AT [position]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM12Position [12] Position,
+
+ -- AT [time] EXPECT CLIMB TO [level]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM13TimeLevel [13] TimeLevel,
+
+ -- AT [position] EXPECT CLIMB TO [level]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM14PositionLevel [14] PositionLevel,
+
+ -- AT [time] EXPECT DESCENT TO [level]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM15TimeLevel [15] TimeLevel,
+
+ -- AT [position] EXPECT DESCENT TO [level]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM16PositionLevel [16] PositionLevel,
+
+ -- AT [time] EXPECT CRUISE CLIMB TO [level]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM17TimeLevel [17] TimeLevel,
+
+ -- AT [position] EXPECT CRUISE CLIMB TO [level]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM18PositionLevel [18] PositionLevel,
+
+ -- MAINTAIN [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM19Level [19] Level,
+
+ -- CLIMB TO [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM20Level [20] Level,
+
+ -- AT [time] CLIMB TO [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM21TimeLevel [21] TimeLevel,
+
+ -- AT [position] CLIMB TO [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM22PositionLevel [22] PositionLevel,
+
+ -- DESCEND TO [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM23Level [23] Level,
+
+ -- AT [time] DESCEND TO [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM24TimeLevel [24] TimeLevel,
+
+ -- AT [position] DESCEND TO [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM25PositionLevel [25] PositionLevel,
+
+ -- CLIMB TO REACH [level] BY [time]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM26LevelTime [26] LevelTime,
+
+ -- CLIMB TO REACH [level] BY [position]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM27LevelPosition [27] LevelPosition,
+
+ -- DESCEND TO REACH [level] BY [time]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM28LevelTime [28] LevelTime,
+
+ -- DESCEND TO REACH [level] BY [position]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM29LevelPosition [29] LevelPosition,
+
+ -- MAINTAIN BLOCK [level] TO [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM30LevelLevel [30] LevelLevel,
+
+ -- CLIMB TO AND MAINTAIN BLOCK [level] TO [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM31LevelLevel [31] LevelLevel,
+
+ -- DESCEND TO AND MAINTAIN BLOCK [level] TO [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM32LevelLevel [32] LevelLevel,
+
+ -- Reserved
+ -- Urg(L)/Alr(L)/Resp(Y)
+ uM33NULL [33] NULL,
+
+ -- CRUISE CLIMB TO [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM34Level [34] Level,
+
+ -- CRUISE CLIMB ABOVE [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM35Level [35] Level,
+
+ -- EXPEDITE CLIMB TO [level]
+ -- Urg(U)/Alr(M)/Resp(W/U)
+ uM36Level [36] Level,
+
+ -- EXPEDITE DESCENT TO [level]
+ -- Urg(U)/Alr(M)/Resp(W/U)
+ uM37Level [37] Level,
+
+ -- IMMEDIATELY CLIMB TO [level]
+ -- Urg(D)/Alr(H)/Resp(W/U)
+ uM38Level [38] Level,
+
+ -- IMMEDIATELY DESCEND TO [level]
+ -- Urg(D)/Alr(H)/Resp(W/U)
+ uM39Level [39] Level,
+
+ -- Reserved
+ -- Urg(L)/Alr(L)/Resp(Y)
+ uM40NULL [40] NULL,
+
+ -- Reserved Urg(L)/Alr(L)/Resp(Y)
+ uM41NULL [41] NULL,
+
+ -- EXPECT TO CROSS [position] AT [level]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM42PositionLevel [42] PositionLevel,
+
+ -- EXPECT TO CROSS [position] AT OR ABOVE [level]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM43PositionLevel [43] PositionLevel,
+
+ -- EXPECT TO CROSS [position] AT OR BELOW [level]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM44PositionLevel [44] PositionLevel,
+
+ -- EXPECT TO CROSS [position] AT AND MAINTAIN [level]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM45PositionLevel [45] PositionLevel,
+
+ -- CROSS [position] AT [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM46PositionLevel [46] PositionLevel,
+
+ -- CROSS [position] AT OR ABOVE [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM47PositionLevel [47] PositionLevel,
+
+ -- CROSS [position] AT OR BELOW [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM48PositionLevel [48] PositionLevel,
+
+ -- CROSS [position] AT AND MAINTAIN [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM49PositionLevel [49] PositionLevel,
+
+ -- CROSS [position] BETWEEN [level] AND [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM50PositionLevelLevel [50] PositionLevelLevel,
+
+ -- CROSS [position] AT [time]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM51PositionTime [51] PositionTime,
+
+ -- CROSS [position] AT OR BEFORE [time]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM52PositionTime [52] PositionTime,
+
+ -- CROSS [position] AT OR AFTER [time]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM53PositionTime [53] PositionTime,
+
+ -- CROSS [position] BETWEEN [time] AND [time]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM54PositionTimeTime [54] PositionTimeTime,
+
+ -- CROSS [position] AT [speed]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM55PositionSpeed [55] PositionSpeed,
+
+ -- CROSS [position] AT OR LESS THAN [speed]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM56PositionSpeed [56] PositionSpeed,
+
+ -- CROSS [position] AT OR GREATER THAN [speed]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM57PositionSpeed [57] PositionSpeed,
+
+ -- CROSS [position] AT [time] AT [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM58PositionTimeLevel [58] PositionTimeLevel,
+
+ -- CROSS [position] AT OR BEFORE [time] AT [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM59PositionTimeLevel [59] PositionTimeLevel,
+
+ -- CROSS [position] AT OR AFTER [time] AT [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM60PositionTimeLevel [60] PositionTimeLevel,
+
+ -- CROSS [position] AT AND MAINTAIN [level] AT [speed]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM61PositionLevelSpeed [61] PositionLevelSpeed,
+
+ -- AT [time] CROSS [position] AT AND MAINTAIN [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM62TimePositionLevel [62] TimePositionLevel,
+
+ -- AT [time] CROSS [position] AT AND MAINTAIN [level] AT [speed]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM63TimePositionLevelSpeed [63] TimePositionLevelSpeed,
+
+ -- OFFSET [specifiedDistance] [direction] OF ROUTE
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM64DistanceSpecifiedDirection [64] DistanceSpecifiedDirection,
+
+ -- AT [position] OFFSET [specifiedDistance] [direction] OF ROUTE
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM65PositionDistanceSpecifiedDirection[65] PositionDistanceSpecifiedDirection,
+
+ -- AT [time] OFFSET [specifiedDistance] [direction] OF ROUTE
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM66TimeDistanceSpecifiedDirection [66] TimeDistanceSpecifiedDirection,
+
+ -- PROCEED BACK ON ROUTE
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM67NULL [67] NULL,
+
+ -- REJOIN ROUTE BY [position]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM68Position [68] Position,
+
+ -- REJOIN ROUTE BY [time]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM69Time [69] Time,
+
+ -- EXPECT BACK ON ROUTE BY [position]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM70Position [70] Position,
+
+ -- EXPECT BACK ON ROUTE BY [time]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM71Time [71] Time,
+
+ -- RESUME OWN NAVIGATION
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM72NULL [72] NULL,
+
+ -- [DepartureClearance]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM73DepartureClearance [73] DepartureClearance,
+
+ -- PROCEED DIRECT TO [position]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM74Position [74] Position,
+
+ -- WHEN ABLE PROCEED DIRECT TO [position]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM75Position [75] Position,
+
+ -- AT [time] PROCEED DIRECT TO [position]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM76TimePosition [76] TimePosition,
+
+ -- AT [position] PROCEED DIRECT TO [position]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM77PositionPosition [77] PositionPosition,
+
+ -- AT [level] PROCEED DIRECT TO [position]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM78LevelPosition [78] LevelPosition,
+
+ -- CLEARED TO [position] VIA [routeClearance]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM79PositionRouteClearance [79] PositionRouteClearanceIndex,
+
+ -- CLEARED [routeClearance]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM80RouteClearance [80] RouteClearanceIndex,
+
+ -- CLEARED [procedureName]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM81ProcedureName [81] ProcedureName,
+
+ -- CLEARED TO DEVIATE UP TO [specifiedDistance] [direction] OF ROUTE
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM82DistanceSpecifiedDirection [82] DistanceSpecifiedDirection,
+
+ -- AT [position] CLEARED [routeClearance]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM83PositionRouteClearance [83] PositionRouteClearanceIndex,
+
+ -- AT [position] CLEARED [procedureName]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM84PositionProcedureName [84] PositionProcedureName,
+
+ -- EXPECT [routeClearance]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM85RouteClearance [85] RouteClearanceIndex,
+
+ -- AT [position] EXPECT [routeClearance]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM86PositionRouteClearance [86] PositionRouteClearanceIndex,
+
+ -- EXPECT DIRECT TO [position]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM87Position [87] Position,
+
+ -- AT [position] EXPECT DIRECT TO [position]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM88PositionPosition [88]PositionPosition,
+
+ -- AT [time] EXPECT DIRECT TO [position]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM89TimePosition [89] TimePosition,
+
+
+ -- AT [level] EXPECT DIRECT TO [position]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM90LevelPosition [90] LevelPosition,
+
+ -- HOLD AT [position] MAINTAIN [level] INBOUND TRACK [degrees][direction] TURNS [legtype]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM91HoldClearance [91] HoldClearance,
+
+ -- HOLD AT [position] AS PUBLISHED MAINTAIN [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM92PositionLevel [92] PositionLevel,
+
+ -- EXPECT FURTHER CLEARANCE AT [time]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM93Time [93] Time,
+
+ -- TURN [direction] HEADING [degrees]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM94DirectionDegrees [94] DirectionDegrees,
+
+ -- TURN [direction] GROUND TRACK [degrees]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM95DirectionDegrees [95] DirectionDegrees,
+
+ -- CONTINUE PRESENT HEADING
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM96NULL [96] NULL,
+
+ -- AT [position] FLY HEADING [degrees]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM97PositionDegrees [97] PositionDegrees,
+
+ -- IMMEDIATELY TURN [direction] HEADING [degrees]
+ -- Urg(D)/Alr(H)/Resp(W/U)
+ uM98DirectionDegrees [98] DirectionDegrees,
+
+ -- EXPECT [procedureName]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM99ProcedureName [99] ProcedureName,
+
+ -- AT [time] EXPECT [speed]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM100TimeSpeed [100] TimeSpeed,
+
+ -- AT [position] EXPECT [speed]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM101PositionSpeed [101] PositionSpeed,
+
+ -- AT [level] EXPECT [speed]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM102LevelSpeed [102] LevelSpeed,
+
+ -- AT [time] EXPECT [speed] TO [speed]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM103TimeSpeedSpeed [103] TimeSpeedSpeed,
+
+ -- AT [position] EXPECT [speed] TO [speed]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM104PositionSpeedSpeed [104] PositionSpeedSpeed,
+
+ -- AT [level] EXPECT [speed] TO [speed]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM105LevelSpeedSpeed [105] LevelSpeedSpeed,
+
+ -- MAINTAIN [speed]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM106Speed [106] Speed,
+
+ -- MAINTAIN PRESENT SPEED
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM107NULL [107] NULL,
+
+ -- MAINTAIN [speed] OR GREATER
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM108Speed [108] Speed,
+
+ -- MAINTAIN [speed] OR LESS
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM109Speed [109] Speed,
+
+ -- MAINTAIN [speed] TO [speed]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM110SpeedSpeed [110] SpeedSpeed,
+
+ -- INCREASE SPEED TO [speed]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM111Speed [111] Speed,
+
+ -- INCREASE SPEED TO [speed] OR GREATER
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM112Speed [112] Speed,
+
+ -- REDUCE SPEED TO [speed]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM113Speed [113] Speed,
+
+ -- REDUCE SPEED TO [speed] OR LESS
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM114Speed [114] Speed,
+
+ -- DO NOT EXCEED [speed]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM115Speed [115] Speed,
+
+ -- RESUME NORMAL SPEED
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM116NULL [116] NULL,
+
+ -- CONTACT [unitname] [frequency]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM117UnitNameFrequency [117] UnitNameFrequency,
+
+ -- AT [position] CONTACT [unitname] [frequency]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM118PositionUnitNameFrequency [118] PositionUnitNameFrequency,
+
+ -- AT [time] CONTACT [unitname] [frequency]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM119TimeUnitNameFrequency [119] TimeUnitNameFrequency,
+
+ -- MONITOR [unitname] [frequency]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM120UnitNameFrequency [120] UnitNameFrequency,
+
+ -- AT [position] MONITOR [unitname] [frequency]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM121PositionUnitNameFrequency [121] PositionUnitNameFrequency,
+
+ -- AT [time] MONITOR [unitname] [frequency]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM122TimeUnitNameFrequency [122] TimeUnitNameFrequency,
+
+ -- SQUAWK [code]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM123Code [123] Code,
+
+ -- STOP SQUAWK
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM124NULL [124] NULL,
+
+ -- SQUAWK MODE CHARLIE
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM125NULL [125] NULL,
+
+ -- STOP SQUAWK MODE CHARLIE
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM126NULL [126] NULL,
+
+ -- REPORT BACK ON ROUTE
+ -- Urg(N)/Alr(L)/Resp(W/U)
+ uM127NULL [127] NULL,
+
+ -- REPORT LEAVING [level]
+ -- Urg(N)/Alr(L)/Resp(W/U)
+ uM128Level [128] Level,
+
+ -- REPORT MAINTAINING [level]
+ -- Urg(N)/Alr(L)/Resp(W/U)
+ uM129Level [129] Level,
+
+ -- REPORT PASSING [position]
+ -- Urg(N)/Alr(L)/Resp(W/U)
+ uM130Position [130] Position,
+
+ -- REPORT REMAINING FUEL AND PERSONS ON BOARD
+ -- Urg(U)/Alr(M)/Resp(Y)
+ uM131NULL [131] NULL,
+
+ -- REPORT POSITION
+ -- Urg(N)/Alr(M)/Resp(Y)
+ uM132NULL [132] NULL,
+
+ -- REPORT PRESENT LEVEL
+ -- Urg(N)/Alr(M)/Resp(Y)
+ uM133NULL [133] NULL,
+
+ -- REPORT [speedtype] [speedtype] [speedtype]SPEED
+ -- Urg(N)/Alr(M)/Resp(Y)
+ uM134SpeedTypeSpeedTypeSpeedType [134] SpeedTypeSpeedTypeSpeedType,
+
+ -- CONFIRM ASSIGNED LEVEL
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM135NULL [135] NULL,
+
+ -- CONFIRM ASSIGNED SPEED
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM136NULL [136] NULL,
+
+ -- CONFIRM ASSIGNED ROUTE
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM137NULL [137] NULL,
+
+ -- CONFIRM TIME OVER REPORTED WAYPOINT
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM138NULL [138] NULL,
+
+ -- CONFIRM REPORTED WAYPOINT
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM139NULL [139] NULL,
+
+ -- CONFIRM NEXT WAYPOINT
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM140NULL [140] NULL,
+
+ -- CONFIRM NEXT WAYPOINT ETA
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM141NULL [141] NULL,
+
+ -- CONFIRM ENSUING WAYPOINT
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM142NULL [142] NULL,
+
+ -- CONFIRM REQUEST
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM143NULL [143] NULL,
+
+ -- CONFIRM SQUAWK
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM144NULL [144] NULL,
+
+ -- REPORT HEADING
+ -- Urg(N)/Alr(M)/Resp(Y)
+ uM145NULL [145] NULL,
+
+ -- REPORT GROUND TRACK
+ -- Urg(N)/Alr(M)/Resp(Y)
+ uM146NULL [146] NULL,
+
+ -- REQUEST POSITION REPORT
+ -- Urg(N)/Alr(M)/Resp(Y )
+ uM147NULL [147] NULL,
+
+ -- WHEN CAN YOU ACCEPT [level]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM148Level [148] Level,
+
+ -- CAN YOU ACCEPT [level] AT [position]
+ -- Urg(N)/Alr(L)/Resp(A/N)
+ uM149LevelPosition [149] LevelPosition,
+
+ -- CAN YOU ACCEPT [level] AT [time]
+ -- Urg(N)/Alr(L)/Resp(A/N)
+ uM150LevelTime [150] LevelTime,
+
+ -- WHEN CAN YOU ACCEPT [speed]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM151Speed [151] Speed,
+
+ -- WHEN CAN YOU ACCEPT [specifiedDistance] [direction] OFFSET
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM152DistanceSpecifiedDirection [152] DistanceSpecifiedDirection,
+
+ -- ALTIMETER [altimeter]
+ -- Urg(N)/Alr(L)/Resp(R)
+ uM153Altimeter [153] Altimeter,
+
+ -- RADAR SERVICE TERMINATED
+ -- Urg(N)/Alr(L)/Resp(R)
+ uM154NULL [154] NULL,
+
+ -- RADAR CONTACT [position]
+ -- Urg(N)/Alr(M)/Resp(R)
+ uM155Position [155] Position,
+
+ -- RADAR CONTACT LOST
+ -- Urg(N)/Alr(M)/Resp(R)
+ uM156NULL [156] NULL,
+
+ -- CHECK STUCK MICROPHONE [frequency]
+ -- Urg(U)/Alr(M)/Resp(N)
+ uM157Frequency [157] Frequency,
+
+ -- ATIS [atiscode]
+ -- Urg(N)/Alr(L)/Resp(R)
+ uM158AtisCode [158] ATISCode,
+
+ -- ERROR [errorInformation]
+ -- Urg(U)/Alr(M)/Resp(N)
+ uM159ErrorInformation [159] ErrorInformation,
+
+ -- NEXT DATA AUTHORITY [facility]
+ -- Urg(L)/Alr(N)/Resp(N)
+ uM160Facility [160] Facility,
+
+ -- END SERVICE
+ -- Urg(L)/Alr(N)/Resp(N)
+ uM161NULL [161] NULL,
+
+ -- SERVICE UNAVAILABLE
+ -- Urg(L)/Alr(L)/Resp(N )
+ uM162NULL [162] NULL,
+
+ -- [facilitydesignation]
+ -- Urg(L)/Alr(N)/Resp(N)
+ uM163FacilityDesignation [163] FacilityDesignation,
+
+ -- WHEN READY
+ -- Urg(L)/Alr(N)/Resp(N)
+ uM164NULL [164] NULL,
+
+ -- THEN
+ -- Urg(L)/Alr(N)/Resp(N)
+ uM165NULL [165] NULL,
+
+ -- DUE TO [traffictype]TRAFFIC
+ -- Urg(L)/Alr(N)/Resp(N)
+ uM166TrafficType [166] TrafficType,
+
+ -- DUE TO AIRSPACE RESTRICTION
+ -- Urg(L)/Alr(N)/Resp(N)
+ uM167NULL [167] NULL,
+
+ -- DISREGARD
+ -- Urg(U)/Alr(M)/Resp(R)
+ uM168NULL [168] NULL,
+
+ -- [freetext]
+ -- Urg(N)/Alr(L)/Resp(R)
+ uM169FreeText [169] FreeText,
+
+ -- [freetext]
+ -- Urg(D)/Alr(H)/Resp(R)
+ uM170FreeText [170] FreeText,
+
+ -- CLIMB AT [verticalRate] MINIMUM
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM171VerticalRate [171] VerticalRate,
+
+ -- CLIMB AT [verticalRate] MAXIMUM
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM172VerticalRate [172] VerticalRate,
+
+ -- DESCEND AT [verticalRate] MINIMUM
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM173VerticalRate [173] VerticalRate,
+
+ -- DESCEND AT [verticalRate] MAXIMUM
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM174VerticalRate [174] VerticalRate,
+
+ -- REPORT REACHING [level]
+ -- Urg(N)/Alr(L)/Resp(W/U)
+ uM175Level [175] Level,
+
+ -- MAINTAIN OWN SEPARATION AND VMC
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM176NULL [176] NULL,
+
+ -- AT PILOTS DISCRETION
+ -- Urg(L)/Alr(L)/Resp(N)
+ uM177NULL [177] NULL,
+
+ -- Reserved
+ -- Urg(L)/Alr(L)/Resp(Y)
+ uM178NULL [178] NULL,
+
+ -- SQUAWK IDENT
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM179NULL [179] NULL,
+
+ -- REPORT REACHING BLOCK [level] TO [level]
+ -- Urg(N)/Alr(L)/Resp(W/U)
+ uM180LevelLevel [180] LevelLevel,
+
+ -- REPORT DISTANCE [tofrom] [position]
+ -- Urg(N)/Alr(M)/Resp(Y)
+ uM181ToFromPosition [181] ToFromPosition,
+
+ -- CONFIRM ATIS CODE
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM182NULL [182] NULL,
+
+ -- [freetext]
+ -- Urg(N)/Alr(M)/Resp(N)
+ uM183FreeText [183] FreeText,
+
+ -- AT [time] REPORT DISTANCE [tofrom] [position]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM184TimeToFromPosition [184] TimeToFromPosition,
+
+ -- AFTER PASSING [position] CLIMB TO [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM185PositionLevel [185] PositionLevel,
+
+ -- AFTER PASSING [position] DESCEND TO [level]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM186PositionLevel [186] PositionLevel,
+
+ -- [freetext]
+ -- Urg(L)/Alr(N)/Resp(N)
+ uM187FreeText [187] FreeText,
+
+ -- AFTER PASSING [position] MAINTAIN [speed]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM188PositionSpeed [188] PositionSpeed,
+
+ -- ADJUST SPEED TO [speed]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM189Speed [189] Speed,
+
+ -- FLY HEADING [degrees]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM190Degrees [190] Degrees,
+
+ -- ALL ATS TERMINATED
+ -- Urg(N)/Alr(M)/Resp(R)
+ uM191NULL [191] NULL,
+
+ -- REACH [level] BY [time]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM192LevelTime [192] LevelTime,
+
+ -- IDENTIFICATION LOST
+ -- Urg(N)/Alr(M)/Resp(R)
+ uM193NULL [193] NULL,
+
+ -- [freetext]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ uM194FreeText [194] FreeText,
+
+ -- [freetext]
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM195FreeText [195] FreeText,
+
+ -- [freetext]
+ -- Urg(N)/Alr(M)/Resp
+ uM196FreeText [196] FreeText,
+
+ -- [freetext]
+ -- Urg(U)/Alr(M)/Resp(W/U)
+ uM197FreeText [197] FreeText,
+
+ -- [freetext]
+ -- Urg(D)/Alr(H)/Resp(W/U)
+ uM198FreeText [198] FreeText,
+
+ -- [freetext]
+ -- Urg(N)/Alr(L)/Resp(N)
+ uM199FreeText [199] FreeText,
+
+ -- REPORT REACHING
+ -- Urg(N)/Alr(L)/Resp(W/U)
+ uM200NULL [200] NULL,
+
+ -- Not Used
+ -- Urg(L)/Alr(L)/Resp(N)
+ uM201NULL [201] NULL,
+
+ -- Not Used
+ -- Urg(L)/Alr(L)/Resp(N)
+ uM202NULL [202] NULL,
+
+ -- [freetext]
+ -- Urg(N)/Alr(M)/Resp(R)
+ uM203FreeText [203] FreeText,
+
+ -- [freetext]
+ -- Urg(N)/Alr(M)/Resp(Y)
+ uM204FreeText [204] FreeText,
+
+ -- [freetext]
+ -- Urg(N)/Alr(M)/Resp(A/N)
+ uM205FreeText [205] FreeText,
+
+ -- [freetext]
+ -- Urg(L)/Alr(N)/Resp(Y)
+ uM206FreeText [206] FreeText,
+
+ -- [freetext]
+ -- Urg(L)/Alr(L)/Resp(Y)
+ uM207FreeText [207] FreeText,
+
+ -- [freetext]
+ -- Urg(L)/Alr(L)/Resp(N)
+ uM208FreeText [208] FreeText,
+
+ -- REACH [level] BY [position]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM209LevelPosition [209] LevelPosition,
+
+ -- IDENTIFIED [position]
+ -- Urg(N)/Alr(M)/Resp(R)
+ uM210Position [210] Position,
+
+ -- REQUEST FORWARDED
+ -- Urg(N)/Alr(L)/Resp(N)
+ uM211NULL [211] NULL,
+
+ -- [facilitydesignation] ATIS [atiscode] CURRENT
+ -- Urg(N)/Alr(L)/Resp(R)
+ uM212FacilityDesignationATISCode [212] FacilityDesignationATISCode,
+
+ -- [facilitydesignation] ALTIMETER [altimeter]
+ -- Urg(N)/Alr(L)/Resp(R)
+ uM213FacilityDesignationAltimeter [213] FacilityDesignationAltimeter,
+
+ -- RVR RUNWAY [runway] [rvr]
+ -- Urg(N)/Alr(M)/Resp(R)
+ uM214RunwayRVR [214] RunwayRVR,
+
+ -- TURN [direction][degrees]
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM215DirectionDegrees [215] DirectionDegrees,
+
+ -- REQUEST FLIGHT PLAN
+ -- Urg(N)/Alr(M)/Resp(Y)
+ uM216NULL [216] NULL,
+
+ -- REPORT ARRIVAL
+ -- Urg(N)/Alr(M)/Resp(Y)
+ uM217NULL [217] NULL,
+
+ -- REQUEST ALREADY RECEIVED
+ -- Urg(L)/Alr(N)/Resp(N)
+ uM218NULL [218] NULL,
+
+ -- STOP CLIMB AT [level]
+ -- Urg(U)/Alr(M)/Resp(W/U)
+ uM219Level [219] Level,
+
+ -- STOP DESCENT AT [level]
+ -- Urg(U)/Alr(M)/Resp(W/U)
+ uM220Level [220] Level,
+
+ -- STOP TURN HEADING [degrees]
+ -- Urg(U)/Alr(M)/Resp(W/U)
+ uM221Degrees [221] Degrees,
+
+ -- NO SPEED RESTRICTION
+ -- Urg(L)/Alr(L)/Resp(R)
+ uM222NULL [222] NULL,
+
+ -- REDUCE TO MINIMUM APPROACH SPEED
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM223NULL [223] NULL,
+
+ -- NO DELAY EXPECTED
+ -- Urg(N)/Alr(L)/Resp(R)
+ uM224NULL [224] NULL,
+
+ -- DELAY NOT DETERMINED
+ -- Urg(N)/Alr(L)/Resp(R)
+ uM225NULL [225] NULL,
+
+ -- EXPECTED APPROACH TIME [time]
+ -- Urg(N)/Alr(L)/Resp(R)
+ uM226Time [226] Time,
+
+ -- LOGICAL ACKNOWLEDGMENT
+ -- Urg(N)/Alr(M)/Resp(N)
+ uM227NULL [227] NULL,
+
+ -- REPORT ETA [position]
+ --Urg(L)/Alr(L)/Resp(Y)
+ uM228Position [228] Position,
+
+ -- REPORT ALTERNATE AERODROME
+ -- Urg(L)/Alr(L)/Resp(Y)
+ uM229NULL [229] NULL,
+
+ -- IMMEDIATELY
+ -- Urg(D)/Alr(H)/Resp(N)
+ uM230NULL [230] NULL,
+
+ -- STATE PREFERRED LEVEL
+ -- Urg(L)/Alr(L)/Resp(Y)
+ uM231NULL [231] NULL,
+
+ -- STATE TOP OF DESCENT
+ -- Urg(L)/Alr(L)/Resp(Y)
+ uM232NULL [232] NULL,
+
+ -- USE OF LOGICAL ACKNOWLEDGMENT PROHIBITED
+ -- Urg(N)/Alr(M)/Resp(N)
+ uM233NULL [233] NULL,
+
+ -- FLIGHT PLAN NOT HELD
+ -- Urg(L)/Alr(L)/Resp(N)
+ uM234NULL [234] NULL,
+
+ -- ROGER 7500
+ -- Urg(U)/Alr(H)/Resp(N)
+ uM235NULL [235] NULL,
+
+ -- LEAVE CONTROLLED AIRSPACE
+ -- Urg(N)/Alr(M)/Resp(W/U)
+ uM236NULL [236] NULL,
+ ...,
+
+ -- REQUEST AGAIN WITH NEXT UNIT
+ -- Urg(N)/Alr(L)/Resp(N)
+ uM237NULL [237]NULL
+}
+
+------------------------------------------------------------------------------------
+-- Downlink message element
+-- ----------------------------------------------------------------------------------
+ATCDownlinkMsgElementId ::= CHOICE
+{
+ -- WILCO
+ -- Urg(N)/Alr(M)/Resp(N)
+ dM0NULL [0] NULL,
+
+ --UNABLE
+ -- Urg(N)/Alr(M)/Resp(N)
+ dM1NULL [1] NULL,
+
+ -- STANDBY
+ -- Urg(N)/Alr(M)/Resp(N)
+ dM2NULL [2] NULL,
+
+ -- ROGER
+ -- Urg(N)/Alr(M)/Resp(N)
+ dM3NULL [3] NULL,
+
+ -- AFFIRM
+ -- Urg(N)/Alr(M)/Resp(N)
+ dM4NULL [4] NULL,
+
+ -- NEGATIVE
+ -- Urg(N)/Alr(M)/Resp(N)
+ dM5NULL [5] NULL,
+
+ -- REQUEST [level]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM6Level [6] Level,
+
+ -- REQUEST BLOCK [level] TO [level]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM7LevelLevel [7] LevelLevel,
+
+ -- REQUEST CRUISE CLIMB TO [level]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM8Level [8] Level,
+
+ -- REQUEST CLIMB TO [level]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM9Level [9] Level,
+
+ -- REQUEST DESCENT TO [level]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM10Level [10] Level,
+
+ -- AT [position] REQUEST CLIMB TO [level]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM11PositionLevel [11] PositionLevel,
+
+ -- AT [position] REQUEST DESCENT TO [level]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM12PositionLevel [12] PositionLevel,
+
+ -- AT [time] REQUEST CLIMB TO [level]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM13TimeLevel [13] TimeLevel,
+
+ -- AT [time] REQUEST DESCENT TO [level]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM14TimeLevel [14] TimeLevel,
+
+ -- REQUEST OFFSET [specifiedDistance] [direction] OF ROUTE
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM15DistanceSpecifiedDirection [15] DistanceSpecifiedDirection,
+
+ -- AT [position] REQUEST OFFSET [specifiedDistance] [direction] OF ROUTE
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM16PositionDistanceSpecifiedDirection [16] PositionDistanceSpecifiedDirection,
+
+ -- AT [time] REQUEST OFFSET [specifiedDistance] [direction] OF ROUTE
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM17TimeDistanceSpecifiedDirection [17] TimeDistanceSpecifiedDirection,
+
+ -- REQUEST [speed]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM18Speed [18] Speed,
+
+ -- REQUEST [speed] TO [speed]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM19SpeedSpeed [19] SpeedSpeed,
+
+ -- REQUEST VOICE CONTACT
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM20NULL [20] NULL,
+
+ -- REQUEST VOICE CONTACT [frequency]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM21Frequency [21] Frequency,
+
+ -- REQUEST DIRECT TO [position]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM22Position [22] Position,
+
+ -- REQUEST [procedureName]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM23ProcedureName [23] ProcedureName,
+
+ -- REQUEST CLEARANCE [routeClearance]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM24RouteClearance [24] RouteClearanceIndex,
+
+ -- REQUEST [clearanceType] CLEARANCE
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM25ClearanceType [25] ClearanceType,
+
+ -- REQUEST WEATHER DEVIATION TO [position] VIA [routeClearance]
+ -- Urg(N)/Alr(M)/Resp(Y)
+ dM26PositionRouteClearance [26] PositionRouteClearanceIndex,
+
+ -- REQUEST WEATHER DEVIATION UP TO [specifiedDistance] [direction] OF ROUTE
+ -- Urg(N)/Alr(M)/Resp(Y)
+ dM27DistanceSpecifiedDirection [27] DistanceSpecifiedDirection,
+
+ -- LEAVING [level]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM28Level [28] Level,
+
+ -- CLIMBING TO [level]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM29Level [29]Level,
+
+ -- DESCENDING TO [level]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM30Level [30] Level,
+
+ -- PASSING [position]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM31Position [31] Position,
+
+ -- PRESENT LEVEL [level]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM32Level [32] Level,
+
+ -- PRESENT POSITION [position]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM33Position [33] Position,
+
+ -- PRESENT SPEED [speed]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM34Speed [34] Speed,
+
+ -- PRESENT HEADING [degrees]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM35Degrees [35] Degrees,
+
+ -- PRESENT GROUND TRACK [degrees]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM36Degrees [36] Degrees,
+
+ -- MAINTAINING [level]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM37Level [37] Level,
+
+ -- ASSIGNED LEVEL [level]
+ -- Urg(N)/Alr(M)/Resp(N)
+ dM38Level [38] Level,
+
+ -- ASSIGNED SPEED [speed]
+ -- Urg(N)/Alr(M)/Resp(N)
+ dM39Speed [39] Speed,
+
+ -- ASSIGNED ROUTE [routeClearance]
+ -- Urg(N)/Alr(M)/Resp(N)
+ dM40RouteClearance [40] RouteClearanceIndex,
+
+ -- BACK ON ROUTE
+ -- Urg(N)/Alr(M)/Resp(N)
+ dM41NULL [41] NULL,
+
+ -- NEXT WAYPOINT [position]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM42Position [42] Position,
+
+ -- NEXT WAYPOINT ETA [time]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM43Time [43] Time,
+
+ -- ENSUING WAYPOINT [position]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM44Position [44] Position,
+
+ -- REPORTED WAYPOINT [position]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM45Position [45] Position,
+
+ -- REPORTED WAYPOINT [time]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM46Time [46] Time,
+
+ -- SQUAWKING [code]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM47Code [47] Code,
+
+ -- POSITION REPORT [positionreport]
+ -- Urg(N)/Alr(M)/Resp(N)
+ dM48PositionReport [48] PositionReport,
+
+ -- WHEN CAN WE EXPECT [speed]
+ -- Urg(L)/Alr(L)/Resp(Y)
+ dM49Speed [49] Speed,
+
+ -- WHEN CAN WE EXPECT [speed] TO [speed]
+ -- Urg(L)/Alr(L)/Resp(Y)
+ dM50SpeedSpeed [50] SpeedSpeed,
+
+ -- WHEN CAN WE EXPECT BACK ON ROUTE
+ -- Urg(L)/Alr(L)/Resp(Y)
+ dM51NULL [51] NULL,
+
+ -- WHEN CAN WE EXPECT LOWER LEVEL
+ -- Urg(L)/Alr(L)/Resp(Y)
+ dM52NULL [52] NULL,
+
+ -- WHEN CAN WE EXPECT HIGHER LEVEL Urg(L)/Alr(L)/Resp(Y)
+ dM53NULL [53] NULL,
+
+ -- WHEN CAN WE EXPECT CRUISE CLIMB TO [level]
+ -- Urg(L)/Alr(L)/Resp(Y)
+ dM54Level [54] Level,
+
+ -- PAN PAN PAN
+ -- Urg(U)/Alr(H)/Resp(Y)
+ dM55NULL [55] NULL,
+
+ -- MAYDAY MAYDAY MAYDAY
+ -- Urg(D)/Alr(H)/Resp(Y)
+ dM56NULL [56] NULL,
+
+ -- [remainingFuel] OF FUEL REMAINING AND [personsonboard] PERSONS ON BOARD
+ -- Urg(U)/Alr(H)/Resp(Y)
+ dM57RemainingFuelPersonsOnBoard [57] RemainingFuelPersonsOnBoard,
+
+ -- CANCEL EMERGENCY
+ -- Urg(U)/Alr(M)/Resp(Y)
+ dM58NULL [58] NULL,
+
+ -- DIVERTING TO [position] VIA [routeClearance]
+ -- Urg(U)/Alr(H)/Resp(Y)
+ dM59PositionRouteClearance [59] PositionRouteClearanceIndex,
+
+ -- OFFSETTING [specifiedDistance] [direction] OF ROUTE
+ -- Urg(U)/Alr(H)/Resp(Y)
+ dM60DistanceSpecifiedDirection [60] DistanceSpecifiedDirection,
+
+ -- DESCENDING TO [level]
+ -- Urg(U)/Alr(H)/Resp(Y)
+ dM61Level [61] Level,
+
+ -- ERROR [errorInformation]
+ -- Urg(U)/Alr(L)/Resp(N)
+ dM62ErrorInformation [62] ErrorInformation,
+
+ -- NOT CURRENT DATA AUTHORITY
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM63NULL [63] NULL,
+
+ -- [facilitydesignation]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM64FacilityDesignation [64] FacilityDesignation,
+
+ -- DUE TO WEATHER
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM65NULL [65] NULL,
+
+ -- DUE TO AIRCRAFT PERFORMANCE
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM66NULL [66] NULL,
+
+ -- [freetext]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM67FreeText [67] FreeText,
+
+ -- [freetext]
+ -- Urg(D)/Alr(H)/Resp(Y)
+ dM68FreeText [68] FreeText,
+
+ -- REQUEST VMC DESCENT
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM69NULL [69] NULL,
+
+ -- REQUEST HEADING [degrees]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM70Degrees [70] Degrees,
+
+ -- REQUEST GROUND TRACK [degrees]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM71Degrees [71] Degrees,
+
+ -- REACHING [level]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM72Level [72] Level,
+
+ -- [versionnumber]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM73Versionnumber [73] VersionNumber,
+
+ -- REQUEST TO MAINTAIN OWN SEPARATION AND VMC
+ -- Urg(L)/Alr(L)/Resp(Y)
+ dM74NULL [74] NULL,
+
+ -- AT PILOTS DISCRETION
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM75NULL [75] NULL,
+
+ -- REACHING BLOCK [level] TO [level]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM76LevelLevel [76] LevelLevel,
+
+ -- ASSIGNED BLOCK [level] TO [level]
+ -- Urg(N)/Alr(M)/Resp(N)
+ dM77LevelLevel [77] LevelLevel,
+
+ -- AT [time] [distance] [tofrom] [position]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM78TimeDistanceToFromPosition [78] TimeDistanceToFromPosition,
+
+ -- ATIS [atiscode]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM79AtisCode [79] ATISCode,
+
+ -- DEVIATING UP TO [specifiedDistance] [direction] OF ROUTE
+ -- Urg(U)/Alr(H)/Resp(Y)
+ dM80DistanceSpecifiedDirection [80] DistanceSpecifiedDirection,
+
+ -- WE CAN ACCEPT [level] AT [time]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM81LevelTime [81] LevelTime,
+
+ -- WE CANNOT ACCEPT [level]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM82Level [82] Level,
+
+ -- WE CAN ACCEPT [speed] AT [time]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM83SpeedTime [83] SpeedTime,
+
+ -- WE CANNOT ACCEPT [speed]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM84Speed [84] Speed,
+
+ -- WE CAN ACCEPT [specifiedDistance] [direction] AT [time]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM85DistanceSpecifiedDirectionTime [85] DistanceSpecifiedDirectionTime,
+
+ -- WE CANNOT ACCEPT [specifiedDistance] [direction]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM86DistanceSpecifiedDirection [86] DistanceSpecifiedDirection,
+
+ -- WHEN CAN WE EXPECT CLIMB TO [level]
+ -- Urg(L)/Alr(L)/Resp(Y)
+ dM87Level [87] Level,
+
+ -- WHEN CAN WE EXPECT DESCENT TO [level]
+ --Urg(L)/Alr(L)/Resp(Y)
+ dM88Level [88] Level,
+
+ -- MONITORING [unitname] [frequency]
+ -- Urg(U)/Alr(M)/Resp(N)
+ dM89UnitnameFrequency [89] UnitNameFrequency,
+
+ -- [freetext]
+ -- Urg(N)/Alr(M)/Resp(N)
+ dM90FreeText [90] FreeText,
+
+ -- [freetext]
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM91FreeText [91] FreeText,
+
+ -- [freetext]
+ -- Urg(L)/Alr(L)/Resp(Y)
+ dM92FreeText [92] FreeText,
+
+ -- [freetext]
+ -- Urg(U)/Alr(H)/Resp(N)
+ dM93FreeText [93] FreeText,
+
+ -- [freetext]
+ -- Urg(D)/Alr(H)/Resp(N)
+ dM94FreeText [94] FreeText,
+
+ -- [freetext]
+ -- Urg(U)/Alr(M)/Resp(N)
+ dM95FreeText [95] FreeText,
+
+ -- [freetext]
+ -- Urg(U)/Alr(L)/Resp(N)
+ dM96FreeText [96] FreeText,
+
+ -- [freetext]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM97FreeText [97] FreeText,
+
+ -- [freetext]
+ -- Urg(N)/Alr(N)/Resp(N)
+ dM98FreeText [98] FreeText,
+
+ -- CURRENT DATA AUTHORITY
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM99NULL [99] NULL,
+
+ -- LOGICAL ACKNOWLEDGMENT
+ -- Urg(N)/Alr(M)/Resp(N)
+ dM100NULL [100] NULL,
+
+ -- REQUEST END OF SERVICE
+ -- Urg(L)/Alr(L)/Resp(Y)
+ dM101NULL [101] NULL,
+
+ -- LANDING REPORT
+ -- Urg(N)/Alr(N)/Resp(N)
+ dM102NULL [102] NULL,
+
+ -- CANCELLING IFR
+ -- Urg(N)/Alr(L)/Resp(Y)
+ dM103NULL [103] NULL,
+
+ -- ETA[position][time]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM104PositionTime [104] PositionTime,
+
+ -- ALTERNATE AERODROME[airport]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM105Airport [105] Airport,
+
+ -- PREFERRED LEVEL[level]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM106Level [106] Level,
+
+ -- NOT AUTHORIZED NEXT DATA AUTHORITY
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM107NULL [107] NULL,
+
+ -- DE-ICING COMPLETE
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM108NULL [108] NULL,
+
+ -- TOP OF DESCENT [time]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM109Time [109] Time,
+
+ -- TOP OF DESCENT [position]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM110Position [110] Position,
+
+ -- TOP OF DESCENT [time] [position]
+ -- Urg(L)/Alr(L)/Resp(N)
+ dM111TimePosition [111] TimePosition,
+
+ -- SQUAWKING 7500
+ -- Urg(U)/Alr(H)/Resp(N)
+ dM112NULL [112] NULL,
+
+ -- [speedType] [speedType] [speedType] SPEED [speed]
+ -- Urg(N)/Alr(L)/Resp(N)
+ dM113SpeedTypeSpeedTypeSpeedTypeSpeed [113] SpeedTypeSpeedTypeSpeedTypeSpeed,
+
+ ...
+}
+
+AircraftAddress ::= BIT STRING (SIZE(24))
+
+AircraftFlightIdentification ::= IA5String (SIZE (2..8))
+
+Airport ::= IA5String (SIZE (4))
+
+Altimeter ::= CHOICE
+{
+ altimeterEnglish [0] AltimeterEnglish,
+ altimeterMetric [1] AltimeterMetric
+}
+
+AltimeterEnglish ::= INTEGER (2200..3200)
+-- unit = Inches Mercury, Range (22.00 .. 32.00), resolution = 0.01
+
+AltimeterMetric ::= INTEGER (7500..12500)
+-- unit = Hectopascal, Range (750.0..1250.0), resolution = 0.1
+
+ATISCode ::= IA5String (SIZE (1))
+
+ATSRouteDesignator ::= IA5String (SIZE (2..7))
+
+ATWAlongTrackWaypoint ::= SEQUENCE
+{
+ position [0] Position,
+ aTWDistance [1] ATWDistance,
+ speed [2] Speed OPTIONAL,
+ aTWLevels [3] ATWLevelSequence OPTIONAL
+}
+
+ATWLevel ::= SEQUENCE
+{
+ atw ATWLevelTolerance,
+ level Level
+}
+
+ATWLevelSequence ::= SEQUENCE SIZE (1..2) OF ATWLevel
+
+ATWLevelTolerance ::= ENUMERATED
+{
+ at (0),
+ atorabove (1),
+ atorbelow (2)
+}
+
+ATWDistance ::= SEQUENCE
+{
+ atwDistanceTolerance ATWDistanceTolerance,
+ distance Distance
+}
+
+ATWDistanceTolerance ::= ENUMERATED
+{
+ plus (0),
+ minus (1)
+}
+
+ClearanceType ::= ENUMERATED
+{
+ noneSpecified (0),
+ approach (1),
+ departure (2),
+ further (3),
+ start-up (4),
+ pushback (5),
+ taxi (6),
+ take-off (7),
+ landing (8),
+ oceanic (9),
+ en-route (10),
+ downstream (11),
+ ...
+}
+
+Code ::= SEQUENCE SIZE (4) OF CodeOctalDigit
+
+CodeOctalDigit ::= INTEGER (0..7)
+
+ControlledTime ::= SEQUENCE
+{
+ time Time,
+ timeTolerance TimeTolerance
+}
+
+Date ::= SEQUENCE
+{
+ year Year,
+ month Month,
+ day Day
+}
+
+DateTimeGroup ::= SEQUENCE
+{
+ date Date,
+ timehhmmss Timehhmmss
+}
+
+Day ::= INTEGER (1..31)
+--unit = Day, Range (1..31), resolution = 1
+
+DegreeIncrement ::= INTEGER (1..20)
+--unit = Degree, Range (1..20), resolution = 1
+
+Degrees ::= CHOICE
+{
+ degreesMagnetic [0] DegreesMagnetic,
+ degreesTrue [1] DegreesTrue
+}
+
+DegreesMagnetic ::= INTEGER (1..360)
+--unit = degree, Range (1..360), resolution = 1
+
+DegreesTrue ::= INTEGER (1..360)
+--unit = degree, Range (1..360), resolution = 1
+
+DepartureClearance ::= SEQUENCE
+{
+ aircraftFlightIdentification [0] AircraftFlightIdentification,
+ clearanceLimit [1] Position,
+ flightInformation [2] FlightInformation OPTIONAL,
+ furtherInstructions [3] FurtherInstructions OPTIONAL
+}
+
+DepartureMinimumInterval ::= INTEGER (1..150)
+--unit = Minute, Range (0.1..15.0), resolution = 0.1
+
+Direction ::= ENUMERATED
+{
+ left (0),
+ right (1),
+ eitherSide (2),
+ north (3),
+ south (4),
+ east (5),
+ west (6),
+ northEast (7),
+ northWest (8),
+ southEast (9),
+ southWest (10)
+}
+
+DirectionDegrees ::= SEQUENCE
+{
+ direction Direction,
+ degrees Degrees
+}
+
+Distance ::= CHOICE
+{
+ distanceNm [0] DistanceNm,
+ distanceKm [1] DistanceKm
+}
+
+
+DistanceKm ::= INTEGER (0..8000)
+-- unit = Kilometer, Range (0..2000), resolution = 0.25
+
+DistanceNm ::= INTEGER (0..9999)
+-- unit = Nautical Mile, Range (0..999.9), resolution = 0.1
+
+DistanceSpecified ::= CHOICE
+{
+ distanceSpecifiedNm [0] DistanceSpecifiedNm,
+ distanceSpecifiedKm [1] DistanceSpecifiedKm
+}
+
+
+DistanceSpecifiedDirection ::= SEQUENCE
+{
+ distanceSpecified DistanceSpecified,
+ direction Direction
+}
+
+DistanceSpecifiedDirectionTime ::= SEQUENCE
+{
+ distanceSpecifiedDirection DistanceSpecifiedDirection,
+ time Time
+}
+
+DistanceSpecifiedKm ::= INTEGER (1..500)
+-- unit = Kilometer, Range (1..500), resolution = 1
+
+DistanceSpecifiedNm ::= INTEGER (1..250)
+-- unit = Nautical Mile, Range (1..250), resolution = 1
+
+ErrorInformation ::= ENUMERATED
+{
+ unrecognizedMsgReferenceNumber (0),
+ logicalAcknowledgmentNotAccepted (1),
+ insufficientResources (2),
+ invalidMessageElementCombination (3),
+ invalidMessageElement (4),
+ ...
+}
+
+Facility ::= CHOICE{
+ noFacility [0] NULL,
+ facilityDesignation [1] FacilityDesignation
+}
+
+FacilityDesignation ::= IA5String (SIZE (4..8))
+
+FacilityFunction ::= ENUMERATED
+{
+ center (0),
+ approach (1),
+ tower (2),
+ final (3),
+ groundControl (4),
+ clearanceDelivery (5),
+ departure (6),
+ control (7),
+ radio (8),
+ ...
+}
+
+FacilityDesignationAltimeter ::= SEQUENCE
+{
+ facilityDesignation FacilityDesignation,
+ altimeter Altimeter
+}
+
+FacilityDesignationATISCode ::= SEQUENCE
+{
+ facilityDesignation FacilityDesignation,
+ aTISCode ATISCode
+}
+
+FacilityName ::= IA5String (SIZE (3..18))
+
+Fix ::= IA5String (SIZE (1..5))
+
+FixName ::= SEQUENCE
+{
+ name [0] Fix,
+ latlon [1] LatitudeLongitude OPTIONAL
+}
+
+FlightInformation ::= CHOICE
+{
+ routeOfFlight [0] RouteInformation,
+ levelsOfFlight [1] LevelsOfFlight,
+ routeAndLevels [2] RouteAndLevels
+}
+
+FreeText ::= IA5String (SIZE (1..256))
+
+Frequency ::= CHOICE
+{
+ frequencyhf [0] Frequencyhf,
+ frequencyvhf [1] Frequencyvhf,
+ frequencyuhf [2] Frequencyuhf,
+ frequencysatchannel [3] Frequencysatchannel
+}
+
+Frequencyhf ::= INTEGER (2850..28000)
+-- unit = Kilohertz, Range (2850..28000), resolution = 1
+
+Frequencysatchannel ::= NumericString (SIZE (12))
+-- Frequencysatchannel corresponds to a 12 digit telephone number
+
+Frequencyuhf ::= INTEGER (9000..15999)
+-- unit = Megahertz, Range (225.000..399.975), resolution = 0.025
+
+Frequencyvhf ::= INTEGER (23600..27398)
+-- unit = Megahertz, Range (118.000..136.990), resolution = 0.005
+
+FurtherInstructions ::= SEQUENCE
+{
+ code [0] Code OPTIONAL,
+ frequencyDeparture [1] UnitNameFrequency OPTIONAL,
+ clearanceExpiryTime [2] Time OPTIONAL,
+ airportDeparture [3] Airport OPTIONAL,
+ airportDestination [4] Airport OPTIONAL,
+ timeDeparture [5] TimeDeparture OPTIONAL,
+ runwayDeparture [6] Runway OPTIONAL,
+ revisionNumber [7] RevisionNumber OPTIONAL,
+ aTISCode [8] ATISCode OPTIONAL
+}
+
+
+Holdatwaypoint ::= SEQUENCE
+{
+ position [0] Position,
+ holdatwaypointspeedlow [1] Speed OPTIONAL,
+ aTWlevel [2] ATWLevel OPTIONAL,
+ holdatwaypointspeedhigh [3] Speed OPTIONAL,
+ direction [4] Direction OPTIONAL,
+ degrees [5] Degrees OPTIONAL,
+ eFCtime [6] Time OPTIONAL,
+ legtype [7] LegType OPTIONAL
+}
+
+HoldClearance ::= SEQUENCE
+{
+ position [0] Position,
+ level [1] Level,
+ degrees [2] Degrees,
+ direction [3] Direction,
+ legType [4] LegType OPTIONAL
+}
+
+
+Humidity ::= INTEGER (0..100)
+-- unit = Percent humidity, Range (0..100), resolution = 1
+
+InterceptCourseFrom ::= SEQUENCE
+{
+ fromSelection InterceptCourseFromSelection,
+ degrees Degrees
+}
+
+InterceptCourseFromSelection ::= CHOICE
+{
+ publishedIdentifier [0] PublishedIdentifier,
+ latitudeLongitude [1] LatitudeLongitude,
+ placeBearingPlaceBearing [2] PlaceBearingPlaceBearing,
+ placeBearingDistance [3] PlaceBearingDistance
+}
+
+Icing ::= ENUMERATED
+{
+ reserved (0),
+ light (1),
+ moderate (2),
+ severe (3)
+}
+
+
+Latitude ::= SEQUENCE
+{
+ latitudeType LatitudeType,
+ latitudeDirection LatitudeDirection
+}
+
+LatitudeDegrees ::= INTEGER (0..90000)
+-- unit = Degree, Range (0..90), resolution = 0.001
+
+LatitudeDegreesMinutes ::= SEQUENCE
+{
+ latitudeWholeDegrees LatitudeWholeDegrees,
+ minutesLatLon MinutesLatLon
+}
+
+LatitudeDegreesMinutesSeconds ::= SEQUENCE
+{
+ latitudeWholeDegrees LatitudeWholeDegrees,
+ latlonWholeMinutes LatLonWholeMinutes,
+ secondsLatLon SecondsLatLon
+}
+
+LatitudeDirection ::= ENUMERATED
+{
+ north (0),
+ south (1)
+}
+
+LatitudeWholeDegrees ::= INTEGER (0..89)
+-- unit = Degree, Range (0..89), resolution = 1
+
+LatitudeLongitude ::= SEQUENCE
+{
+ latitude [0] Latitude OPTIONAL,
+ longitude [1] Longitude OPTIONAL
+}
+
+LatitudeReportingPoints ::= SEQUENCE
+{
+ latitudeDirection LatitudeDirection,
+ latitudeDegrees LatitudeDegrees
+}
+
+LatitudeType ::= CHOICE
+{
+ latitudeDegrees [0] LatitudeDegrees,
+ latitudeDegreesMinutes [1] LatitudeDegreesMinutes,
+ latitudeDMS [2] LatitudeDegreesMinutesSeconds
+}
+
+LatLonWholeMinutes ::= INTEGER (0..59)
+-- unit = Minute, Range (0..59), resolution = 1
+
+LatLonReportingPoints ::= CHOICE
+{
+ latitudeReportingPoints [0] LatitudeReportingPoints,
+ longitudeReportingPoints [1] LongitudeReportingPoints
+}
+
+LegDistance ::= CHOICE
+{
+ legDistanceEnglish [0] LegDistanceEnglish,
+ legDistanceMetric [1] LegDistanceMetric
+}
+
+LegDistanceEnglish ::= INTEGER (0..50)
+-- unit = Nautical Mile, Range (0..50), resolution = 1
+
+LegDistanceMetric ::= INTEGER (1..128)
+-- unit = Kilometer, Range (1..128), resolution = 1
+
+LegTime ::= INTEGER (0..10)
+--unit = Minute, Range (0..10), resolution = 1
+
+LegType ::= CHOICE
+{
+ legDistance [0] LegDistance,
+ legTime [1] LegTime
+}
+
+Level ::= CHOICE
+{
+ singleLevel [0] LevelType,
+ blockLevel [1] SEQUENCE SIZE (2) OF LevelType
+}
+
+LevelFeet ::= INTEGER (-60..7000)
+--unit = Feet, Range (-600..70000), resolution = 10
+
+LevelFlightLevel ::= INTEGER (30..700)
+--unit = Level (100 Feet), Range (030..700), resolution = 1
+
+LevelFlightLevelMetric ::= INTEGER (100..2500)
+--unit = Level (10 Meters), Range (100..2500), resolution = 1
+LevelLevel ::= SEQUENCE SIZE (2) OF Level
+LevelMeters ::= INTEGER (-30..25000)
+--unit = Meter, Range (-30..25000), resolution = 1
+
+LevelPosition ::= SEQUENCE
+{
+ level Level,
+ position Position
+}
+
+LevelProcedureName ::= SEQUENCE
+{
+ level Level,
+ procedureName ProcedureName
+}
+
+LevelsOfFlight ::= CHOICE
+{
+ level [0] Level,
+ procedureName [1] ProcedureName,
+ levelProcedureName [2] LevelProcedureName
+}
+
+LevelSpeed ::= SEQUENCE
+{
+ level Level,
+ speed SpeedSpeed
+}
+
+LevelSpeedSpeed ::= SEQUENCE
+{
+ level Level,
+ speeds SpeedSpeed
+}
+
+LevelTime ::= SEQUENCE
+{
+ level Level,
+ time Time
+}
+
+LevelType ::= CHOICE
+{
+ levelFeet [0] LevelFeet,
+ levelMeters [1] LevelMeters,
+ levelFlightLevel [2] LevelFlightLevel,
+ levelFlightLevelMetric [3] LevelFlightLevelMetric
+}
+
+Longitude ::= SEQUENCE
+{
+ longitudeType LongitudeType,
+ longitudeDirection LongitudeDirection
+}
+
+LongitudeDegrees ::= INTEGER (0..180000)
+--unit = Degree, Range (0..180), resolution = 0.001
+
+LongitudeDegreesMinutes ::= SEQUENCE
+{
+ longitudeWholeDegrees LongitudeWholeDegrees,
+ minutesLatLon MinutesLatLon
+}
+
+LongitudeDegreesMinutesSeconds ::= SEQUENCE
+{
+ longitudeWholeDegrees LongitudeWholeDegrees,
+ latLonWholeMinutes LatLonWholeMinutes,
+ secondsLatLon SecondsLatLon
+}
+
+LongitudeDirection ::= ENUMERATED
+{
+ east (0),
+ west (1)
+}
+
+LongitudeWholeDegrees ::= INTEGER (0..179)
+-- unit = Degree, Range (0..179), resolution = 1
+
+LongitudeReportingPoints ::= SEQUENCE
+{
+ longitudeDirection LongitudeDirection,
+ longitudeDegrees LongitudeDegrees
+}
+
+LongitudeType ::= CHOICE
+{
+ longitudeDegrees [0] LongitudeDegrees,
+ longitudeDegreesMinutes [1] LongitudeDegreesMinutes,
+ longitudeDMS [2] LongitudeDegreesMinutesSeconds
+}
+
+MinutesLatLon ::= INTEGER (0..5999)
+--unit = Minute, Range (0..59.99), resolution = 0.01
+
+Month ::= INTEGER (1..12)
+--unit = 1 Month, Range (1..12), resolution = 1
+
+Navaid ::= SEQUENCE
+{
+ name [0] NavaidName,
+ latlon [1] LatitudeLongitude OPTIONAL
+}
+
+NavaidName ::= IA5String (SIZE (1..4))
+
+PersonsOnBoard ::= INTEGER (1..1024)
+
+PlaceBearing ::= SEQUENCE
+{
+ publishedIdentifier PublishedIdentifier,
+ degrees Degrees
+}
+
+PlaceBearingDistance ::= SEQUENCE
+{
+ publishedIdentifier PublishedIdentifier,
+ degrees Degrees,
+ distance Distance
+}
+
+PlaceBearingPlaceBearing ::= SEQUENCE SIZE (2) OF PlaceBearing
+
+Position ::= CHOICE
+{
+ fixName [0] FixName,
+ navaid [1] Navaid,
+ airport [2] Airport,
+ latitudeLongitude [3] LatitudeLongitude,
+ placeBearingDistance [4] PlaceBearingDistance
+}
+
+PositionDegrees ::= SEQUENCE
+{
+ position Position,
+ degrees Degrees
+}
+
+
+PositionDistanceSpecifiedDirection ::= SEQUENCE
+{
+ position Position,
+ distanceSpecifiedDirection DistanceSpecifiedDirection
+}
+
+PositionLevel ::= SEQUENCE
+{
+ position Position,
+ level Level
+}
+
+PositionLevelLevel ::= SEQUENCE
+{
+ position Position,
+ levels LevelLevel
+}
+
+PositionLevelSpeed ::= SEQUENCE
+{
+ positionlevel PositionLevel,
+ speed Speed
+}
+
+PositionPosition ::= SEQUENCE SIZE (2) OF Position
+
+PositionProcedureName ::= SEQUENCE
+{
+ position Position,
+ procedureName ProcedureName
+}
+
+PositionReport ::= SEQUENCE
+{
+ positioncurrent [0] Position,
+ timeatpositioncurrent [1] Time,
+ level [2] Level,
+ fixnext [3] Position OPTIONAL,
+ timeetaatfixnext [4] Time OPTIONAL,
+ fixnextplusone [5] Position OPTIONAL,
+ timeetaatdestination [6] Time OPTIONAL,
+ remainingFuel [7] RemainingFuel OPTIONAL,
+ temperature [8] Temperature OPTIONAL,
+ winds [9] Winds OPTIONAL,
+ turbulence [10] Turbulence OPTIONAL,
+ icing [11] Icing OPTIONAL,
+ speed [12] Speed OPTIONAL,
+ speedground [13] SpeedGround OPTIONAL,
+ verticalChange [14] VerticalChange OPTIONAL,
+ trackAngle [15] Degrees OPTIONAL,
+ heading [16] Degrees OPTIONAL,
+ distance [17] Distance OPTIONAL,
+ humidity [18] Humidity OPTIONAL,
+ reportedWaypointPosition[19] Position OPTIONAL,
+ reportedWaypointTime [20] Time OPTIONAL,
+ reportedWaypointLevel [21] Level OPTIONAL
+}
+
+PositionRouteClearanceIndex ::= SEQUENCE
+{
+ position Position,
+ routeClearanceIndex RouteClearanceIndex
+}
+
+PositionSpeed ::= SEQUENCE
+{
+ position Position,
+ speed Speed
+}
+
+PositionSpeedSpeed ::= SEQUENCE
+{
+ position Position,
+ speeds SpeedSpeed
+}
+
+PositionTime ::= SEQUENCE
+{
+ position Position,
+ time Time
+}
+
+PositionTimeLevel ::= SEQUENCE
+{
+ positionTime PositionTime,
+ level Level
+}
+
+PositionTimeTime ::= SEQUENCE
+{
+ position Position,
+ times TimeTime
+}
+
+PositionUnitNameFrequency ::= SEQUENCE
+{
+ position Position,
+ unitname UnitName,
+ frequency Frequency
+}
+
+Procedure ::= IA5String (SIZE (1..20))
+
+ProcedureName ::= SEQUENCE
+{
+ type [0] ProcedureType,
+ procedure [1] Procedure,
+ transition [2] ProcedureTransition OPTIONAL
+}
+
+ProcedureTransition ::= IA5String (SIZE (1..5))
+
+ProcedureType ::= ENUMERATED
+{
+ arrival (0),
+ approach (1),
+ departure (2)
+}
+
+PublishedIdentifier ::= CHOICE
+{
+ fixName [0] FixName,
+ navaid [1] Navaid
+}
+
+RemainingFuel ::= Time
+
+RemainingFuelPersonsOnBoard ::= SEQUENCE
+{
+ remainingFuel RemainingFuel,
+ personsOnBoard PersonsOnBoard
+}
+
+ReportingPoints ::= SEQUENCE
+{
+ latLonReportingPoints [0] LatLonReportingPoints,
+ degreeIncrement [1] DegreeIncrement OPTIONAL
+}
+
+RevisionNumber ::= INTEGER (1..16)
+
+RouteAndLevels ::= SEQUENCE
+{
+ routeOfFlight RouteInformation,
+ levelsOfFlight LevelsOfFlight
+}
+
+RouteClearance ::= SEQUENCE
+{
+ airportDeparture [0] Airport OPTIONAL,
+ airportDestination [1] Airport OPTIONAL,
+ runwayDeparture [2] Runway OPTIONAL,
+ procedureDeparture [3] ProcedureName OPTIONAL,
+ runwayArrival [4] Runway OPTIONAL,
+ procedureApproach [5] ProcedureName OPTIONAL,
+ procedureArrival [6] ProcedureName OPTIONAL,
+ routeInformations [7] SEQUENCE SIZE (1..128) OF RouteInformation OPTIONAL,
+ routeInformationAdditional [8] RouteInformationAdditional OPTIONAL
+}
+
+RouteClearanceIndex ::= INTEGER (1..2)
+-- RouteClearanceIndex identifies the position of the RouteClearance data
+-- in the ASN.1 type for
+-- ATC UplinkMessage, constrained Data, routeClearance Data
+-- ATC DownlinkMessage, constrained Data, routeClearance Data
+
+RouteInformation ::= CHOICE
+{
+ publishedIdentifier [0] PublishedIdentifier,
+ latitudeLongitude [1] LatitudeLongitude,
+ placeBearingPlaceBearing [2] PlaceBearingPlaceBearing,
+ placeBearingDistance [3] PlaceBearingDistance,
+ aTSRouteDesignator [4] ATSRouteDesignator
+}
+
+
+RouteInformationAdditional ::= SEQUENCE
+{
+ aTWAlongTrackWaypoints [0] SEQUENCE SIZE (1..8) OF ATWAlongTrackWaypoint OPTIONAL,
+ reportingpoints [1] ReportingPoints OPTIONAL,
+ interceptCourseFroms [2] SEQUENCE SIZE (1..4) OF InterceptCourseFrom OPTIONAL,
+ holdAtWaypoints [3] SEQUENCE SIZE (1..8) OF Holdatwaypoint OPTIONAL,
+ waypointSpeedLevels [4] SEQUENCE SIZE (1..32) OF WaypointSpeedLevel OPTIONAL,
+ rTARequiredTimeArrivals [5] SEQUENCE SIZE (1..32) OF RTARequiredTimeArrival OPTIONAL
+}
+
+RTARequiredTimeArrival ::= SEQUENCE
+{
+ position [0] Position,
+ rTATime [1] RTATime,
+ rTATolerance [2] RTATolerance OPTIONAL
+}
+
+RTATime ::= SEQUENCE
+{
+ time Time,
+ timeTolerance TimeTolerance
+}
+
+RTATolerance ::= INTEGER (1..150)
+--unit= Minute, Range (0.1..15.0), resolution = 0.1
+
+Runway ::= SEQUENCE
+{
+ direction RunwayDirection,
+ configuration RunwayConfiguration
+}
+
+RunwayDirection ::= INTEGER (1..36)
+
+RunwayConfiguration ::= ENUMERATED
+{
+ left (0),
+ right (1),
+ center (2),
+ none (3)
+}
+
+RunwayRVR ::= SEQUENCE
+{
+ runway Runway,
+ rVR RVR
+}
+
+RVR ::= CHOICE
+{
+ rVRFeet [0] RVRFeet,
+ rVRMeters [1] RVRMeters
+}
+
+RVRFeet ::= INTEGER (0..6100)
+-- unit = Feet, Range (0..6100), resolution = 1
+
+RVRMeters ::= INTEGER (0..1500)
+-- unit = Meters (0..1500), resolution = 1
+
+SecondsLatLon ::= INTEGER (0..59)
+--unit = Second, Range (0.. 59), resolution = 1
+
+Speed ::= CHOICE
+{
+ speedIndicated [0] SpeedIndicated,
+ speedIndicatedMetric [1] SpeedIndicatedMetric,
+ speedTrue [2] SpeedTrue,
+ speedTrueMetric [3] SpeedTrueMetric,
+ speedGround [4] SpeedGround,
+ speedGroundMetric [5] SpeedGroundMetric,
+ speedMach [6] SpeedMach
+}
+
+SpeedIndicated ::= INTEGER (0..400)
+-- unit = Knots, Range (0..400), resolution = 1
+
+SpeedIndicatedMetric ::= INTEGER (0..800)
+-- unit = Kilometers/Hour, Range (0..800), resolution = 1
+
+SpeedGround ::= INTEGER (-50..2000)
+-- unit = Knots, Range (-50..2000), resolution = 1
+
+SpeedGroundMetric ::= INTEGER (-100..4000)
+-- unit = Kilometers/Hour, Range (-100..4000), resolution = 1
+
+SpeedMach ::= INTEGER (500..4000)
+-- unit = Mach Range (0.5 to 4.0), resolution = 0.001
+
+SpeedSpeed ::= SEQUENCE SIZE (2) OF Speed
+SpeedTime ::= SEQUENCE
+{
+ speed Speed,
+ time Time
+}
+
+SpeedTrue ::= INTEGER (0..2000)
+-- unit = Knots, Range (0..2000), resolution = 1
+
+SpeedTrueMetric ::= INTEGER (0..4000)
+-- unit = Kilometers/Hour, Range (0..4000), resolution = 1
+
+SpeedType ::= ENUMERATED
+{
+ noneSpecified (0),
+ indicated (1),
+ true (2),
+ ground (3),
+ mach (4),
+ approach (5),
+ cruise (6),
+ minimum (7),
+ maximum (8),
+ ...
+}
+
+SpeedTypeSpeedTypeSpeedType ::= SEQUENCE SIZE (3) OF SpeedType
+
+SpeedTypeSpeedTypeSpeedTypeSpeed ::= SEQUENCE
+{
+ speedTypes SpeedTypeSpeedTypeSpeedType,
+ speed Speed
+}
+
+Temperature ::= INTEGER (-100..100)
+-- unit = Degree Celsius, Range (-100..100), resolution = 1
+
+Time ::= SEQUENCE
+{
+ hours TimeHours,
+ minutes TimeMinutes
+}
+
+TimeLevel ::= SEQUENCE
+{
+ time Time,
+ level Level
+}
+
+TimeDeparture ::= SEQUENCE
+{
+ timeDepartureAllocated [0] Time OPTIONAL,
+ timeDepartureControlled [1] ControlledTime OPTIONAL,
+ timeDepartureClearanceExpected [2] Time OPTIONAL,
+ departureMinimumInterval [3] DepartureMinimumInterval OPTIONAL
+}
+
+
+TimeDistanceSpecifiedDirection ::= SEQUENCE
+{
+ time Time,
+ distanceSpecifiedDirection DistanceSpecifiedDirection
+}
+
+TimeDistanceToFromPosition ::= SEQUENCE
+{
+ time Time,
+ distance Distance,
+ tofrom ToFrom,
+ position Position
+}
+
+Timehhmmss ::= SEQUENCE
+{
+ hoursminutes Time,
+ seconds TimeSeconds
+}
+
+TimeHours ::= INTEGER (0..23)
+-- unit = Hour, Range (0..23), resolution = 1
+
+TimeUnitNameFrequency ::= SEQUENCE
+{
+ time Time,
+ unitName UnitName,
+ frequency Frequency
+}
+
+TimeMinutes ::= INTEGER (0..59)
+-- unit = Minute, Range (0..59), resolution = 1
+
+TimePosition ::= SEQUENCE
+{
+ time Time,
+ position Position
+}
+
+TimePositionLevel ::= SEQUENCE
+{
+ timeposition TimePosition,
+ level Level
+}
+
+TimePositionLevelSpeed ::= SEQUENCE
+{
+ timeposition TimePosition,
+ levelspeed LevelSpeed
+}
+
+TimeSeconds ::= INTEGER (0..59)
+-- unit = Second, Range (0..59), resolution = 1
+
+TimeSpeed ::= SEQUENCE
+{
+ time Time,
+ speed Speed
+}
+
+TimeSpeedSpeed ::= SEQUENCE
+{
+ time Time,
+ speedspeed SpeedSpeed
+}
+
+TimeTime ::= SEQUENCE SIZE (2) OF Time
+
+TimeToFromPosition ::= SEQUENCE
+{
+ time Time,
+ tofrom ToFrom,
+ position Position
+}
+TimeTolerance ::= ENUMERATED
+{
+ at (0),
+ atorafter (1),
+ atorbefore(2)
+}
+
+ToFrom ::= ENUMERATED
+{
+ to (0),
+ from (1)
+}
+
+ToFromPosition ::= SEQUENCE
+{
+ toFrom ToFrom,
+ position Position
+}
+
+TrafficType ::= ENUMERATED
+{
+ noneSpecified (0),
+ oppositeDirection (1),
+ sameDirection (2),
+ converging (3),
+ crossing (4),
+ diverging (5),
+ ...
+}
+
+Turbulence ::= ENUMERATED
+{
+ light (0),
+ moderate (1),
+ severe (2)
+}
+
+UnitName ::= SEQUENCE
+{
+ facilityDesignation [0] FacilityDesignation,
+ facilityName [1] FacilityName OPTIONAL,
+ facilityFunction [2] FacilityFunction
+}
+
+UnitNameFrequency ::= SEQUENCE
+{
+ unitName UnitName,
+ frequency Frequency
+}
+
+VersionNumber ::= INTEGER (0..15)
+
+VerticalChange ::= SEQUENCE
+{
+ direction VerticalDirection,
+ rate VerticalRate
+}
+
+VerticalDirection ::= ENUMERATED
+{
+ up (0),
+ down (1)
+}
+
+VerticalRate ::= CHOICE
+{
+ verticalRateEnglish [0] VerticalRateEnglish,
+ verticalRateMetric [1] VerticalRateMetric
+}
+
+VerticalRateEnglish ::= INTEGER (0..3000)
+-- unit = Feet/Minute, Range (0..30000), resolution = 10
+
+VerticalRateMetric ::= INTEGER (0..1000)
+-- unit = Meters/Minute, Range (0..10000), resolution = 10
+
+WaypointSpeedLevel ::= SEQUENCE
+{
+ position [0] Position,
+ speed [1] Speed OPTIONAL,
+ aTWLevels [2] ATWLevelSequence OPTIONAL
+}
+
+WindDirection ::= INTEGER (1..360)
+-- unit = Degree, Range (1..360), resolution = 1
+
+Winds ::= SEQUENCE
+{
+ direction WindDirection,
+ speed WindSpeed
+}
+
+WindSpeed ::= CHOICE
+{
+ windSpeedEnglish [0] WindSpeedEnglish,
+ windSpeedMetric [1] WindSpeedMetric
+}
+
+WindSpeedEnglish ::= INTEGER (0..255)
+-- unit = Knot, Range (0..255), resolution = 1
+
+WindSpeedMetric ::= INTEGER (0..511)
+-- unit = Kilometer/Hour, Range (0..511), resolution = 1
+
+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:
+--
diff --git a/asn1/atn-cpdlc/atn-cpdlc.cnf b/asn1/atn-cpdlc/atn-cpdlc.cnf
new file mode 100644
index 0000000000..bf6555a028
--- /dev/null
+++ b/asn1/atn-cpdlc/atn-cpdlc.cnf
@@ -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:
+#
diff --git a/asn1/atn-cpdlc/packet-atn-cpdlc-template.c b/asn1/atn-cpdlc/packet-atn-cpdlc-template.c
new file mode 100644
index 0000000000..de4e917dff
--- /dev/null
+++ b/asn1/atn-cpdlc/packet-atn-cpdlc-template.c
@@ -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:
+ */ \ No newline at end of file
diff --git a/asn1/atn-ulcs/Makefile.am b/asn1/atn-ulcs/Makefile.am
new file mode 100644
index 0000000000..4347512508
--- /dev/null
+++ b/asn1/atn-ulcs/Makefile.am
@@ -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
+
diff --git a/asn1/atn-ulcs/Makefile.common b/asn1/atn-ulcs/Makefile.common
new file mode 100644
index 0000000000..91a5c092fa
--- /dev/null
+++ b/asn1/atn-ulcs/Makefile.common
@@ -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=
+
diff --git a/asn1/atn-ulcs/Makefile.nmake b/asn1/atn-ulcs/Makefile.nmake
new file mode 100644
index 0000000000..78b3419d2b
--- /dev/null
+++ b/asn1/atn-ulcs/Makefile.nmake
@@ -0,0 +1,6 @@
+
+include ../../config.nmake
+include ../Makefile.preinc.nmake
+include Makefile.common
+include ../Makefile.inc.nmake
+
diff --git a/asn1/atn-ulcs/atn-ulcs.asn b/asn1/atn-ulcs/atn-ulcs.asn
new file mode 100644
index 0000000000..d7d18d08ba
--- /dev/null
+++ b/asn1/atn-ulcs/atn-ulcs.asn
@@ -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:
+--
diff --git a/asn1/atn-ulcs/atn-ulcs.cnf b/asn1/atn-ulcs/atn-ulcs.cnf
new file mode 100644
index 0000000000..00cc6a5ef4
--- /dev/null
+++ b/asn1/atn-ulcs/atn-ulcs.cnf
@@ -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:
+#
diff --git a/asn1/atn-ulcs/packet-atn-ulcs-template.c b/asn1/atn-ulcs/packet-atn-ulcs-template.c
new file mode 100644
index 0000000000..17a219f3e0
--- /dev/null
+++ b/asn1/atn-ulcs/packet-atn-ulcs-template.c
@@ -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:
+ */
diff --git a/asn1/atn-ulcs/packet-atn-ulcs-template.h b/asn1/atn-ulcs/packet-atn-ulcs-template.h
new file mode 100644
index 0000000000..88a6a82cb6
--- /dev/null
+++ b/asn1/atn-ulcs/packet-atn-ulcs-template.h
@@ -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:
+ */
+