Blind implementation of READ/TAKE DDS READER operations

Finalized DDS Reader interface. Implemented read/take,
read_next_sample/take_next_sample, read_instance/take_instance,
read_next_instance/take_next_instance operations.
Instance Get operations were made generic to allow returning 2 variants
of instance data.
This commit is contained in:
Greek 2021-01-25 20:01:03 +01:00
parent c3b656c654
commit 164bd508c1
5 changed files with 1502 additions and 187 deletions

View File

@ -459,14 +459,15 @@ STATUS INFO
-----------
31............24..............16..............8...............0
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+-----------------------------------------------------+-+-+-+-+
| UNUSED |V|L|W|D|
+-----------------------------------------------------+-+-+-+-+
+---------------------------------------------------+-+-+-+-+-+
| UNUSED |M|V|L|W|D|
+---------------------------------------------------+-+-+-+-+-+
D...NOT_ALIVE_DISPOSED
W...NOT_ALIVE_NO_WRITERS
L...LIVELINESS FLAG
V...VIEW STATE
M...MARK
OUTPUT DATA
@ -608,6 +609,12 @@ The act of reading a sample sets its sample_state to READ. If the sample belongs
generation of the instance, it will also set the view_state of the instance to NOT_NEW. It will not
affect the instance_state of the instance.
https://community.rti.com/static/documentation/connext-dds/5.2.0/doc/manuals/connext_dds/html_files/RTI_ConnextDDS_CoreLibraries_UsersManual/Content/UsersManual/DESTINATION_ORDER_QosPolicy.htm#sending_2410472787_644578
Data will be delivered by a DataReader in the order in which it was sent. If data arrives on the network
with a source timestamp earlier than the source timestamp of the last data delivered, the new data will
be dropped. This ordering therefore works best when system clocks are relatively synchronized among
writing machines.
INVALIDATION
============

View File

