From Matt Deckard:
authorjake <jake@f5534014-38df-0310-8fa8-9805f1628bb7>
Tue, 2 Jun 2009 06:37:21 +0000 (06:37 +0000)
committerjake <jake@f5534014-38df-0310-8fa8-9805f1628bb7>
Tue, 2 Jun 2009 06:37:21 +0000 (06:37 +0000)
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.

git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@28583 f5534014-38df-0310-8fa8-9805f1628bb7

epan/dissectors/packet-dis-fields.c
epan/dissectors/packet-dis-fields.h
epan/dissectors/packet-dis-pdus.c
epan/dissectors/packet-dis-pdus.h
epan/dissectors/packet-dis.c

index a17b89544ba6d0d3e852229e3efa972f90fffc9d..6fc2c0069dfcafb2427e0a82dbe1b7784fc18ca7 100644 (file)
@@ -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", {
index 998d32bfe2df0c0dcd567bbed2144a6e989f78d6..85cb4b2efb3d287749d354935c95f16e4368a5dd 100644 (file)
@@ -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 */
index 82336f323652ebab49362c56a81627060e64b3c6..3856714b3bfcc7897d4dc3cb09eace7d978d4ac6 100644 (file)
 #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;
        }
index 553521c41e12d548b8393ab6a527ec8798357e4c..b3f6eda0c98cc4315d145e46b1b45bd4f4afbd16 100644 (file)
@@ -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[]);
index 7df8e81e2063a424468b2cf0857bd065db874e6d..821d3fac6794617c7d43c71c1450c1b913add8d6 100644 (file)
@@ -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;