2009-11-13 06:53:15 +00:00
|
|
|
/* packet-dis-pdus.c
|
2005-07-11 22:23:15 +00:00
|
|
|
* Routines and definitions for DIS PDU parsing.
|
|
|
|
* Copyright 2005, Scientific Research Corporation
|
|
|
|
* Initial implementation by Jeremy Ouellette <jouellet@scires.com>
|
|
|
|
*
|
2005-09-20 22:51:42 +00:00
|
|
|
* $Id$
|
|
|
|
*
|
2006-05-21 04:49:01 +00:00
|
|
|
* Wireshark - Network traffic analyzer
|
|
|
|
* By Gerald Combs <gerald@wireshark.org>
|
2005-07-11 22:23:15 +00:00
|
|
|
* Copyright 1998 Gerald Combs
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
#include "packet-dis-pdus.h"
|
|
|
|
#include "packet-dis-fields.h"
|
|
|
|
|
2009-11-13 06:53:15 +00:00
|
|
|
#define DIS_PDU_MAX_VARIABLE_PARAMETERS 16
|
|
|
|
#define DIS_PDU_MAX_VARIABLE_RECORDS 16
|
2005-07-11 22:23:15 +00:00
|
|
|
|
2009-11-13 06:53:15 +00:00
|
|
|
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
|
|
|
|
*/
|
2005-07-11 22:23:15 +00:00
|
|
|
DIS_ParserNode DIS_PARSER_ENTITY_STATE_PDU[] =
|
|
|
|
{
|
2009-11-13 06:53:15 +00:00
|
|
|
{ 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 }
|
2005-07-11 22:23:15 +00:00
|
|
|
};
|
|
|
|
|
2009-11-13 06:53:15 +00:00
|
|
|
/* DIS Warfare PDUs
|
|
|
|
*/
|
2005-07-11 22:23:15 +00:00
|
|
|
DIS_ParserNode DIS_PARSER_FIRE_PDU[] =
|
|
|
|
{
|
2009-11-13 06:53:15 +00:00
|
|
|
{ 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 }
|
2005-07-11 22:23:15 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
DIS_ParserNode DIS_PARSER_DETONATION_PDU[] =
|
|
|
|
{
|
2009-11-13 06:53:15 +00:00
|
|
|
{ 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 }
|
2005-07-11 22:23:15 +00:00
|
|
|
};
|
|
|
|
|
2009-06-02 06:37:21 +00:00
|
|
|
DIS_ParserNode DIS_PARSER_DATA_PDU[] =
|
|
|
|
{
|
2009-11-13 06:53:15 +00:00
|
|
|
{ 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 }
|
2009-06-02 06:37:21 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
DIS_ParserNode DIS_PARSER_DATA_QUERY_PDU[] =
|
|
|
|
{
|
2009-11-13 06:53:15 +00:00
|
|
|
{ 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 }
|
2009-06-02 06:37:21 +00:00
|
|
|
};
|
|
|
|
|
2005-07-11 22:23:15 +00:00
|
|
|
/* Initialize the parsers for each PDU type and the standard DIS header.
|
|
|
|
*/
|
|
|
|
void initializeParsers(void)
|
|
|
|
{
|
2009-11-13 06:53:15 +00:00
|
|
|
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 */
|
2005-07-11 22:23:15 +00:00
|
|
|
initializeParser(DIS_PARSER_ENTITY_STATE_PDU);
|
2009-11-13 06:53:15 +00:00
|
|
|
|
|
|
|
/* DIS Warfare PDUs */
|
2005-07-11 22:23:15 +00:00
|
|
|
initializeParser(DIS_PARSER_FIRE_PDU);
|
|
|
|
initializeParser(DIS_PARSER_DETONATION_PDU);
|
2009-11-13 06:53:15 +00:00
|
|
|
|
|
|
|
/* 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);
|
2009-06-02 06:37:21 +00:00
|
|
|
initializeParser(DIS_PARSER_DATA_PDU);
|
|
|
|
initializeParser(DIS_PARSER_DATA_QUERY_PDU);
|
2009-11-13 06:53:15 +00:00
|
|
|
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));
|
2005-07-11 22:23:15 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/* Create a specific subtree for a PDU or a composite PDU field.
|
|
|
|
*/
|
|
|
|
DIS_ParserNode *createSubtree(DIS_ParserNode parserNodes[], gint *ettVar)
|
|
|
|
{
|
|
|
|
guint fieldIndex = 0;
|
|
|
|
guint fieldCount;
|
|
|
|
gint *ett[1];
|
|
|
|
DIS_ParserNode *newSubtree;
|
|
|
|
|
|
|
|
while (parserNodes[fieldIndex].fieldType != DIS_FIELDTYPE_END)
|
|
|
|
{
|
|
|
|
++fieldIndex;
|
|
|
|
}
|
|
|
|
|
|
|
|
fieldCount = fieldIndex + 1;
|
|
|
|
|
|
|
|
newSubtree = (DIS_ParserNode*)g_malloc(sizeof(DIS_ParserNode) * fieldCount);
|
|
|
|
|
|
|
|
memcpy(newSubtree, parserNodes, sizeof(DIS_ParserNode) * fieldCount);
|
|
|
|
|
|
|
|
initializeParser(newSubtree);
|
|
|
|
|
2009-08-04 18:48:45 +00:00
|
|
|
*ettVar = -1;
|
2005-07-11 22:23:15 +00:00
|
|
|
ett[0] = ettVar;
|
|
|
|
proto_register_subtree_array(ett, array_length(ett));
|
|
|
|
|
|
|
|
return newSubtree;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Initialize an array of parser nodes.
|
|
|
|
*/
|
|
|
|
void initializeParser(DIS_ParserNode parserNodes[])
|
|
|
|
{
|
|
|
|
guint parserIndex = 0;
|
|
|
|
|
|
|
|
/* Create the parser subtrees for each of the composite field types.
|
|
|
|
*/
|
|
|
|
while (parserNodes[parserIndex].fieldType != DIS_FIELDTYPE_END)
|
|
|
|
{
|
|
|
|
switch (parserNodes[parserIndex].fieldType)
|
|
|
|
{
|
2009-11-13 06:53:15 +00:00
|
|
|
/* Bit fields */
|
2005-07-11 22:23:15 +00:00
|
|
|
case DIS_FIELDTYPE_APPEARANCE:
|
|
|
|
parserNodes[parserIndex].children = createSubtree(
|
|
|
|
DIS_FIELDS_NONE,
|
|
|
|
&parserNodes[parserIndex].ettVar);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
|
|
|
|
/* Composite types */
|
|
|
|
case DIS_FIELDTYPE_BURST_DESCRIPTOR:
|
2005-07-11 22:23:15 +00:00
|
|
|
parserNodes[parserIndex].children = createSubtree(
|
2009-11-13 06:53:15 +00:00
|
|
|
DIS_FIELDS_BURST_DESCRIPTOR,
|
2005-07-11 22:23:15 +00:00
|
|
|
&parserNodes[parserIndex].ettVar);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_CLOCK_TIME:
|
2005-07-11 22:23:15 +00:00
|
|
|
parserNodes[parserIndex].children = createSubtree(
|
2009-11-13 06:53:15 +00:00
|
|
|
DIS_FIELDS_CLOCK_TIME,
|
2005-07-11 22:23:15 +00:00
|
|
|
&parserNodes[parserIndex].ettVar);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_ENTITY_ID:
|
|
|
|
parserNodes[parserIndex].children = createSubtree(
|
|
|
|
DIS_FIELDS_ENTITY_ID,
|
|
|
|
&parserNodes[parserIndex].ettVar);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_ENTITY_TYPE:
|
|
|
|
parserNodes[parserIndex].children = createSubtree(
|
|
|
|
DIS_FIELDS_ENTITY_TYPE,
|
|
|
|
&parserNodes[parserIndex].ettVar);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_EVENT_ID:
|
|
|
|
parserNodes[parserIndex].children = createSubtree(
|
|
|
|
DIS_FIELDS_EVENT_ID,
|
|
|
|
&parserNodes[parserIndex].ettVar);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_ORIENTATION:
|
2005-07-11 22:23:15 +00:00
|
|
|
parserNodes[parserIndex].children = createSubtree(
|
2009-11-13 06:53:15 +00:00
|
|
|
DIS_FIELDS_ORIENTATION,
|
2005-07-11 22:23:15 +00:00
|
|
|
&parserNodes[parserIndex].ettVar);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_SIMULATION_ADDRESS:
|
2005-07-11 22:23:15 +00:00
|
|
|
parserNodes[parserIndex].children = createSubtree(
|
2009-11-13 06:53:15 +00:00
|
|
|
DIS_FIELDS_SIMULATION_ADDRESS,
|
2005-07-11 22:23:15 +00:00
|
|
|
&parserNodes[parserIndex].ettVar);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_LINEAR_VELOCITY:
|
2005-07-11 22:23:15 +00:00
|
|
|
case DIS_FIELDTYPE_LOCATION_ENTITY:
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_VECTOR_32:
|
2005-07-11 22:23:15 +00:00
|
|
|
parserNodes[parserIndex].children = createSubtree(
|
2009-11-13 06:53:15 +00:00
|
|
|
DIS_FIELDS_VECTOR_FLOAT_32,
|
2005-07-11 22:23:15 +00:00
|
|
|
&parserNodes[parserIndex].ettVar);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_LOCATION_WORLD:
|
|
|
|
case DIS_FIELDTYPE_VECTOR_64:
|
2005-07-11 22:23:15 +00:00
|
|
|
parserNodes[parserIndex].children = createSubtree(
|
2009-11-13 06:53:15 +00:00
|
|
|
DIS_FIELDS_VECTOR_FLOAT_64,
|
2005-07-11 22:23:15 +00:00
|
|
|
&parserNodes[parserIndex].ettVar);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
|
|
|
|
/* Array records */
|
|
|
|
case DIS_FIELDTYPE_FIXED_DATUMS:
|
2009-06-02 06:37:21 +00:00
|
|
|
parserNodes[parserIndex].children = createSubtree(
|
|
|
|
DIS_FIELDS_FIXED_DATUM,
|
|
|
|
&parserNodes[parserIndex].ettVar);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_VARIABLE_DATUMS:
|
2009-06-02 06:37:21 +00:00
|
|
|
parserNodes[parserIndex].children = createSubtree(
|
|
|
|
DIS_FIELDS_VARIABLE_DATUM,
|
|
|
|
&parserNodes[parserIndex].ettVar);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
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;
|
2005-07-11 22:23:15 +00:00
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
++parserIndex;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Parse packet data based on a specified array of DIS_ParserNodes.
|
|
|
|
*/
|
|
|
|
gint parseFields(tvbuff_t *tvb, proto_tree *tree, gint offset, DIS_ParserNode parserNodes[])
|
|
|
|
{
|
|
|
|
guint fieldIndex = 0;
|
2009-11-13 06:53:15 +00:00
|
|
|
guint fieldRepeatLen = 0;
|
2005-07-11 22:23:15 +00:00
|
|
|
|
|
|
|
while (parserNodes[fieldIndex].fieldType != DIS_FIELDTYPE_END)
|
|
|
|
{
|
|
|
|
proto_item *newField = 0;
|
2009-11-13 06:53:15 +00:00
|
|
|
|
|
|
|
fieldRepeatLen = (guint) ((parserNodes[fieldIndex].fieldRepeatLen > 1) ?
|
|
|
|
parserNodes[fieldIndex].fieldRepeatLen : 1);
|
|
|
|
|
2005-07-11 22:23:15 +00:00
|
|
|
switch(parserNodes[fieldIndex].fieldType)
|
|
|
|
{
|
2009-11-13 06:53:15 +00:00
|
|
|
/* basic numeric types */
|
2005-07-11 22:23:15 +00:00
|
|
|
case DIS_FIELDTYPE_INT8:
|
|
|
|
offset = parseField_Int(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 1);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_INT16:
|
|
|
|
offset = parseField_Int(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 2);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_INT32:
|
|
|
|
offset = parseField_Int(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 4);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_INT64:
|
|
|
|
offset = parseField_Int(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 8);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_UINT8:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 1);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_UINT16:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 2);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_UINT32:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 4);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_UINT64:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 8);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_FLOAT32:
|
|
|
|
offset = parseField_Float(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex]);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_FLOAT64:
|
|
|
|
offset = parseField_Double(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex]);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
|
|
|
|
/* padding */
|
2005-07-11 22:23:15 +00:00
|
|
|
case DIS_FIELDTYPE_PAD8:
|
|
|
|
offset = parseField_Pad(tvb, tree, offset,
|
2009-11-13 06:53:15 +00:00
|
|
|
parserNodes[fieldIndex], 1 * fieldRepeatLen);
|
2005-07-11 22:23:15 +00:00
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_PAD16:
|
|
|
|
offset = parseField_Pad(tvb, tree, offset,
|
2009-11-13 06:53:15 +00:00
|
|
|
parserNodes[fieldIndex], 2 * fieldRepeatLen);
|
2005-07-11 22:23:15 +00:00
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_PAD32:
|
|
|
|
offset = parseField_Pad(tvb, tree, offset,
|
2009-11-13 06:53:15 +00:00
|
|
|
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,
|
2005-07-11 22:23:15 +00:00
|
|
|
parserNodes[fieldIndex], 4);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
|
|
|
|
/* other atomic types */
|
2005-07-11 22:23:15 +00:00
|
|
|
case DIS_FIELDTYPE_APPEARANCE:
|
2009-11-13 06:53:15 +00:00
|
|
|
{
|
2005-07-11 22:23:15 +00:00
|
|
|
proto_item *newSubtree;
|
2008-10-31 14:07:23 +00:00
|
|
|
newField = proto_tree_add_text(tree, tvb, offset, 4, "%s",
|
2005-07-11 22:23:15 +00:00
|
|
|
parserNodes[fieldIndex].fieldLabel);
|
|
|
|
newSubtree = proto_item_add_subtree(newField,
|
|
|
|
parserNodes[fieldIndex].ettVar);
|
|
|
|
offset = parseField_Bitmask(tvb, newSubtree, offset,
|
|
|
|
parserNodes[fieldIndex], 4);
|
2009-11-13 06:53:15 +00:00
|
|
|
}
|
2005-07-11 22:23:15 +00:00
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_ARTIC_PARAM_TYPE:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 4);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_CAPABILITIES:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 4);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_COUNTRY:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 2);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_DATUM_ID:
|
|
|
|
case DIS_FIELDTYPE_DATUM_LENGTH:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 4);
|
|
|
|
break;
|
2005-07-11 22:23:15 +00:00
|
|
|
case DIS_FIELDTYPE_DEAD_RECKONING_PARAMS:
|
2009-11-13 06:53:15 +00:00
|
|
|
/* This is really a struct... needs a field parser.
|
2005-07-11 22:23:15 +00:00
|
|
|
* For now, just skip the 12 bytes.
|
|
|
|
*/
|
|
|
|
offset = parseField_Bytes(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 40);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_ENTITY_MARKING:
|
2009-11-13 06:53:15 +00:00
|
|
|
/* This is really a struct... needs a field parser.
|
2005-07-11 22:23:15 +00:00
|
|
|
* For now, just skip the 12 bytes.
|
|
|
|
*/
|
|
|
|
offset = parseField_Bytes(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 12);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_EXTRA:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 1);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
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;
|
2005-07-11 22:23:15 +00:00
|
|
|
case DIS_FIELDTYPE_FORCE_ID:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 1);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_FUSE:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 2);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_NUM_FIXED_DATA:
|
|
|
|
case DIS_FIELDTYPE_NUM_VARIABLE_DATA:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 4);
|
2005-07-11 22:23:15 +00:00
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_REQUEST_ID:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 4);
|
2005-07-11 22:23:15 +00:00
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_SPECIFIC:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 1);
|
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_SUBCATEGORY:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 1);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_TIME_INTERVAL:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 4);
|
|
|
|
break;
|
2005-07-11 22:23:15 +00:00
|
|
|
case DIS_FIELDTYPE_TIMESTAMP:
|
2008-08-20 06:32:08 +00:00
|
|
|
offset = parseField_Timestamp(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex]);
|
2005-07-11 22:23:15 +00:00
|
|
|
break;
|
|
|
|
case DIS_FIELDTYPE_WARHEAD:
|
|
|
|
offset = parseField_UInt(tvb, tree, offset,
|
|
|
|
parserNodes[fieldIndex], 2);
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
|
|
|
|
/* composite types */
|
2005-07-11 22:23:15 +00:00
|
|
|
case DIS_FIELDTYPE_BURST_DESCRIPTOR:
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_CLOCK_TIME:
|
2005-07-11 22:23:15 +00:00
|
|
|
case DIS_FIELDTYPE_ENTITY_ID:
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_ENTITY_TYPE:
|
2005-07-11 22:23:15 +00:00
|
|
|
case DIS_FIELDTYPE_EVENT_ID:
|
|
|
|
case DIS_FIELDTYPE_LINEAR_VELOCITY:
|
|
|
|
case DIS_FIELDTYPE_LOCATION_ENTITY:
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_LOCATION_WORLD:
|
2005-07-11 22:23:15 +00:00
|
|
|
case DIS_FIELDTYPE_ORIENTATION:
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_SIMULATION_ADDRESS:
|
|
|
|
case DIS_FIELDTYPE_VECTOR_32:
|
|
|
|
case DIS_FIELDTYPE_VECTOR_64:
|
2008-10-31 14:07:23 +00:00
|
|
|
newField = proto_tree_add_text(tree, tvb, offset, -1, "%s",
|
2005-07-11 22:23:15 +00:00
|
|
|
parserNodes[fieldIndex].fieldLabel);
|
|
|
|
if (parserNodes[fieldIndex].children != 0)
|
|
|
|
{
|
|
|
|
proto_item *newSubtree = proto_item_add_subtree(newField,
|
|
|
|
parserNodes[fieldIndex].ettVar);
|
|
|
|
offset = parseFields(tvb, newSubtree, offset,
|
|
|
|
parserNodes[fieldIndex].children);
|
|
|
|
}
|
|
|
|
proto_item_set_end(newField, tvb, offset);
|
2009-11-13 06:53:15 +00:00
|
|
|
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;
|
2005-07-11 22:23:15 +00:00
|
|
|
|
2009-11-13 06:53:15 +00:00
|
|
|
/* arrays */
|
|
|
|
case DIS_FIELDTYPE_FIXED_DATUMS:
|
|
|
|
{
|
|
|
|
guint i;
|
|
|
|
if (numFixed > INT32_MAX)
|
2005-07-11 22:23:15 +00:00
|
|
|
{
|
2009-11-13 06:53:15 +00:00
|
|
|
numFixed = INT32_MAX;
|
2005-07-11 22:23:15 +00:00
|
|
|
}
|
|
|
|
|
2009-11-13 06:53:15 +00:00
|
|
|
for (i = 0; i < numFixed; ++i)
|
|
|
|
{
|
|
|
|
proto_item *newSubtree;
|
2008-10-31 14:07:23 +00:00
|
|
|
newField = proto_tree_add_text(tree, tvb, offset, -1, "%s",
|
2005-07-11 22:23:15 +00:00
|
|
|
parserNodes[fieldIndex].fieldLabel);
|
2009-11-13 06:53:15 +00:00
|
|
|
newSubtree = proto_item_add_subtree(newField, ettFixedData);
|
|
|
|
offset = parseFields
|
|
|
|
(tvb, newSubtree, offset,
|
|
|
|
parserNodes[fieldIndex].children);
|
2005-07-11 22:23:15 +00:00
|
|
|
proto_item_set_end(newField, tvb, offset);
|
2009-11-13 06:53:15 +00:00
|
|
|
}
|
2005-07-11 22:23:15 +00:00
|
|
|
}
|
2009-06-02 06:37:21 +00:00
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
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:
|
2009-06-02 06:37:21 +00:00
|
|
|
{
|
|
|
|
guint i;
|
2009-11-13 06:53:15 +00:00
|
|
|
if (numVariable > INT32_MAX)
|
2009-06-02 06:37:21 +00:00
|
|
|
{
|
2009-11-13 06:53:15 +00:00
|
|
|
numVariable = INT32_MAX;
|
2009-06-02 06:37:21 +00:00
|
|
|
}
|
|
|
|
|
2009-11-13 06:53:15 +00:00
|
|
|
for (i = 0; i < numVariable; ++i)
|
2009-06-02 06:37:21 +00:00
|
|
|
{
|
|
|
|
proto_item *newSubtree;
|
|
|
|
newField = proto_tree_add_text(tree, tvb, offset, -1, "%s",
|
|
|
|
parserNodes[fieldIndex].fieldLabel);
|
2009-11-13 06:53:15 +00:00
|
|
|
newSubtree = proto_item_add_subtree
|
|
|
|
(newField, ettVariableData);
|
|
|
|
offset = parseFields
|
|
|
|
(tvb, newSubtree, offset,
|
|
|
|
parserNodes[fieldIndex].children);
|
2009-06-02 06:37:21 +00:00
|
|
|
proto_item_set_end(newField, tvb, offset);
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
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:
|
2009-06-02 06:37:21 +00:00
|
|
|
{
|
|
|
|
guint i;
|
2009-11-13 06:53:15 +00:00
|
|
|
|
|
|
|
if (numVariable > DIS_PDU_MAX_VARIABLE_PARAMETERS)
|
2009-06-02 06:37:21 +00:00
|
|
|
{
|
2009-11-13 06:53:15 +00:00
|
|
|
numVariable = DIS_PDU_MAX_VARIABLE_PARAMETERS;
|
2009-06-02 06:37:21 +00:00
|
|
|
}
|
|
|
|
|
2009-11-13 06:53:15 +00:00
|
|
|
for (i = 0; i < numVariable; ++i)
|
2009-06-02 06:37:21 +00:00
|
|
|
{
|
|
|
|
proto_item *newSubtree;
|
|
|
|
newField = proto_tree_add_text(tree, tvb, offset, -1, "%s",
|
|
|
|
parserNodes[fieldIndex].fieldLabel);
|
2009-11-13 06:53:15 +00:00
|
|
|
newSubtree = proto_item_add_subtree(newField,
|
|
|
|
ettVariableParameters[i]);
|
|
|
|
offset = parseFields
|
|
|
|
(tvb, newSubtree, offset,
|
|
|
|
parserNodes[fieldIndex].children);
|
|
|
|
offset = parseField_VariableParameter
|
|
|
|
(tvb, newSubtree, offset);
|
2009-06-02 06:37:21 +00:00
|
|
|
proto_item_set_end(newField, tvb, offset);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
case DIS_FIELDTYPE_VARIABLE_RECORDS:
|
2009-06-02 06:37:21 +00:00
|
|
|
{
|
2009-11-13 06:53:15 +00:00
|
|
|
guint i;
|
|
|
|
|
|
|
|
if (numVariable > DIS_PDU_MAX_VARIABLE_RECORDS)
|
2009-06-02 06:37:21 +00:00
|
|
|
{
|
2009-11-13 06:53:15 +00:00
|
|
|
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);
|
2009-06-02 06:37:21 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
default:
|
2009-06-02 06:37:21 +00:00
|
|
|
break;
|
2009-11-13 06:53:15 +00:00
|
|
|
}
|
2005-07-11 22:23:15 +00:00
|
|
|
|
|
|
|
++fieldIndex;
|
|
|
|
}
|
|
|
|
|
|
|
|
return offset;
|
|
|
|
}
|