@ -63,14 +63,11 @@
* What happens if we get a sample with a source timestamp earlier than the last sample that was accessed by the DataReader when using DESTINATION ORDER BY_SOURCE_TIMESTAMP? Is the smaple dropped?
* The spec does not define the serialized Key (KEY=1 DATA MESSAGE)
- fast-rtps assumes it is the Key Hash
-
* Currently the builtin-endpoint does only acknowledge SN, but does not negatively acknowledge any SN (Bitamp is always empty).
A writer usually responds with repqirs only to negative acknowledgements.
* Currently a RTPS Writer with DURABILITY TARNSIENT_LOCAL does send historical data to all matched readrs, not depensing if they are VOLATILE or TRANSIENT_LOCAL.
* Currently a RTPS Writer with DURABILITY TARNSIENT_LOCAL does send historical data to all matched readers, not depending if they are VOLATILE or TRANSIENT_LOCAL.
* Assert Heartbeat period > Heartbeat Suppression Period
* Can I request (NACK) SNs that were NOT announced by the writer (> last_sn in Heartbeat)?
* As it currently works, if a new sample is received and the QOS is not KEEP_ALL/RELIABLE, the oldest sample is removed.
In case of DESTINATION_ORDER = BY_SOURCE_TIMESTAMP it could happen that we effectively removed a sample that had a source timestamp later than the one we received.
* Fast-RTPS doen not follow DDSI-RTPS Specification
- Open Github Issue
@ -149,20 +146,23 @@ DESIGN DECISIONS
Use the lowest bit of the Heartbeat/Acknack Deadline stored in the Participant Data to differentiate
between Delay and Suppression. This reduces the resolution from 0.23 ns to 0.47 ns
* Originally we stored the mask of local matching endpoints in the memory frame of the remote endpoint in order
to be able to send MATCH frames only to new matches, and UNMATCH frames only to previously matched local endpoints.
This decision was reverted, and we just sent MATCH frames to the currently matched local endpoints (non depending on if they are already matched)
and UNMATCH frames to the rest of the local endpoints (non depending on if they were previously matched).
So we basically push the responsibility to the local endpoints, which have to handle this situations accordingly.
Since META traffic is not supposed to be generated as often , this should not produce any significant overhead.
As optimization, on new matched remote endpoints UNMATCH frames can be ignored.
* Originally we stored the mask of local matching endpoints in the memory frame of the remote endpoint
in order to be able to send MATCH frames only to new matches, and UNMATCH frames only to previously
matched local endpoints. This decision was reverted, and we just sent MATCH frames to the currently
matched local endpoints (non depending on if they are already matched) and UNMATCH frames to the
rest of the local endpoints (non depending on if they were previously matched).
So we basically push the responsibility to the local endpoints, which have to handle this situations
accordingly. Since META traffic is not supposed to be generated as often, this should not produce
any significant overhead. As optimization, on new matched remote endpoints UNMATCH frames can be
ignored.
* The HEARTBEATs are sent out together with the liveliness assertions. This adds a 96-Byte overhead to the output RTPS Message.
This was done to prevent having to loop through the memory to find remote participant destination more than once.
* The HEARTBEATs are sent out together with the liveliness assertions. This adds a 96-Byte overhead
to the output RTPS Message. This was done to prevent having to loop through the memory to find
remote participant destination more than once.
* The Publisher, Subscriber, and Message Data is written on separate RTPS Messages, even though they are
sent simutanously. This decision was made to support as many local Endpoints as possible. We could
make a compile-time if check and sent them in the same RTPS Message/UDP Packet, but the overhead is
make a compile-time check and sent them in the same RTPS Message/UDP Packet, but the overhead is
quite small and not worth the hassle.
* Even though the Reader does not need to keep track of received SN with respect to each Writer with
@ -176,29 +176,31 @@ DESIGN DECISIONS
In order to acoomodate for that, we could store the lowest (and possibly highest) SN of a requested
lost SN and always send ALL GAPs in that range.
* The meta_data (sample info) of a cache change is fixed size, and a cache change may be connected to data (payload),
which may be variable in size. For this reason, we store the cache change and payload in separate memories.
The payload size may either be fixed (in which case the memory frame sizes are adjusted according to that),
or may be variable, in which case the payload is stored in a linked list of predefined sized memory frames.
The first word of a payload contains the address of the next linked memory frame. If this is the last frame
(or if the payload is static and there are no linked frames), the address is MAX_ADDRESS.
The last bit of this address is the "occupied" bit. This bit signifies if the memory frame is used or free,
and is used for the insert operation to find a new empty slot. This in effect means that all frame sizes
have to be a multiple of 2 (all frame addresses have to be aligned to 2).
* The meta_data (sample info) of a cache change is fixed size, and a cache change may be connected to
data (payload), which may be variable in size. For this reason, we store the cache change and
payload in separate memories. The payload size may either be fixed (in which case the memory frame
sizes are adjusted according to that), or may be variable, in which case the payload is stored in
a linked list of predefined sized memory frames. The first word of a payload contains the address
of the next linked memory frame. If this is the last frame (or if the payload is static and there
are no linked frames), the address is MAX_ADDRESS. The last bit of this address is the "occupied"
bit. This bit signifies if the memory frame is used or free, and is used for the insert operation
to find a new empty slot. This in effect means that all frame sizes have to be a multiple of 2
(all frame addresses have to be aligned to 2).
* !REJECTED! The History Cache (HC) is the interface between RTPS and DDS. The History Cache contains the Sample Info
and Payload memories. The HC has two input "sides", one is connected to the DDS and one to the RTPS entity.
Housing the memories inside the HC entity and abstracting the direct memory address via opcode requests
allows the memory interface to be replaced in future (e.g. AXI Lite).
Since all memory operations are handled by the same entity, this allows some state keeping to improve
memory bandwidth. More specifically the "linked list" paradigm can be extended to also reference empty
slots (and next unread slots), to allow selecting empty slots without iterating through the whole memory.
Originally the memory was to be implemented in a true dual port fashion, and two seperate procoesses
would each satisfy the requests from one input side. This would allow concurrent RTPS and DDS requests
to be handled. The write concurrency (add and remove change) does not allow for state keeping (first
empty slot address), since it is reset by the "adding" side, by set by the "removing" side.
Because of this, it was decided against concurrent input handling in light of the fact that the history
cache will be most commonly quite large in size, and iterating through all
* !REJECTED! The History Cache (HC) is the interface between RTPS and DDS. The History Cache contains
the Sample Info and Payload memories. The HC has two input "sides", one is connected to the DDS
and one to the RTPS entity. Housing the memories inside the HC entity and abstracting the direct
memory address via opcode requests allows the memory interface to be replaced in future (e.g. AXI
Lite). Since all memory operations are handled by the same entity, this allows some state keeping
to improve memory bandwidth. More specifically the "linked list" paradigm can be extended to also
reference empty slots (and next unread slots), to allow selecting empty slots without iterating
through the whole memory. Originally the memory was to be implemented in a true dual port fashion,
and two seperate procoesses would each satisfy the requests from one input side. This would allow
concurrent RTPS and DDS requests to be handled. The write concurrency (add and remove change) does
not allow for state keeping (first empty slot address), since it is reset by the "adding" side, by
set by the "removing" side. Because of this, it was decided against concurrent input handling in
light of the fact that the history cache will be most commonly quite large in size, and iterating
through all...
* Since most of the DDS QoS need information that is directly available to the History Cache (HC),
it makes sense to integrate most of the DDS functionality directly into the HC to save up space
@ -222,10 +224,8 @@ PROTOCOL UNCOMPLIANCE
-> No validity check
* Inline QoS validated in Endpoint
-> Cannot invalidate Rest of Message/Packet
* RESOURCE_LIMITS applies also to "empty" samples (Samples with no valid data).
-- Input FIFO Guard
-- Output FIFO Guard
-- Deferred to package Body
RTPS ENDPOINT
=============

