OpenDDS  Snapshot(2023/04/28-20:55)
RtpsUdpInst.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_TRANSPORT_RTPS_UDP_RTPSUDPINST_H
9 #define OPENDDS_DCPS_TRANSPORT_RTPS_UDP_RTPSUDPINST_H
10 
11 #include "Rtps_Udp_Export.h"
12 #include "RtpsUdpTransport_rch.h"
13 
16 #include <dds/DCPS/RTPS/ICE/Ice.h>
18 
20 
21 namespace OpenDDS {
22 namespace RTPS {
23  class Sedp;
24 }
25 
26 namespace DCPS {
27 class RtpsUdpTransport;
28 class TransportReceiveListener;
29 typedef RcHandle<TransportReceiveListener> TransportReceiveListener_rch;
30 
32 public:
33 
34  static const suseconds_t DEFAULT_NAK_RESPONSE_DELAY_USEC = 200000; // default from RTPS
35  static const time_t DEFAULT_HEARTBEAT_PERIOD_SEC = 1; // no default in RTPS spec
36 
37  ACE_INT32 send_buffer_size_;
38  ACE_INT32 rcv_buffer_size_;
39 
41  unsigned char ttl_;
43 
46  size_t nak_depth_;
52 
53  virtual int load(ACE_Configuration_Heap& cf,
55 
56  /// Diagnostic aid.
57  virtual OPENDDS_STRING dump_to_str() const;
58 
59  bool is_reliable() const { return true; }
60  bool requires_cdr_encapsulation() const { return true; }
61 
62  virtual size_t populate_locator(OpenDDS::DCPS::TransportLocator& trans_info, ConnectionInfoFlags flags) const;
63  const TransportBLOB* get_blob(const OpenDDS::DCPS::TransportLocatorSeq& trans_info) const;
64 
65  NetworkAddress multicast_group_address() const { return multicast_group_address_; }
67  {
68  if (addr.get_type() == AF_INET) {
69  multicast_group_address_ = addr;
70  } else {
71  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: RtpsUdpInst::multicast_group_address set failed because address family is not AF_INET\n")));
72  }
73  }
74 
75  NetworkAddress local_address() const { return local_address_; }
76  void local_address(const NetworkAddress& addr)
77  {
78  if (addr.get_type() == AF_INET) {
79  local_address_ = addr;
80  } else {
81  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: RtpsUdpInst::local_address set failed because address family is not AF_INET\n")));
82  }
83  }
84 
85  NetworkAddress advertised_address() const { return advertised_address_; }
87  {
88  if (addr.get_type() == AF_INET) {
89  advertised_address_ = addr;
90  } else {
91  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: RtpsUdpInst::advertised_address set failed because address family is not AF_INET\n")));
92  }
93  }
94 
95 #ifdef ACE_HAS_IPV6
96  NetworkAddress ipv6_multicast_group_address() const { return ipv6_multicast_group_address_; }
97  void ipv6_multicast_group_address(const NetworkAddress& addr)
98  {
99  if (addr.get_type() == AF_INET6) {
100  ipv6_multicast_group_address_ = addr;
101  } else {
102  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: RtpsUdpInst::ipv6_multicast_group_address set failed because address family is not AF_INET6\n")));
103  }
104  }
105 
106  NetworkAddress ipv6_local_address() const { return ipv6_local_address_; }
107  void ipv6_local_address(const NetworkAddress& addr)
108  {
109  if (addr.get_type() == AF_INET6) {
110  ipv6_local_address_ = addr;
111  } else {
112  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: RtpsUdpInst::ipv6_local_address set failed because address family is not AF_INET6\n")));
113  }
114  }
115 
116  NetworkAddress ipv6_advertised_address() const { return ipv6_advertised_address_; }
117  void ipv6_advertised_address(const NetworkAddress& addr)
118  {
119  if (addr.get_type() == AF_INET6) {
120  ipv6_advertised_address_ = addr;
121  } else {
122  ACE_ERROR((LM_ERROR, ACE_TEXT("(%P|%t) ERROR: RtpsUdpInst::ipv6_advertised_address set failed because address family is not AF_INET6\n")));
123  }
124  }
125 #endif
126 
127  /// Relay address and stun server address may change, these use a mutex
128  ///{
129  void rtps_relay_only(bool flag);
130  bool rtps_relay_only() const;
131  void use_rtps_relay(bool flag);
132  bool use_rtps_relay() const;
133  void rtps_relay_address(const NetworkAddress& address);
134  NetworkAddress rtps_relay_address() const;
135  void use_ice(bool flag);
136  bool use_ice() const;
137  void stun_server_address(const NetworkAddress& address);
138  NetworkAddress stun_server_address() const;
139  ///}
140 
141  void update_locators(const GUID_t& remote_id,
142  const TransportLocatorSeq& locators);
143 
144  void get_last_recv_locator(const GUID_t& /*remote_id*/,
145  TransportLocator& /*locators*/);
146 
147  void rtps_relay_address_change();
148  void append_transport_statistics(TransportStatisticsSequence& seq);
149 
150 private:
151  friend class RtpsUdpType;
152  template <typename T, typename U>
153  friend RcHandle<T> OpenDDS::DCPS::make_rch(U const&);
154  explicit RtpsUdpInst(const OPENDDS_STRING& name);
155 
156  TransportImpl_rch new_impl();
157 
158  friend class RTPS::Sedp;
159  friend class RtpsUdpTransport;
160  TransportReceiveListener_rch opendds_discovery_default_listener_;
162 
166 #ifdef ACE_HAS_IPV6
167  NetworkAddress ipv6_multicast_group_address_;
168  NetworkAddress ipv6_local_address_;
169  NetworkAddress ipv6_advertised_address_;
170 #endif
171 
176  bool use_ice_;
178 };
179 
180 inline void RtpsUdpInst::rtps_relay_only(bool flag)
181 {
182  ACE_GUARD(ACE_Thread_Mutex, g, config_lock_);
183  rtps_relay_only_ = flag;
184  if (DCPS::DCPS_debug_level > 3) {
185  ACE_DEBUG((LM_INFO, "(%P|%t) RtpsUdpInst::rtps_relay_only is now %d\n", rtps_relay_only_));
186  }
187 }
188 
189 inline bool RtpsUdpInst::rtps_relay_only() const
190 {
191  ACE_GUARD_RETURN(ACE_Thread_Mutex, g, config_lock_, false);
192  return rtps_relay_only_;
193 }
194 
195 inline void RtpsUdpInst::use_rtps_relay(bool flag)
196 {
197  ACE_GUARD(ACE_Thread_Mutex, g, config_lock_);
198  use_rtps_relay_ = flag;
199  if (DCPS::DCPS_debug_level > 3) {
200  ACE_DEBUG((LM_INFO, "(%P|%t) RtpsUdpInst::use_rtps_relay is now %d\n", use_rtps_relay_));
201  }
202 }
203 
204 inline bool RtpsUdpInst::use_rtps_relay() const
205 {
206  ACE_GUARD_RETURN(ACE_Thread_Mutex, g, config_lock_, false);
207  return use_rtps_relay_;
208 }
209 
210 inline void RtpsUdpInst::rtps_relay_address(const NetworkAddress& address)
211 {
212  ACE_GUARD(ACE_Thread_Mutex, g, config_lock_);
213  rtps_relay_address_ = address;
214 }
215 
216 inline NetworkAddress RtpsUdpInst::rtps_relay_address() const
217 {
218  ACE_GUARD_RETURN(ACE_Thread_Mutex, g, config_lock_, NetworkAddress());
219  return rtps_relay_address_;
220 }
221 
222 inline void RtpsUdpInst::use_ice(bool flag)
223 {
224  ACE_GUARD(ACE_Thread_Mutex, g, config_lock_);
225  use_ice_ = flag;
226  if (DCPS::DCPS_debug_level > 3) {
227  ACE_DEBUG((LM_INFO, "(%P|%t) RtpsUdpInst::use_ice is now %d\n", use_ice_));
228  }
229 }
230 
231 inline bool RtpsUdpInst::use_ice() const
232 {
233  ACE_GUARD_RETURN(ACE_Thread_Mutex, g, config_lock_, false);
234  return use_ice_;
235 }
236 
237 inline void RtpsUdpInst::stun_server_address(const NetworkAddress& address)
238 {
239  ACE_GUARD(ACE_Thread_Mutex, g, config_lock_);
240  stun_server_address_ = address;
241 }
242 
243 inline NetworkAddress RtpsUdpInst::stun_server_address() const
244 {
245  ACE_GUARD_RETURN(ACE_Thread_Mutex, g, config_lock_, NetworkAddress());
246  return stun_server_address_;
247 }
248 
249 } // namespace DCPS
250 } // namespace OpenDDS
251 
253 
254 #endif /* OPENDDS_DCPS_TRANSPORT_RTPS_UDP_RTPSUDPINST_H */
#define ACE_DEBUG(X)
TimeDuration heartbeat_period_
Definition: RtpsUdpInst.h:48
static int load
#define ACE_ERROR(X)
#define ACE_GUARD(MUTEX, OBJ, LOCK)
ACE_SYNCH_MUTEX config_lock_
Definition: RtpsUdpInst.h:172
void advertised_address(const NetworkAddress &addr)
Definition: RtpsUdpInst.h:86
#define ACE_SYNCH_MUTEX
Base class to hold configuration settings for TransportImpls.
Definition: TransportInst.h:64
LM_INFO
NetworkAddress rtps_relay_address_
Definition: RtpsUdpInst.h:175
RcHandle< T > make_rch()
Definition: RcHandle_T.h:256
NetworkAddress stun_server_address_
Definition: RtpsUdpInst.h:177
sequence< TransportLocator > TransportLocatorSeq
RcHandle< TransportReceiveListener > TransportReceiveListener_rch
NetworkAddress local_address_
Definition: RtpsUdpInst.h:164
TransportReceiveListener_rch opendds_discovery_default_listener_
Definition: RtpsUdpInst.h:160
TimeDuration nak_response_delay_
Definition: RtpsUdpInst.h:47
#define OPENDDS_STRING
NetworkAddress local_address() const
Definition: RtpsUdpInst.h:75
bool is_reliable() const
Does the transport as configured support RELIABLE_RELIABILITY_QOS?
Definition: RtpsUdpInst.h:59
sequence< TransportStatistics > TransportStatisticsSequence
#define ACE_GUARD_RETURN(MUTEX, OBJ, LOCK, RETURN)
NetworkAddress advertised_address() const
Definition: RtpsUdpInst.h:85
TimeDuration receive_address_duration_
Definition: RtpsUdpInst.h:49
NetworkAddress multicast_group_address() const
Definition: RtpsUdpInst.h:65
#define AF_INET
OPENDDS_STRING multicast_interface_
Definition: RtpsUdpInst.h:42
const char *const name
Definition: debug.cpp:60
ACE_TEXT("TCP_Factory")
void local_address(const NetworkAddress &addr)
Definition: RtpsUdpInst.h:76
OpenDDS_Dcps_Export unsigned int DCPS_debug_level
Definition: debug.cpp:30
NetworkAddress advertised_address_
Definition: RtpsUdpInst.h:165
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
void multicast_group_address(const NetworkAddress &addr)
Definition: RtpsUdpInst.h:66
bool requires_cdr_encapsulation() const
Does the transport require a CDR-encapsulated data payload?
Definition: RtpsUdpInst.h:60
DDS::OctetSeq TransportBLOB
LM_ERROR
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28
NetworkAddress multicast_group_address_
Definition: RtpsUdpInst.h:163
#define OpenDDS_Rtps_Udp_Export
size_t ConnectionInfoFlags