How to improve Wireshark dissector design with C-code autogenerator

Transcription

How to improve Wireshark dissector design with C-code autogenerator
How to improve
Wireshark dissector
design with C-code
autogenerator
methodology?
September 23, 2009
By Antoine Varet,
Nicolas Larrieu,
Jean-Marie Fontaine,
CNS Department
ENAC
1
Note about the license
/*
* Copyright © ENAC, 2009 (Antoine Varet, Nicolas Larrieu, Jean-Marie Fontaine).
*
* ENAC's URL/Lien ENAC : http://www.enac.fr/.
* ASTERIX PLUGIN's URL : http://www.recherche.enac.fr/leopart/~asterix/
* Mail to/Adresse électronique : asterix.wireshark@enac.fr
*
**fr**
Cette œuvre est une œuvre littéraire sous forme de documentation servant à décrire
l’usage du plugin pour l'analyseur réseau Wireshark dissecteur des trames
ASTERIX.
Ce document est une œuvre libre, soumise à une double licence libre.
Etant précisé que les deux licences appliquées conjointement ou indépendamment à
l’œuvre seront, en cas de litige, interprétées au regard de la loi française et soumis à
la compétence des tribunaux français ; vous pouvez utiliser l’œuvre, la modifier, la
publier et la redistribuer dès lors que vous respectez les termes de l’une au moins
des deux licences suivantes :
- Soit la licence GNU Library General Public License comme publiée par la Free
Software Foundation, dans sa version 2
(http://www.recherche.enac.fr/leopart/~asterix/gnu_library_gpl_v2.txt ou fichier
joint);
- Soit la licence Creative Commons – Paternité – Partage des Conditions à
l’Identique (CC-By-SA) comme publiée par Creative Commons, dans sa version 2
(http://www.recherche.enac.fr/leopart/~asterix/creative_commons.txt ou fichier joint).
**en**
This work is a documentation relating to a dissector plugin for ASTERIX data frame
with the network analyser Wireshark.
This document is free under the terms of two free licences. In case of problem, the
licences will be interpreted with the french law and submitted to the competence of
the french courts; you can use the document, modify it, publish and redistribute it if
you respect the terms of at least one of the next licenses:
- The GNU Library General Public License v2 of the Free Software Fundation
(http://www.recherche.enac.fr/leopart/~asterix/gnu_library_gpl_v2.txt or local file);
- The Creative Commons Attribution-Share Alike 2.0 France licence
(http://www.recherche.enac.fr/leopart/~asterix/creative_commons.txt or local file).
2
Summary
Note about the license............................................................................................................................2
Summary................................................................................................................................................3
Introduction.............................................................................................................................................4
The autogenerator methodology.............................................................................................................5
A higher level than C..........................................................................................................................5
The “compiler”: a custom parser.........................................................................................................5
Using this parser................................................................................................................................6
And the result!....................................................................................................................................7
The ASTERIX Protocol: how does it work in practice?...........................................................................8
Frame.................................................................................................................................................8
Block..................................................................................................................................................8
The categories...............................................................................................................................8
Record................................................................................................................................................8
Data...............................................................................................................................................8
Example of an ASTERIX frame..........................................................................................................9
C-code autogenerator process design..................................................................................................13
Why so many “.inc.c” files?...............................................................................................................13
Example of the IDEN item decoding.................................................................................................14
When to call IDEN? From categories.csv to categories.inc.c.......................................................14
What to do with this field? Parsing of champs.csv.......................................................................15
Autogenerator skills..........................................................................................................................17
Conclusion............................................................................................................................................18
ANNEX 1: Eurocontrol, DGAC and ASTERIX......................................................................................19
1: The standardization organism: Eurocontrol..................................................................................19
2: The customer: DGAC...................................................................................................................19
3: The project leader: ENAC.............................................................................................................19
4: Presentation of the standard: ASTERIX.......................................................................................20
ANNEX 2: Source files for the autogenerator......................................................................................21
3
Introduction
The European network of aviation control organism uses a standard named ASTERIX (see annex 1-4
for more details) and managed by Eurocontrol (see Annex 1-1) to exchange data between the different
devices. The local control center of Toulouse, France, asked to ENAC (the French Civil Aviation
University, more details in annex 1-3) to develop a dissector for the ASTERIX protocol in order to
decode frames with the well-known open-source network capturer and analyzer Wireshark.
Figure 1 - Context of this project
Preliminary versions of the Wireshark ASTERIX protocol dissector were completely written by-thehand by four programmers and of course the code was heterogeneous (different ways to write the
identifiers, different languages, different results for twin-fields…), the code was big (5000 lines in one
file), neither global view nor list of decoded fields…
In order to simplify design and future evolutions (add new categories faster, homogenize the code,
prevent bugs, check the dissection…), we decided to design an autogenerator methodology. This
automatized process gives us a lot of gains:
•
•
•
•
•
•
Gain for the time of development;
Easiness to develop (people without a good knowledge in C can develop dissector
evolutions);
Maintainability (because there are less lines to modify, comparing to the same effort for
“manual-written” code);
Homogenity of the code ;
Documentation generated in the same time;
Less bugs.
We have chosen to develop a plug-in and not a built-in dissector, for development and deployment
facilities; but the auto-generation process is independent of this consideration.
In a first time, we will explain our c-code autogenerator methodology. Then, an application to the
ASTERIX protocol will illustrate these explanations.
4
The autogenerator methodology
A higher level than C
Figure 2 - Development architecture
The autogenerator aims to improve the capacity of development by adding a new layer of abstraction.
For example, the C is a language parsed into assembler and enables to make programs more easily
and then bigger and more powerful than if we developed the programs directly in assembler. By
adding a level of abstraction, it reduces the development complexity. In the same idea, the
autogenerator will take some input data (as a code source) and compile it into C language.
The “compiler”: a custom parser
Figure 3 - Compiling the parser
The generation step is based on a conversion process from tabular data describing the protocol to the
code in C language. We used Bison and Flex toolbox to build the executable from a grammar and
specific actions to convert a language into another one.
5
Using this parser
Figure 4 - How the parser works
After compiling the parsers (our autogenerator is composed of two parsers called in a Makefile), we
call it to convert the table into the code for the plug-in dissector. In fact, we do not generate the code
for the whole dissector, but we generate some parts of the code, included during the compilation by
some #include pragmas.
Figure 5 - How the autogenerator works
6
And the result!
Wireshark is then able to decode all parts of the ASTERIX frames and we have the filters we need, a
detailed tree asked by project specifications, some sub-trees…
Figure 6 - Example of decoding display in Wireshark
In this example, all code needed for displaying the sub-items of trees « RECORD: » is automatically
generated with our parsers.
7
The ASTERIX Protocol: how does it work in practice?
Frame
An ASTERIX data frame contains one or more data blocks; each block is associated to one and only
one category.
Block 1
Block 2
…
Block n
Block
A block contains its category, its length and a succession of record.
BLOCK 1

CAT
LENGTH
REC1
REC2
…
REC N
The category’s byte indicates how to decode the data of the following records in the data block. For
example, the records indicating the state of radar are different than the ones indicating the position of
an object in the sky.
The 2 bytes for the length enable to pass directly to the next data block in the frame.
Besides, the records are concatenated without indication (where is the start, where is the length,
where is the end). Consequently, if the decoder fails to decode some record, it will not be able to
understand the following bytes after this record!
The categories
The ASTERIX category defines the type of data in the records. Up to 256 data categories can be
defined and their usage is as follows:
•
•
•
data categories 000 to 127 for standard civil and military applications;
data categories 128 to 240 reserved for special military applications;
data categories 241 to 255 used for both civil and military non-standard applications.
Record
RECORD i

FSPEC
Data 1
Data 2
Data 3
…
Data x
A record begins by an extensive field called the FSPEC (Field Special): this field is a bit mask
indicating the presence or not of some data field. It is an extensive field, so its size can be 1, 2 or
more…
Data
Each field of each category is defined by some Eurocontrol norm. There are three main kinds of fields:
•
•
•
Fixed field: the field length is constant and defined by the standard.
Extensive field: each byte of the field contains 7 bits of data and the least significant bit
indicates if the next byte contains the next data bits of the field or if it is the end of the field.
Repetitive field: the first byte contains the size of the field
8
Figure 7 - Different kinds of fields
Example of an ASTERIX frame
The global structure of the frame seems like that:
Block n°1
CAT
SIZE
FSPEC
(1,5,8)
Data1
Data5
Record n°1
Block n°2
Data8
FSPEC
(7,9)
Data7
Data9
CAT
SIZE
FSPEC
Record n°2
ASTERIX frame
Figure 8 - Frame example
But in order to understand more, we will take an example of a frame containing one Block of category
#1. This category collects data from radars related to flying objects (mostly aircrafts).
9
D
Figure 9 ASTERIX network
Each object is associated to a “plot” and each plot is transmitted in a record. The FSPEC extensible
field is decoded like that for this category:
8
IDEN
7
ESC
8
MCD
8
OD2
7
QA
6
UM
Byte 1:
5
OSU
4
OSX
3
VIT
2
MODA
1
EXT
Byte 2 (if present, ie if EXT of byte 1 is 1):
7
6
5
4
3
PTU
LOT
UIS
OPP
IST
2
UAL
1
EXT
Byte 3 (if extension of byte 2):
6
5
4
QC
Q2
WEC
2
FS
1
EXT
Byte 4 (theorical, because in practice, he is never present!):
8
7
6
5
4
3
2
0
0
0
0
0
0
0
It could have some 5th or 6th or more unused bytes in the FSPEC.
1
EXT
3
SP
Each record has a FSPEC indicating which information is transmitted for the plot.
For example, if the bits 3 and 2 of the 3rd byte are set to 1, then the record contains the SP field and
the RFS field.
Here is a Ethernet frame recorded in the ENAC.
F7
84 08 05 A8 01 A8 70 21 BD 88 09 09 26 68 00 89 85 50 68] 77
84 A8 00 21 68 BC B9 D4 08 1B A7 28 4D A0 45 C8 48 77 84 A8
01 7D 57 A9 B8 70 08 0E FE 0E 0A E8 05 78 48 77 84 A8 00 88 48
3E BF 34 08 1F 2A B8 02 06 04 D8 48 77 84 A8 00 8B 4 E B7 BC CC
FD FF FF FF 08 02 00 80 02 00 00 15 00 92 34 34 03 01 00 83 [
07 05 82 08 06 E 6 02 0C 48
77 84
A8 01 4F 4A FA BE 00 08 37 7B 00 04 C8 05 C8 48 77 84 A8
00 31 18 3A BC 50 01 E1 07 D0 0D 40 00 70 68 02 00 0C F4 08 05 02
C0 3D 81 AF 20 …
10
In this frame, we have the destination (6 bytes) and then the source (6 bytes) MAC address and after
5 bytes relating to LLC protocol. The ASTERIX frame begins really to the understrike text by a block of
category #1 and of length 0x83=131 bytes.
Then we notice directly the FSPEC of the first data record. A cheat enables to know the size of this
field: the bytes are even until the last byte which is odd. Here, the FSPEC is F784.
F7
1111
84
0111
1000
0100
ext
IDEN
QUAL
DESC
PIST
DOPP
NUM
POSX
PUIS
POSX
PLOT
VIT
HPTU
MODA
MCD
Figure 10 - Decoding FSPEC bytes
Now we know the content of this record: the fields IDEN, DESC, NUM, POSU, VIT, MODA, MCD,
PLOT, PIST are presents (in this order), all other fields are absent. So we can continue the decoding
process: the IDEN field is in fact 2 bytes called SAC (Source Area Code, geographic origin of the
emitter) and SIC (Source Identification Code: radar identifier)…
11
FD FF FF FF 08 02
@ MAC dest
00 80 02 00 00 15
00 92
34
34
@ MAC source
Eth.size
SSAP
DSAP
03
01
00 83
F7 84
08 05
A8
cmd
CAT
Block size
FSPEC
SAC SIC
DES
01 A8
70 21 BD 88
09 09 26 68
00 89
85 50
Track nb
POSU
SPEED
Mode A
Mode C
68
77 84 …
TkS
Next FSPEC
Figure 11 - Decoding a Ethernet frame containing ASTERIX data
Field
SAC SIC
DES
08 05
A8
Data
Track nb
POSU
Speed
01 A8
70 21 BD 88
09 09 26 68
Mode A
Mode C
Track_
status
00 89
85 50
68
Remarks
Mono-pulse Mont Ventoux
True track, secondary,TPR2,no SPI, no fixed
transponder
Track number 424
Rho=224 Nm(7021), Theta=266°(BD88)
Speed=508Kts=0,14 Nm/s (0909)
cap=54 ° (2668)
Mode A valid, no garbled, brut, mode A =1120
Mode C valid,no garbled, FL=340
Confirmed track, sec radar, manoeuvring aircraft,
TPR2, no association plot/unconfirmed track, not a
ghost track
12
C-code autogenerator process design
In this section, we will abbreviate Wireshark by “WS”.
Problematic can be summed up by converting a list of entities into C-code: what are theses entities,
which are the entities, when are they called? These entities – on the following “the fields” – have
different views:
•
•
•
In the Eurocontrol specification, they are the “data item”,
In Wireshark, they are each line of the detailed tree,
In ASTERIX record, each bit of the FSPEC is associated to the presence or the absence of
some field.
In order to solve our problem, we chosen to make a table (“champs.csv”) describing how works an
entity (“how to show it and how to filter it?”) and another (“categories.csv”) to decode the FSPEC
(“what is the bit mask for each category?”). The first table responds to the question “what are the
entities”, the second one responds to “when to call them?” We have 2 tables so we need 2 parsers for
our autogenerator.
The compiler solves the question “which entities exist?”. If a field is used in categories.csv but
undefined in champs.csv, the compilation fails and indicates the name of the problematic field.
The user needs some list of fields in order to know and use the names of the filters. That’s why a bash
script generates the documentation from “champs.csv”.
The developer of the plug-in has just to complete the files “champs.csv” and “categories.csv” in order
to complete the ASTERIX plug-in: he has to indicate “which bit of the FSPEC corresponds to which
data item” in “categories.csv” and “which are the data items” in “champs.csv”. Then he starts the
compilation by typing “make” in cygwin in the folder ./plugins/asterix/autogenere. This command
creates the files *.inc.c included in the plug-in’s code during the compilation of the library ASTERIX.
Figure 12 - The different files used for the plug-in
Why so many “.inc.c” files?
First a field is a filter (with label and description) declared in champs_declare.inc.c (to create some
variable for the WS’handle) and registered (indicate to WS the existence of the filter) in
champs_register.inc.c
Most of time, a field is associated to some C-code called “decoder”. This decoder is a procedure
beginning by “void decode_field_name (…)” ; the declaration is written in the file champs_declare.inc.c
and the definition in the file champs_define.inc.c. This decoder includes instructions relative to the
displaying of the data in the detailed tree, to the size of the field...
In some cases, the code has to be not auto-generated (field without code or with special code), the file
champs_define_manual.inc.c is for that (not auto-generated, this file is completely manually filled).
This file contains the translations integer-text too.
13
Some fields are “master”-fields and correspond to an input point to other fields or other decoders. In
the detailed tree, theses fields are not single items but trees with sub-items. WS needs the tree to
register in order to use them: champs_register_tree.inc.c does it.
Finally, the FSPEC bit mask is described in categories.inc.c (each category corresponds to one and
only one bit mask).
Example of the IDEN item decoding
The IDEN field is coded by the first bit of many FSPEC and contains two bytes: the SAC and the SIC.
When to call IDEN? From categories.csv to categories.inc.c
The file categories.csv is a table with the description of each byte of the FSPEC for each category.
The first column is reserved for a # to neutralize the line. The second waits for a category number (the
text is included as-is in the code) and after, the cells are discomposed bit per bit (with commas to
separate the bits).
Table 1 - Categories.csv
#ignore?
N°categ
1
2
Octet1
IDEN,TRD01,TRACK,POS_SPOL,POS_CART,CTV_POL,ModeA
IDEN,Type02,SECT,TIME,ARS,SCS2,SPM2
The generated code follows :
/* AUTOGENERATED FILE (BISON/FLEX) ** MODIFICATIONS WILL BE ERASED
ON THE NEXT REGENERATION */
case 1:
expert_add_info_format( pinfo, enregistrement_item, PI_SEQUENCE,
PI_NOTE, "1");
if (longueur_fspec>=1) {
/*DOT* cat_1 -> IDEN */
if ((fspec[0]&128) !=0) decode_IDEN(pinfo, tvb,
enregistrement_tree, enregistrement_item, pt_offset);
/*DOT* cat_1 -> TRD01 */
if ((fspec[0]&64) !=0) decode_TRD01(pinfo, tvb,
enregistrement_tree, enregistrement_item, pt_offset);
…
/*DOT* cat_1 -> ModeA */
if ((fspec[0]&2) !=0) decode_ModeA(pinfo, tvb,
enregistrement_tree, enregistrement_item, pt_offset);
}
if (longueur_fspec>=2) {…
if (longueur_fspec>=5)
{ error_decode(pinfo, tvb, enregistrement_tree,
pt_offset, fin_Block); erreur_durant_le_decodage=TRUE; break; }
break;
case 2:
expert_add_info_format( pinfo, enregistrement_item, PI_SEQUENCE,
PI_NOTE, "2");
if (longueur_fspec>=1) {
/*DOT* cat_2 -> IDEN */
if ((fspec[0]&128) !=0) decode_IDEN(pinfo, tvb,
enregistrement_tree, enregistrement_item, pt_offset);
/*DOT* cat_2 -> Type02 */
if ((fspec[0]&64) !=0) decode_Type02(pinfo, tvb,
enregistrement_tree, enregistrement_item, pt_offset);
/*DOT* cat_2 -> SECT */
…
14
What to do with this field? Parsing of champs.csv
Note: to represent the table, we transposed it (inverting rows and columns). Indeed in the source code,
each line is a field description and each column is some indication for the parser.
Table 2 - Champs.csv
#Ign
NOM name
Filtre filter
Libellé label
Détails (filtre) details for the filter
L length of the field in the frame
Bitmask
TYPE
Baz base used for the display
VALS(nom)
Gén Does generate the code ?
Appel de décodeurs et d'autres
champs Does call other decoders ?
mv7
SsA Make a sub-tree for called
decoders
hidA Hide the item of the detailed
tree
Surlign Use the expert system to
colorize the item
Remarques... Remarks
IDEN
iden
Identification
(SAC/SIC)
SAC
sac
System Area
Code
SIC
sic
System Identification
code
2
1
1
UINT
16
UINT
10
1
1
VALS
10
Liste_SIC
1
SAC,SIC
1
Appelle SAC et SIC
Here we can see the IDEN item : its filter string will be “ast.iden”, the label used to explain the filter and
the label for the item of the detailed tree will be “Identification (SAC/SIC)”, the length for this field is 2
bytes, there is no bit mask used, the type is an unsigned integer (2 bytes) displayed in hexadecimal
(base 16), the code is auto-generated and call the sub-fields SAC and SIC to complete it.
The generated code in champs_register.inc.c registers the filters for WS:
{&hf_asterix_champs_IDEN, {"Identification (SAC/SIC)", "ast.iden",
FT_UINT16, BASE_HEX, NULL, 0x00, "", HFILL}},
{&hf_asterix_champs_SAC, {"System Area Code", "ast.sac",
FT_UINT8 , BASE_DEC, NULL, 0x00, "", HFILL}},
{&hf_asterix_champs_SIC, {"System Identification code", "ast.sic",
FT_UINT8 , BASE_DEC, VALS(Liste_SIC), 0x00, "", HFILL}},
This file is included in packet-asterix.c (the main plug-in code file) :
static hf_register_info hf[] = {
#include "champs_register.inc.c"
};/* end of static hf_register_info hf[] */
proto_register_field_array (proto_asterix, hf, array_length (hf));
Notice one advantage of using our generator: some basic but fatal bug (like associating FT_NONE
and BASE_DEC, resulting in WS failure at its initialization) are avoided. The generator signals where
the errors are. We gain time in debugging.
15
The generated code to dissect the frame is in the file champs_define.inc.c:
void decode_IDEN(packet_info * pinfo, tvbuff_t *tvb, proto_tree
*enreg_tree,proto_item *caller_item, guint32 *offset)
{
proto_item * item=NULL;
item = proto_tree_add_item( enreg_tree, hf_asterix_champs_IDEN,
tvb,*offset, 2, FALSE);
PROTO_ITEM_SET_HIDDEN(item);
/*DOT* IDEN -> SAC; */
decode_SAC(pinfo, tvb, enreg_tree, item, offset);
/*DOT* IDEN -> SIC; */
decode_SIC(pinfo, tvb, enreg_tree, item, offset);
}
void decode_SAC(packet_info * pinfo, tvbuff_t *tvb, proto_tree
*enreg_tree,proto_item *caller_item, guint32 *offset)
{
proto_item * item=NULL;
item = proto_tree_add_item( enreg_tree, hf_asterix_champs_SAC,
tvb,*offset, 1, FALSE);
*offset+=1;
}
void decode_SIC(packet_info * pinfo, tvbuff_t *tvb, proto_tree
*enreg_tree,proto_item *caller_item, guint32 *offset)
{
proto_item * item=NULL;
item = proto_tree_add_item( enreg_tree, hf_asterix_champs_SIC,
tvb,*offset, 1, FALSE);
*offset+=1;
}
We can see the PROTO_ITEM_SET_HIDDEN(item) line added in the case of the IDEN: the hidA
column contains a 1, then the autogenerator add this line to hide the item of the detailed tree!
The decoders for SAC and SIC are easily an addition of the item to the detailed tree, the caller is the
IDEN field. Note the offset variable: we need some position indicator to know what we are decoding
into the frame. The variable offset is updated by the decoder.
Each decoder have a lot of parameters (pinfo, tvb, enreg_tree, caller_item, offset): some specific
cases indeed need them to produce a powerful code.
The file champs_declare.inc.c declares the variable needed by the filter and the item in detailed tree. It
declares the decoder function too in order to be called by others decoders. This file is included at the
beginning of the packet-asterix.c file.
static gint hf_asterix_champs_IDEN =-1;
void decode_IDEN(packet_info * pinfo, tvbuff_t *tvb, proto_tree
*enreg_tree, proto_item *caller_item, guint32 *offset);
static gint hf_asterix_champs_SAC =-1;
void decode_SAC(packet_info * pinfo, tvbuff_t *tvb, proto_tree
*enreg_tree, proto_item *caller_item, guint32 *offset);
static gint hf_asterix_champs_SIC =-1;
void decode_SIC(packet_info * pinfo, tvbuff_t *tvb, proto_tree
*enreg_tree, proto_item *caller_item, guint32 *offset);
A last file champs_define_manual.inc.c is used to add here manually the list of string values with their
indexes. For example, the structure Liste_SIC contains the associations SIC-number with SIC-label.
static const value_string Liste_SIC[] = {
{ 0x80, "DACOTA"},
{ 0x81, "STR Athis"},
16
{
{
{
{
{
{
{
{
};
0x82, "STR Reims"},
0x83, "STR Aix"},
0x84, "STR Bordeaux"},
0x85, "STR Brest"},
0x86, "STR Orly"},
0x87, "STR Roissy"},
0xA0, "SPIP2000"},
0, NULL }
Theses use cases present principles of autogenerator behaviors. We did not present the use case of
an item having a sub-tree of sub-items or other specific cases. You may read the generated code
or/and the code of the autogenerator (joint in annex) to understand the exact work done, specific to the
ASTERIX protocol.
Autogenerator skills
The generator is able to recognize a lot of types of fields and to generate the associated C-code.
•
It manages the signed and unsigned integer (on 8,16,24 or 32 bits ; 64 bits integers are
unused for now in the ASTERIX standard);
•
It manages bit masks to isolate some relevant parts of bytes (with WS’s limitations for signed
integer);
•
It can associate text with some values;
•
It can call other decoders (field decode functions), automatically generated or manually
written;
•
It can display some items in color (with the expert functions);
•
It is able to make sub-tree with sub-items;
•
It can hide easily an item (1 cell to change is enough to disable a complete field);
•
It can extract fixed strings (length fixed in the standard), zero-terminal strings (but unused in
ASTERIX) and short strings (with a maximum of 255 characters and the first byte used to
indicate the length of the string);
•
It enables to decode easily a status byte bit-per-bit (for example the Target Report Descriptor
below).
Figure 13 - Example of bit per bit byte dissecting
17
Conclusion
Figure 14 - Code size breakdown
In the graphic we can see than 75% of the C-code is auto-generated; a very small part has been
written for the parsers and about 20% have been manually written for non-automatized things.
The creation of an automatic code generator requires some skills; here the Bison and Flex toolbox
have been used to generate the parsers. But the Internet provides a lot of documentation and
examples and if you take some time to understand how to use theses tools, you finally gain time on
projects with a lot of data to compute.
The autogenerator represents a new language more limited and constrained than the C and then
remains more accessible for low-skill user of the parsers (the developers of the plug-in). The final
developer does not need to know how works exactly the parsers and can everytime consult the result.
Some people would say it is not a good idea for performances to have a lot of filters, but Wireshark
use hashing tables in its source code and the difference is not visible in terms of additional running
time but is visible in terms of filtering skills (for instance we can filter on any byte in the packet).
We can anyway find a few negative points with this methodology. Firstly the compilation chain needs
one more step, but this can be added to the makefiles and then automatized. Secondly you cannot do
anything with the new higher language, but this is actually a positive point by avoiding some
dangerous things the programmer would do! Lastly the binary code seems to be bigger, because of
the big number of implemented fields, which is a regular consequence of all the different filtering done
but you cannot notice bad performance consequences when you run Wireshark program.
18
ANNEX 1: Eurocontrol, DGAC and ASTERIX
1: The standardization organism: Eurocontrol
EUROCONTROL is the European Organization for the Safety of Air Navigation who plays a
unique role at the European level in coordinating efforts from all aviation stakeholders to achieve
common goals.
Created in 1960 by six founding members, this civil and military intergovernmental organization now
counts 38 Member States from across Europe. It is based in Belgium with specialized offices in six
other European countries.
Eurocontrol’s mission is to harmonize and integrate air navigation services in Europe, aiming at the
creation of a uniform air traffic management (ATM) system for civil and military users, in order to
achieve the safe, secure, orderly, expeditious and economic flow of traffic throughout Europe, while
minimizing adverse environmental impact.
2: The customer: DGAC
The French Civil Aviation Authority (DGAC) plays a central role in the world of French air transport.
This department of the Ministry of ecology and sustainable development guarantees air traffic safety
and security and is a service provider for airlines. It also manages air traffic, defines and enforces the
regulations applicable to French airports and airlines. The DGAC ensures that passengers’ rights are
respected and that land planning and development criteria are properly taken into account. The DGAC
is a consulting partner for French industry and provides research and development support for major
aircraft industry programs. The Authority is working to help reduce all forms of pollution generated by
air traffic. The DGAC implements sophisticated technical resources and high level skills to provide air
traffic control services for airlines, under the best possible conditions of safety, regularity and cost.
3: The project leader: ENAC
The French Civil Aviation University is called ENAC, “Ecole Nationale d’Aviation Civile”. Enac’s
mission is to provide ab-initio and further training for the executives and main players of the civil
aviation world. This genuine University of Civil Aviation offers a wide range of activities which are
tailored to meet the requirements of the public and private sectors both in France and in other
countries.
Enac offers a favourable environment for research activities: it has its own impressive teaching and
training facilities (experts in various aeronautical disciplines, laboratories, simulators, etc.) and can rely
on the skills and equipment of the Sous-Direction de la Recherche de la Direction de la Technique et
de l'Innovation (DTI/SDER) which is located on the campus. All Enac’s competences rely on
aeronautical applications.
19
4: Presentation of the standard: ASTERIX
ASTERIX is a EUROCONTROL Standard which refers to the Presentation and Application layers
(layers six and seven) as defined by the Open Systems Interconnection (OSI) Reference Model
(International Standards Organization (ISO) Standard 7498).
Transmission of ASTERIX coded surveillance information can make use of any available
communication medium, for instance Wide Area Network (WAN), Local Area Network (LAN), Internet
Protocols (IP), etc as those belong to lower layers.
Considering that there is information common to all systems (for instance position, Mode-A Code and
Mode-C Code information), ASTERIX specifies minimum requirements at the Application level, so as
to ease data exchange between heterogeneous applications. The communication between two
different systems (even located in different countries) is thus made possible, based on a core of
commonly used surveillance related data, transferred in the same way by the ASTERIX Presentation
layer.
ASTERIX has been developed to ease the exchange of surveillance information between and within
countries. Thus, the main users of ASTERIX are the Air Traffic Control (ATC) Centers. Today almost
all ECAC States are using this data format in their ATC Centers.
But ASTERIX is also used by Industries to help stabilization/maturation of new technologies, and is
then integrated in surveillance sensors and in automation systems such as ARTAS (ATM suRveillance
Tracker And Server), RMCDE (Radar Message Conversion and Distribution Equipment) and RADNET
(RADar NETwork implemented in the so-called four states area - Benelux and Germany), RAPS II
(Radar Analysis, Playback & Simulation System for Surveillance Data).
As the volume of Air Traffic is continuously increasing and as high level of Safety must be maintained,
the surveillance systems are under constant evolution. New-generation surveillance technologies are
being developed which need to cohabit with current systems. The information they generate must be
transmitted in a harmonized and efficient way.
20
ANNEX 2: Source files for the autogenerator
Here is the development tree of sources for our plug-in.
In the subdirectory “./plugins/asterix/autogenere”: sources of the autogenerator and data for
code generation specific to ASTERIX categories
Categories.csv and champs.csv
Files containing the data to convert into C
Categories.exe and champs.exe
Executables of our 2 parsers
Categories.lex and champs.lex
Source files for LEX (lexical analyser)
Categories.y, champs.y and champs.c
Source files for YACC (semantic analyser)
Categories.lex.c, categories.tab.c,
champs.lex.c, champs.tab.c,
categories.tab.h, champs.tab.h
C-code of our parsers, generated by Bison and Flex
Makefile
Make-script to generate the parser easily
Extract_desc.sh
Shell-script to generate the documentation
Filters_asterix.htm and filters_asterix_tbl.htm
Documentation files, generated by extract_desc.sh
Other files
Temporary files generated and deletable
In the main directory “./plugins/asterix”: sources and binaries for the ASTERIX plug-in
Packet-asterix.c
Main C-code source file of the plug-in
moduleinfo.*, asterix.res, Makefile*, plugin*
Files used to generate the Wireshark plug-in
Asterix.dll
Binary of library built for Wireshark on Windows
Asterix.so
Binary built for Wireshark on Linux
categories.inc.c,
champs_declare.inc.c,
champs_define.inc.c,
champs_define_manual.inc.c,
champs_register.inc.c,
champs_register_tree.inc.c
Autogenerated files, containing parts of C-code for
ASTERIX plug-in dissector code, included in packetasterix.c by “#define”
Compile_only_asterix.bat
Batch-script used to generate asterix.dll on Windows
21