File diff suppressed because it is too large Load Diff

View File

@ -53,6 +53,8 @@ package rtps_config_package is
type KEY_GENERATOR_OPCODE_TYPE is (NOP, WRITE_PAYLOAD, READ_KEY, READ_SIZE);
type HISTORY_CACHE_RESPOSNE_TYPE is (UNDEFINED, ACK, ACCEPTED, REJECTED);
type INSTANCE_STATE_TYPE is (ALIVE, NOT_ALIVE_DISPOSED, NOT_ALIVE_NO_WRITERS);
type VIEW_STATE_TYPE is (NEW_INSTANCE, NOT_NEW_INSTANCE);
type SAMPLE_STATE is (READ, NOT_READ);
-- Sample Status Info Flags
constant DISPOSED_FLAG : natural := 0;
@ -66,6 +68,7 @@ package rtps_config_package is
constant NOT_ALIVE_NO_WRITERS_FLAG : natural := 1;
constant LIVELINESS_FLAG : natural := 2;
constant VIEW_FLAG : natural := 3;
constant MARK_FLAG : natural := 4;
-- Marks the Reader Endpoint in the Endpoint Array
constant ENDPOINT_READERS : std_logic_vector(0 to NUM_ENDPOINTS-1) := (0 to NUM_READERS-1 => '1', others => '0');

View File

