diff options
-rw-r--r-- | epan/dissectors/packet-dis-enums.c | 266 | ||||
-rw-r--r-- | epan/dissectors/packet-dis-enums.h | 284 | ||||
-rw-r--r-- | epan/dissectors/packet-dis-fields.c | 389 | ||||
-rw-r--r-- | epan/dissectors/packet-dis-fields.h | 131 | ||||
-rw-r--r-- | epan/dissectors/packet-dis-pdus.c | 786 | ||||
-rw-r--r-- | epan/dissectors/packet-dis-pdus.h | 37 | ||||
-rw-r--r-- | epan/dissectors/packet-dis.c | 202 |
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 |