aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJaap Keuter <jaap.keuter@xs4all.nl>2009-11-13 06:53:15 +0000
committerJaap Keuter <jaap.keuter@xs4all.nl>2009-11-13 06:53:15 +0000
commit0e4e74ef3dfe79df80a519c91075bfad66715f37 (patch)
tree3594b2beca7f5ac66cc0058eff3a9c44640bbe42
parentec097d99817da930daa32e7602733241111fe010 (diff)
From Michael Dishman:
Fixed parser for DIS DataRequest PDU. Added parser for DIS StartResume, StopFreeze, Acknowledge, ActionRequest, ActionResponse, Comment, CreateEntity, DeleteEntity PDUs. Added parser for "reliable" versions of the above DIS PDUs. Added parser for DIS Application Control PDU. Added parsers for DIS Persistent Object Family PDUs. svn path=/trunk/; revision=30947
-rw-r--r--epan/dissectors/packet-dis-enums.c266
-rw-r--r--epan/dissectors/packet-dis-enums.h284
-rw-r--r--epan/dissectors/packet-dis-fields.c389
-rw-r--r--epan/dissectors/packet-dis-fields.h131
-rw-r--r--epan/dissectors/packet-dis-pdus.c786
-rw-r--r--epan/dissectors/packet-dis-pdus.h37
-rw-r--r--epan/dissectors/packet-dis.c202
7 files changed, 1765 insertions, 330 deletions
diff --git a/epan/dissectors/packet-dis-enums.c b/epan/dissectors/packet-dis-enums.c
index 40e32d6a98..4a4b0441c2 100644
--- a/epan/dissectors/packet-dis-enums.c
+++ b/epan/dissectors/packet-dis-enums.c
@@ -40,6 +40,7 @@ const value_string DIS_PDU_ProtocolVersion_Strings[] =
{ DIS_VERSION_2_0_4TH_DRAFT, "DIS PDU version 2.0 - fourth draft (revised) March 16, 1994" },
{ DIS_VERSION_IEEE_1278_1_1995, "IEEE 1278.1-1995" },
{ DIS_VERSION_IEEE_1278_1A_1998, "IEEE 1278.1A-1998" },
+ { DIS_VERSION_IEEE_1278_1_200X, "IEEE 1278.1-200X" },
{ 0, NULL }
};
@@ -58,7 +59,9 @@ const value_string DIS_PDU_ProtocolFamily_Strings[] =
{ DIS_PROTOCOLFAMILY_SIMULATION_MANAGEMENT_WITH_RELIABILITY, "Simulation management with reliability" },
{ DIS_PROTOCOLFAMILY_LIVE_ENTITY, "Live entity" },
{ DIS_PROTOCOLFAMILY_NON_REAL_TIME, "Non-real time" },
+ { DIS_PROTOCOLFAMILY_INFORMATION_OPERATIONS, "Information Operations" },
{ DIS_PROTOCOLFAMILY_EXPERIMENTAL_COMPUTER_GENERATED_FORCES, "Experimental - Computer Generated Forces" },
+ { DIS_PROTOCOLFAMILY_EXPERIMENTAL_VDIS, "Experimental - V-DIS" },
{ DIS_PROTOCOLFAMILY_PERSISTENT_OBJECT, "Persistent object" },
{ DIS_PROTOCOLFAMILY_EXPERIMENTAL, "Experimental" },
{ 0, NULL }
@@ -134,6 +137,11 @@ const value_string DIS_PDU_Type_Strings[] =
{ DIS_PDUTYPE_RECORD_QUERY_R, "Record Query-R" },
{ DIS_PDUTYPE_COLLISION_ELASTIC, "Collision Elastic" },
{ DIS_PDUTYPE_ENTITY_STATE_UPDATE, "Entity State Update" },
+ { DIS_PDUTYPE_DIRECTED_ENERGY_FIRE, "Directed Energy Fire" },
+ { DIS_PDUTYPE_ENTITY_DAMAGE_STATUS, "Entity Damage Status" },
+ { DIS_PDUTYPE_INFORMATION_OPERATIONS_ACTION, "Info Operations Action" },
+ { DIS_PDUTYPE_INFORMATION_OPERATIONS_REPORT, "Info Operations Report" },
+ { DIS_PDUTYPE_ATTRIBUTE, "Attribute" },
{ DIS_PDUTYPE_ANNOUNCE_OBJECT, "Announce Object" },
{ DIS_PDUTYPE_DELETE_OBJECT, "Delete Object" },
{ DIS_PDUTYPE_DESCRIBE_APPLICATION, "Describe Application" },
@@ -141,6 +149,8 @@ const value_string DIS_PDU_Type_Strings[] =
{ DIS_PDUTYPE_DESCRIBE_OBJECT, "Describe Object" },
{ DIS_PDUTYPE_REQUEST_EVENT, "Request Event" },
{ DIS_PDUTYPE_REQUEST_OBJECT, "Request Object" },
+ { DIS_PDUTYPE_APPLICATION_CONTROL, "Application Control" },
+ { DIS_PDUTYPE_STEALTH_STATE, "Stealth State" },
{ 0, NULL }
};
@@ -257,6 +267,117 @@ const value_string DIS_PDU_Category_SpacePlatform_Strings[] =
{ 0, NULL }
};
+const value_string DIS_PDU_AcknowledgeFlag_Strings[] =
+{
+ { DIS_ACKNOWLEDGE_FLAG_CREATE_ENTITY, "Create Entity" },
+ { DIS_ACKNOWLEDGE_FLAG_REMOVE_ENTITY, "Remove Entity" },
+ { DIS_ACKNOWLEDGE_FLAG_START_RESUME, "Start Resume" },
+ { DIS_ACKNOWLEDGE_FLAG_STOP_FREEZE, "Stop Freeze" },
+ { DIS_ACKNOWLEDGE_FLAG_TRANSFER_CONTROL_REQUEST, "Transfer Control Request" },
+ { 0, NULL }
+};
+
+const value_string DIS_PDU_ActionId_Strings[] =
+{
+ { DIS_ACTION_ID_OTHER, "Other" },
+ { DIS_ACTION_ID_LOCAL_STORAGE_OF_THE_REQUESTED_INFORMATION, "LocalStorageOfTheRequestedInformation" },
+ { DIS_ACTION_ID_INFORM_SM_OF_EVENT_RAN_OUT_OF_AMMUNITION, "InformSMofEventRanOutOfAmmunition" },
+ { DIS_ACTION_ID_INFORM_SM_OF_EVENT_KILLED_IN_ACTION, "InformSMofEventKilledInAction" },
+ { DIS_ACTION_ID_INFORM_SM_OF_EVENT_DAMAGE, "InformSMofEventDamage" },
+ { DIS_ACTION_ID_INFORM_SM_OF_EVENT_MOBILITY_DISABLED, "InformSMofEventMobilityDisabled" },
+ { DIS_ACTION_ID_INFORM_SM_OF_EVENT_FIRE_DISABLED, "InformSMofEventFireDisabled" },
+ { DIS_ACTION_ID_INFORM_SM_OF_EVENT_RAN_OUT_OF_FUEL, "InformSMofEventRanOutOfFuel" },
+ { DIS_ACTION_ID_RECALL_CHECKPOINT_DATA, "RecallCheckpointData" },
+ { DIS_ACTION_ID_RECALL_INITIAL_PARAMETERS, "RecallInitialParameters" },
+ { DIS_ACTION_ID_INITIATE_TETHER_LEAD, "InitiateTetherLead" },
+ { DIS_ACTION_ID_INITIATE_TETHER_FOLLOW, "InitiateTetherFollow" },
+ { DIS_ACTION_ID_UNTETHER, "Untether" },
+ { DIS_ACTION_ID_INITIATE_SERVICE_STATION_RESUPPLY, "InitiateServiceStationResupply" },
+ { DIS_ACTION_ID_INITIATE_TAILGATE_RESUPPLY, "InitiateTailgateResupply" },
+ { DIS_ACTION_ID_INITIATE_HITCH_LEAD, "InitiateHitchLead" },
+ { DIS_ACTION_ID_INITIATE_HITCH_FOLLOW, "InitiateHitchFollow" },
+ { DIS_ACTION_ID_UNHITCH, "Unhitch" },
+ { DIS_ACTION_ID_MOUNT, "Mount" },
+ { DIS_ACTION_ID_DISMOUNT, "Dismount" },
+ { DIS_ACTION_ID_START_DRC, "StartDRC" },
+ { DIS_ACTION_ID_STOP_DRC, "StopDRC" },
+ { DIS_ACTION_ID_DATA_QUERY, "DataQuery" },
+ { DIS_ACTION_ID_STATUS_REQUEST, "StatusRequest" },
+ { DIS_ACTION_ID_SEND_OBJECT_STATE_DATA, "SendObjectStateData" },
+ { DIS_ACTION_ID_RECONSTITUTE, "Reconstitute" },
+ { DIS_ACTION_ID_LOCK_SITE_CONFIGURATION, "LockSiteConfiguration" },
+ { DIS_ACTION_ID_UNLOCK_SITE_CONFIGURATION, "UnlockSiteConfiguration" },
+ { DIS_ACTION_ID_UPDATE_SITE_CONFIGURATION, "UpdateSiteConfiguration" },
+ { DIS_ACTION_ID_QUERY_SITE_CONFIGURATION, "QuerySiteConfiguration" },
+ { DIS_ACTION_ID_TETHERING_INFORMATION, "TetheringInformation" },
+ { DIS_ACTION_ID_MOUNT_INTENT, "MountIntent" },
+ { DIS_ACTION_ID_ACCEPT_SUBSCRIPTION, "AcceptSubscription" },
+ { DIS_ACTION_ID_UNSUBSCRIBE, "Unsubscribe" },
+ { DIS_ACTION_ID_TELEPORT_ENTITY, "TeleportEntity" },
+ { DIS_ACTION_ID_CHANGE_AGGREGATE_STATE, "ChangeAggregateState" },
+ { DIS_ACTION_ID_REQUEST_START_PDU, "RequestStartPdu" },
+ { DIS_ACTION_ID_WAKEUP_GET_READY_FOR_INITIALIZATION, "WakeupGetReadyForInitialization" },
+ { DIS_ACTION_ID_INITIALIZE_INTERNAL_PARAMETERS, "InitializeInternalParameters" },
+ { DIS_ACTION_ID_SEND_PLAN_DATA, "SendPlanData" },
+ { DIS_ACTION_ID_SYNCHRONIZE_INTERNAL_CLOCKS, "SynchronizeInternalClocks" },
+ { DIS_ACTION_ID_RUN, "Run" },
+ { DIS_ACTION_ID_SAVE_INTERNAL_PARAMETERS, "SaveInternalParameters" },
+ { DIS_ACTION_ID_SIMULATE_MALFUNCTION, "SimulateMalfunction" },
+ { DIS_ACTION_ID_JOIN_EXERCISE, "JoinExercise" },
+ { DIS_ACTION_ID_RESIGN_EXERCISE, "ResignExercise" },
+ { DIS_ACTION_ID_TIME_ADVANCE, "TimeAdvance" },
+ { DIS_ACTION_ID_COMMAND_FROM_SIMULATOR, "CommandFromSimulator" },
+ { DIS_ACTION_ID_SLING_LOAD_CAPABILITY_REQUEST, "SlingLoadCapabilityRequest" },
+ { DIS_ACTION_ID_SLING_ATTACH_REQUEST, "SlingAttachRequest" },
+ { DIS_ACTION_ID_SLING_RELEASE_REQUEST, "SlingReleaseRequest" },
+ { DIS_ACTION_ID_AIRMOUNT_MOUNT_REQUEST, "AirmountMountRequest" },
+ { DIS_ACTION_ID_AIRMOUNT_DISMOUNT_REQUEST, "AirmountDismountRequest" },
+ { DIS_ACTION_ID_AIRMOUNT_INFO_REQUEST, "AirmountInfoRequest" },
+ { 0, NULL }
+};
+
+const value_string DIS_PDU_ApplicationGeneralStatus_Strings[] =
+{
+ { DIS_APPLICATION_GENERAL_STATUS_UNKNOWN, "Unknown" },
+ { DIS_APPLICATION_GENERAL_STATUS_FUNCTIONAL, "Functional" },
+ { DIS_APPLICATION_GENERAL_STATUS_DEGRADED_BUT_FUNCTIONAL, "Degraded But Functional" },
+ { DIS_APPLICATION_GENERAL_STATUS_NOT_FUNCTIONAL, "Not Functional" },
+ { 0, NULL }
+};
+
+const value_string DIS_PDU_ApplicationStatusType_Strings[] =
+{
+ { DIS_APPLICATION_STATUS_TYPE_NOT_SPECIFIED, "Not Specified" },
+ { DIS_APPLICATION_STATUS_TYPE_CPU_USAGE_USER, "Cpu Usage User" },
+ { DIS_APPLICATION_STATUS_TYPE_CPU_USAGE_SYSTEM, "Cpu Usage System" },
+ { DIS_APPLICATION_STATUS_TYPE_CPU_USAGE_IO, "Cpu Usage Io" },
+ { DIS_APPLICATION_STATUS_TYPE_CPU_USAGE_IDLE, "Cpu Usage Idle" },
+ { DIS_APPLICATION_STATUS_TYPE_CPU_USAGE_STEAL, "Cpu Usage Steal" },
+ { DIS_APPLICATION_STATUS_TYPE_CPU_USAGE_NICE, "Cpu Usage Nice" },
+ { DIS_APPLICATION_STATUS_TYPE_MEMORY_FREE, "Memory Free" },
+ { DIS_APPLICATION_STATUS_TYPE_MEMORY_USED, "Memory Used" },
+ { DIS_APPLICATION_STATUS_TYPE_SWAP_FREE, "Swap Free" },
+ { DIS_APPLICATION_STATUS_TYPE_SWAP_USED, "Swap Used" },
+ { DIS_APPLICATION_STATUS_TYPE_SWAP_CACHED, "Swap Cached" },
+ { DIS_APPLICATION_STATUS_TYPE_TRANSMITTED_PACKETS_SEC, "Transmitted Packets Sec" },
+ { DIS_APPLICATION_STATUS_TYPE_TRANSMITTED_BYTES_SEC, "Transmitted Bytes Sec" },
+ { DIS_APPLICATION_STATUS_TYPE_RECEIVED_PACKETS_SEC, "Received Packets Sec" },
+ { DIS_APPLICATION_STATUS_TYPE_RECEIVED_BYTES_SEC, "Received Bytes Sec" },
+ { DIS_APPLICATION_STATUS_TYPE_NICE_LEVEL, "Nice Level" },
+ { 0, NULL }
+};
+
+const value_string DIS_PDU_ApplicationType_Strings[] =
+{
+ { DIS_APPLICATION_TYPE_OTHER, "Other" },
+ { DIS_APPLICATION_TYPE_RESOURCE_MANAGER, "Resource Manager" },
+ { DIS_APPLICATION_TYPE_SIMULATION_MANAGER, "Simulation Manager" },
+ { DIS_APPLICATION_TYPE_GATEWAY, "Gateway" },
+ { DIS_APPLICATION_TYPE_STEALTH, "Stealth" },
+ { DIS_APPLICATION_TYPE_TACTICAL_INTERNET_INTERFACE, "Tactical Internet Interface" },
+ { 0, NULL }
+};
+
const value_string DIS_PDU_DetonationResult_Strings[] =
{
{ DIS_DETONATION_RESULT_OTHER, "Other" },
@@ -295,3 +416,148 @@ const value_string DIS_PDU_DetonationResult_Strings[] =
{ DIS_DETONATION_RESULT_MISS_DUE_TO_FOF_AND_ENDGAME_FAILURE, "Miss due to fly-out and end-game failure" },
{ 0, NULL }
};
+
+const value_string DIS_PDU_ControlId_Strings[] =
+{
+ { DIS_CONTROL_ID_OTHER, "Other" },
+ { DIS_CONTROL_ID_SHUTDOWN, "Shutdown" },
+ { DIS_CONTROL_ID_DATA_QUERY, "Data Query" },
+ { DIS_CONTROL_ID_DATA, "Data" },
+ { DIS_CONTROL_ID_SET_DATA, "Set Data" },
+ { DIS_CONTROL_ID_ADD_DATA, "Add Data" },
+ { DIS_CONTROL_ID_REMOVE_DATA, "Remove Data" },
+ { DIS_CONTROL_ID_STATUS, "Status" },
+ { 0, NULL }
+};
+
+const value_string DIS_PDU_FrozenBehavior_Strings[] =
+{
+ { DIS_FROZEN_BEHAVIOR_RUN_INTERNAL_SIMULATION_CLOCK, "Run Internal Simulation Clock" },
+ { DIS_FROZEN_BEHAVIOR_TRANSMIT_PDUS, "Transmit PDUs" },
+ { DIS_FROZEN_BEHAVIOR_UPDATE_SIM_MODELS_OF_OTHER_ENTITIES, "Update Sim Models Of Other Entities" },
+ { DIS_FROZEN_BEHAVIOR_CONTINUE_TRANSMIT_PDU, "Continue Transmit PDU" },
+ { DIS_FROZEN_BEHAVIOR_CEASE_UPDATE_SIM_MODELS_OF_OTHER_ENTITIES, "Cease Update Sim Models Of Other Entities" },
+ { DIS_FROZEN_BEHAVIOR_CONTINUE_UPDATE_SIM_MODELS_OF_OTHER_ENTITIES, "Continue Update Sim Models Of Other Entities" },
+ { 0, NULL }
+};
+
+const value_string DIS_PDU_ParameterTypeDesignator_Strings[] =
+{
+ { DIS_PARAM_TYPE_DESIG_ARTICULATED_PART, "Articulated Part" },
+ { DIS_PARAM_TYPE_DESIG_ATTACHED_PART, "Attached Part" },
+ { DIS_PARAM_TYPE_DESIG_SEPARATION, "Separation" },
+ { DIS_PARAM_TYPE_DESIG_ENTITY_TYPE, "Entity Type" },
+ { DIS_PARAM_TYPE_DESIG_ENTITY_ASSOCIATION, "Entity Association" },
+ { DIS_PARAM_TYPE_DESIG_ANTENNA_LOCATION, "Antenna Location" },
+ { DIS_PARAM_TYPE_DESIG_EXTENDED_PLATFORM_APPEARANCE, "Extended Platform Appearance" },
+ { DIS_PARAM_TYPE_DESIG_EXTENDED_LIFEFORM_APPEARANCE, "Extended Lifeform Appearance" },
+ { DIS_PARAM_TYPE_DESIG_HIGH_FIDELITY_LIGHTS, "High Fidelity Lights" },
+ { DIS_PARAM_TYPE_DESIG_CHEVRON_MARKING, "Chevron Marking" },
+ { DIS_PARAM_TYPE_DESIG_HIGH_FIDELITY_THERMAL_SENSOR, "High Fidelity Thermal Sensor" },
+ { DIS_PARAM_TYPE_DESIG_ENTITY_OFFSET, "Entity Offset" },
+ { DIS_PARAM_TYPE_DESIG_DEAD_RECKONING, "Dead Reckoning" },
+ { DIS_PARAM_TYPE_DESIG_ARMY_TASK_ORGANIZATION, "Army Task Organization" },
+ { DIS_PARAM_TYPE_DESIG_HEAD_GAZING_WEAPON_AIMING, "Head Gazing Weapon Aiming" },
+ { DIS_PARAM_TYPE_DESIG_LIFEFORM_ACTION_SEQUENCE, "Lifeform Action Sequence" },
+ { DIS_PARAM_TYPE_DESIG_LEGACY_EXTENDED_LIFEFORM_APPEARANCE, "Legacy Extended Lifeform Appearance" },
+ { 0, NULL }
+};
+
+const value_string DIS_PDU_Reason_Strings[] =
+{
+ { DIS_REASON_OTHER, "Other" },
+ { DIS_REASON_RECESS, "Recess" },
+ { DIS_REASON_TERMINATION, "Termination" },
+ { DIS_REASON_SYSTEM_FAILURE, "System Failure" },
+ { DIS_REASON_SECURITY_VIOLATION, "Security Violation" },
+ { DIS_REASON_ENTITY_RECONSTITUTION, "Entity Reconstitution" },
+ { DIS_REASON_STOP_FOR_RESET, "Stop For Reset" },
+ { DIS_REASON_STOP_FOR_RESTART, "Stop For Restart" },
+ { DIS_REASON_ABORT_TRAINING_RETURN_TO_TACTICAL_OPERATIONS, "Abort Training Return To Tactical Operations" },
+ { 0, NULL }
+};
+
+const value_string DIS_PDU_RequestStatus_Strings[] =
+{
+ { DIS_REQUEST_STATUS_OTHER, "Other" },
+ { DIS_REQUEST_STATUS_PENDING, "Pending" },
+ { DIS_REQUEST_STATUS_EXECUTING, "Executing" },
+ { DIS_REQUEST_STATUS_PARTIALLY_COMPLETE, "Partially Complete" },
+ { DIS_REQUEST_STATUS_COMPLETE, "Complete" },
+ { DIS_REQUEST_STATUS_REQUEST_REJECTED, "Request Rejected" },
+ { DIS_REQUEST_STATUS_RETRANSMIT_REQUEST_NOW, "Retransmit Request Now" },
+ { DIS_REQUEST_STATUS_RETRANSMIT_REQUEST_LATER, "Retransmit Request Later" },
+ { DIS_REQUEST_STATUS_INVALID_TIME_PARAMETERS, "Invalid Time Parameters" },
+ { DIS_REQUEST_STATUS_SIMULATION_TIME_EXCEEDED, "Simulation Time Exceeded" },
+ { DIS_REQUEST_STATUS_REQUEST_DONE, "Request Done" },
+ { DIS_REQUEST_STATUS_TACCSF_LOS_REPLY_TYPE_1, "TACCSF LOS Reply Type 1" },
+ { DIS_REQUEST_STATUS_TACCSF_LOS_REPLY_TYPE_2, "TACCSF LOS Reply Type 2" },
+ { DIS_REQUEST_STATUS_JOIN_EXERCISE_REQUEST_REJECTED, "Join Exercise Request Rejected" },
+ { 0, NULL }
+};
+
+const value_string DIS_PDU_RequiredReliabilityService_Strings[] =
+{
+ { DIS_REQUIRED_RELIABILITY_SERVICE_ACKNOWLEDGED, "Acknowledged" },
+ { DIS_REQUIRED_RELIABILITY_SERVICE_UNACKNOWLEDGED, "Unacknowledged" },
+ { 0, NULL }
+};
+
+const value_string DIS_PDU_DisResponseFlag_Strings[] =
+{
+ { DIS_RESPONSE_FLAG_OTHER, "Other" },
+ { DIS_RESPONSE_FLAG_ABLE_TO_COMPLY, "Able To Comply" },
+ { DIS_RESPONSE_FLAG_UNABLE_TO_COMPLY, "Unable To Comply" },
+ { DIS_RESPONSE_FLAG_PENDING_OPERATOR_ACTION, "Pending Operator Action" },
+ { 0, NULL }
+};
+
+const value_string DIS_PDU_PersistentObjectType_Strings[] =
+{
+ { DIS_PERSISTENT_OBJECT_TYPE_OTHER, "Other" },
+ { DIS_PERSISTENT_OBJECT_TYPE_SIMULATOR_PRESENT, "Simulator Present" },
+ { DIS_PERSISTENT_OBJECT_TYPE_DESCRIBE_OBJECT, "Describe Object" },
+ { DIS_PERSISTENT_OBJECT_TYPE_OBJECTS_PRESENT, "Objects Present" },
+ { DIS_PERSISTENT_OBJECT_TYPE_OBJECT_REQUEST, "Object Request" },
+ { DIS_PERSISTENT_OBJECT_TYPE_DELETE_OBJECTS, "Delete Objects" },
+ { DIS_PERSISTENT_OBJECT_TYPE_SET_WORLD_STATE, "Set World State" },
+ { DIS_PERSISTENT_OBJECT_TYPE_NOMINATION, "Nomination" },
+ { 0, NULL }
+};
+
+const value_string DIS_PDU_PO_ObjectClass_Strings[] =
+{
+ { DIS_PO_OBJECT_CLASS_OTHER, "Other" },
+ { DIS_PO_OBJECT_CLASS_WORLD_STATE, "World State" },
+ { DIS_PO_OBJECT_CLASS_OVERLAY, "Overlay" },
+ { DIS_PO_OBJECT_CLASS_POINT, "Point" },
+ { DIS_PO_OBJECT_CLASS_LINE, "Line" },
+ { DIS_PO_OBJECT_CLASS_SECTOR, "Sector" },
+ { DIS_PO_OBJECT_CLASS_TEXT, "Text" },
+ { DIS_PO_OBJECT_CLASS_UNIT, "Unit" },
+ { DIS_PO_OBJECT_CLASS_UNIT_DEFINITION, "Unit Definition" },
+ { DIS_PO_OBJECT_CLASS_STEALTH_CONTROLLER, "Stealth Controller" },
+ { DIS_PO_OBJECT_CLASS_H_HOUR, "H Hour" },
+ { DIS_PO_OBJECT_CLASS_VARIABLE, "Variable" },
+ { DIS_PO_OBJECT_CLASS_TASK, "Task" },
+ { DIS_PO_OBJECT_CLASS_TASK_STATE, "Task State" },
+ { DIS_PO_OBJECT_CLASS_TASK_FRAME, "Task Frame" },
+ { DIS_PO_OBJECT_CLASS_TASK_AUTHORIZATION, "Task Authorization" },
+ { DIS_PO_OBJECT_CLASS_PARAMETRIC_INPUT, "Parametric Input" },
+ { DIS_PO_OBJECT_CLASS_PARAMETRIC_INPUT_HOLDER, "Parametric Input Holder" },
+ { DIS_PO_OBJECT_CLASS_EXERCISE_INITIALIZER, "Exercise Initializer" },
+ { DIS_PO_OBJECT_CLASS_FIRE_PARAMETERS, "Fire Parameters" },
+ { DIS_PO_OBJECT_CLASS_MINEFIELD, "Minefield" },
+ { DIS_PO_OBJECT_CLASS_SIMULATION_REQUEST, "Simulation Request" },
+ { DIS_PO_OBJECT_CLASS_NET_SUBSCRIPTION, "Net Subscription" },
+ { DIS_PO_OBJECT_CLASS_LINK, "Link" },
+ { DIS_PO_OBJECT_CLASS_MINEFIELD_PARENT, "Minefield Parent" },
+ { DIS_PO_OBJECT_CLASS_CHEMICAL, "Chemical" },
+ { DIS_PO_OBJECT_CLASS_AlertUser, "Alert User" },
+ { DIS_PO_OBJECT_CLASS_HAND_OFF, "Hand Off" },
+ { DIS_PO_OBJECT_CLASS_CIRCUIT, "Circuit" },
+ { DIS_PO_OBJECT_CLASS_CARGO, "Cargo" },
+ { DIS_PO_OBJECT_CLASS_MCM_ROUTE, "Mcm Route" },
+ { DIS_PO_OBJECT_CLASS_MESSAGE, "Message" },
+ { 0, NULL }
+};
diff --git a/epan/dissectors/packet-dis-enums.h b/epan/dissectors/packet-dis-enums.h
index 2de733537d..4ccded648f 100644
--- a/epan/dissectors/packet-dis-enums.h
+++ b/epan/dissectors/packet-dis-enums.h
@@ -37,7 +37,8 @@ typedef enum
DIS_VERSION_2_0_3RD_DRAFT = 3,
DIS_VERSION_2_0_4TH_DRAFT = 4,
DIS_VERSION_IEEE_1278_1_1995 = 5,
- DIS_VERSION_IEEE_1278_1A_1998 = 6
+ DIS_VERSION_IEEE_1278_1A_1998 = 6,
+ DIS_VERSION_IEEE_1278_1_200X = 7
} DIS_PDU_ProtocolVersion;
extern const value_string DIS_PDU_ProtocolVersion_Strings[];
@@ -57,7 +58,9 @@ typedef enum
DIS_PROTOCOLFAMILY_SIMULATION_MANAGEMENT_WITH_RELIABILITY = 10,
DIS_PROTOCOLFAMILY_LIVE_ENTITY = 11,
DIS_PROTOCOLFAMILY_NON_REAL_TIME = 12,
+ DIS_PROTOCOLFAMILY_INFORMATION_OPERATIONS = 13,
DIS_PROTOCOLFAMILY_EXPERIMENTAL_COMPUTER_GENERATED_FORCES = 129,
+ DIS_PROTOCOLFAMILY_EXPERIMENTAL_VDIS = 130,
DIS_PROTOCOLFAMILY_PERSISTENT_OBJECT = 140,
DIS_PROTOCOLFAMILY_EXPERIMENTAL = 150
} DIS_PDU_ProtocolFamily;
@@ -134,13 +137,20 @@ typedef enum
DIS_PDUTYPE_RECORD_QUERY_R = 65,
DIS_PDUTYPE_COLLISION_ELASTIC = 66,
DIS_PDUTYPE_ENTITY_STATE_UPDATE = 67,
+ DIS_PDUTYPE_DIRECTED_ENERGY_FIRE = 68,
+ DIS_PDUTYPE_ENTITY_DAMAGE_STATUS = 69,
+ DIS_PDUTYPE_INFORMATION_OPERATIONS_ACTION = 70,
+ DIS_PDUTYPE_INFORMATION_OPERATIONS_REPORT = 71,
+ DIS_PDUTYPE_ATTRIBUTE = 71,
DIS_PDUTYPE_ANNOUNCE_OBJECT = 129,
DIS_PDUTYPE_DELETE_OBJECT = 130,
DIS_PDUTYPE_DESCRIBE_APPLICATION = 131,
DIS_PDUTYPE_DESCRIBE_EVENT = 132,
DIS_PDUTYPE_DESCRIBE_OBJECT = 133,
DIS_PDUTYPE_REQUEST_EVENT = 134,
- DIS_PDUTYPE_REQUEST_OBJECT = 135
+ DIS_PDUTYPE_REQUEST_OBJECT = 135,
+ DIS_PDUTYPE_APPLICATION_CONTROL = 200,
+ DIS_PDUTYPE_STEALTH_STATE = 201
} DIS_PDU_Type;
extern const value_string DIS_PDU_Type_Strings[];
@@ -267,6 +277,122 @@ extern const value_string DIS_PDU_Category_SpacePlatform_Strings[];
typedef enum
{
+ DIS_ACKNOWLEDGE_FLAG_CREATE_ENTITY = 1,
+ DIS_ACKNOWLEDGE_FLAG_REMOVE_ENTITY = 2,
+ DIS_ACKNOWLEDGE_FLAG_START_RESUME = 3,
+ DIS_ACKNOWLEDGE_FLAG_STOP_FREEZE = 4,
+ DIS_ACKNOWLEDGE_FLAG_TRANSFER_CONTROL_REQUEST = 5
+} DIS_PDU_AcknowledgeFlag;
+
+extern const value_string DIS_PDU_AcknowledgeFlag_Strings[];
+
+typedef enum
+{
+ DIS_ACTION_ID_OTHER = 0,
+ DIS_ACTION_ID_LOCAL_STORAGE_OF_THE_REQUESTED_INFORMATION = 1,
+ DIS_ACTION_ID_INFORM_SM_OF_EVENT_RAN_OUT_OF_AMMUNITION = 2,
+ DIS_ACTION_ID_INFORM_SM_OF_EVENT_KILLED_IN_ACTION = 3,
+ DIS_ACTION_ID_INFORM_SM_OF_EVENT_DAMAGE = 4,
+ DIS_ACTION_ID_INFORM_SM_OF_EVENT_MOBILITY_DISABLED = 5,
+ DIS_ACTION_ID_INFORM_SM_OF_EVENT_FIRE_DISABLED = 6,
+ DIS_ACTION_ID_INFORM_SM_OF_EVENT_RAN_OUT_OF_FUEL = 7,
+ DIS_ACTION_ID_RECALL_CHECKPOINT_DATA = 8,
+ DIS_ACTION_ID_RECALL_INITIAL_PARAMETERS = 9,
+ DIS_ACTION_ID_INITIATE_TETHER_LEAD = 10,
+ DIS_ACTION_ID_INITIATE_TETHER_FOLLOW = 11,
+ DIS_ACTION_ID_UNTETHER = 12,
+ DIS_ACTION_ID_INITIATE_SERVICE_STATION_RESUPPLY = 13,
+ DIS_ACTION_ID_INITIATE_TAILGATE_RESUPPLY = 14,
+ DIS_ACTION_ID_INITIATE_HITCH_LEAD = 15,
+ DIS_ACTION_ID_INITIATE_HITCH_FOLLOW = 16,
+ DIS_ACTION_ID_UNHITCH = 17,
+ DIS_ACTION_ID_MOUNT = 18,
+ DIS_ACTION_ID_DISMOUNT = 19,
+ DIS_ACTION_ID_START_DRC = 20,
+ DIS_ACTION_ID_STOP_DRC = 21,
+ DIS_ACTION_ID_DATA_QUERY = 22,
+ DIS_ACTION_ID_STATUS_REQUEST = 23,
+ DIS_ACTION_ID_SEND_OBJECT_STATE_DATA = 24,
+ DIS_ACTION_ID_RECONSTITUTE = 25,
+ DIS_ACTION_ID_LOCK_SITE_CONFIGURATION = 26,
+ DIS_ACTION_ID_UNLOCK_SITE_CONFIGURATION = 27,
+ DIS_ACTION_ID_UPDATE_SITE_CONFIGURATION = 28,
+ DIS_ACTION_ID_QUERY_SITE_CONFIGURATION = 29,
+ DIS_ACTION_ID_TETHERING_INFORMATION = 30,
+ DIS_ACTION_ID_MOUNT_INTENT = 31,
+ DIS_ACTION_ID_ACCEPT_SUBSCRIPTION = 33,
+ DIS_ACTION_ID_UNSUBSCRIBE = 34,
+ DIS_ACTION_ID_TELEPORT_ENTITY = 35,
+ DIS_ACTION_ID_CHANGE_AGGREGATE_STATE = 36,
+ DIS_ACTION_ID_REQUEST_START_PDU = 37,
+ DIS_ACTION_ID_WAKEUP_GET_READY_FOR_INITIALIZATION = 38,
+ DIS_ACTION_ID_INITIALIZE_INTERNAL_PARAMETERS = 39,
+ DIS_ACTION_ID_SEND_PLAN_DATA = 40,
+ DIS_ACTION_ID_SYNCHRONIZE_INTERNAL_CLOCKS = 41,
+ DIS_ACTION_ID_RUN = 42,
+ DIS_ACTION_ID_SAVE_INTERNAL_PARAMETERS = 43,
+ DIS_ACTION_ID_SIMULATE_MALFUNCTION = 44,
+ DIS_ACTION_ID_JOIN_EXERCISE = 45,
+ DIS_ACTION_ID_RESIGN_EXERCISE = 46,
+ DIS_ACTION_ID_TIME_ADVANCE = 47,
+ DIS_ACTION_ID_COMMAND_FROM_SIMULATOR = 48,
+ DIS_ACTION_ID_SLING_LOAD_CAPABILITY_REQUEST = 4300,
+ DIS_ACTION_ID_SLING_ATTACH_REQUEST = 4301,
+ DIS_ACTION_ID_SLING_RELEASE_REQUEST = 4302,
+ DIS_ACTION_ID_AIRMOUNT_MOUNT_REQUEST = 4303,
+ DIS_ACTION_ID_AIRMOUNT_DISMOUNT_REQUEST = 4304,
+ DIS_ACTION_ID_AIRMOUNT_INFO_REQUEST = 4305
+} DIS_PDU_ActionId;
+
+extern const value_string DIS_PDU_ActionId_Strings[];
+
+typedef enum
+{
+ DIS_APPLICATION_GENERAL_STATUS_UNKNOWN = 1,
+ DIS_APPLICATION_GENERAL_STATUS_FUNCTIONAL = 2,
+ DIS_APPLICATION_GENERAL_STATUS_DEGRADED_BUT_FUNCTIONAL = 3,
+ DIS_APPLICATION_GENERAL_STATUS_NOT_FUNCTIONAL = 4
+} DIS_PDU_ApplicationGeneralStatus;
+
+extern const value_string DIS_PDU_ApplicationGeneralStatus_Strings[];
+
+typedef enum
+{
+ DIS_APPLICATION_STATUS_TYPE_NOT_SPECIFIED = 0,
+ DIS_APPLICATION_STATUS_TYPE_CPU_USAGE_USER = 10,
+ DIS_APPLICATION_STATUS_TYPE_CPU_USAGE_SYSTEM = 11,
+ DIS_APPLICATION_STATUS_TYPE_CPU_USAGE_IO = 12,
+ DIS_APPLICATION_STATUS_TYPE_CPU_USAGE_IDLE = 13,
+ DIS_APPLICATION_STATUS_TYPE_CPU_USAGE_STEAL = 14,
+ DIS_APPLICATION_STATUS_TYPE_CPU_USAGE_NICE = 15,
+ DIS_APPLICATION_STATUS_TYPE_MEMORY_FREE = 50,
+ DIS_APPLICATION_STATUS_TYPE_MEMORY_USED = 51,
+ DIS_APPLICATION_STATUS_TYPE_SWAP_FREE = 60,
+ DIS_APPLICATION_STATUS_TYPE_SWAP_USED = 61,
+ DIS_APPLICATION_STATUS_TYPE_SWAP_CACHED = 62,
+ DIS_APPLICATION_STATUS_TYPE_TRANSMITTED_PACKETS_SEC = 100,
+ DIS_APPLICATION_STATUS_TYPE_TRANSMITTED_BYTES_SEC = 101,
+ DIS_APPLICATION_STATUS_TYPE_RECEIVED_PACKETS_SEC = 110,
+ DIS_APPLICATION_STATUS_TYPE_RECEIVED_BYTES_SEC = 111,
+ DIS_APPLICATION_STATUS_TYPE_NICE_LEVEL = 150
+} DIS_PDU_ApplicationStatusType;
+
+extern const value_string DIS_PDU_ApplicationStatusType_Strings[];
+
+typedef enum
+{
+ DIS_APPLICATION_TYPE_OTHER = 0,
+ DIS_APPLICATION_TYPE_RESOURCE_MANAGER = 1,
+ DIS_APPLICATION_TYPE_SIMULATION_MANAGER = 2,
+ DIS_APPLICATION_TYPE_GATEWAY = 3,
+ DIS_APPLICATION_TYPE_STEALTH = 4,
+ DIS_APPLICATION_TYPE_TACTICAL_INTERNET_INTERFACE = 5
+} DIS_PDU_ApplicationType;
+
+extern const value_string DIS_PDU_ApplicationType_Strings[];
+
+typedef enum
+{
DIS_DETONATION_RESULT_OTHER = 0,
DIS_DETONATION_RESULT_ENTITY_IMPACT = 1,
DIS_DETONATION_RESULT_ENTITY_PROXIMATE_DETONATION = 2,
@@ -305,4 +431,158 @@ typedef enum
extern const value_string DIS_PDU_DetonationResult_Strings[];
+typedef enum
+{
+ DIS_CONTROL_ID_OTHER = 0,
+ DIS_CONTROL_ID_SHUTDOWN = 1,
+ DIS_CONTROL_ID_DATA_QUERY = 2,
+ DIS_CONTROL_ID_DATA = 3,
+ DIS_CONTROL_ID_SET_DATA = 4,
+ DIS_CONTROL_ID_ADD_DATA = 5,
+ DIS_CONTROL_ID_REMOVE_DATA = 6,
+ DIS_CONTROL_ID_STATUS = 7
+} DIS_PDU_ControlId;
+
+extern const value_string DIS_PDU_ControlId_Strings[];
+
+typedef enum
+{
+ DIS_FROZEN_BEHAVIOR_RUN_INTERNAL_SIMULATION_CLOCK = 0,
+ DIS_FROZEN_BEHAVIOR_TRANSMIT_PDUS = 1,
+ DIS_FROZEN_BEHAVIOR_UPDATE_SIM_MODELS_OF_OTHER_ENTITIES = 2,
+ DIS_FROZEN_BEHAVIOR_CONTINUE_TRANSMIT_PDU = 3,
+ DIS_FROZEN_BEHAVIOR_CEASE_UPDATE_SIM_MODELS_OF_OTHER_ENTITIES = 4,
+ DIS_FROZEN_BEHAVIOR_CONTINUE_UPDATE_SIM_MODELS_OF_OTHER_ENTITIES = 5
+} DIS_PDU_FrozenBehavior;
+
+extern const value_string DIS_PDU_FrozenBehavior_Strings[];
+
+typedef enum
+{
+ DIS_PARAM_TYPE_DESIG_ARTICULATED_PART = 0,
+ DIS_PARAM_TYPE_DESIG_ATTACHED_PART = 1,
+ DIS_PARAM_TYPE_DESIG_SEPARATION = 2,
+ DIS_PARAM_TYPE_DESIG_ENTITY_TYPE = 3,
+ DIS_PARAM_TYPE_DESIG_ENTITY_ASSOCIATION = 4,
+ DIS_PARAM_TYPE_DESIG_ANTENNA_LOCATION = 5,
+ DIS_PARAM_TYPE_DESIG_EXTENDED_PLATFORM_APPEARANCE = 20,
+ DIS_PARAM_TYPE_DESIG_EXTENDED_LIFEFORM_APPEARANCE = 21,
+ DIS_PARAM_TYPE_DESIG_HIGH_FIDELITY_LIGHTS = 22,
+ DIS_PARAM_TYPE_DESIG_CHEVRON_MARKING = 23,
+ DIS_PARAM_TYPE_DESIG_HIGH_FIDELITY_THERMAL_SENSOR = 24,
+ DIS_PARAM_TYPE_DESIG_ENTITY_OFFSET = 25,
+ DIS_PARAM_TYPE_DESIG_DEAD_RECKONING = 26,
+ DIS_PARAM_TYPE_DESIG_ARMY_TASK_ORGANIZATION = 27,
+ DIS_PARAM_TYPE_DESIG_HEAD_GAZING_WEAPON_AIMING = 28,
+ DIS_PARAM_TYPE_DESIG_LIFEFORM_ACTION_SEQUENCE = 29,
+ DIS_PARAM_TYPE_DESIG_LEGACY_EXTENDED_LIFEFORM_APPEARANCE = 30
+} DIS_PDU_ParameterTypeDesignator;
+
+extern const value_string DIS_PDU_ParameterTypeDesignator_Strings[];
+
+typedef enum
+{
+ DIS_REASON_OTHER = 0,
+ DIS_REASON_RECESS = 1,
+ DIS_REASON_TERMINATION = 2,
+ DIS_REASON_SYSTEM_FAILURE = 3,
+ DIS_REASON_SECURITY_VIOLATION = 4,
+ DIS_REASON_ENTITY_RECONSTITUTION = 5,
+ DIS_REASON_STOP_FOR_RESET = 6,
+ DIS_REASON_STOP_FOR_RESTART = 7,
+ DIS_REASON_ABORT_TRAINING_RETURN_TO_TACTICAL_OPERATIONS = 8
+} DIS_PDU_Reason;
+
+extern const value_string DIS_PDU_Reason_Strings[];
+
+typedef enum
+{
+ DIS_REQUEST_STATUS_OTHER = 0,
+ DIS_REQUEST_STATUS_PENDING = 1,
+ DIS_REQUEST_STATUS_EXECUTING = 2,
+ DIS_REQUEST_STATUS_PARTIALLY_COMPLETE = 3,
+ DIS_REQUEST_STATUS_COMPLETE = 4,
+ DIS_REQUEST_STATUS_REQUEST_REJECTED = 5,
+ DIS_REQUEST_STATUS_RETRANSMIT_REQUEST_NOW = 6,
+ DIS_REQUEST_STATUS_RETRANSMIT_REQUEST_LATER = 7,
+ DIS_REQUEST_STATUS_INVALID_TIME_PARAMETERS = 8,
+ DIS_REQUEST_STATUS_SIMULATION_TIME_EXCEEDED = 9,
+ DIS_REQUEST_STATUS_REQUEST_DONE = 10,
+ DIS_REQUEST_STATUS_TACCSF_LOS_REPLY_TYPE_1 = 100,
+ DIS_REQUEST_STATUS_TACCSF_LOS_REPLY_TYPE_2 = 101,
+ DIS_REQUEST_STATUS_JOIN_EXERCISE_REQUEST_REJECTED = 201
+} DIS_PDU_RequestStatus;
+
+extern const value_string DIS_PDU_RequestStatus_Strings[];
+
+typedef enum
+{
+ DIS_REQUIRED_RELIABILITY_SERVICE_ACKNOWLEDGED = 0,
+ DIS_REQUIRED_RELIABILITY_SERVICE_UNACKNOWLEDGED = 1
+} DIS_PDU_RequiredReliabilityService;
+
+extern const value_string DIS_PDU_RequiredReliabilityService_Strings[];
+
+typedef enum
+{
+ DIS_RESPONSE_FLAG_OTHER = 0,
+ DIS_RESPONSE_FLAG_ABLE_TO_COMPLY = 1,
+ DIS_RESPONSE_FLAG_UNABLE_TO_COMPLY = 2,
+ DIS_RESPONSE_FLAG_PENDING_OPERATOR_ACTION = 3
+} DIS_PDU_DisResponseFlag;
+
+extern const value_string DIS_PDU_DisResponseFlag_Strings[];
+
+typedef enum
+{
+ DIS_PERSISTENT_OBJECT_TYPE_OTHER = 0,
+ DIS_PERSISTENT_OBJECT_TYPE_SIMULATOR_PRESENT = 1,
+ DIS_PERSISTENT_OBJECT_TYPE_DESCRIBE_OBJECT = 2,
+ DIS_PERSISTENT_OBJECT_TYPE_OBJECTS_PRESENT = 3,
+ DIS_PERSISTENT_OBJECT_TYPE_OBJECT_REQUEST = 4,
+ DIS_PERSISTENT_OBJECT_TYPE_DELETE_OBJECTS = 5,
+ DIS_PERSISTENT_OBJECT_TYPE_SET_WORLD_STATE = 6,
+ DIS_PERSISTENT_OBJECT_TYPE_NOMINATION = 7
+} DIS_PDU_PersistentObjectType;
+
+extern const value_string DIS_PDU_PersistentObjectType_Strings[];
+
+typedef enum
+{
+ DIS_PO_OBJECT_CLASS_OTHER = 0,
+ DIS_PO_OBJECT_CLASS_WORLD_STATE = 1,
+ DIS_PO_OBJECT_CLASS_OVERLAY = 2,
+ DIS_PO_OBJECT_CLASS_POINT = 3,
+ DIS_PO_OBJECT_CLASS_LINE = 4,
+ DIS_PO_OBJECT_CLASS_SECTOR = 5,
+ DIS_PO_OBJECT_CLASS_TEXT = 6,
+ DIS_PO_OBJECT_CLASS_UNIT = 7,
+ DIS_PO_OBJECT_CLASS_UNIT_DEFINITION = 8,
+ DIS_PO_OBJECT_CLASS_STEALTH_CONTROLLER = 9,
+ DIS_PO_OBJECT_CLASS_H_HOUR = 10,
+ DIS_PO_OBJECT_CLASS_VARIABLE = 11,
+ DIS_PO_OBJECT_CLASS_TASK = 12,
+ DIS_PO_OBJECT_CLASS_TASK_STATE = 13,
+ DIS_PO_OBJECT_CLASS_TASK_FRAME = 14,
+ DIS_PO_OBJECT_CLASS_TASK_AUTHORIZATION = 15,
+ DIS_PO_OBJECT_CLASS_PARAMETRIC_INPUT = 16,
+ DIS_PO_OBJECT_CLASS_PARAMETRIC_INPUT_HOLDER = 17,
+ DIS_PO_OBJECT_CLASS_EXERCISE_INITIALIZER = 18,
+ DIS_PO_OBJECT_CLASS_FIRE_PARAMETERS = 19,
+ DIS_PO_OBJECT_CLASS_MINEFIELD = 20,
+ DIS_PO_OBJECT_CLASS_SIMULATION_REQUEST = 21,
+ DIS_PO_OBJECT_CLASS_NET_SUBSCRIPTION = 22,
+ DIS_PO_OBJECT_CLASS_LINK = 23,
+ DIS_PO_OBJECT_CLASS_MINEFIELD_PARENT = 24,
+ DIS_PO_OBJECT_CLASS_CHEMICAL = 25,
+ DIS_PO_OBJECT_CLASS_AlertUser = 26,
+ DIS_PO_OBJECT_CLASS_HAND_OFF = 27,
+ DIS_PO_OBJECT_CLASS_CIRCUIT = 28,
+ DIS_PO_OBJECT_CLASS_CARGO = 29,
+ DIS_PO_OBJECT_CLASS_MCM_ROUTE = 30,
+ DIS_PO_OBJECT_CLASS_MESSAGE = 31
+} DIS_PDU_PO_ObjectClass;
+
+extern const value_string DIS_PDU_PO_ObjectClass_Strings[];
+
#endif /* packet-dis-enums.h */
diff --git a/epan/dissectors/packet-dis-fields.c b/epan/dissectors/packet-dis-fields.c
index 3d227c086a..eb8f99dc44 100644
--- a/epan/dissectors/packet-dis-fields.c
+++ b/epan/dissectors/packet-dis-fields.c
@@ -32,122 +32,232 @@
#include <epan/packet.h>
#include "packet-dis-fields.h"
#include "packet-dis-enums.h"
+#include "packet-dis-pdus.h"
+guint32 protocolVersion;
guint32 pduType;
+guint32 protocolFamily;
+guint32 persistentObjectPduType;
guint32 entityKind;
guint32 entityDomain;
+guint32 numFixed;
+guint32 numVariable;
guint32 variableDatumLength;
+guint32 variableParameterType;
+guint32 variableRecordLength;
+guint32 variableRecordType;
+/* Headers
+ */
DIS_ParserNode DIS_FIELDS_PDU_HEADER[] =
{
- { DIS_FIELDTYPE_PROTOCOL_VERSION, "Protocol Version",0,0,0 },
- { DIS_FIELDTYPE_UINT8, "Exercise ID",0,0,0 },
- { DIS_FIELDTYPE_PDU_TYPE, "PDU Type",0,0,&pduType },
- { DIS_FIELDTYPE_PROTOCOL_FAMILY, "Protocol Family",0,0,0 },
- { DIS_FIELDTYPE_TIMESTAMP, "Timestamp",0,0,0 },
- { DIS_FIELDTYPE_UINT16, "Length",0,0,0 },
- { DIS_FIELDTYPE_PAD16, "Padding",0,0,0 },
- { DIS_FIELDTYPE_END, NULL,0,0,0 }
+ { DIS_FIELDTYPE_PROTOCOL_VERSION, "Protocol Version",0,0,0,&protocolVersion },
+ { DIS_FIELDTYPE_UINT8, "Exercise ID",0,0,0,0 },
+ { DIS_FIELDTYPE_PDU_TYPE, "PDU Type",0,0,0,&pduType },
+ { DIS_FIELDTYPE_PROTOCOL_FAMILY, "Protocol Family",0,0,0,&protocolFamily },
+ { DIS_FIELDTYPE_TIMESTAMP, "Timestamp",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Length",0,0,0,0 },
+ { DIS_FIELDTYPE_PAD16, "Padding",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
};
-DIS_ParserNode DIS_FIELDS_ENTITY_ID[] =
+DIS_ParserNode DIS_FIELDS_PERSISTENT_OBJECT_HEADER[] =
{
- { DIS_FIELDTYPE_UINT16, "Site",0,0,0 },
- { DIS_FIELDTYPE_UINT16, "Application",0,0,0 },
- { DIS_FIELDTYPE_UINT16, "Entity",0,0,0 },
- { DIS_FIELDTYPE_END, NULL,0,0,0 }
+ { DIS_FIELDTYPE_UINT8, "Protocol Version",0,0,0,0 },
+ { DIS_FIELDTYPE_PERSISTENT_OBJECT_TYPE, "PO PDU Type",0,0,0,&persistentObjectPduType },
+ { DIS_FIELDTYPE_UINT8, "Exercise ID",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT8, "PO Database ID",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Length",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "PDU Count",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
};
-DIS_ParserNode DIS_FIELDS_ENTITY_TYPE[] =
+/* Composite types
+ */
+DIS_ParserNode DIS_FIELDS_BURST_DESCRIPTOR[] =
{
- { DIS_FIELDTYPE_ENTITY_KIND, "Entity Kind",0,0,&entityKind },
- { DIS_FIELDTYPE_DOMAIN, "Domain",0,0,&entityDomain },
- { DIS_FIELDTYPE_COUNTRY, "Country",0,0,0 },
- { DIS_FIELDTYPE_CATEGORY, "Category",0,0,0 },
- { DIS_FIELDTYPE_SUBCATEGORY, "Subcategory",0,0,0 },
- { DIS_FIELDTYPE_SPECIFIC, "Specific",0,0,0 },
- { DIS_FIELDTYPE_EXTRA, "Extra",0,0,0 },
- { DIS_FIELDTYPE_END, NULL,0,0,0 }
+ { DIS_FIELDTYPE_ENTITY_TYPE, "Munition",0,0,0,0 },
+ { DIS_FIELDTYPE_WARHEAD, "Warhead",0,0,0,0 },
+ { DIS_FIELDTYPE_FUSE, "Fuse",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Quantity",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Rate",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
};
-DIS_ParserNode DIS_FIELDS_EVENT_ID[] =
+DIS_ParserNode DIS_FIELDS_CLOCK_TIME[] =
{
- { DIS_FIELDTYPE_UINT16, "Site",0,0,0 },
- { DIS_FIELDTYPE_UINT16, "Application",0,0,0 },
- { DIS_FIELDTYPE_UINT16, "Event Number",0,0,0 },
- { DIS_FIELDTYPE_END, NULL,0,0,0 }
+ { DIS_FIELDTYPE_UINT32, "Hour",0,0,0,0 },
+ { DIS_FIELDTYPE_TIMESTAMP, "Time Past The Hour",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
};
-DIS_ParserNode DIS_FIELDS_LINEAR_VELOCITY[] =
+DIS_ParserNode DIS_FIELDS_ENTITY_ID[] =
{
- { DIS_FIELDTYPE_FLOAT32, "X",0,0,0 },
- { DIS_FIELDTYPE_FLOAT32, "Y",0,0,0 },
- { DIS_FIELDTYPE_FLOAT32, "Z",0,0,0 },
- { DIS_FIELDTYPE_END, NULL,0,0,0 }
+ { DIS_FIELDTYPE_UINT16, "Site",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Application",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Entity",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
};
-DIS_ParserNode DIS_FIELDS_LOCATION_WORLD[] =
+DIS_ParserNode DIS_FIELDS_ENTITY_TYPE[] =
{
- { DIS_FIELDTYPE_FLOAT64, "X",0,0,0 },
- { DIS_FIELDTYPE_FLOAT64, "Y",0,0,0 },
- { DIS_FIELDTYPE_FLOAT64, "Z",0,0,0 },
- { DIS_FIELDTYPE_END, NULL,0,0,0 }
+ { DIS_FIELDTYPE_ENTITY_KIND, "Entity Kind",0,0,0,&entityKind },
+ { DIS_FIELDTYPE_DOMAIN, "Domain",0,0,0,&entityDomain },
+ { DIS_FIELDTYPE_COUNTRY, "Country",0,0,0,0 },
+ { DIS_FIELDTYPE_CATEGORY, "Category",0,0,0,0 },
+ { DIS_FIELDTYPE_SUBCATEGORY, "Subcategory",0,0,0,0 },
+ { DIS_FIELDTYPE_SPECIFIC, "Specific",0,0,0,0 },
+ { DIS_FIELDTYPE_EXTRA, "Extra",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
};
-DIS_ParserNode DIS_FIELDS_LOCATION_ENTITY[] =
+DIS_ParserNode DIS_FIELDS_EVENT_ID[] =
{
- { DIS_FIELDTYPE_FLOAT32, "X",0,0,0 },
- { DIS_FIELDTYPE_FLOAT32, "Y",0,0,0 },
- { DIS_FIELDTYPE_FLOAT32, "Z",0,0,0 },
- { DIS_FIELDTYPE_END, NULL,0,0,0 }
+ { DIS_FIELDTYPE_UINT16, "Site",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Application",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Event Number",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
};
DIS_ParserNode DIS_FIELDS_ORIENTATION[] =
{
- { DIS_FIELDTYPE_FLOAT32, "Psi",0,0,0 },
- { DIS_FIELDTYPE_FLOAT32, "Theta",0,0,0 },
- { DIS_FIELDTYPE_FLOAT32, "Phi",0,0,0 },
- { DIS_FIELDTYPE_END, NULL,0,0,0 }
+ { DIS_FIELDTYPE_FLOAT32, "Psi",0,0,0,0 },
+ { DIS_FIELDTYPE_FLOAT32, "Theta",0,0,0,0 },
+ { DIS_FIELDTYPE_FLOAT32, "Phi",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
};
-DIS_ParserNode DIS_FIELDS_BURST_DESCRIPTOR[] =
+DIS_ParserNode DIS_FIELDS_SIMULATION_ADDRESS[] =
{
- { DIS_FIELDTYPE_ENTITY_TYPE, "Munition",0,0,0 },
- { DIS_FIELDTYPE_WARHEAD, "Warhead",0,0,0 },
- { DIS_FIELDTYPE_FUSE, "Fuse",0,0,0 },
- { DIS_FIELDTYPE_UINT16, "Quantity",0,0,0 },
- { DIS_FIELDTYPE_UINT16, "Rate",0,0,0 },
- { DIS_FIELDTYPE_END, NULL,0,0,0 }
+ { DIS_FIELDTYPE_UINT16, "Site",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Application",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
};
-DIS_ParserNode DIS_FIELDS_ARTICULATION_PARAMETER[] =
+DIS_ParserNode DIS_FIELDS_VECTOR_FLOAT_32[] =
{
- { DIS_FIELDTYPE_ARTIC_PARAM_TYPE_DESIGNATOR, "Parameter Type Designator",0,0,0 },
- { DIS_FIELDTYPE_UINT8, "Change",0,0,0 },
- { DIS_FIELDTYPE_UINT16, "Part Attached To ID",0,0,0 },
- { DIS_FIELDTYPE_ARTIC_PARAM_TYPE, "Parameter Type",0,0,0 },
- { DIS_FIELDTYPE_UINT64, "Parameter Value",0,0,0 },
- { DIS_FIELDTYPE_END, NULL,0,0,0 }
+ { DIS_FIELDTYPE_FLOAT32, "X",0,0,0,0 },
+ { DIS_FIELDTYPE_FLOAT32, "Y",0,0,0,0 },
+ { DIS_FIELDTYPE_FLOAT32, "Z",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
};
-DIS_ParserNode DIS_FIELDS_NONE[] =
+DIS_ParserNode DIS_FIELDS_VECTOR_FLOAT_64[] =
{
- { DIS_FIELDTYPE_END, NULL, 0,0,0 }
+ { DIS_FIELDTYPE_FLOAT64, "X",0,0,0,0 },
+ { DIS_FIELDTYPE_FLOAT64, "Y",0,0,0,0 },
+ { DIS_FIELDTYPE_FLOAT64, "Z",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
};
+/* Array records
+ */
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_FIELDTYPE_DATUM_ID, "Datum ID",0,0,0,0 },
+ { DIS_FIELDTYPE_FIXED_DATUM_VALUE, "Datum value",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,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_FIELDTYPE_DATUM_ID, "Datum ID",0,0,0,0 },
+ { DIS_FIELDTYPE_DATUM_LENGTH, "Datum length",0,0,0,&variableDatumLength },
+ { DIS_FIELDTYPE_VARIABLE_DATUM_VALUE, "Datum value",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_FIELDS_DATUM_IDS[] =
+{
+ { DIS_FIELDTYPE_DATUM_ID, "Datum ID",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+/* Variable Parameters
+ */
+DIS_ParserNode DIS_FIELDS_VP_TYPE[] =
+{
+ { DIS_FIELDTYPE_PARAMETER_TYPE_DESIGNATOR, "Variable Parameter Type",0,0,0,&variableParameterType },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+/* Array record contents - variable parameter records
+ */
+DIS_ParserNode DIS_FIELDS_VP_GENERIC[] =
+{
+ { DIS_FIELDTYPE_FIXED_LEN_STR, "Data",15,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_FIELDS_VP_ARTICULATED_PART[] =
+{
+ { DIS_FIELDTYPE_UINT8, "Change",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Part Attached To ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ARTIC_PARAM_TYPE, "Parameter Type",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT64, "Parameter Value",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_FIELDS_VP_ATTACHED_PART[] =
+{
+ { DIS_FIELDTYPE_UINT8, "Attached Indicator",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Part Attached To ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ARTIC_PARAM_TYPE, "Parameter Type",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_TYPE, "Part Type",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_FIELDS_VP_ENTITY_OFFSET[] =
+{
+ { DIS_FIELDTYPE_UINT8, "Offset Type",0,0,0,0 },
+ { DIS_FIELDTYPE_PAD8, "Padding",2,0,0,0 },
+ { DIS_FIELDTYPE_VECTOR_32, "Offset",0,0,0,0 },
+ { DIS_FIELDTYPE_ORIENTATION, "Orientation",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+/* Variable Records
+ */
+DIS_ParserNode DIS_FIELDS_VR_TYPE[] =
+{
+ { DIS_FIELDTYPE_UINT32, "Record Type",0,0,0,&variableRecordType },
+ { DIS_FIELDTYPE_UINT16, "Record Length",0,0,0,&variableRecordLength },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_FIELDS_VR_APPLICATION_HEALTH_STATUS[] =
+{
+ { DIS_FIELDTYPE_PAD8, "Padding",2,0,0,0 },
+ { DIS_FIELDTYPE_APPLICATION_STATUS_TYPE, "Status Type",0,0,0,0 },
+ { DIS_FIELDTYPE_APPLICATION_GENERAL_STATUS, "General Status",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT8, "Specific Status",0,0,0,0 },
+ { DIS_FIELDTYPE_INT32, "Status Value Int",0,0,0,0 },
+ { DIS_FIELDTYPE_FLOAT64, "Status Value Float",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_FIELDS_VR_APPLICATION_INITIALIZATION[] =
+{
+ { DIS_FIELDTYPE_UINT8, "Exercise ID",0,0,0,0 },
+ { DIS_FIELDTYPE_PAD8, "Padding",0,0,0,0 },
+ { DIS_FIELDTYPE_FIXED_LEN_STR, "Exercise File Path",256,0,0,0 },
+ { DIS_FIELDTYPE_FIXED_LEN_STR, "Exercise File Name",128,0,0,0 },
+ { DIS_FIELDTYPE_FIXED_LEN_STR, "Application Role",64,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_FIELDS_VR_DATA_QUERY[] =
+{
+ { DIS_FIELDTYPE_UINT16, "Num Records",0,0,0,&numFixed },
+ { DIS_FIELDTYPE_FIXED_DATUM_IDS, "Record",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+/* Bit fields
+ */
+DIS_ParserNode DIS_FIELDS_NONE[] =
+{
+ { DIS_FIELDTYPE_END, NULL, 0,0,0,0 }
};
DIS_BitMask DIS_APPEARANCE_LANDPLATFORM[] =
@@ -198,6 +308,22 @@ DIS_BitMask DIS_APPEARANCE_LIFEFORM[] =
} }
};
+/* Initialize the field parsers that are not explicitly included in any
+ * specific PDU. These fields are only accessed and used if a variant
+ * field indicates they are to be used.
+ */
+void initializeFieldParsers()
+{
+ initializeParser(DIS_FIELDS_VP_GENERIC);
+ initializeParser(DIS_FIELDS_VP_ARTICULATED_PART);
+ initializeParser(DIS_FIELDS_VP_ATTACHED_PART);
+ initializeParser(DIS_FIELDS_VP_ENTITY_OFFSET);
+
+ initializeParser(DIS_FIELDS_VR_APPLICATION_HEALTH_STATUS);
+ initializeParser(DIS_FIELDS_VR_APPLICATION_INITIALIZATION);
+ initializeParser(DIS_FIELDS_VR_DATA_QUERY);
+}
+
/* Adjust an offset variable for proper alignment for a specified field length.
*/
static gint alignOffset(gint offset, guint fieldLength)
@@ -401,6 +527,24 @@ gint parseField_Enum(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNod
switch(parserNode.fieldType)
{
+ case DIS_FIELDTYPE_ACKNOWLEDGE_FLAG:
+ enumStrings = DIS_PDU_AcknowledgeFlag_Strings;
+ break;
+ case DIS_FIELDTYPE_ACTION_ID:
+ enumStrings = DIS_PDU_ActionId_Strings;
+ break;
+ case DIS_FIELDTYPE_APPLICATION_GENERAL_STATUS:
+ enumStrings = DIS_PDU_ApplicationGeneralStatus_Strings;
+ break;
+ case DIS_FIELDTYPE_APPLICATION_STATUS_TYPE:
+ enumStrings = DIS_PDU_ApplicationStatusType_Strings;
+ break;
+ case DIS_FIELDTYPE_APPLICATION_TYPE:
+ enumStrings = DIS_PDU_ApplicationType_Strings;
+ break;
+ case DIS_FIELDTYPE_CONTROL_ID:
+ enumStrings = DIS_PDU_ControlId_Strings;
+ break;
case DIS_FIELDTYPE_PROTOCOL_VERSION:
enumStrings = DIS_PDU_ProtocolVersion_Strings;
break;
@@ -419,6 +563,9 @@ gint parseField_Enum(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNod
case DIS_FIELDTYPE_DETONATION_RESULT:
enumStrings = DIS_PDU_DetonationResult_Strings;
break;
+ case DIS_FIELDTYPE_FROZEN_BEHAVIOR:
+ enumStrings = DIS_PDU_FrozenBehavior_Strings;
+ break;
case DIS_FIELDTYPE_CATEGORY:
if (entityKind == DIS_ENTITYKIND_PLATFORM)
{
@@ -445,6 +592,27 @@ gint parseField_Enum(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNod
}
}
break;
+ case DIS_FIELDTYPE_PARAMETER_TYPE_DESIGNATOR:
+ enumStrings = DIS_PDU_ParameterTypeDesignator_Strings;
+ break;
+ case DIS_FIELDTYPE_PERSISTENT_OBJECT_TYPE:
+ enumStrings = DIS_PDU_PersistentObjectType_Strings;
+ break;
+ case DIS_FIELDTYPE_PERSISTENT_OBJECT_CLASS:
+ enumStrings = DIS_PDU_PO_ObjectClass_Strings;
+ break;
+ case DIS_FIELDTYPE_REASON:
+ enumStrings = DIS_PDU_Reason_Strings;
+ break;
+ case DIS_FIELDTYPE_REQUEST_STATUS:
+ enumStrings = DIS_PDU_RequestStatus_Strings;
+ break;
+ case DIS_FIELDTYPE_REQUIRED_RELIABILITY_SERVICE:
+ enumStrings = DIS_PDU_RequiredReliabilityService_Strings;
+ break;
+ case DIS_FIELDTYPE_RESPONSE_FLAG:
+ enumStrings = DIS_PDU_DisResponseFlag_Strings;
+ break;
default:
enumStrings = 0;
break;
@@ -468,7 +636,7 @@ gint parseField_Enum(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNod
if (enumStrings != 0)
{
- enumStr = val_to_str(enumVal, enumStrings, "Unknown Enum Value");
+ enumStr = val_to_str(enumVal, enumStrings, "Unknown Enum Value (%d)");
}
else
{
@@ -574,3 +742,84 @@ gint parseField_Timestamp(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_Pars
offset += 4;
return offset;
}
+
+/* Parse a variable parameter field.
+ */
+gint parseField_VariableParameter(tvbuff_t *tvb, proto_tree *tree, gint offset)
+{
+ DIS_ParserNode *paramParser = 0;
+
+ /* Determine the parser to use based on the type */
+ switch (variableParameterType) {
+ case DIS_PARAM_TYPE_DESIG_ARTICULATED_PART:
+ paramParser = DIS_FIELDS_VP_ARTICULATED_PART;
+ break;
+ case DIS_PARAM_TYPE_DESIG_ATTACHED_PART:
+ paramParser = DIS_FIELDS_VP_ATTACHED_PART;
+ break;
+ case DIS_PARAM_TYPE_DESIG_ENTITY_OFFSET:
+ paramParser = DIS_FIELDS_VP_ENTITY_OFFSET;
+ break;
+ default:
+ paramParser = DIS_FIELDS_VP_GENERIC;
+ break;
+ }
+
+ /* Parse the variable parameter fields */
+ if (paramParser)
+ {
+ offset = parseFields(tvb, tree, offset, paramParser);
+ }
+
+ return offset;
+}
+
+/* Parse a variable record field.
+ */
+gint parseField_VariableRecord(tvbuff_t *tvb, proto_tree *tree, gint offset)
+{
+ DIS_ParserNode *paramParser = 0;
+
+ /* Determine the parser to use based on the type */
+ switch (variableRecordType) {
+ case 47200:
+ paramParser = DIS_FIELDS_VR_APPLICATION_HEALTH_STATUS;
+ break;
+ case 47300:
+ paramParser = DIS_FIELDS_VR_APPLICATION_INITIALIZATION;
+ break;
+ case 47600:
+ paramParser = DIS_FIELDS_VR_DATA_QUERY;
+ break;
+ default:
+ {
+ guint32 dataLength = variableRecordLength - 6;
+
+ if (dataLength > 0)
+ {
+ proto_tree_add_text(tree, tvb, offset, dataLength,
+ "Record Data (%d bytes)", dataLength);
+ offset += dataLength;
+ }
+ }
+ break;
+ }
+
+ /* Parse the variable record fields */
+ if (paramParser)
+ {
+ offset = parseFields(tvb, tree, offset, paramParser);
+ }
+
+ /* Should alignment padding be added */
+ if (variableRecordLength % 8)
+ {
+ guint32 alignmentPadding = (8 - (variableRecordLength % 8));
+
+ proto_tree_add_text(tree, tvb, offset, alignmentPadding,
+ "Alignment Padding (%d bytes)", alignmentPadding);
+ offset += alignmentPadding;
+ }
+
+ return offset;
+}
diff --git a/epan/dissectors/packet-dis-fields.h b/epan/dissectors/packet-dis-fields.h
index 85cb4b2efb..4c01288e46 100644
--- a/epan/dissectors/packet-dis-fields.h
+++ b/epan/dissectors/packet-dis-fields.h
@@ -52,51 +52,76 @@ typedef enum
DIS_FIELDTYPE_PAD16,
DIS_FIELDTYPE_PAD32,
- /* other atomic types, including enumerations */
+ /* enumerations */
+ DIS_FIELDTYPE_ACKNOWLEDGE_FLAG,
+ DIS_FIELDTYPE_ACTION_ID,
+ DIS_FIELDTYPE_APPLICATION_GENERAL_STATUS,
+ DIS_FIELDTYPE_APPLICATION_STATUS_TYPE,
+ DIS_FIELDTYPE_APPLICATION_TYPE,
+ DIS_FIELDTYPE_CATEGORY,
+ DIS_FIELDTYPE_CONTROL_ID,
+ DIS_FIELDTYPE_DETONATION_RESULT,
+ DIS_FIELDTYPE_DOMAIN,
+ DIS_FIELDTYPE_ENTITY_KIND,
+ DIS_FIELDTYPE_FROZEN_BEHAVIOR,
+ DIS_FIELDTYPE_PARAMETER_TYPE_DESIGNATOR,
+ DIS_FIELDTYPE_PDU_TYPE,
+ DIS_FIELDTYPE_PERSISTENT_OBJECT_TYPE,
+ DIS_FIELDTYPE_PERSISTENT_OBJECT_CLASS,
+ DIS_FIELDTYPE_PROTOCOL_FAMILY,
+ DIS_FIELDTYPE_PROTOCOL_VERSION,
+ DIS_FIELDTYPE_REASON,
+ DIS_FIELDTYPE_REQUEST_STATUS,
+ DIS_FIELDTYPE_REQUIRED_RELIABILITY_SERVICE,
+ DIS_FIELDTYPE_RESPONSE_FLAG,
+
+ /* other atomic types */
DIS_FIELDTYPE_APPEARANCE,
- DIS_FIELDTYPE_ARTIC_PARAM_TYPE_DESIGNATOR,
DIS_FIELDTYPE_ARTIC_PARAM_TYPE,
DIS_FIELDTYPE_CAPABILITIES,
- DIS_FIELDTYPE_CATEGORY,
DIS_FIELDTYPE_COUNTRY,
+ DIS_FIELDTYPE_DATUM_ID,
+ DIS_FIELDTYPE_DATUM_LENGTH,
DIS_FIELDTYPE_DEAD_RECKONING_PARAMS,
DIS_FIELDTYPE_DEAD_RECKONING_ALGORITHM,
DIS_FIELDTYPE_DEAD_RECKONING_OTHER_PARAMS,
- DIS_FIELDTYPE_DETONATION_RESULT,
- DIS_FIELDTYPE_DOMAIN,
- DIS_FIELDTYPE_ENTITY_KIND,
DIS_FIELDTYPE_ENTITY_MARKING,
DIS_FIELDTYPE_EXTRA,
+ DIS_FIELDTYPE_FIXED_DATUM_VALUE,
+ DIS_FIELDTYPE_FIXED_LEN_STR,
DIS_FIELDTYPE_FORCE_ID,
DIS_FIELDTYPE_FUSE,
- DIS_FIELDTYPE_ORIENTATION,
- DIS_FIELDTYPE_PDU_TYPE,
- DIS_FIELDTYPE_PROTOCOL_FAMILY,
- DIS_FIELDTYPE_PROTOCOL_VERSION,
- DIS_FIELDTYPE_SPECIFIC,
- 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_SPECIFIC,
+ DIS_FIELDTYPE_SUBCATEGORY,
DIS_FIELDTYPE_TIME_INTERVAL,
+ DIS_FIELDTYPE_TIMESTAMP,
+ DIS_FIELDTYPE_WARHEAD,
/* composite types */
- DIS_FIELDTYPE_ARTICULATION_PARAMETERS,
DIS_FIELDTYPE_BURST_DESCRIPTOR,
+ DIS_FIELDTYPE_CLOCK_TIME,
DIS_FIELDTYPE_ENTITY_ID,
DIS_FIELDTYPE_ENTITY_TYPE,
DIS_FIELDTYPE_EVENT_ID,
DIS_FIELDTYPE_LINEAR_VELOCITY,
- DIS_FIELDTYPE_LOCATION_WORLD,
DIS_FIELDTYPE_LOCATION_ENTITY,
- DIS_FIELDTYPE_FIXED_DATUM,
- DIS_FIELDTYPE_VARIABLE_DATUM
+ DIS_FIELDTYPE_LOCATION_WORLD,
+ DIS_FIELDTYPE_ORIENTATION,
+ DIS_FIELDTYPE_SIMULATION_ADDRESS,
+ DIS_FIELDTYPE_VARIABLE_DATUM_VALUE,
+ DIS_FIELDTYPE_VECTOR_32,
+ DIS_FIELDTYPE_VECTOR_64,
+
+ /* arrays */
+ DIS_FIELDTYPE_FIXED_DATUMS,
+ DIS_FIELDTYPE_FIXED_DATUM_IDS,
+ DIS_FIELDTYPE_VARIABLE_DATUMS,
+ DIS_FIELDTYPE_VARIABLE_DATUM_IDS,
+ DIS_FIELDTYPE_VARIABLE_PARAMETERS,
+ DIS_FIELDTYPE_VARIABLE_RECORDS
} DIS_FieldType;
@@ -106,6 +131,7 @@ typedef struct DIS_ParserNode_T
{
DIS_FieldType fieldType;
const char *fieldLabel;
+ int fieldRepeatLen;
int ettVar;
struct DIS_ParserNode_T *children;
guint32 *outputVar;
@@ -130,57 +156,66 @@ typedef struct
DIS_BitMaskMapping bitMappings[33];
} DIS_BitMask;
+/* Headers */
extern DIS_ParserNode DIS_FIELDS_PDU_HEADER[];
+extern DIS_ParserNode DIS_FIELDS_PERSISTENT_OBJECT_HEADER[];
+/* Composite types */
+extern DIS_ParserNode DIS_FIELDS_BURST_DESCRIPTOR[];
+extern DIS_ParserNode DIS_FIELDS_CLOCK_TIME[];
extern DIS_ParserNode DIS_FIELDS_ENTITY_ID[];
-
extern DIS_ParserNode DIS_FIELDS_ENTITY_TYPE[];
-
extern DIS_ParserNode DIS_FIELDS_EVENT_ID[];
-
-extern DIS_ParserNode DIS_FIELDS_LINEAR_VELOCITY[];
-
-extern DIS_ParserNode DIS_FIELDS_LOCATION_WORLD[];
-
-extern DIS_ParserNode DIS_FIELDS_LOCATION_ENTITY[];
-
-extern DIS_ParserNode DIS_FIELDS_BURST_DESCRIPTOR[];
-
-extern DIS_ParserNode DIS_FIELDS_ARTICULATION_PARAMETER[];
-
extern DIS_ParserNode DIS_FIELDS_ORIENTATION[];
+extern DIS_ParserNode DIS_FIELDS_SIMULATION_ADDRESS[];
+extern DIS_ParserNode DIS_FIELDS_VECTOR_FLOAT_32[];
+extern DIS_ParserNode DIS_FIELDS_VECTOR_FLOAT_64[];
-extern DIS_ParserNode DIS_FIELDS_NONE[];
-
+/* Array records */
extern DIS_ParserNode DIS_FIELDS_FIXED_DATUM[];
-
extern DIS_ParserNode DIS_FIELDS_VARIABLE_DATUM[];
+extern DIS_ParserNode DIS_FIELDS_DATUM_IDS[];
+extern DIS_ParserNode DIS_FIELDS_VP_TYPE[];
+extern DIS_ParserNode DIS_FIELDS_VR_TYPE[];
+/* Bit fields */
+extern DIS_ParserNode DIS_FIELDS_NONE[];
extern DIS_BitMask DIS_APPEARANCE_LANDPLATFORM[];
-
extern DIS_BitMask DIS_APPEARANCE_LIFEFORM[];
-gint parseField_Bytes(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode, guint numBytes);
+extern void initializeFieldParsers();
+
+extern gint parseField_Bytes(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode, guint numBytes);
+
+extern gint parseField_Bitmask(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode, guint numBytes);
+
+extern gint parseField_UInt(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode, guint numBytes);
-gint parseField_Bitmask(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode, guint numBytes);
+extern gint parseField_Int(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode, guint numBytes);
-gint parseField_UInt(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode, guint numBytes);
+extern gint parseField_Enum(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode, guint numBytes);
-gint parseField_Int(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode, guint numBytes);
+extern gint parseField_Pad(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode, guint numBytes);
-gint parseField_Enum(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode, guint numBytes);
+extern gint parseField_Float(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode);
-gint parseField_Pad(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode, guint numBytes);
+extern gint parseField_Double(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode);
-gint parseField_Float(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode);
+extern gint parseField_Timestamp(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode);
-gint parseField_Double(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode);
+extern gint parseField_VariableParameter(tvbuff_t *tvb, proto_tree *tree, gint offset);
-gint parseField_Timestamp(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNode);
+extern gint parseField_VariableRecord(tvbuff_t *tvb, proto_tree *tree, gint offset);
+extern guint32 protocolVersion;
extern guint32 pduType;
+extern guint32 protocolFamily;
+extern guint32 persistentObjectPduType;
extern guint32 entityKind;
extern guint32 entityDomain;
+extern guint32 numFixed;
+extern guint32 numVariable;
extern guint32 variableDatumLength;
+extern guint32 variableRecordLength;
#endif /* packet-dis-fieldparsers.h */
diff --git a/epan/dissectors/packet-dis-pdus.c b/epan/dissectors/packet-dis-pdus.c
index 4492ac95d8..69bc67d3ec 100644
--- a/epan/dissectors/packet-dis-pdus.c
+++ b/epan/dissectors/packet-dis-pdus.c
@@ -1,4 +1,4 @@
-/* packet-dis-pdus.c
+ /* packet-dis-pdus.c
* Routines and definitions for DIS PDU parsing.
* Copyright 2005, Scientific Research Corporation
* Initial implementation by Jeremy Ouellette <jouellet@scires.com>
@@ -32,98 +32,409 @@
#include "packet-dis-pdus.h"
#include "packet-dis-fields.h"
-guint32 numArticulations;
-guint32 numFixedData;
-guint32 numVariableData;
-gint ettArticulations[DIS_PDU_MAX_ARTICULATIONS];
-gint ettFixedData;
-gint ettVariableData;
+#define DIS_PDU_MAX_VARIABLE_PARAMETERS 16
+#define DIS_PDU_MAX_VARIABLE_RECORDS 16
+gint ettVariableParameters[DIS_PDU_MAX_VARIABLE_PARAMETERS];
+gint ettVariableRecords[DIS_PDU_MAX_VARIABLE_RECORDS];
+
+gint ettFixedData = -1;
+gint ettVariableData = -1;
+
+/* DIS Entity Information / Interaction PDUs
+ */
DIS_ParserNode DIS_PARSER_ENTITY_STATE_PDU[] =
{
- { DIS_FIELDTYPE_ENTITY_ID, "Entity ID",0,0,0 },
- { DIS_FIELDTYPE_FORCE_ID, "Force ID",0,0,0 },
- { DIS_FIELDTYPE_UINT8, "Number of Articulation Parameters",0,0,&numArticulations },
- { DIS_FIELDTYPE_ENTITY_TYPE, "Entity Type",0,0,0 },
- { DIS_FIELDTYPE_ENTITY_TYPE, "Alternative Entity Type",0,0,0 },
- { DIS_FIELDTYPE_LINEAR_VELOCITY, "Entity Linear Velocity",0,0,0 },
- { DIS_FIELDTYPE_LOCATION_WORLD, "Entity Location",0,0,0 },
- { DIS_FIELDTYPE_ORIENTATION, "Entity Orientation",0,0,0 },
- { DIS_FIELDTYPE_APPEARANCE, "Entity Appearance",0,0,0 },
- { DIS_FIELDTYPE_DEAD_RECKONING_PARAMS, "Dead Reckoning Parameters",0,0,0 },
- { DIS_FIELDTYPE_ENTITY_MARKING, "Entity Marking",0,0,0 },
- { DIS_FIELDTYPE_CAPABILITIES, "Capabilities",0,0,0 },
- { DIS_FIELDTYPE_ARTICULATION_PARAMETERS, "Articulation Parameters",0,0,0 },
- { DIS_FIELDTYPE_END, NULL,0,0,0 }
+ { DIS_FIELDTYPE_ENTITY_ID, "Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_FORCE_ID, "Force ID",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT8, "Number of Variable Parameters",0,0,0,&numVariable },
+ { DIS_FIELDTYPE_ENTITY_TYPE, "Entity Type",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_TYPE, "Alternative Entity Type",0,0,0,0 },
+ { DIS_FIELDTYPE_LINEAR_VELOCITY, "Entity Linear Velocity",0,0,0,0 },
+ { DIS_FIELDTYPE_LOCATION_WORLD, "Entity Location",0,0,0,0 },
+ { DIS_FIELDTYPE_ORIENTATION, "Entity Orientation",0,0,0,0 },
+ { DIS_FIELDTYPE_APPEARANCE, "Entity Appearance",0,0,0,0 },
+ { DIS_FIELDTYPE_DEAD_RECKONING_PARAMS, "Dead Reckoning Parameters",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_MARKING, "Entity Marking",0,0,0,0 },
+ { DIS_FIELDTYPE_CAPABILITIES, "Capabilities",0,0,0,0 },
+ { DIS_FIELDTYPE_VARIABLE_PARAMETERS, "Variable Parameter",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
};
+/* DIS Warfare PDUs
+ */
DIS_ParserNode DIS_PARSER_FIRE_PDU[] =
{
- { DIS_FIELDTYPE_ENTITY_ID, "Firing Entity ID",0,0,0 },
- { DIS_FIELDTYPE_ENTITY_ID, "Target Entity ID",0,0,0 },
- { DIS_FIELDTYPE_ENTITY_ID, "Munition ID",0,0,0 },
- { DIS_FIELDTYPE_EVENT_ID, "Event ID",0,0,0 },
- { DIS_FIELDTYPE_UINT32, "Fire Mission Index",0,0,0 },
- { DIS_FIELDTYPE_LOCATION_WORLD, "Location in World Coordinates",0,0,0 },
- { DIS_FIELDTYPE_BURST_DESCRIPTOR, "Burst Descriptor",0,0,0 },
- { DIS_FIELDTYPE_LINEAR_VELOCITY, "Velocity",0,0,0 },
- { DIS_FIELDTYPE_FLOAT32, "Range",0,0,0 },
- { DIS_FIELDTYPE_END, NULL,0,0,0 }
+ { DIS_FIELDTYPE_ENTITY_ID, "Firing Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Target Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Munition ID",0,0,0,0 },
+ { DIS_FIELDTYPE_EVENT_ID, "Event ID",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT32, "Fire Mission Index",0,0,0,0 },
+ { DIS_FIELDTYPE_LOCATION_WORLD, "Location in World Coordinates",0,0,0,0 },
+ { DIS_FIELDTYPE_BURST_DESCRIPTOR, "Burst Descriptor",0,0,0,0 },
+ { DIS_FIELDTYPE_LINEAR_VELOCITY, "Velocity",0,0,0,0 },
+ { DIS_FIELDTYPE_FLOAT32, "Range",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
};
DIS_ParserNode DIS_PARSER_DETONATION_PDU[] =
{
- { DIS_FIELDTYPE_ENTITY_ID, "Firing Entity ID",0,0,0 },
- { DIS_FIELDTYPE_ENTITY_ID, "Target Entity ID",0,0,0 },
- { DIS_FIELDTYPE_ENTITY_ID, "Munition ID",0,0,0 },
- { DIS_FIELDTYPE_EVENT_ID, "Event ID",0,0,0 },
- { DIS_FIELDTYPE_LINEAR_VELOCITY, "Velocity",0,0,0 },
- { DIS_FIELDTYPE_LOCATION_WORLD, "Location in World Coordinates",0,0,0 },
- { DIS_FIELDTYPE_BURST_DESCRIPTOR, "Burst Descriptor",0,0,0 },
- { DIS_FIELDTYPE_LOCATION_ENTITY, "Location in Entity Coordinates",0,0,0 },
- { DIS_FIELDTYPE_DETONATION_RESULT, "Detonation Result",0,0,0 },
- { DIS_FIELDTYPE_UINT8, "Number of Articulation Parameters",0,0,0 },
- { DIS_FIELDTYPE_PAD16, "Padding",0,0,0 },
- { DIS_FIELDTYPE_ARTICULATION_PARAMETERS, "Articulation Parameters",0,0,0 },
- { DIS_FIELDTYPE_END, NULL,0,0,0 }
+ { DIS_FIELDTYPE_ENTITY_ID, "Firing Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Target Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Munition ID",0,0,0,0 },
+ { DIS_FIELDTYPE_EVENT_ID, "Event ID",0,0,0,0 },
+ { DIS_FIELDTYPE_LINEAR_VELOCITY, "Velocity",0,0,0,0 },
+ { DIS_FIELDTYPE_LOCATION_WORLD, "Location in World Coordinates",0,0,0,0 },
+ { DIS_FIELDTYPE_BURST_DESCRIPTOR, "Burst Descriptor",0,0,0,0 },
+ { DIS_FIELDTYPE_LOCATION_ENTITY, "Location in Entity Coordinates",0,0,0,0 },
+ { DIS_FIELDTYPE_DETONATION_RESULT, "Detonation Result",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT8, "Number of Variable Parameters",0,0,0,&numVariable },
+ { DIS_FIELDTYPE_PAD16, "Padding",0,0,0,0 },
+ { DIS_FIELDTYPE_VARIABLE_PARAMETERS, "Variable Parameter",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+/* DIS Simulation Management PDUs
+ */
+DIS_ParserNode DIS_PARSER_START_RESUME_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_CLOCK_TIME, "Real World Time",0,0,0,0 },
+ { DIS_FIELDTYPE_CLOCK_TIME, "Simulation Time",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_STOP_FREEZE_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_CLOCK_TIME, "Real World Time",0,0,0,0 },
+ { DIS_FIELDTYPE_REASON, "Reason",0,0,0,0 },
+ { DIS_FIELDTYPE_FROZEN_BEHAVIOR, "Frozen Behavior",0,0,0,0 },
+ { DIS_FIELDTYPE_PAD16, "Padding",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_ACKNOWLEDGE_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ACKNOWLEDGE_FLAG, "Acknowledge Flag",0,0,0,0 },
+ { DIS_FIELDTYPE_RESPONSE_FLAG, "Response Flag",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_ACTION_REQUEST_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ACTION_ID, "Action ID",0,0,0,0 },
+ { DIS_FIELDTYPE_NUM_FIXED_DATA, "Number of Fixed Data Fields",0,0,0,&numFixed },
+ { DIS_FIELDTYPE_NUM_VARIABLE_DATA, "Number of Variable Data Fields",0,0,0,&numVariable },
+ { DIS_FIELDTYPE_FIXED_DATUMS, "Fixed data",0,0,0,0 },
+ { DIS_FIELDTYPE_VARIABLE_DATUMS, "Variable data",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_ACTION_RESPONSE_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_STATUS, "Request Status",0,0,0,0 },
+ { DIS_FIELDTYPE_NUM_FIXED_DATA, "Number of Fixed Data Fields",0,0,0,&numFixed },
+ { DIS_FIELDTYPE_NUM_VARIABLE_DATA, "Number of Variable Data Fields",0,0,0,&numVariable },
+ { DIS_FIELDTYPE_FIXED_DATUMS, "Fixed data",0,0,0,0 },
+ { DIS_FIELDTYPE_VARIABLE_DATUMS, "Variable data",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,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_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_PAD32, "Padding",0,0,0,0 },
+ { DIS_FIELDTYPE_NUM_FIXED_DATA, "Number of Fixed Data Fields",0,0,0,&numFixed },
+ { DIS_FIELDTYPE_NUM_VARIABLE_DATA, "Number of Variable Data Fields",0,0,0,&numVariable },
+ { DIS_FIELDTYPE_FIXED_DATUMS, "Fixed data",0,0,0,0 },
+ { DIS_FIELDTYPE_VARIABLE_DATUMS, "Variable data",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,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 }
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_TIME_INTERVAL, "Time interval",0,0,0,0 },
+ { DIS_FIELDTYPE_NUM_FIXED_DATA, "Number of Fixed Datum Ids",0,0,0,&numFixed },
+ { DIS_FIELDTYPE_NUM_VARIABLE_DATA, "Number of Variable Datum Ids",0,0,0,&numVariable },
+ { DIS_FIELDTYPE_FIXED_DATUM_IDS, "Fixed datum ids",0,0,0,0 },
+ { DIS_FIELDTYPE_VARIABLE_DATUM_IDS, "Variable datum ids",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_COMMENT_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_NUM_FIXED_DATA, "Number of Fixed Data Fields",0,0,0,&numFixed },
+ { DIS_FIELDTYPE_NUM_VARIABLE_DATA, "Number of Variable Data Fields",0,0,0,&numVariable },
+ { DIS_FIELDTYPE_FIXED_DATUMS, "Fixed data",0,0,0,0 },
+ { DIS_FIELDTYPE_VARIABLE_DATUMS, "Variable data",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_SIMAN_ENTITY_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+/* DIS Simulation Management with Reliability PDUs
+ */
+DIS_ParserNode DIS_PARSER_START_RESUME_R_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_CLOCK_TIME, "Real World Time",0,0,0,0 },
+ { DIS_FIELDTYPE_CLOCK_TIME, "Simulation Time",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUIRED_RELIABILITY_SERVICE, "Reliability",0,0,0,0 },
+ { DIS_FIELDTYPE_PAD8, "Padding",3,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_STOP_FREEZE_R_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_CLOCK_TIME, "Real World Time",0,0,0,0 },
+ { DIS_FIELDTYPE_REASON, "Reason",0,0,0,0 },
+ { DIS_FIELDTYPE_FROZEN_BEHAVIOR, "Frozen Behavior",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUIRED_RELIABILITY_SERVICE, "Reliability",0,0,0,0 },
+ { DIS_FIELDTYPE_PAD8, "Padding",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_ACTION_REQUEST_R_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUIRED_RELIABILITY_SERVICE, "Reliability",0,0,0,0 },
+ { DIS_FIELDTYPE_PAD8, "Padding",3,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ACTION_ID, "Action ID",0,0,0,0 },
+ { DIS_FIELDTYPE_NUM_FIXED_DATA, "Number of Fixed Data Fields",0,0,0,&numFixed },
+ { DIS_FIELDTYPE_NUM_VARIABLE_DATA, "Number of Variable Data Fields",0,0,0,&numVariable },
+ { DIS_FIELDTYPE_FIXED_DATUMS, "Fixed data",0,0,0,0 },
+ { DIS_FIELDTYPE_VARIABLE_DATUMS, "Variable data",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_DATA_R_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUIRED_RELIABILITY_SERVICE, "Reliability",0,0,0,0 },
+ { DIS_FIELDTYPE_PAD8, "Padding",3,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_NUM_FIXED_DATA, "Number of Fixed Data Fields",0,0,0,&numFixed },
+ { DIS_FIELDTYPE_NUM_VARIABLE_DATA, "Number of Variable Data Fields",0,0,0,&numVariable },
+ { DIS_FIELDTYPE_FIXED_DATUMS, "Fixed data",0,0,0,0 },
+ { DIS_FIELDTYPE_VARIABLE_DATUMS, "Variable data",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_DATA_QUERY_R_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUIRED_RELIABILITY_SERVICE, "Reliability",0,0,0,0 },
+ { DIS_FIELDTYPE_PAD8, "Padding",3,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_TIME_INTERVAL, "Time interval",0,0,0,0 },
+ { DIS_FIELDTYPE_NUM_FIXED_DATA, "Number of Fixed Datum Ids",0,0,0,&numFixed },
+ { DIS_FIELDTYPE_NUM_VARIABLE_DATA, "Number of Variable Datum Ids",0,0,0,&numVariable },
+ { DIS_FIELDTYPE_FIXED_DATUM_IDS, "Fixed datum ids",0,0,0,0 },
+ { DIS_FIELDTYPE_VARIABLE_DATUM_IDS, "Variable datum ids",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_SIMAN_ENTITY_R_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUIRED_RELIABILITY_SERVICE, "Reliability",0,0,0,0 },
+ { DIS_FIELDTYPE_PAD8, "Padding",3,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+/* DIS Experimental V-DIS PDUs
+ */
+DIS_ParserNode DIS_PARSER_APPLICATION_CONTROL_PDU[] =
+{
+ { DIS_FIELDTYPE_ENTITY_ID, "Originating Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Receiving Entity ID",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUIRED_RELIABILITY_SERVICE, "Reliability",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT8, "Time Interval",0,0,0,0 },
+ { DIS_FIELDTYPE_CONTROL_ID, "Control ID",0,0,0,0 },
+ { DIS_FIELDTYPE_PAD8, "Padding",0,0,0,0 },
+ { DIS_FIELDTYPE_APPLICATION_TYPE, "Originating App Type",0,0,0,0 },
+ { DIS_FIELDTYPE_APPLICATION_TYPE, "Receiving App Type",0,0,0,0 },
+ { DIS_FIELDTYPE_REQUEST_ID, "Request ID",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT8, "Number of Parts",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT8, "Current Part",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Number of Variable Records",0,0,0,&numVariable },
+ { DIS_FIELDTYPE_VARIABLE_RECORDS, "Record",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+/* Persistent Object (PO) Family PDU parsers
+ */
+DIS_ParserNode DIS_PARSER_SIMULATOR_PRESENT_PO_PDU[] =
+{
+ { DIS_FIELDTYPE_SIMULATION_ADDRESS, "Simulator",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Simulator Type",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT32, "Database Sequence Number",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT32, "Simulator Load",0,0,0,0 },
+ { DIS_FIELDTYPE_FLOAT32, "Simulation Load",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT32, "Time",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT32, "Packets Sent",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Unit Database Version",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Relative Battle Scheme",0,0,0,0 },
+ { DIS_FIELDTYPE_FIXED_LEN_STR, "Terrain Name",32,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Terrain Version",0,0,0,0 },
+ { DIS_FIELDTYPE_FIXED_LEN_STR, "Host Name",32,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_DESCRIBE_OBJECT_PO_PDU[] =
+{
+ { DIS_FIELDTYPE_UINT32, "Database Sequence Number",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "Object ID",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "World State ID",0,0,0,0 },
+ { DIS_FIELDTYPE_SIMULATION_ADDRESS, "Owner",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT16, "Sequence Number",0,0,0,0 },
+ { DIS_FIELDTYPE_PERSISTENT_OBJECT_CLASS, "Object Class",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT8, "Missing From World State",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_OBJECTS_PRESENT_PO_PDU[] =
+{
+ { DIS_FIELDTYPE_SIMULATION_ADDRESS, "Owner",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "World State ID",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT8, "Object Count",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_OBJECT_REQUEST_PO_PDU[] =
+{
+ { DIS_FIELDTYPE_SIMULATION_ADDRESS, "Requesting Simulator",0,0,0,0 },
+ { DIS_FIELDTYPE_SIMULATION_ADDRESS, "Object Owner",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "World State ID",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT8, "Object Count",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_DELETE_OBJECTS_PO_PDU[] =
+{
+ { DIS_FIELDTYPE_SIMULATION_ADDRESS, "Requesting Simulator",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT8, "Object Count",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_SET_WORLD_STATE_PO_PDU[] =
+{
+ { DIS_FIELDTYPE_SIMULATION_ADDRESS, "Requesting Simulator",0,0,0,0 },
+ { DIS_FIELDTYPE_FLOAT32, "Clock Rate",0,0,0,0 },
+ { DIS_FIELDTYPE_UINT32, "Seconds Since 1970",0,0,0,0 },
+ { DIS_FIELDTYPE_ENTITY_ID, "World State ID",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
+};
+
+DIS_ParserNode DIS_PARSER_NOMINATION_PO_PDU[] =
+{
+ { DIS_FIELDTYPE_SIMULATION_ADDRESS, "Nominated Simulator",0,0,0,0 },
+ { DIS_FIELDTYPE_SIMULATION_ADDRESS, "Nominating Simulator",0,0,0,0 },
+ { DIS_FIELDTYPE_SIMULATION_ADDRESS, "Missing Simulator",0,0,0,0 },
+ { DIS_FIELDTYPE_END, NULL,0,0,0,0 }
};
/* Initialize the parsers for each PDU type and the standard DIS header.
*/
void initializeParsers(void)
{
+ gint *ett[DIS_PDU_MAX_VARIABLE_PARAMETERS+DIS_PDU_MAX_VARIABLE_RECORDS+2];
+ int i, ett_index;
+
+ initializeParser(DIS_FIELDS_PDU_HEADER);
+
+ /* DIS Entity Information / Interaction PDUs */
initializeParser(DIS_PARSER_ENTITY_STATE_PDU);
+
+ /* DIS Warfare PDUs */
initializeParser(DIS_PARSER_FIRE_PDU);
initializeParser(DIS_PARSER_DETONATION_PDU);
- initializeParser(DIS_FIELDS_PDU_HEADER);
+
+ /* DIS Simulation Management PDUs */
+ initializeParser(DIS_PARSER_START_RESUME_PDU);
+ initializeParser(DIS_PARSER_STOP_FREEZE_PDU);
+ initializeParser(DIS_PARSER_ACKNOWLEDGE_PDU);
+ initializeParser(DIS_PARSER_ACTION_REQUEST_PDU);
+ initializeParser(DIS_PARSER_ACTION_RESPONSE_PDU);
initializeParser(DIS_PARSER_DATA_PDU);
initializeParser(DIS_PARSER_DATA_QUERY_PDU);
+ initializeParser(DIS_PARSER_COMMENT_PDU);
+ initializeParser(DIS_PARSER_SIMAN_ENTITY_PDU);
+
+ /* DIS Simulation Management with Reliability PDUs */
+ initializeParser(DIS_PARSER_START_RESUME_R_PDU);
+ initializeParser(DIS_PARSER_STOP_FREEZE_R_PDU);
+ initializeParser(DIS_PARSER_ACTION_REQUEST_R_PDU);
+ initializeParser(DIS_PARSER_DATA_R_PDU);
+ initializeParser(DIS_PARSER_DATA_QUERY_R_PDU);
+ initializeParser(DIS_PARSER_SIMAN_ENTITY_R_PDU);
+
+ /* DIS Experimental V-DIS PDUs */
+ initializeParser(DIS_PARSER_APPLICATION_CONTROL_PDU);
+
+ /* Initialize the Persistent Object PDUs */
+ initializeParser(DIS_FIELDS_PERSISTENT_OBJECT_HEADER);
+ initializeParser(DIS_PARSER_DESCRIBE_OBJECT_PO_PDU);
+ initializeParser(DIS_PARSER_SIMULATOR_PRESENT_PO_PDU);
+ initializeParser(DIS_PARSER_OBJECTS_PRESENT_PO_PDU);
+ initializeParser(DIS_PARSER_OBJECT_REQUEST_PO_PDU);
+ initializeParser(DIS_PARSER_DELETE_OBJECTS_PO_PDU);
+ initializeParser(DIS_PARSER_SET_WORLD_STATE_PO_PDU);
+ initializeParser(DIS_PARSER_NOMINATION_PO_PDU);
+
+ /* Initialize the ett array */
+ ett_index = 0;
+ for (i=0; i<DIS_PDU_MAX_VARIABLE_PARAMETERS; i++, ett_index++)
+ {
+ ettVariableParameters[i] = -1;
+ ett[ett_index] = &ettVariableParameters[i];
+ }
+ for (i=0; i<DIS_PDU_MAX_VARIABLE_RECORDS; i++, ett_index++)
+ {
+ ettVariableRecords[i] = -1;
+ ett[ett_index] = &ettVariableRecords[i];
+ }
+ ett[ett_index++] = &ettFixedData;
+ ett[ett_index++] = &ettVariableData;
+ proto_register_subtree_array(ett, array_length(ett));
}
/* Create a specific subtree for a PDU or a composite PDU field.
@@ -167,19 +478,22 @@ void initializeParser(DIS_ParserNode parserNodes[])
{
switch (parserNodes[parserIndex].fieldType)
{
+ /* Bit fields */
case DIS_FIELDTYPE_APPEARANCE:
parserNodes[parserIndex].children = createSubtree(
DIS_FIELDS_NONE,
&parserNodes[parserIndex].ettVar);
break;
- case DIS_FIELDTYPE_ARTICULATION_PARAMETERS:
+
+ /* Composite types */
+ case DIS_FIELDTYPE_BURST_DESCRIPTOR:
parserNodes[parserIndex].children = createSubtree(
- DIS_FIELDS_ARTICULATION_PARAMETER,
+ DIS_FIELDS_BURST_DESCRIPTOR,
&parserNodes[parserIndex].ettVar);
break;
- case DIS_FIELDTYPE_BURST_DESCRIPTOR:
+ case DIS_FIELDTYPE_CLOCK_TIME:
parserNodes[parserIndex].children = createSubtree(
- DIS_FIELDS_BURST_DESCRIPTOR,
+ DIS_FIELDS_CLOCK_TIME,
&parserNodes[parserIndex].ettVar);
break;
case DIS_FIELDTYPE_ENTITY_ID:
@@ -197,36 +511,57 @@ void initializeParser(DIS_ParserNode parserNodes[])
DIS_FIELDS_EVENT_ID,
&parserNodes[parserIndex].ettVar);
break;
- case DIS_FIELDTYPE_LINEAR_VELOCITY:
+ case DIS_FIELDTYPE_ORIENTATION:
parserNodes[parserIndex].children = createSubtree(
- DIS_FIELDS_LINEAR_VELOCITY,
+ DIS_FIELDS_ORIENTATION,
&parserNodes[parserIndex].ettVar);
break;
- case DIS_FIELDTYPE_LOCATION_WORLD:
+ case DIS_FIELDTYPE_SIMULATION_ADDRESS:
parserNodes[parserIndex].children = createSubtree(
- DIS_FIELDS_LOCATION_WORLD,
+ DIS_FIELDS_SIMULATION_ADDRESS,
&parserNodes[parserIndex].ettVar);
break;
+ case DIS_FIELDTYPE_LINEAR_VELOCITY:
case DIS_FIELDTYPE_LOCATION_ENTITY:
+ case DIS_FIELDTYPE_VECTOR_32:
parserNodes[parserIndex].children = createSubtree(
- DIS_FIELDS_LOCATION_ENTITY,
+ DIS_FIELDS_VECTOR_FLOAT_32,
&parserNodes[parserIndex].ettVar);
break;
- case DIS_FIELDTYPE_ORIENTATION:
+ case DIS_FIELDTYPE_LOCATION_WORLD:
+ case DIS_FIELDTYPE_VECTOR_64:
parserNodes[parserIndex].children = createSubtree(
- DIS_FIELDS_ORIENTATION,
+ DIS_FIELDS_VECTOR_FLOAT_64,
&parserNodes[parserIndex].ettVar);
break;
- case DIS_FIELDTYPE_FIXED_DATUM:
+
+ /* Array records */
+ case DIS_FIELDTYPE_FIXED_DATUMS:
parserNodes[parserIndex].children = createSubtree(
DIS_FIELDS_FIXED_DATUM,
&parserNodes[parserIndex].ettVar);
break;
- case DIS_FIELDTYPE_VARIABLE_DATUM:
+ case DIS_FIELDTYPE_VARIABLE_DATUMS:
parserNodes[parserIndex].children = createSubtree(
DIS_FIELDS_VARIABLE_DATUM,
&parserNodes[parserIndex].ettVar);
break;
+ case DIS_FIELDTYPE_FIXED_DATUM_IDS:
+ case DIS_FIELDTYPE_VARIABLE_DATUM_IDS:
+ parserNodes[parserIndex].children = createSubtree(
+ DIS_FIELDS_DATUM_IDS,
+ &parserNodes[parserIndex].ettVar);
+ break;
+ case DIS_FIELDTYPE_VARIABLE_PARAMETERS:
+ parserNodes[parserIndex].children = createSubtree(
+ DIS_FIELDS_VP_TYPE,
+ &parserNodes[parserIndex].ettVar);
+ break;
+ case DIS_FIELDTYPE_VARIABLE_RECORDS:
+ parserNodes[parserIndex].children = createSubtree(
+ DIS_FIELDS_VR_TYPE,
+ &parserNodes[parserIndex].ettVar);
+ break;
default:
break;
}
@@ -239,12 +574,18 @@ void initializeParser(DIS_ParserNode parserNodes[])
gint parseFields(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNodes[])
{
guint fieldIndex = 0;
+ guint fieldRepeatLen = 0;
while (parserNodes[fieldIndex].fieldType != DIS_FIELDTYPE_END)
{
proto_item *newField = 0;
+
+ fieldRepeatLen = (guint) ((parserNodes[fieldIndex].fieldRepeatLen > 1) ?
+ parserNodes[fieldIndex].fieldRepeatLen : 1);
+
switch(parserNodes[fieldIndex].fieldType)
{
+ /* basic numeric types */
case DIS_FIELDTYPE_INT8:
offset = parseField_Int(tvb, tree, offset,
parserNodes[fieldIndex], 1);
@@ -285,20 +626,60 @@ gint parseFields(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode pa
offset = parseField_Double(tvb, tree, offset,
parserNodes[fieldIndex]);
break;
+
+ /* padding */
case DIS_FIELDTYPE_PAD8:
offset = parseField_Pad(tvb, tree, offset,
- parserNodes[fieldIndex], 1);
+ parserNodes[fieldIndex], 1 * fieldRepeatLen);
break;
case DIS_FIELDTYPE_PAD16:
offset = parseField_Pad(tvb, tree, offset,
- parserNodes[fieldIndex], 2);
+ parserNodes[fieldIndex], 2 * fieldRepeatLen);
break;
case DIS_FIELDTYPE_PAD32:
offset = parseField_Pad(tvb, tree, offset,
+ parserNodes[fieldIndex], 4 * fieldRepeatLen);
+ break;
+
+ /* enumerations (1-byte) */
+ case DIS_FIELDTYPE_APPLICATION_GENERAL_STATUS:
+ case DIS_FIELDTYPE_CATEGORY:
+ case DIS_FIELDTYPE_CONTROL_ID:
+ case DIS_FIELDTYPE_DETONATION_RESULT:
+ case DIS_FIELDTYPE_DOMAIN:
+ case DIS_FIELDTYPE_ENTITY_KIND:
+ case DIS_FIELDTYPE_FROZEN_BEHAVIOR:
+ case DIS_FIELDTYPE_PARAMETER_TYPE_DESIGNATOR:
+ case DIS_FIELDTYPE_PDU_TYPE:
+ case DIS_FIELDTYPE_PROTOCOL_FAMILY:
+ case DIS_FIELDTYPE_PROTOCOL_VERSION:
+ case DIS_FIELDTYPE_REASON:
+ case DIS_FIELDTYPE_REQUIRED_RELIABILITY_SERVICE:
+ case DIS_FIELDTYPE_PERSISTENT_OBJECT_CLASS:
+ case DIS_FIELDTYPE_PERSISTENT_OBJECT_TYPE:
+ offset = parseField_Enum(tvb, tree, offset,
+ parserNodes[fieldIndex], 1);
+ break;
+
+ /* enumerations (2-bytes) */
+ case DIS_FIELDTYPE_ACKNOWLEDGE_FLAG:
+ case DIS_FIELDTYPE_APPLICATION_STATUS_TYPE:
+ case DIS_FIELDTYPE_APPLICATION_TYPE:
+ case DIS_FIELDTYPE_RESPONSE_FLAG:
+ offset = parseField_Enum(tvb, tree, offset,
+ parserNodes[fieldIndex], 2);
+ break;
+
+ /* enumerations (4-bytes) */
+ case DIS_FIELDTYPE_ACTION_ID:
+ case DIS_FIELDTYPE_REQUEST_STATUS:
+ offset = parseField_Enum(tvb, tree, offset,
parserNodes[fieldIndex], 4);
break;
+
+ /* other atomic types */
case DIS_FIELDTYPE_APPEARANCE:
- {
+ {
proto_item *newSubtree;
newField = proto_tree_add_text(tree, tvb, offset, 4, "%s",
parserNodes[fieldIndex].fieldLabel);
@@ -306,11 +687,7 @@ gint parseFields(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode pa
parserNodes[fieldIndex].ettVar);
offset = parseField_Bitmask(tvb, newSubtree, offset,
parserNodes[fieldIndex], 4);
- }
- break;
- case DIS_FIELDTYPE_ARTIC_PARAM_TYPE_DESIGNATOR:
- offset = parseField_UInt(tvb, tree, offset,
- parserNodes[fieldIndex], 1);
+ }
break;
case DIS_FIELDTYPE_ARTIC_PARAM_TYPE:
offset = parseField_UInt(tvb, tree, offset,
@@ -320,35 +697,24 @@ gint parseFields(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode pa
offset = parseField_UInt(tvb, tree, offset,
parserNodes[fieldIndex], 4);
break;
- case DIS_FIELDTYPE_CATEGORY:
- offset = parseField_Enum(tvb, tree, offset,
- parserNodes[fieldIndex], 1);
- break;
case DIS_FIELDTYPE_COUNTRY:
offset = parseField_UInt(tvb, tree, offset,
parserNodes[fieldIndex], 2);
break;
+ case DIS_FIELDTYPE_DATUM_ID:
+ case DIS_FIELDTYPE_DATUM_LENGTH:
+ offset = parseField_UInt(tvb, tree, offset,
+ parserNodes[fieldIndex], 4);
+ break;
case DIS_FIELDTYPE_DEAD_RECKONING_PARAMS:
- /* This is really a struct... needs a field parser.
+ /* This is really a struct... needs a field parser.
* For now, just skip the 12 bytes.
*/
offset = parseField_Bytes(tvb, tree, offset,
parserNodes[fieldIndex], 40);
break;
- case DIS_FIELDTYPE_DETONATION_RESULT:
- offset = parseField_Enum(tvb, tree, offset,
- parserNodes[fieldIndex], 1);
- break;
- case DIS_FIELDTYPE_DOMAIN:
- offset = parseField_Enum(tvb, tree, offset,
- parserNodes[fieldIndex], 1);
- break;
- case DIS_FIELDTYPE_ENTITY_KIND:
- offset = parseField_Enum(tvb, tree, offset,
- parserNodes[fieldIndex], 1);
- break;
case DIS_FIELDTYPE_ENTITY_MARKING:
- /* This is really a struct... needs a field parser.
+ /* This is really a struct... needs a field parser.
* For now, just skip the 12 bytes.
*/
offset = parseField_Bytes(tvb, tree, offset,
@@ -358,6 +724,15 @@ gint parseFields(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode pa
offset = parseField_UInt(tvb, tree, offset,
parserNodes[fieldIndex], 1);
break;
+ case DIS_FIELDTYPE_FIXED_DATUM_VALUE:
+ offset = parseField_Bytes(tvb, tree, offset,
+ parserNodes[fieldIndex], 4);
+ break;
+ case DIS_FIELDTYPE_FIXED_LEN_STR:
+ offset = parseField_Bytes(tvb, tree, offset,
+ parserNodes[fieldIndex],
+ parserNodes[fieldIndex].fieldRepeatLen);
+ break;
case DIS_FIELDTYPE_FORCE_ID:
offset = parseField_UInt(tvb, tree, offset,
parserNodes[fieldIndex], 1);
@@ -366,17 +741,14 @@ gint parseFields(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode pa
offset = parseField_UInt(tvb, tree, offset,
parserNodes[fieldIndex], 2);
break;
- case DIS_FIELDTYPE_PDU_TYPE:
- offset = parseField_Enum(tvb, tree, offset,
- parserNodes[fieldIndex], 1);
- break;
- case DIS_FIELDTYPE_PROTOCOL_FAMILY:
- offset = parseField_Enum(tvb, tree, offset,
- parserNodes[fieldIndex], 1);
+ 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_PROTOCOL_VERSION:
- offset = parseField_Enum(tvb, tree, offset,
- parserNodes[fieldIndex], 1);
+ case DIS_FIELDTYPE_REQUEST_ID:
+ offset = parseField_UInt(tvb, tree, offset,
+ parserNodes[fieldIndex], 4);
break;
case DIS_FIELDTYPE_SPECIFIC:
offset = parseField_UInt(tvb, tree, offset,
@@ -386,6 +758,10 @@ gint parseFields(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode pa
offset = parseField_UInt(tvb, tree, offset,
parserNodes[fieldIndex], 1);
break;
+ case DIS_FIELDTYPE_TIME_INTERVAL:
+ offset = parseField_UInt(tvb, tree, offset,
+ parserNodes[fieldIndex], 4);
+ break;
case DIS_FIELDTYPE_TIMESTAMP:
offset = parseField_Timestamp(tvb, tree, offset,
parserNodes[fieldIndex]);
@@ -394,14 +770,20 @@ gint parseFields(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode pa
offset = parseField_UInt(tvb, tree, offset,
parserNodes[fieldIndex], 2);
break;
+
+ /* composite types */
case DIS_FIELDTYPE_BURST_DESCRIPTOR:
+ case DIS_FIELDTYPE_CLOCK_TIME:
case DIS_FIELDTYPE_ENTITY_ID:
+ case DIS_FIELDTYPE_ENTITY_TYPE:
case DIS_FIELDTYPE_EVENT_ID:
case DIS_FIELDTYPE_LINEAR_VELOCITY:
- case DIS_FIELDTYPE_LOCATION_WORLD:
case DIS_FIELDTYPE_LOCATION_ENTITY:
- case DIS_FIELDTYPE_ENTITY_TYPE:
+ case DIS_FIELDTYPE_LOCATION_WORLD:
case DIS_FIELDTYPE_ORIENTATION:
+ case DIS_FIELDTYPE_SIMULATION_ADDRESS:
+ case DIS_FIELDTYPE_VECTOR_32:
+ case DIS_FIELDTYPE_VECTOR_64:
newField = proto_tree_add_text(tree, tvb, offset, -1, "%s",
parserNodes[fieldIndex].fieldLabel);
if (parserNodes[fieldIndex].children != 0)
@@ -412,106 +794,166 @@ gint parseFields(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode pa
parserNodes[fieldIndex].children);
}
proto_item_set_end(newField, tvb, offset);
- break;
- case DIS_FIELDTYPE_ARTICULATION_PARAMETERS:
- {
- guint i;
+ break;
+ case DIS_FIELDTYPE_VARIABLE_DATUM_VALUE:
+ {
+ guint lengthInBytes;
+ lengthInBytes = variableDatumLength / 8;
+ if (variableDatumLength % 8 > 0)
+ {
+ lengthInBytes += (8 - (variableDatumLength % 8));
+ }
+ offset = parseField_Bytes(tvb, tree, offset,
+ parserNodes[fieldIndex], lengthInBytes);
+ }
+ break;
- if (numArticulations > DIS_PDU_MAX_ARTICULATIONS)
+ /* arrays */
+ case DIS_FIELDTYPE_FIXED_DATUMS:
+ {
+ guint i;
+ if (numFixed > INT32_MAX)
{
- numArticulations = DIS_PDU_MAX_ARTICULATIONS;
+ numFixed = INT32_MAX;
}
- for (i = 0; i < numArticulations; ++i)
- {
- proto_item *newSubtree;
+ for (i = 0; i < numFixed; ++i)
+ {
+ proto_item *newSubtree;
newField = proto_tree_add_text(tree, tvb, offset, -1, "%s",
parserNodes[fieldIndex].fieldLabel);
- newSubtree = proto_item_add_subtree(newField,
- ettArticulations[i]);
- offset = parseFields(tvb, newSubtree, offset,
- parserNodes[fieldIndex].children);
+ 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_NUM_FIXED_DATA:
- case DIS_FIELDTYPE_NUM_VARIABLE_DATA:
- offset = parseField_UInt(tvb, tree, offset,
- parserNodes[fieldIndex], 4);
break;
- case DIS_FIELDTYPE_FIXED_DATUM:
+ case DIS_FIELDTYPE_FIXED_DATUM_IDS:
+ if (numFixed > 0)
+ {
+ guint i;
+ proto_item *newSubtree;
+
+ newField = proto_tree_add_text(tree, tvb, offset, -1, "%s",
+ parserNodes[fieldIndex].fieldLabel);
+ newSubtree = proto_item_add_subtree(newField, ettFixedData);
+
+ if (numFixed > INT32_MAX)
+ {
+ numFixed = INT32_MAX;
+ }
+
+ for (i = 0; i < numFixed; ++i)
+ {
+ offset = parseFields
+ (tvb, newSubtree, offset,
+ parserNodes[fieldIndex].children);
+ }
+ proto_item_set_end(newField, tvb, offset);
+ }
+ break;
+ case DIS_FIELDTYPE_VARIABLE_DATUMS:
{
guint i;
- if (numFixedData > INT32_MAX)
+ if (numVariable > INT32_MAX)
{
- numFixedData = INT32_MAX;
+ numVariable = INT32_MAX;
}
- for (i = 0; i < numFixedData; ++i)
+ for (i = 0; i < numVariable; ++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);
+ 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_VARIABLE_DATUM:
+ case DIS_FIELDTYPE_VARIABLE_DATUM_IDS:
+ if (numVariable > 0)
+ {
+ guint i;
+ proto_item *newSubtree;
+
+ newField = proto_tree_add_text(tree, tvb, offset, -1, "%s",
+ parserNodes[fieldIndex].fieldLabel);
+ newSubtree = proto_item_add_subtree(newField, ettVariableData);
+
+ if (numVariable > INT32_MAX)
+ {
+ numVariable = INT32_MAX;
+ }
+
+ for (i = 0; i < numVariable; ++i)
+ {
+ offset = parseFields
+ (tvb, newSubtree, offset,
+ parserNodes[fieldIndex].children);
+ }
+ proto_item_set_end(newField, tvb, offset);
+ }
+ break;
+ case DIS_FIELDTYPE_VARIABLE_PARAMETERS:
{
guint i;
- if (numVariableData > INT32_MAX)
+
+ if (numVariable > DIS_PDU_MAX_VARIABLE_PARAMETERS)
{
- numVariableData = INT32_MAX;
+ numVariable = DIS_PDU_MAX_VARIABLE_PARAMETERS;
}
- for (i = 0; i < numVariableData; ++i)
+ for (i = 0; i < numVariable; ++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);
+ newSubtree = proto_item_add_subtree(newField,
+ ettVariableParameters[i]);
+ offset = parseFields
+ (tvb, newSubtree, offset,
+ parserNodes[fieldIndex].children);
+ offset = parseField_VariableParameter
+ (tvb, newSubtree, offset);
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:
+ case DIS_FIELDTYPE_VARIABLE_RECORDS:
{
- guint lengthInBytes;
- lengthInBytes = variableDatumLength / 8;
- if (variableDatumLength % 8 > 0)
+ guint i;
+
+ if (numVariable > DIS_PDU_MAX_VARIABLE_RECORDS)
{
- lengthInBytes++;
+ numVariable = DIS_PDU_MAX_VARIABLE_RECORDS;
+ }
+
+ for (i = 0; i < numVariable; ++i)
+ {
+ proto_item *newSubtree;
+ newField = proto_tree_add_text(tree, tvb, offset, -1, "%s",
+ parserNodes[fieldIndex].fieldLabel);
+ newSubtree = proto_item_add_subtree(newField,
+ ettVariableRecords[i]);
+ offset = parseFields
+ (tvb, newSubtree, offset,
+ parserNodes[fieldIndex].children);
+ offset = parseField_VariableRecord
+ (tvb, newSubtree, offset);
+ proto_item_set_end(newField, tvb, offset);
}
- 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);
+ default:
break;
- default:
- break;
- }
+ }
++fieldIndex;
}
diff --git a/epan/dissectors/packet-dis-pdus.h b/epan/dissectors/packet-dis-pdus.h
index b3f6eda0c9..06da1f7c24 100644
--- a/epan/dissectors/packet-dis-pdus.h
+++ b/epan/dissectors/packet-dis-pdus.h
@@ -29,15 +29,43 @@
#include "packet-dis-fields.h"
+/* DIS Entity Information / Interaction PDUs */
extern DIS_ParserNode DIS_PARSER_ENTITY_STATE_PDU[];
+/* DIS Warfare PDUs */
extern DIS_ParserNode DIS_PARSER_FIRE_PDU[];
-
extern DIS_ParserNode DIS_PARSER_DETONATION_PDU[];
+/* DIS Simulation Management PDUs */
+extern DIS_ParserNode DIS_PARSER_START_RESUME_PDU[];
+extern DIS_ParserNode DIS_PARSER_STOP_FREEZE_PDU[];
+extern DIS_ParserNode DIS_PARSER_ACKNOWLEDGE_PDU[];
+extern DIS_ParserNode DIS_PARSER_ACTION_REQUEST_PDU[];
+extern DIS_ParserNode DIS_PARSER_ACTION_RESPONSE_PDU[];
extern DIS_ParserNode DIS_PARSER_DATA_PDU[];
-
extern DIS_ParserNode DIS_PARSER_DATA_QUERY_PDU[];
+extern DIS_ParserNode DIS_PARSER_COMMENT_PDU[];
+extern DIS_ParserNode DIS_PARSER_SIMAN_ENTITY_PDU[];
+
+/* DIS Simulation Management with Reliability PDUs */
+extern DIS_ParserNode DIS_PARSER_START_RESUME_R_PDU[];
+extern DIS_ParserNode DIS_PARSER_STOP_FREEZE_R_PDU[];
+extern DIS_ParserNode DIS_PARSER_ACTION_REQUEST_R_PDU[];
+extern DIS_ParserNode DIS_PARSER_DATA_R_PDU[];
+extern DIS_ParserNode DIS_PARSER_DATA_QUERY_R_PDU[];
+extern DIS_ParserNode DIS_PARSER_SIMAN_ENTITY_R_PDU[];
+
+/* DIS Experimental V-DIS PDUs */
+extern DIS_ParserNode DIS_PARSER_APPLICATION_CONTROL_PDU[];
+
+/* Persistent Object (PO) Family PDUs */
+extern DIS_ParserNode DIS_PARSER_SIMULATOR_PRESENT_PO_PDU[];
+extern DIS_ParserNode DIS_PARSER_DESCRIBE_OBJECT_PO_PDU[];
+extern DIS_ParserNode DIS_PARSER_OBJECTS_PRESENT_PO_PDU[];
+extern DIS_ParserNode DIS_PARSER_OBJECT_REQUEST_PO_PDU[];
+extern DIS_ParserNode DIS_PARSER_DELETE_OBJECTS_PO_PDU[];
+extern DIS_ParserNode DIS_PARSER_SET_WORLD_STATE_PO_PDU[];
+extern DIS_ParserNode DIS_PARSER_NOMINATION_PO_PDU[];
/* Limits of integral types. */
#ifndef INT8_MIN
@@ -76,9 +104,4 @@ void initializeParsers(void);
gint parseFields(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNodes[]);
-extern guint32 numArticulations;
-extern int ettArticulations[];
-
-#define DIS_PDU_MAX_ARTICULATIONS 16
-
#endif /* packet-dis-pduparsers.h */
diff --git a/epan/dissectors/packet-dis.c b/epan/dissectors/packet-dis.c
index 821d3fac67..72e882a49a 100644
--- a/epan/dissectors/packet-dis.c
+++ b/epan/dissectors/packet-dis.c
@@ -55,6 +55,7 @@
static gint proto_dis = -1;
static gint ett_dis = -1;
static gint ett_dis_header = -1;
+static gint ett_dis_po_header = -1;
static gint ett_dis_payload = -1;
static guint dis_udp_port = DEFAULT_DIS_UDP_PORT;
@@ -90,7 +91,8 @@ static gint dissect_dis(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
* the DIS header.
*/
pduType = DIS_PDUTYPE_OTHER;
- numArticulations = 0;
+ protocolFamily = DIS_PROTOCOLFAMILY_OTHER;
+ persistentObjectPduType = DIS_PERSISTENT_OBJECT_TYPE_OTHER;
if (check_col(pinfo->cinfo, COL_PROTOCOL))
{
@@ -113,38 +115,175 @@ static gint dissect_dis(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/* Locate the appropriate PDU parser, if type is known.
*/
- switch (pduType)
+ switch (protocolFamily)
{
- case DIS_PDUTYPE_ENTITY_STATE:
- pduParser = DIS_PARSER_ENTITY_STATE_PDU;
- break;
- case DIS_PDUTYPE_FIRE:
- pduParser = DIS_PARSER_FIRE_PDU;
- break;
- 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;
+ case DIS_PROTOCOLFAMILY_PERSISTENT_OBJECT:
+ {
+ proto_item *dis_po_header_tree = 0;
+ proto_item *dis_po_header_node = 0;
+
+ dis_po_header_node = proto_tree_add_text
+ (dis_header_tree, tvb, offset, -1, "PO Header");
+ dis_po_header_tree = proto_item_add_subtree
+ (dis_po_header_node, ett_dis_po_header);
+ offset = parseFields
+ (tvb, dis_po_header_tree, offset,
+ DIS_FIELDS_PERSISTENT_OBJECT_HEADER);
+ proto_item_set_end(dis_po_header_node, tvb, offset);
+
+ /* Locate the appropriate PO PDU parser, if type is known.
+ */
+ switch (persistentObjectPduType)
+ {
+ case DIS_PERSISTENT_OBJECT_TYPE_SIMULATOR_PRESENT:
+ pduParser = DIS_PARSER_SIMULATOR_PRESENT_PO_PDU;
+ break;
+ case DIS_PERSISTENT_OBJECT_TYPE_DESCRIBE_OBJECT:
+ pduParser = DIS_PARSER_DESCRIBE_OBJECT_PO_PDU;
+ break;
+ case DIS_PERSISTENT_OBJECT_TYPE_OBJECTS_PRESENT:
+ pduParser = DIS_PARSER_OBJECTS_PRESENT_PO_PDU;
+ break;
+ case DIS_PERSISTENT_OBJECT_TYPE_OBJECT_REQUEST:
+ pduParser = DIS_PARSER_OBJECT_REQUEST_PO_PDU;
+ break;
+ case DIS_PERSISTENT_OBJECT_TYPE_DELETE_OBJECTS:
+ pduParser = DIS_PARSER_DELETE_OBJECTS_PO_PDU;
+ break;
+ case DIS_PERSISTENT_OBJECT_TYPE_SET_WORLD_STATE:
+ pduParser = DIS_PARSER_SET_WORLD_STATE_PO_PDU;
+ break;
+ case DIS_PERSISTENT_OBJECT_TYPE_NOMINATION:
+ pduParser = DIS_PARSER_NOMINATION_PO_PDU;
+ break;
+ default:
+ pduParser = 0;
+ break;
+ }
+
+ /* Locate the string name for the PO PDU type enumeration,
+ * or default to "Unknown".
+ */
+ pduString = val_to_str
+ (persistentObjectPduType,
+ DIS_PDU_PersistentObjectType_Strings, "Unknown");
+
+ /* Add a node to contain the DIS PDU fields.
+ */
+ dis_payload_node = proto_tree_add_text(dis_tree, tvb, offset, -1,
+ "%s PO PDU", pduString);
+
+ }
break;
default:
- pduParser = 0;
- break;
- }
+ /* Locate the string name for the PDU type enumeration,
+ * or default to "Unknown".
+ */
+ pduString = val_to_str(pduType, DIS_PDU_Type_Strings, "Unknown");
- /* Locate the string name for the PDU type enumeration, or default to
- * "Unknown".
- */
- pduString = val_to_str(pduType, DIS_PDU_Type_Strings, "Unknown");
+ /* Add a node to contain the DIS PDU fields.
+ */
+ dis_payload_node = proto_tree_add_text(dis_tree, tvb, offset, -1,
+ "%s PDU", pduString);
- /* Add a node to contain the DIS PDU fields.
- */
- dis_payload_node = proto_tree_add_text(dis_tree, tvb, offset, -1,
- "%s PDU", pduString);
+ switch (pduType)
+ {
+ /* DIS Entity Information / Interaction PDUs */
+ case DIS_PDUTYPE_ENTITY_STATE:
+ pduParser = DIS_PARSER_ENTITY_STATE_PDU;
+ break;
+
+ /* DIS Warfare PDUs */
+ case DIS_PDUTYPE_FIRE:
+ pduParser = DIS_PARSER_FIRE_PDU;
+ break;
+ case DIS_PDUTYPE_DETONATION:
+ if ( protocolVersion < DIS_VERSION_IEEE_1278_1_200X )
+ {
+ pduParser = DIS_PARSER_DETONATION_PDU;
+ }
+ else
+ {
+ /* TODO: Version 7 changed the Detonation PDU format
+ * Need a different parser
+ */
+ pduParser = DIS_PARSER_DETONATION_PDU;
+ }
+ break;
+
+ /* DIS Simulation Management PDUs */
+ case DIS_PDUTYPE_START_RESUME:
+ pduParser = DIS_PARSER_START_RESUME_PDU;
+ break;
+ case DIS_PDUTYPE_STOP_FREEZE:
+ pduParser = DIS_PARSER_STOP_FREEZE_PDU;
+ break;
+ case DIS_PDUTYPE_ACKNOWLEDGE:
+ pduParser = DIS_PARSER_ACKNOWLEDGE_PDU;
+ break;
+ case DIS_PDUTYPE_ACTION_REQUEST:
+ pduParser = DIS_PARSER_ACTION_REQUEST_PDU;
+ break;
+ case DIS_PDUTYPE_ACTION_RESPONSE:
+ pduParser = DIS_PARSER_ACTION_RESPONSE_PDU;
+ break;
+ case DIS_PDUTYPE_DATA:
+ case DIS_PDUTYPE_SET_DATA:
+ pduParser = DIS_PARSER_DATA_PDU;
+ break;
+ case DIS_PDUTYPE_DATA_QUERY:
+ pduParser = DIS_PARSER_DATA_QUERY_PDU;
+ break;
+ case DIS_PDUTYPE_COMMENT:
+ pduParser = DIS_PARSER_COMMENT_PDU;
+ break;
+ case DIS_PDUTYPE_CREATE_ENTITY:
+ case DIS_PDUTYPE_REMOVE_ENTITY:
+ pduParser = DIS_PARSER_SIMAN_ENTITY_PDU;
+ break;
+
+ /* DIS Simulation Management with Reliability PDUs */
+ case DIS_PDUTYPE_START_RESUME_R:
+ pduParser = DIS_PARSER_START_RESUME_R_PDU;
+ break;
+ case DIS_PDUTYPE_STOP_FREEZE_R:
+ pduParser = DIS_PARSER_STOP_FREEZE_R_PDU;
+ break;
+ case DIS_PDUTYPE_ACKNOWLEDGE_R:
+ pduParser = DIS_PARSER_ACKNOWLEDGE_PDU;
+ break;
+ case DIS_PDUTYPE_ACTION_REQUEST_R:
+ pduParser = DIS_PARSER_ACTION_REQUEST_R_PDU;
+ break;
+ case DIS_PDUTYPE_ACTION_RESPONSE_R:
+ pduParser = DIS_PARSER_ACTION_RESPONSE_PDU;
+ break;
+ case DIS_PDUTYPE_DATA_R:
+ case DIS_PDUTYPE_SET_DATA_R:
+ pduParser = DIS_PARSER_DATA_R_PDU;
+ break;
+ case DIS_PDUTYPE_DATA_QUERY_R:
+ pduParser = DIS_PARSER_DATA_QUERY_R_PDU;
+ break;
+ case DIS_PDUTYPE_COMMENT_R:
+ pduParser = DIS_PARSER_COMMENT_PDU;
+ break;
+ case DIS_PDUTYPE_CREATE_ENTITY_R:
+ case DIS_PDUTYPE_REMOVE_ENTITY_R:
+ pduParser = DIS_PARSER_SIMAN_ENTITY_R_PDU;
+ break;
+
+ /* DIS Experimental V-DIS PDUs */
+ case DIS_PDUTYPE_APPLICATION_CONTROL:
+ pduParser = DIS_PARSER_APPLICATION_CONTROL_PDU;
+ break;
+
+ default:
+ pduParser = 0;
+ break;
+ }
+ break;
+ }
/* If a parser was located, invoke it on the data packet.
*/
@@ -170,14 +309,14 @@ void proto_register_dis(void)
static gint *ett[] =
{
&ett_dis,
- &ett_dis_header,
+ &ett_dis_header,
+ &ett_dis_po_header,
&ett_dis_payload
};
module_t *dis_module;
- proto_dis = proto_register_protocol(dis_proto_name, dis_proto_name_short,
- "dis");
+ proto_dis = proto_register_protocol(dis_proto_name, dis_proto_name_short, "dis");
proto_register_subtree_array(ett, array_length(ett));
dis_module = prefs_register_protocol(proto_dis, proto_reg_handoff_dis);
@@ -193,6 +332,7 @@ void proto_register_dis(void)
/* Perform the one-time initialization of the DIS parsers.
*/
initializeParsers();
+ initializeFieldParsers();
}
/* Register handoff routine for DIS dissector. This will be invoked initially