@ -49,6 +49,35 @@ package rtps_package is
constant MAX_BITMAP_WIDTH : natural := 256;
constant KEY_HASH_WIDTH : natural := 128;
constant STATUS_INFO_WIDTH : natural := 32;
-- DDS
constant RETURN_CODE_WIDTH : natural := CDR_LONG_WIDTH;
constant STATUS_KIND_WIDTH : natural := CDR_LONG_WIDTH;
constant SAMPLE_STATE_KIND_WIDTH : natural := CDR_LONG_WIDTH;
constant VIEW_STATE_KIND_WIDTH : natural := CDR_LONG_WIDTH;
constant INSTANCE_STATE_KIND_WIDTH : natural := CDR_LONG_WIDTH;
constant QOS_POLICY_ID_WIDTH : natural := CDR_LONG_WIDTH;
constant MAX_SAMPLES_WIDTH : natural := CDR_LONG_WIDTH;
constant DISPOSED_GENERATION_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
constant NO_WRITERS_GENERATION_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
constant SAMPLE_RANK_WIDTH : natural := CDR_LONG_WIDTH;
constant GENERATION_RANK_WIDTH : natural := CDR_LONG_WIDTH;
constant ABSOLUTE_GENERATION_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
constant INCONSISTENT_TOPIC_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
constant SAMPLE_LOST_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
constant SAMPLE_REJECTED_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
constant LIVELINESS_LOST_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
constant LIVELINESS_CHANGED_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
constant OFFERED_DEADLINE_MISSED_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
constant REQUESTED_DEADLINE_MISSED_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
constant OFFERED_INCOMPATIBLE_QOS_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
constant REQUESTED_INCOMPATIBLE_QOS_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
constant PUBLICATION_MATCHED_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
constant SUBSCRIPTION_MATCHED_STATUS_COUNT_WIDTH : natural := CDR_LONG_WIDTH;
-- *TYPES DEFINITION*
-- Generic Types
@ -62,6 +91,9 @@ package rtps_package is
type GUID_TYPE is array (0 to (GUID_WIDTH/WORD_WIDTH)-1) of std_logic_vector(WORD_WIDTH-1 downto 0);
type BITMAP_TYPE is array (0 to (MAX_BITMAP_WIDTH/WORD_WIDTH)-1) of std_logic_vector(0 to WORD_WIDTH-1);
type KEY_HASH_TYPE is array (0 to (KEY_HASH_WIDTH/WORD_WIDTH)-1) of std_logic_vector(WORD_WIDTH-1 downto 0);
-- DDS
subtype INSTANCE_HANDLE_TYPE is KEY_HASH_TYPE;
subtype PUBLICATION_HANDLE_TYPE is GUID_TYPE;
-- Helper Function
function gen_duration(s,ns : integer) return DURATION_TYPE;
@ -86,6 +118,86 @@ package rtps_package is
constant UDP_PORT_INVALID : std_logic_vector(UDP_PORT_WIDTH-1 downto 0) := (others => '0');
constant IPv4_ADDRESS_INVALID : std_logic_vector(IPv4_ADDRESS_WIDTH-1 downto 0) := (others => '0');
constant LENGTH_UNLIMITED : std_logic_vector(CDR_LONG_WIDTH-1 downto 0) := std_logic_vector(to_signed(-1,CDR_LONG_WIDTH));
-- DDS
constant HANDLE_NIL : INSTANCE_HANDLE_TYPE := (others => (others => '0'));
-- *RETURN CODES* (DDS)
constant RETCODE_OK : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(0,RETURN_CODE_WIDTH));
constant RETCODE_ERROR : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(1,RETURN_CODE_WIDTH));
constant RETCODE_UNSUPPORTED : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(2,RETURN_CODE_WIDTH));
constant RETCODE_BAD_PARAMETER : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(3,RETURN_CODE_WIDTH));
constant RETCODE_PRECONDITION_NOT_MET : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(4,RETURN_CODE_WIDTH));
constant RETCODE_OUT_OF_RESOURCES : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(5,RETURN_CODE_WIDTH));
constant RETCODE_NOT_ENABLED : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(6,RETURN_CODE_WIDTH));
constant RETCODE_IMMUTABLE_POLICY : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(7,RETURN_CODE_WIDTH));
constant RETCODE_INCONSISTENT_POLICY : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(8,RETURN_CODE_WIDTH));
constant RETCODE_ALREADY_DELETED : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(9,RETURN_CODE_WIDTH));
constant RETCODE_TIMEOUT : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(10,RETURN_CODE_WIDTH));
constant RETCODE_NO_DATA : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(11,RETURN_CODE_WIDTH));
constant RETCODE_ILLEGAL_OPERATION : std_logic_vector(RETURN_CODE_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(12,RETURN_CODE_WIDTH));
-- *STATUS KIND* (DDS)
constant INCONSISTENT_TOPIC_STATUS : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := x"00000001";
constant OFFERED_DEADLINE_MISSED_STATUS : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := x"00000002";
constant REQUESTED_DEADLINE_MISSED_STATUS : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := x"00000004";
constant OFFERED_INCOMPATIBLE_QOS_STATUS : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := x"00000020";
constant REQUESTED_INCOMPATIBLE_QOS_STATUS : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := x"00000040";
constant SAMPLE_LOST_STATUS : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := x"00000080";
constant SAMPLE_REJECTED_STATUS : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := x"00000100";
constant DATA_ON_READERS_STATUS : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := x"00000200";
constant DATA_AVAILABLE_STATUS : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := x"00000400";
constant LIVELINESS_LOST_STATUS : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := x"00000800";
constant LIVELINESS_CHANGED_STATUS : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := x"00001000";
constant PUBLICATION_MATCHED_STATUS : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := x"00002000";
constant SUBSCRIPTION_MATCHED_STATUS : std_logic_vector(STATUS_KIND_WIDTH-1 downto 0) := x"00004000";
-- *SAMPLE STATE KIND* (DDS)
constant READ_SAMPLE_STATE : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := x"00000001";
constant NOT_READ_SAMPLE_STATE : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := x"00000002";
constant ANY_SAMPLE_STATE : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := x"FFFFFFFF";
-- *VIEW STATE KIND* (DDS)
constant NEW_VIEW_STATE : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := x"00000001";
constant NOT_NEW_VIEW_STATE : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := x"00000002";
constant ANY_VIEW_STATE : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := x"FFFFFFFF";
-- *INSTANCE STATE KIND* (DDS)
constant ALIVE_INSTANCE_STATE : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := x"00000001";
constant NOT_ALIVE_DISPOSED_INSTANCE_STATE : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := x"00000002";
constant NOT_ALIVE_NO_WRITERS_INSTANCE_STATE : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := x"00000004";
constant NOT_ALIVE_INSTANCE_STATE : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := x"00000006";
constant ANY_INSTANCE_STATE : std_logic_vector(SAMPLE_STATE_KIND_WIDTH-1 downto 0) := x"FFFFFFFF";
-- *SAMPLE REJECTED STATUS KIND* (DDS)
constant NOT_REJECTED : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(0,CDR_ENUMERATION_WIDTH));
constant REJECTED_BY_INSTANCES_LIMIT : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(1,CDR_ENUMERATION_WIDTH));
constant REJECTED_BY_SAMPLES_LIMIT : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(2,CDR_ENUMERATION_WIDTH));
constant REJECTED_BY_SAMPLES_PER_INSTANCE_LIMIT : std_logic_vector(CDR_ENUMERATION_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(3,CDR_ENUMERATION_WIDTH));
-- *QOS POLICY ID* (DDS)
constant INVALID_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(0,QOS_POLICY_ID_WIDTH));
constant USERDATA_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(1,QOS_POLICY_ID_WIDTH));
constant DURABILITY_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(2,QOS_POLICY_ID_WIDTH));
constant PRESENTATION_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(3,QOS_POLICY_ID_WIDTH));
constant DEADLINE_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(4,QOS_POLICY_ID_WIDTH));
constant LATENCYBUDGET_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(5,QOS_POLICY_ID_WIDTH));
constant OWNERSHIP_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(6,QOS_POLICY_ID_WIDTH));
constant OWNERSHIPSTRENGTH_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(7,QOS_POLICY_ID_WIDTH));
constant LIVELINESS_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(8,QOS_POLICY_ID_WIDTH));
constant TIMEBASEDFILTER_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(9,QOS_POLICY_ID_WIDTH));
constant PARTITION_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(10,QOS_POLICY_ID_WIDTH));
constant RELIABILITY_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(11,QOS_POLICY_ID_WIDTH));
constant DESTINATIONORDER_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(12,QOS_POLICY_ID_WIDTH));
constant HISTORY_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(13,QOS_POLICY_ID_WIDTH));
constant RESOURCELIMITS_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(14,QOS_POLICY_ID_WIDTH));
constant ENTITYFACTORY_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(15,QOS_POLICY_ID_WIDTH));
constant WRITERDATALIFECYCLE_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(16,QOS_POLICY_ID_WIDTH));
constant READERDATALIFECYCLE_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(17,QOS_POLICY_ID_WIDTH));
constant TOPICDATA_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(18,QOS_POLICY_ID_WIDTH));
constant GROUPDATA_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(19,QOS_POLICY_ID_WIDTH));
constant TRANSPORTPRIORITY_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(20,QOS_POLICY_ID_WIDTH));
constant LIFESPAN_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(21,QOS_POLICY_ID_WIDTH));
constant DURABILITYSERVICE_QOS_POLICY_ID : std_logic_vector(QOS_POLICY_ID_WIDTH-1 downto 0) := std_logic_vector(to_unsigned(22,QOS_POLICY_ID_WIDTH));
-- *SUBMESSAGE IDs*
constant SID_PAD : std_logic_vector(SUBMESSAGE_ID_WIDTH-1 downto 0) := x"01";