aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-dis-pdus.c
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/dissectors/packet-dis-pdus.c
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/dissectors/packet-dis-pdus.c')
-rw-r--r--epan/dissectors/packet-dis-pdus.c116
1 files changed, 116 insertions, 0 deletions
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;
}