aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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