OpenDDS  Snapshot(2023/04/28-20:55)
MessageUtils.h
Go to the documentation of this file.
1 /*
2  *
3  *
4  * Distributed under the OpenDDS License.
5  * See: http://www.opendds.org/license.html
6  */
7 
8 #ifndef OPENDDS_DCPS_RTPS_MESSAGEUTILS_H
9 #define OPENDDS_DCPS_RTPS_MESSAGEUTILS_H
10 
11 #include "RtpsCoreTypeSupportImpl.h"
12 #include "rtps_export.h"
13 
14 #include <dds/DCPS/Hash.h>
15 #include <dds/DCPS/Util.h>
17 #include <dds/DCPS/Serializer.h>
20 #include <dds/DCPS/TimeTypes.h>
21 #include <dds/DCPS/GuidConverter.h>
22 
23 #include <dds/DdsDcpsInfoUtilsC.h>
24 #include <dds/DdsDcpsInfoUtilsTypeSupportImpl.h>
25 
26 #include <ace/INET_Addr.h>
27 #include <ace/Message_Block.h>
28 
29 #include <cstring>
30 
32 
33 namespace OpenDDS {
34 namespace RTPS {
35 
36 using DCPS::GuidPrefix_t;
37 using DCPS::GUID_t;
38 using DCPS::assign;
39 using DCPS::EntityId_t;
40 using DCPS::GUID_tKeyLessThan;
41 using DCPS::LogGuid;
42 using DCPS::String;
43 using DCPS::SequenceNumber;
44 using DCPS::TimeDuration;
48 using DCPS::RcHandle;
49 
50 template <typename T>
51 void marshal_key_hash(const T& msg, KeyHash_t& hash)
52 {
53  using DCPS::Serializer;
54  using DCPS::Encoding;
55  typedef DCPS::MarshalTraits<T> Traits;
56 
57  DCPS::KeyOnly<const T> ko(msg);
58 
59  static const size_t hash_limit = 16;
60  std::memset(hash.value, 0, hash_limit);
61 
64  Traits::key_only_serialized_size_bound(encoding);
65 
66  if (bound && bound.get() <= hash_limit) {
67  // If it is bounded and can always fit in 16 bytes, we will use the
68  // marshaled key
69  ACE_Message_Block mb(hash_limit);
70  Serializer out_serializer(&mb, encoding);
71  out_serializer << ko;
72  std::memcpy(hash.value, mb.rd_ptr(), mb.length());
73 
74  } else {
75  // We will use the hash of the marshaled key
76  ACE_Message_Block mb(serialized_size(encoding, ko));
77  Serializer out_serializer(&mb, encoding);
78  out_serializer << ko;
79 
80  DCPS::MD5Hash(hash.value, mb.rd_ptr(), mb.length());
81  }
82 }
83 
86 
89  DCPS::LocatorSeq& locators,
90  bool* requires_inline_qos = 0,
91  unsigned int* pBytesRead = 0);
92 
94 void locators_to_blob(const DCPS::LocatorSeq& locators,
95  DCPS::TransportBLOB& blob);
96 
99 
100 template <typename T>
101 void message_block_to_sequence(const ACE_Message_Block& mb_locator, T& out)
102 {
103  out.length (CORBA::ULong(mb_locator.length()));
104  std::memcpy (out.get_buffer(), mb_locator.rd_ptr(), mb_locator.length());
105 }
106 
107 #ifndef OPENDDS_SAFETY_PROFILE
108 
109 inline bool operator==(const Duration_t& x, const Duration_t& y)
110 {
111  return x.seconds == y.seconds && x.fraction == y.fraction;
112 }
113 
114 inline bool operator==(const VendorId_t& v1, const VendorId_t& v2)
115 {
116  return (v1.vendorId[0] == v2.vendorId[0] && v1.vendorId[1] == v2.vendorId[1]);
117 }
118 
119 #endif
120 
121 inline bool operator<(const ProtocolVersion_t& v1, const ProtocolVersion_t& v2)
122 {
123  return (v1.major < v2.major || (v1.major == v2.major && v1.minor < v2.minor));
124 }
125 
127 DCPS::TimeDuration rtps_duration_to_time_duration(const Duration_t& rtps_duration, const ProtocolVersion_t& version, const VendorId_t& vendor);
128 
130 bool bitmapNonEmpty(const SequenceNumberSet& snSet);
131 
133 {
134  DCPS::SequenceNumber opendds_seqnum;
135  opendds_seqnum.setValue(rtps_seqnum.high, rtps_seqnum.low);
136  return opendds_seqnum;
137 }
138 
140 {
141  RTPS::SequenceNumber_t rtps_seqnum;
142  rtps_seqnum.high = opendds_seqnum.getHigh();
143  rtps_seqnum.low = opendds_seqnum.getLow();
144  return rtps_seqnum;
145 }
146 
147 inline void append_submessage(RTPS::Message& message, const RTPS::InfoDestinationSubmessage& submessage)
148 {
149  RTPS::Submessage sm;
150  sm.info_dst_sm(submessage);
151  DCPS::push_back(message.submessages, sm);
152 }
153 
154 inline void append_submessage(RTPS::Message& message, const RTPS::InfoTimestampSubmessage& submessage)
155 {
156  RTPS::Submessage sm;
157  sm.info_ts_sm(submessage);
158  DCPS::push_back(message.submessages, sm);
159 }
160 
161 inline void append_submessage(RTPS::Message& message, const RTPS::DataSubmessage& submessage)
162 {
163  RTPS::Submessage sm;
164  sm.data_sm(submessage);
165  DCPS::push_back(message.submessages, sm);
166 }
167 
168 inline void append_submessage(RTPS::Message& message, const RTPS::DataFragSubmessage& submessage)
169 {
170  RTPS::Submessage sm;
171  sm.data_frag_sm(submessage);
172  DCPS::push_back(message.submessages, sm);
173 }
174 
175 #ifdef OPENDDS_SECURITY
178 {
179  using namespace DDS::Security;
180 
182  if (sec_attr.is_rtps_protected) {
184  }
185  if (sec_attr.is_discovery_protected) {
187  }
188  if (sec_attr.is_liveliness_protected) {
190  }
191  return result;
192 }
193 
196 {
197  using namespace DDS::Security;
198 
200 
201  if (sec_attr.base.is_read_protected)
203 
204  if (sec_attr.base.is_write_protected)
206 
207  if (sec_attr.base.is_discovery_protected)
209 
210  if (sec_attr.base.is_liveliness_protected)
212 
213  if (sec_attr.is_submessage_protected)
215 
216  if (sec_attr.is_payload_protected)
218 
219  if (sec_attr.is_key_protected)
221 
222  return result;
223 }
224 
225 inline DDS::OctetSeq
227 {
228  DDS::OctetSeq handleOctets(sizeof handle);
229  handleOctets.length(handleOctets.maximum());
230  unsigned char* rawHandleOctets = handleOctets.get_buffer();
231  unsigned int handleTmp = handle;
232  for (unsigned int j = sizeof handle; j > 0; --j) {
233  rawHandleOctets[j - 1] = handleTmp & 0xff;
234  handleTmp >>= 8;
235  }
236  return handleOctets;
237 }
238 #endif
239 
240 } // namespace RTPS
241 } // namespace OpenDDS
242 
244 
245 #endif /* OPENDDS_DCPS_RTPS_MESSAGEUTILS_H */
const EndpointSecurityAttributesMask ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_LIVELINESS_PROTECTED
std::string String
const ParticipantSecurityAttributesMask PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_LIVELINESS_PROTECTED
const ParticipantSecurityAttributesMask PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_RTPS_PROTECTED
const EndpointSecurityAttributesMask ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_PAYLOAD_PROTECTED
size_t length(void) const
int hash(const std::vector< const DDS::OctetSeq *> &src, DDS::OctetSeq &dst)
void MD5Hash(MD5Result &result, const void *input, size_t size)
Definition: Hash.cpp:323
InfoDestinationSubmessage info_dst_sm
Definition: RtpsCore.idl:857
sequence< Locator_t > LocatorSeq
TimePoint_T< SystemClock > SystemTimePoint
Definition: TimeTypes.h:32
void serialized_size(const Encoding &encoding, size_t &size, const SequenceNumber &)
char * rd_ptr(void) const
const ParticipantSecurityAttributesMask PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_VALID
bool bitmapNonEmpty(const SequenceNumberSet &snSet)
const EndpointSecurityAttributesMask ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_SUBMESSAGE_PROTECTED
DCPS::TimeDuration rtps_duration_to_time_duration(const Duration_t &rtps_duration, const ProtocolVersion_t &version, const VendorId_t &vendor)
ACE_CDR::ULong ULong
Class to serialize and deserialize data for DDS.
Definition: Serializer.h:369
const EndpointSecurityAttributesMask ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_WRITE_PROTECTED
#define OpenDDS_Rtps_Export
Definition: rtps_export.h:23
bool operator==(const Duration_t &x, const Duration_t &y)
Definition: MessageUtils.h:109
const EndpointSecurityAttributesMask ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_DISCOVERY_PROTECTED
unsigned long fraction
Definition: RtpsCore.idl:106
void message_block_to_sequence(const ACE_Message_Block &mb_locator, T &out)
Definition: MessageUtils.h:101
unsigned long EndpointSecurityAttributesMask
TimePoint_T< MonotonicClock > MonotonicTimePoint
Definition: TimeTypes.h:51
const EndpointSecurityAttributesMask ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_VALID
OpenDDS_Rtps_Export DCPS::LocatorSeq transport_locator_to_locator_seq(const DCPS::TransportLocator &info)
sequence< octet > OctetSeq
Definition: DdsDcpsCore.idl:64
DDS::OctetSeq handle_to_octets(DDS::Security::NativeCryptoHandle handle)
Definition: MessageUtils.h:226
void append_submessage(RTPS::Message &message, const RTPS::InfoDestinationSubmessage &submessage)
Definition: MessageUtils.h:147
void push_back(Seq &seq, const typename Seq::value_type &val)
std::vector-style push_back() for CORBA Sequences
Definition: Util.h:138
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
unsigned long ParticipantSecurityAttributesMask
void marshal_key_hash(const T &msg, KeyHash_t &hash)
Definition: MessageUtils.h:51
Sequence number abstraction. Only allows positive 64 bit values.
octet GuidPrefix_t[12]
Definition: DdsDcpsGuid.idl:19
const DCPS::Encoding & get_locators_encoding()
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
void assign(EntityId_t &dest, const EntityId_t &src)
Definition: GuidUtils.h:157
InfoTimestampSubmessage info_ts_sm
Definition: RtpsCore.idl:848
DDS::ReturnCode_t blob_to_locators(const DCPS::TransportBLOB &blob, DCPS::LocatorSeq &locators, bool *requires_inline_qos, unsigned int *pBytesRead)
RTPS::SequenceNumber_t to_rtps_seqnum(const DCPS::SequenceNumber &opendds_seqnum)
Definition: MessageUtils.h:139
DataFragSubmessage data_frag_sm
Definition: RtpsCore.idl:872
const DCPS::Encoding encoding(DCPS::Encoding::KIND_UNALIGNED_CDR, DCPS::ENDIAN_BIG)
DDS::OctetSeq TransportBLOB
DataSubmessage data_sm
Definition: RtpsCore.idl:869
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28
void locators_to_blob(const DCPS::LocatorSeq &locators, DCPS::TransportBLOB &blob)
const ParticipantSecurityAttributesMask PARTICIPANT_SECURITY_ATTRIBUTES_FLAG_IS_DISCOVERY_PROTECTED
DCPS::SequenceNumber to_opendds_seqnum(const RTPS::SequenceNumber_t &rtps_seqnum)
Definition: MessageUtils.h:132
SubmessageSeq submessages
Definition: RtpsCore.idl:903
const EndpointSecurityAttributesMask ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_READ_PROTECTED
DDS::Security::ParticipantSecurityAttributesMask security_attributes_to_bitmask(const DDS::Security::ParticipantSecurityAttributes &sec_attr)
Definition: MessageUtils.h:177
bool operator<(const ProtocolVersion_t &v1, const ProtocolVersion_t &v2)
Definition: MessageUtils.h:121
const EndpointSecurityAttributesMask ENDPOINT_SECURITY_ATTRIBUTES_FLAG_IS_KEY_PROTECTED
DDS::OctetArray16 value
Definition: RtpsCore.idl:151