OpenDDS  Snapshot(2023/04/28-20:55)
RtpsUdpSendStrategy.h
Go to the documentation of this file.
1 /*
2  * Distributed under the OpenDDS License.
3  * See: http://www.opendds.org/license.html
4  */
5 
6 #ifndef OPENDDS_DCPS_TRANSPORT_RTPS_UDP_RTPSUDPSENDSTRATEGY_H
7 #define OPENDDS_DCPS_TRANSPORT_RTPS_UDP_RTPSUDPSENDSTRATEGY_H
8 
9 #include "Rtps_Udp_Export.h"
10 #include "RtpsUdpDataLink_rch.h"
11 
13 #include <dds/DCPS/AtomicBool.h>
16 
17 #ifdef OPENDDS_SECURITY
18 # include <dds/DdsSecurityCoreC.h>
19 #endif
20 
21 #include <ace/SOCK_Dgram.h>
22 
24 
25 namespace OpenDDS {
26 namespace DCPS {
27 
28 class RtpsUdpInst;
29 
31  : public TransportSendStrategy {
32 public:
34  const GuidPrefix_t& local_prefix);
35 
36  virtual void stop_i();
37 
38  struct OverrideToken {
39  explicit OverrideToken(RtpsUdpSendStrategy* outer) : outer_(outer) {}
40  ~OverrideToken();
42  };
43  friend struct OverrideToken;
44 
45  OverrideToken override_destinations(const NetworkAddress& destination);
46  OverrideToken override_destinations(
47  const AddrSet& destinations);
48 
49  void send_rtps_control(RTPS::Message& message,
50  ACE_Message_Block& submessages,
51  const NetworkAddress& destination);
52  void send_rtps_control(RTPS::Message& message,
53  ACE_Message_Block& submessages,
54  const AddrSet& destinations);
55  void append_submessages(const RTPS::SubmessageSeq& submessages);
56 
57 #if defined(OPENDDS_SECURITY)
58  void encode_payload(const GUID_t& pub_id, Message_Block_Ptr& payload,
59  RTPS::SubmessageSeq& submessages);
60 #endif
61 
62  // NOTE: The header and footer sizes are dependent on the built-in crypto plugin.
63  static const size_t MaxCryptoHeaderSize = 20;
64  static const size_t MaxCryptoFooterSize = 20;
65  static const size_t MaxSecurePrefixSize = RTPS::SMHDR_SZ + MaxCryptoHeaderSize;
66  static const size_t MaxSubmessagePadding = RTPS::SM_ALIGN - 1;
67  static const size_t MaxSecureSuffixSize = RTPS::SMHDR_SZ + MaxCryptoFooterSize;
68  static const size_t MaxSecureSubmessageLeadingSize = MaxSecurePrefixSize;
69  static const size_t MaxSecureSubmessageFollowingSize =
70  RTPS::SMHDR_SZ /* SEC_BODY */ + MaxSecureSuffixSize;
71  static const size_t MaxSecureSubmessageAdditionalSize =
72  MaxSecureSubmessageLeadingSize + MaxSubmessagePadding + MaxSecureSubmessageFollowingSize;
73  static const size_t MaxSecureFullMessageLeadingSize =
74  RTPS::SMHDR_SZ + RTPS::INFO_SRC_SZ + MaxSecurePrefixSize;
75  static const size_t MaxSecureFullMessageFollowingSize = MaxSecureSuffixSize;
76  static const size_t MaxSecureFullMessageAdditionalSize =
77  MaxSecureFullMessageLeadingSize + MaxSubmessagePadding + MaxSecureFullMessageFollowingSize;
78 
79 #ifdef OPENDDS_SECURITY
80  virtual Security::SecurityConfig_rch security_config() const;
81 #endif
82 
83 protected:
84  virtual ssize_t send_bytes_i(const iovec iov[], int n);
85  ssize_t send_bytes_i_helper(const iovec iov[], int n);
86 
87  virtual size_t max_message_size() const;
88 
89  virtual void add_delayed_notification(TransportQueueElement* element);
90 
91 private:
92  bool marshal_transport_header(ACE_Message_Block* mb);
93  ssize_t send_multi_i(const iovec iov[], int n,
94  const AddrSet& addrs);
95  const ACE_SOCK_Dgram& choose_send_socket(const NetworkAddress& addr) const;
96  ssize_t send_single_i(const iovec iov[], int n,
97  const NetworkAddress& addr);
98 
99 #ifdef OPENDDS_SECURITY
100  ACE_Message_Block* pre_send_packet(const ACE_Message_Block* plain);
101 
102  struct Chunk {
103  const char* start_;
104  unsigned int length_;
106  };
107 
108  bool encode_writer_submessage(const GUID_t& sender,
109  const GUID_t& receiver,
110  OPENDDS_VECTOR(Chunk)& replacements,
112  const DDS::OctetSeq& plain,
114  const char* submessage_start, CORBA::Octet msgId);
115 
116  bool encode_reader_submessage(const GUID_t& sender,
117  const GUID_t& receiver,
118  OPENDDS_VECTOR(Chunk)& replacements,
120  const DDS::OctetSeq& plain,
122  const char* submessage_start, CORBA::Octet msgId);
123 
124  ACE_Message_Block* encode_submessages(const ACE_Message_Block* plain,
126  bool& stateless_or_volatile);
127 
128  ACE_Message_Block* encode_rtps_message(const ACE_Message_Block* plain,
130 
131  ACE_Message_Block* replace_chunks(const ACE_Message_Block* plain,
132  const OPENDDS_VECTOR(Chunk)& replacements);
133 #endif
134 
136  const AddrSet* override_dest_;
138 
139  const size_t max_message_size_;
142  char rtps_header_data_[RTPS::RTPSHDR_SZ];
147 };
148 
149 } // namespace DCPS
150 } // namespace OpenDDS
151 
153 
154 #endif /* DCPS_RTPSUDPSENDSTRATEGY_H */
sequence< Submessage > SubmessageSeq
Definition: RtpsCore.idl:885
const ACE_CDR::UShort INFO_SRC_SZ
Definition: MessageTypes.h:110
const ACE_CDR::UShort RTPSHDR_SZ
Definition: MessageTypes.h:105
int ssize_t
const ACE_CDR::UShort SMHDR_SZ
Definition: MessageTypes.h:106
NativeCryptoHandle DatawriterCryptoHandle
NativeCryptoHandle DatareaderCryptoHandle
sequence< octet > OctetSeq
Definition: DdsDcpsCore.idl:64
const NetworkAddress * override_single_dest_
octet GuidPrefix_t[12]
Definition: DdsDcpsGuid.idl:19
ACE_CDR::Octet Octet
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
typedef OPENDDS_VECTOR(ActionConnectionRecord) ConnectionRecords
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28
Base wrapper class around a data/control sample to be sent.
const size_t SM_ALIGN
Alignment of RTPS Submessage.
Definition: MessageTypes.h:113
#define OpenDDS_Rtps_Udp_Export