aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorJaap Keuter <jaap.keuter@xs4all.nl>2009-06-02 06:37:21 +0000
committerJaap Keuter <jaap.keuter@xs4all.nl>2009-06-02 06:37:21 +0000
commit38638f9fb154d5eb4d00435bee9ec0ab726f83cb (patch)
treecf9ec7d214ebb3d77aca28b1d810ba26d4bd8294 /epan
parentab57f8da5db6f18a69a87b69c84433bc911e3b3a (diff)
From Matt Deckard:
Add support for the DIS protocol dissector to more fully interpret the PDU types "Data Query", "Data", and "Set Data". It should interpret the originating and receiving entity IDs, request ID, number of fixed and variable datum fields, and the ID and values of each datum field in the PDU. svn path=/trunk/; revision=28583
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-dis-fields.c16
-rw-r--r--epan/dissectors/packet-dis-fields.h18
-rw-r--r--epan/dissectors/packet-dis-pdus.c116
-rw-r--r--epan/dissectors/packet-dis-pdus.h33
-rw-r--r--epan/dissectors/packet-dis.c7
5 files changed, 189 insertions, 1 deletions
diff --git a/epan/dissectors/packet-dis-fields.c b/epan/dissectors/packet-dis-fields.c
index a17b89544b..6fc2c0069d 100644
--- a/epan/dissectors/packet-dis-fields.c
+++ b/epan/dissectors/packet-dis-fields.c
@@ -36,6 +36,7 @@
guint32 pduType;
guint32 entityKind;
guint32 entityDomain;
+guint32 variableDatumLength;
DIS_ParserNode DIS_FIELDS_PDU_HEADER[] =
{
@@ -134,6 +135,21 @@ DIS_ParserNode DIS_FIELDS_NONE[] =
{ DIS_FIELDTYPE_END, NULL, 0,0,0 }
};
+DIS_ParserNode DIS_FIELDS_FIXED_DATUM[] =
+{
+ { DIS_FIELDTYPE_DATUM_ID, "Datum ID",0,0,0 },
+ { DIS_FIELDTYPE_FIXED_DATUM_VALUE, "Datum value",0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0 }
+};
+
+DIS_ParserNode DIS_FIELDS_VARIABLE_DATUM[] =
+{
+ { DIS_FIELDTYPE_DATUM_ID, "Datum ID",0,0,0 },
+ { DIS_FIELDTYPE_DATUM_LENGTH, "Datum length",0,0,&variableDatumLength },
+ { DIS_FIELDTYPE_VARIABLE_DATUM_VALUE, "Datum value",0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0 }
+};
+
DIS_BitMask DIS_APPEARANCE_LANDPLATFORM[] =
{
{ 0x00000001, 0, "Paint Scheme", {
diff --git a/epan/dissectors/packet-dis-fields.h b/epan/dissectors/packet-dis-fields.h
index 998d32bfe2..85cb4b2efb 100644
--- a/epan/dissectors/packet-dis-fields.h
+++ b/epan/dissectors/packet-dis-fields.h
@@ -77,6 +77,14 @@ typedef enum
DIS_FIELDTYPE_SUBCATEGORY,
DIS_FIELDTYPE_TIMESTAMP,
DIS_FIELDTYPE_WARHEAD,
+ DIS_FIELDTYPE_NUM_FIXED_DATA,
+ DIS_FIELDTYPE_NUM_VARIABLE_DATA,
+ DIS_FIELDTYPE_DATUM_ID,
+ DIS_FIELDTYPE_DATUM_LENGTH,
+ DIS_FIELDTYPE_FIXED_DATUM_VALUE,
+ DIS_FIELDTYPE_VARIABLE_DATUM_VALUE,
+ DIS_FIELDTYPE_REQUEST_ID,
+ DIS_FIELDTYPE_TIME_INTERVAL,
/* composite types */
DIS_FIELDTYPE_ARTICULATION_PARAMETERS,
@@ -86,7 +94,10 @@ typedef enum
DIS_FIELDTYPE_EVENT_ID,
DIS_FIELDTYPE_LINEAR_VELOCITY,
DIS_FIELDTYPE_LOCATION_WORLD,
- DIS_FIELDTYPE_LOCATION_ENTITY
+ DIS_FIELDTYPE_LOCATION_ENTITY,
+ DIS_FIELDTYPE_FIXED_DATUM,
+ DIS_FIELDTYPE_VARIABLE_DATUM
+
} DIS_FieldType;
/* Struct which contains the data needed to parse a single DIS field.
@@ -141,6 +152,10 @@ extern DIS_ParserNode DIS_FIELDS_ORIENTATION[];
extern DIS_ParserNode DIS_FIELDS_NONE[];
+extern DIS_ParserNode DIS_FIELDS_FIXED_DATUM[];
+
+extern DIS_ParserNode DIS_FIELDS_VARIABLE_DATUM[];
+
extern DIS_BitMask DIS_APPEARANCE_LANDPLATFORM[];
extern DIS_BitMask DIS_APPEARANCE_LIFEFORM[];
@@ -166,5 +181,6 @@ gint parseField_Timestamp(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_Pars
extern guint32 pduType;
extern guint32 entityKind;
extern guint32 entityDomain;
+extern guint32 variableDatumLength;
#endif /* packet-dis-fieldparsers.h */
diff --git a/epan/dissectors/packet-dis-pdus.c b/epan/dissectors/packet-dis-pdus.c
index 82336f3236..3856714b3b 100644
--- a/epan/dissectors/packet-dis-pdus.c
+++ b/epan/dissectors/packet-dis-pdus.c
@@ -33,7 +33,11 @@
#include "packet-dis-fields.h"
guint32 numArticulations;
+guint32 numFixedData;
+guint32 numVariableData;
gint ettArticulations[DIS_PDU_MAX_ARTICULATIONS];
+gint ettFixedData;
+gint ettVariableData;
DIS_ParserNode DIS_PARSER_ENTITY_STATE_PDU[] =
{
@@ -84,6 +88,32 @@ DIS_ParserNode DIS_PARSER_DETONATION_PDU[] =
{ DIS_FIELDTYPE_END, NULL,0,0,0 }
};
+DIS_ParserNode DIS_PARSER_DATA_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0 },
+ { DIS_FIELDTYPE_PAD32, "Padding",0,0,0 },
+ { DIS_FIELDTYPE_NUM_FIXED_DATA, "Number of fixed data fields",0,0,&numFixedData },
+ { DIS_FIELDTYPE_NUM_VARIABLE_DATA, "Number of variable data fields",0,0,&numVariableData },
+ { DIS_FIELDTYPE_FIXED_DATUM, "Fixed data",0,0,0 },
+ { DIS_FIELDTYPE_VARIABLE_DATUM, "Variable data",0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_DATA_QUERY_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0 },
+ { DIS_FIELDTYPE_TIME_INTERVAL, "Time interval",0,0,0 },
+ { DIS_FIELDTYPE_NUM_FIXED_DATA, "Number of fixed data fields",0,0,&numFixedData },
+ { DIS_FIELDTYPE_NUM_VARIABLE_DATA, "Number of variable data fields",0,0,&numVariableData },
+ { DIS_FIELDTYPE_FIXED_DATUM, "Fixed data",0,0,0 },
+ { DIS_FIELDTYPE_VARIABLE_DATUM, "Variable data",0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0 }
+};
+
/* Initialize the parsers for each PDU type and the standard DIS header.
*/
void initializeParsers(void)
@@ -92,6 +122,8 @@ void initializeParsers(void)
initializeParser(DIS_PARSER_FIRE_PDU);
initializeParser(DIS_PARSER_DETONATION_PDU);
initializeParser(DIS_FIELDS_PDU_HEADER);
+ initializeParser(DIS_PARSER_DATA_PDU);
+ initializeParser(DIS_PARSER_DATA_QUERY_PDU);
}
/* Create a specific subtree for a PDU or a composite PDU field.
@@ -184,6 +216,16 @@ void initializeParser(DIS_ParserNode parserNodes[])
DIS_FIELDS_ORIENTATION,
&parserNodes[parserIndex].ettVar);
break;
+ case DIS_FIELDTYPE_FIXED_DATUM:
+ parserNodes[parserIndex].children = createSubtree(
+ DIS_FIELDS_FIXED_DATUM,
+ &parserNodes[parserIndex].ettVar);
+ break;
+ case DIS_FIELDTYPE_VARIABLE_DATUM:
+ parserNodes[parserIndex].children = createSubtree(
+ DIS_FIELDS_VARIABLE_DATUM,
+ &parserNodes[parserIndex].ettVar);
+ break;
default:
break;
}
@@ -392,6 +434,80 @@ gint parseFields(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode pa
}
}
break;
+ case DIS_FIELDTYPE_NUM_FIXED_DATA:
+ case DIS_FIELDTYPE_NUM_VARIABLE_DATA:
+ offset = parseField_UInt(tvb, tree, offset,
+ parserNodes[fieldIndex], 4);
+ break;
+ case DIS_FIELDTYPE_FIXED_DATUM:
+ {
+ guint i;
+ if (numFixedData > INT32_MAX)
+ {
+ numFixedData = INT32_MAX;
+ }
+
+ for (i = 0; i < numFixedData; ++i)
+ {
+ proto_item *newSubtree;
+ newField = proto_tree_add_text(tree, tvb, offset, -1, "%s",
+ parserNodes[fieldIndex].fieldLabel);
+ newSubtree = proto_item_add_subtree(newField, ettFixedData);
+ offset = parseFields(tvb, newSubtree, offset, parserNodes[fieldIndex].children);
+ proto_item_set_end(newField, tvb, offset);
+ }
+
+ }
+ break;
+ case DIS_FIELDTYPE_VARIABLE_DATUM:
+ {
+ guint i;
+ if (numVariableData > INT32_MAX)
+ {
+ numVariableData = INT32_MAX;
+ }
+
+ for (i = 0; i < numVariableData; ++i)
+ {
+ proto_item *newSubtree;
+ newField = proto_tree_add_text(tree, tvb, offset, -1, "%s",
+ parserNodes[fieldIndex].fieldLabel);
+ newSubtree = proto_item_add_subtree(newField, ettVariableData);
+ offset = parseFields(tvb, newSubtree, offset, parserNodes[fieldIndex].children);
+ proto_item_set_end(newField, tvb, offset);
+ }
+
+ }
+ break;
+ case DIS_FIELDTYPE_DATUM_ID:
+ case DIS_FIELDTYPE_DATUM_LENGTH:
+ offset = parseField_UInt(tvb, tree, offset,
+ parserNodes[fieldIndex], 4);
+ break;
+ case DIS_FIELDTYPE_FIXED_DATUM_VALUE:
+ offset = parseField_Bytes(tvb, tree, offset,
+ parserNodes[fieldIndex], 4);
+ break;
+ case DIS_FIELDTYPE_VARIABLE_DATUM_VALUE:
+ {
+ guint lengthInBytes;
+ lengthInBytes = variableDatumLength / 8;
+ if (variableDatumLength % 8 > 0)
+ {
+ lengthInBytes++;
+ }
+ offset = parseField_Bytes(tvb, tree, offset,
+ parserNodes[fieldIndex], lengthInBytes);
+ }
+ break;
+ case DIS_FIELDTYPE_REQUEST_ID:
+ offset = parseField_UInt(tvb, tree, offset,
+ parserNodes[fieldIndex], 4);
+ break;
+ case DIS_FIELDTYPE_TIME_INTERVAL:
+ offset = parseField_UInt(tvb, tree, offset,
+ parserNodes[fieldIndex], 4);
+ break;
default:
break;
}
diff --git a/epan/dissectors/packet-dis-pdus.h b/epan/dissectors/packet-dis-pdus.h
index 553521c41e..b3f6eda0c9 100644
--- a/epan/dissectors/packet-dis-pdus.h
+++ b/epan/dissectors/packet-dis-pdus.h
@@ -35,6 +35,39 @@ extern DIS_ParserNode DIS_PARSER_FIRE_PDU[];
extern DIS_ParserNode DIS_PARSER_DETONATION_PDU[];
+extern DIS_ParserNode DIS_PARSER_DATA_PDU[];
+
+extern DIS_ParserNode DIS_PARSER_DATA_QUERY_PDU[];
+
+/* Limits of integral types. */
+#ifndef INT8_MIN
+#define INT8_MIN (-128)
+#endif
+#ifndef INT16_MIN
+#define INT16_MIN (-32767-1)
+#endif
+#ifndef INT32_MIN
+#define INT32_MIN (-2147483647-1)
+#endif
+#ifndef INT8_MAX
+#define INT8_MAX (127)
+#endif
+#ifndef INT16_MAX
+#define INT16_MAX (32767)
+#endif
+#ifndef INT32_MAX
+#define INT32_MAX (2147483647)
+#endif
+#ifndef UINT8_MAX
+#define UINT8_MAX (255U)
+#endif
+#ifndef UINT16_MAX
+#define UINT16_MAX (65535U)
+#endif
+#ifndef UINT32_MAX
+#define UINT32_MAX (4294967295U)
+#endif
+
DIS_ParserNode *createSubtree(DIS_ParserNode parserNodes[], gint *ettVar);
void initializeParser(DIS_ParserNode parserNodes[]);
diff --git a/epan/dissectors/packet-dis.c b/epan/dissectors/packet-dis.c
index 7df8e81e20..821d3fac67 100644
--- a/epan/dissectors/packet-dis.c
+++ b/epan/dissectors/packet-dis.c
@@ -124,6 +124,13 @@ static gint dissect_dis(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
case DIS_PDUTYPE_DETONATION:
pduParser = DIS_PARSER_DETONATION_PDU;
break;
+ case DIS_PDUTYPE_DATA_QUERY:
+ pduParser = DIS_PARSER_DATA_QUERY_PDU;
+ break;
+ case DIS_PDUTYPE_SET_DATA:
+ case DIS_PDUTYPE_DATA:
+ pduParser = DIS_PARSER_DATA_PDU;
+ break;
default:
pduParser = 0;
break;