forked from osmocom/wireshark
From Mathias Guettler:
New dissector for Air/Ground Datalink ICAO doc 9705 Ed2: ULCS, CM, CPDLC. Just adding the files to SVN for now. svn path=/trunk/; revision=51210
This commit is contained in:
parent
6e0c354769
commit
a4d1560fd1
|
@ -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
|
||||
|
|
@ -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=
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
|
||||
include ../../config.nmake
|
||||
include ../Makefile.preinc.nmake
|
||||
include Makefile.common
|
||||
include ../Makefile.inc.nmake
|
||||
|
|
@ -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:
|
||||
--
|
||||
|
|
@ -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:
|
||||
#
|
|
@ -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:
|
||||
*/
|
||||
|
|
@ -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
|
||||
|
|
@ -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=
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
|
||||
include ../../config.nmake
|
||||
include ../Makefile.preinc.nmake
|
||||
include Makefile.common
|
||||
include ../Makefile.inc.nmake
|
||||
|
File diff suppressed because it is too large
Load Diff
|
@ -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:
|
||||
#
|
|
@ -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:
|
||||
*/
|
|
@ -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
|
||||
|
|
@ -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=
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
|
||||
include ../../config.nmake
|
||||
include ../Makefile.preinc.nmake
|
||||
include Makefile.common
|
||||
include ../Makefile.inc.nmake
|
||||
|
|
@ -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:
|
||||
--
|
|
@ -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:
|
||||
#
|
|
@ -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:
|
||||
*/
|
|
@ -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:
|
||||
*/
|
||||
|
Loading…
Reference in New Issue