Unisys.JCR.2
1.3.2
DDS Protocol
valuetype
Class
interactionUse
Interaction
Component View
Data types
realize
Abstraction
Protocol
Discovery
DomainParticipant
Participant
ParticipantDiscovery
discovered_participant_add
a_participant_desc
discovered_participant_remove
a_guid
DiscoveredParticipantData
SimpleDiscovery
SPDPbuiltinParticipantWriter
SPDPbuiltinParticipantReader
SPDPdiscoveredParticipantData
leaseDuration
ParcicipantDiscoveryImpl
DiscoveredWriterData
DiscoveredReaderData
contentFilter
documentation
documentation
>
DiscoveredTopicData
BuiltinEndpoints
builtinParticipantReader
rtpsBuiltinParticipantWriter
builtinSubscriptionsWriter
builtinParticipantWriter
rtpsBuiltinParticipantReader
SEDPbuiltinTopicsWriter
SEDPbuiltinPublicationsReader
builtinPublicationsWriter
BuiltinEndpointSet_t
PARTICIPANT_WRITER = 0x2
PARTICIPANT_READER = 0x1
PUBLICATIONS_WRITER = 0x8
PUBLICATIONS_READER = 0x4
SUBSCRPTIONS_WRITER = 0x20
SUBSCRIPTIONS_READER = 0x10
TOPIC_WRITER = 0x80
TOPIC_READER = 0x40
builtinPublicationsReader
SEDPbuiltinSubscriptionsReader
builtinTopicsReader
SEDPbuiltinPublicationsWriter
SEDPbuiltinSubscriptionsWriter
SEDPbuiltinTopicsReader
builtinSubscriptionsReader
builtinTopicsWriter
ModelElement
ContentFilterProperty_t
Contents of the respective HistoryCache
<<contains>>
<<contains>>
<<contains>>
<<contains>>
<<contains>>
Indicates the type of the data-objects contained in the HistoryCache
Behavior
(Analysis) - Behavior sequence diagram
SequenceDiagram
Interaction
(Analysis) - Best-efforts communications
SequenceDiagram
Interaction
(Analysis) - Reliable communications
SequenceDiagram
Interaction
dw
writer_cache
w
reader_cache
r
dr
User1
User2
Instance
dw1
hc1
Instance3
User3
dw2
wc2
w2
rc2
r2
dr2
User4
network
Overview
whc
rhc
remove_change( seq_num )
remove_change
seq_num
add_change( a_change )
add_change
a_change
return
new_change( kind, data, a_handle )
kind
data
a_handle
return
finish()
remove_change( seq_num )
seq_num
return
return
write( data, a_handle )
write
data
a_handle
take()
get_change( seq_num )
seq_num
return
return
ACKNACK
ReaderProxy.acked_changes_set( seq_num )
acked_changes_set
ReaderProxy
seq_num
is_acked_by_all( seq_num )
seq_num
return
seq_num
return
a_change
return
DATA; HEARTBEAT
add_change( a_change )
add_change
a_change
return
DATA
DATA; HEARTBEAT
ACKNACK
user
Writer Behavior
alive
new DDS DataWriter/
new RTPS Writer
delete DDS DataWriter
delete RTPS Writer
DW::dispose(data, handle)/
if ( W::topicKind == WITH_KEY ) {
a_change := W::new_change(NOT_ALIVE_DISPOSED,
<nil>, handle)
WHC::add_change(a_change)
}
DW::write(data, handle)/
a_change := W::new_change(ALIVE,
data, handle)
WHC::add_change(a_change)
DW::unregister(data, handle)/
if ( W::topicKind==WITH_KEY ) {
a_change := W::new_change(NOT_ALIVE_UNREGISTERED, <nil>, handle)
WHC::add_change(a_change)
}
BE StatefulWriter WithKey
send_data
send_gap
ready_to_send
pushing
idle
ready
new ReaderProxy
RP::unsent_changes() != <empty>
RP::unsent_changes() == <empty>
is_relevant == true
send DATA (seq_num_next)
is_relevant == false
send GAP (seq_num_next)
RP::can_send() == true
change := RP::next_unsent_change()
send DATA(change) | GAP(change.seq_num)
delete ReaderProxy
WHC::add_change(a_change)
add a_change to RP::changes_for_reader
BE StatefulReader WithKey
waiting
accept
new WriterProxy
delete WriterProxy
RHC::add_change( a_change )
add a_change {WP::received_changes}
update WP::irrelevant_changes
q
[a_change.seq_num > MAX{WP::received_changes}]
a_change := DATA | GAP/
next_expected_sn := WP::received_changes_max() + 1
DATA
expected_seq_num := WP::available_changes_max()+1
a_change_list := GAP
else
else
GAP
FOREACH seq_num IN GAP.irrelevant_changes_list
WP::irrelevant_changes_set(seq_num)
a_change.sequenceNumber >= expected_seq_num
a_change := DATA
RHC::add_change(a_change)
WP::received_change_set(a_change.sequenceNumber)
WP::lost_changes_update(a_change.sequenceNumber)
obsolete Reliable Stateful Writer
pushing
announcing
idle
repairing
waiting
must_repair
new ReaderProxy/
RP::unsent_changes != <empty>
RP::unsent_changes == <empty>
RP::can_send() == true
seq_num_next := RP::unsent_changes_min()
RP::unsent_changes_remove(seq_num_next)
is_relevant := RP::is_relevant(seq_num_next)
if (is_relevant) send DATA (seq_num_next)
else send GAP (seq_num_next)
WHC:get_change_max()
== RP:acked_changes_min()
WHC:get_change_max()
> RP:acked_changes_min()
W::repeatAnnouncePeriod
send HEARTBEAT.F
ACKNACK
RP::requested_changes_add(ACKNACK,requested_sns)
RP::acked_changes_add(ACKNACK.acked_sns)
PR::requested_changes != <empty>
RP::requested_changes == <empty>
W::responseDelayDuration
ACKNACK
RP::requested_changes_add(ACKNACK,requested_sns)
RP::acked_changes_add(ACKNACK.acked_sns)
RP::can_send() == true
seq_num_next := RP::requested_changes_min()
RP::requested_changes_remove(seq_num_next)
is_relevant := RP::is_relevant(seq_num_next)
if (is_relevant) send DATA (seq_num_next)
else send GAP (seq_num_next)
delete WriterProxy
is_relevant
send DATA (seq_num_next)
obsolete Reliable StatefulReader
waiting
may_send_ack
must_send_ack
ready
new WriterProxy
HEARTBEAT
HEARTBEAT.F == 1
HEARTBEAT.F == 0
WP::missing_changes != <empty>
GAP
foreach change in GAP do:
RHC::add_change(change)
WP::received_changes_add(change)
WP::missing_changes_remove(change)
WP::irrelevant_changes_add(change)
HEARTBEAT
seq_num)
WP::missing_changes_update(HEARTBEAT
delete ReaderProxy
WP::missing_changes == <empty>
R::responseDelayDuration
send ACKNACK
DATA
a_change := DATA
RHC::add_change(a_change)
WP::received_changes_add(a_change)
WP::missing_changes_remove(a_change)
Reliable StatefulWriter
announcing
idle
pushing
repairing
must_repair
waiting
ready
RP::requested_changes()
== <empty>
new ReaderProxy/
RP::can_send() == true
change := RP::next_requested_change()
send DATA(change) | GAP(change.seq_num)
RP::requested_changes() != <empty>
RP::unsent_changes() != <empty>
RP::unsent_changes() == <empty>
W::heartbeatPeriod
send HEARTBEAT(FinalFlag:=NOT_SET)
RP::unacked_changes()
== <empty>
RP::unacked_changes
!= <empty>
W::nackResponseDelay
ACKNACK
RP::acked_changes_set(ACKNACK)
RP::requested_changes_set(ACKNACK)
RP::can_send() == true
change := RP::next_unsent_change()
send DATA(change) | GAP(change.seq_num)
ACKNACK
RP::acked_changes_set(ACKNACK)
RP::requested_changes_set(ACKNACK)
delete ReaderProxy
is_relevant
send DATA (seq_num_next)
WHC::add_change(a_change)
add a_change to RP::changes_for_reader
WHC::remove_change(a_change)
ChangeForReader status
Acknowledged
Unsent
Requested
Unacknowledged
Underway
New
received NACK(seq_num)
received ACK(seq_num)
W::pushMode == true
W::pushMode == false
RP::nackSuppressionDuration
sent DATA(seq_num) | sent GAP(seq_num)
new ChangeForReader (seq_num)
Reliable StatefulReader
must_send_ack
may_send_ack
waiting
ready
WP::missing_changes() != <empty>
new WriterProxy
HEARTBEAT
firstSN)
WP::missing_changes_update(HEARTBEAT.lastSN)
WP::lost_changes_update(HEARTBEAT
GAP
FOREACH seq_num IN GAP.
WP::irrelevant_change_set (seq_num)
WP::missing_changes() == <empty>
HEARTBEAT.FinalFlag==SET
DATA
sequenceNumber)
a_change := DATA
RHC::add_change (a_change)
WP::received_change_set (
a_change
R::heartbeatResponseDelay
send ACKNACK
HEARTBEAT.FinalFlag==NOT_SET
HEARTBEAT
delete WriterProxy
Reliable StatelessWriter
announcing
idle
pushing
repairing
waiting
must_repair
new ReaderLocator/
RL::requested_changes() != <empty>
RL::unsent_changes() == <empty>
RL::unsent_changes() != <empty>
RL::can_send() == true
change := RL::next_requested_change()
send DATA(change.seq_num) | GAP(change.seq_num)
RL::requested_changes()
== <empty>
W::nackResponseDelay
RP:unacked_changes
!= <empty>
RP:unacked_changes()
== <empty>
W::heartbeatPeriod
send HEARTBEAT(FinalFlag=SET)
ACKNACK
RL::requested_changes_set(ACKNACK)
ACKNACK
RL::requested_changes_set(ACKNACK)
RL::can_send() == true
change := RL::next_unsent_change()
send DATA(change.seq_num)
delete ReaderLocator
is_relevant
send DATA (seq_num_next)
BE StatelessReader Behavior
waiting
DATA
else
delete RTPS Reader
new RTPS Reader
GAP
FOREACH seq_num IN GAP.gapList
R::irrelevant_changes_set(seq_num)
DATA
a_change := DATA
RHC::add_change(a_change)
Reader Behavior
alive
delete DDS DataReader
delete RTPS Reader
new DDS DataReader/
new RTPS Reader
DR::take()/
a_change_list = new();
FOREACH change in R::available_changes() {
a_change_list += change;
R::reader_cache.remove_change(a_change);
}
RETURN a_change_list;
DR::read()/
a_change_list = new();
FOREACH change in R::available_changes() {
a_change_list += change;
}
RETURN a_change_list;
ChangeFromWriter status
Received
Lost
Missing
Requested
Unknown
received DATA(seq_num) |
received NOKEYDATA(seq_num) |
received GAP(seq_num)
received HB( firstSN > seq_num )
received HB (firstSN <= seq_num <= lastSN )
sent NACK ( seq_num )
new ChangeFromWriter (seq_num )
BE StatelessWriter Behavior
idle
pushing
announcing
pushing
idle
repairing
waiting
must_repair
RL::can_send() == true
change := RL::next_unsent_change()
send DATA(change.seq_num) | GAP(change.seq_num)
RL::unsent_changes() != <empty>
RL::unsent_changes() == <empty>
delete ReaderLocator
new ReaderLocator
is_relevant
send DATA (seq_num_next)
RP:unacked_changes()
== <empty>
RP:unacked_changes
!= <empty>
ACKNACK
RL::requested_changes_set(ACKNACK)
ACKNACK
RL::requested_changes_set(ACKNACK)
W::responseDelayDuration
RL::requested_changes()
== <empty>
RL::can_send() == true
change := RL::next_requested_change()
send DATA(change.seq_num) | GAP(change.seq_num)
RL::requested_changes() != <empty>
RL::can_send() == true
change := RL::next_unsent_change()
send DATA(change.seq_num) | GAP(change.seq_num)
W::repeatAnnouncePeriod
send HEARTBEAT(FinalFlag=SET)
RL::unsent_changes() != <empty>
RL::unsent_changes() == <empty>
new ReaderLocator/
Messages
Header
protocol
version
vendorId
guidPrefix
NoKeyData
readerId
writerId
writerSN
inlineQos
serializedData
Submessage
Message
Heartbeat
readerId
writerId
firstSN
lastSN
count
AckNack
readerId
writerId
readerSNState
count
Gap
readerId
writerId
gapStart
gapList
Data
extraFlags
octetsToInlineQos
readerId
writerId
writerSN
inlineQos
serializedData
InfoSource
protocolVersion
vendorId
guidPrefix
InfoDestination
guidPrefix
InfoTimestamp
timestamp
InfoReplyIp4
unicastLocator
multicastLocator
Pad
VendorId_t
LifecycleState
SubmessageKind
SubmessageFlagKind
1
1
1
1
1
-1
1
1
Receiver
sourceVersion
sourceVendorId
sourceGuidPrefix
destGuidPrefix
unicastReplyLocatorList
multicastReplyLocatorList
haveTimestamp
timestamp
submessage-element
Class
parameter
SubmessageHeader
submessageId
submessageLength
flags
8
8
1
1
1
1
1
1
-1
-1
InfoReply
multicastLocatorList
unicastLocatorList
SubmessageElements
EntityId
value
KeyHash
GuidPrefix
value
LocatorUDPv4
value
LocatorList
value
-1
-1
Parameter
parameterId
length
value
length
length
ParameterList
ProtocolVersion
value
SequenceNumber
value
SequenceNumberSet
base
set
-1
-1
SubmessageElement
Timestamp
value
VendorId
value
SerializedPayload
value
-1
-1
Count
value
Flags
value
32
32
value
SerializedPayloadFragment
value
-1
-1
ProtocolVersion_t
ProtocolId_t
suffix
prefix
KeyHashPrefix_t
KeyHashSuffix_t
Protocol
Messages
SubmessageFlag
FragmentNumber
value
FragmentNumber_t
FragmentNumberSet
base
set
-1
-1
DataFrag
extraFlags
octetsToInlineQos
readerId
writerId
writerSN
inlineQos
serializedData
fragmentStartingNum
fragmentsInSubmessage
dataSize
fragmentSize
NoKeyDataFrag
readerId
writerId
writerSN
inlineQos
serializedData
fragmentStartingNum
fragmentsInSubmessage
dataSize
fragmentSize
NackFrag
readerId
writerId
fragmentNumberState
count
writerSN
HeartbeatFrag
readerId
writerId
writerSN
lastFragmentNum
count
Structure
Domain
Entity
guid
Endpoint
Participant
protocolVersion
PROTOCOL_VERSION_1_0
vendorId
PROTOCOL_VENDOR_UNKNOWN
defaultUnicastLocatorList
{}
defaultMulticastLocatorList
{}
topicKind
reliabilityLevel
unicastLocatorList
-1
-1
multicastLocatorList
-1
-1
Writer
pushMode
heartbeatPeriod
nackResponseDelay
new_change
kind
data
a_handle
nackSuppressionDuration
lastChangeSequenceNumber
0
Reader
Enumeration
expectsInlineQos
FALSE
heartbeatResponseDelay
heartbeatSuppressionDuration
ReaderProxy
remoteReaderGuid
expectsInlineQos
FALSE
unicastLocatorList
-1
-1
acked_changes_set
seq_num
next_requested_change
next_unsent_change
requested_changes
requested_changes_set
unsent_changes
multicastLocatorList
-1
-1
unacked_changes
WriterProxy
remoteWriterGuid
unicastLocatorList
0
-1
multicastLocatorList
0
-1
available_changes_max
irrelevant_change_set
lost_changes_update
missing_changes_update
received_change_set
missing_changes
SingleKeyWriter
Generalization
SingleKeyReader
Generalization
MultiKeyWriter
Generalization
MultiKeyReader
Generalization
CacheChange
kind
writerGuid
instanceHandle
sequenceNumber
Data
HistoryCache
add_change
a_change
remove_change
seq_num
get_change
seq_num
get_seq_num_min
get_seq_num_max
StatefulWriter
Generalization
is_acked_by_all
seq_num
matched_reader_add
a_proxy
matched_reader_remove
StatefulReader
Generalization
matched_writer_add
a_proxy
matched_writer_remove
matched_writer_lookup
StatelessWriter
Generalization
resendDataPeriod
reader_locator_add
a_locator
reader_locator_remove
unsent_changes_reset
StatelessReader
Generalization
ReaderLocator
locator
-1
-1
next_requested_change
next_unsent_change
requested_changes
requested_changes_set
unsent_changes