OpenDDS  Snapshot(2023/04/28-20:55)
RtpsUdpTransport.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_RTPSUDPTRANSPORT_H
7 #define OPENDDS_DCPS_TRANSPORT_RTPS_UDP_RTPSUDPTRANSPORT_H
8 
9 #include "Rtps_Udp_Export.h"
10 #include "RtpsUdpDataLink_rch.h"
11 #include "RtpsUdpDataLink.h"
12 
15 #include <dds/DCPS/PoolAllocator.h>
16 #include <dds/DCPS/SporadicTask.h>
17 #include <dds/DCPS/RTPS/ICE/Ice.h>
18 #include <dds/DCPS/RTPS/RtpsCoreC.h>
22 
24 
25 namespace OpenDDS {
26 namespace DCPS {
27 
28 class RtpsUdpInst;
29 
31 public:
32  RtpsUdpTransport(const RtpsUdpInst_rch& inst);
33  RtpsUdpInst_rch config() const;
34 #ifdef OPENDDS_SECURITY
35  DCPS::RcHandle<ICE::Agent> get_ice_agent() const;
36 #endif
37  virtual DCPS::WeakRcHandle<ICE::Endpoint> get_ice_endpoint();
38  virtual void rtps_relay_only_now(bool flag);
39  virtual void use_rtps_relay_now(bool flag);
40  virtual void use_ice_now(bool flag);
41 #ifdef OPENDDS_SECURITY
42  ICE::ServerReflexiveStateMachine& relay_srsm() { return relay_srsm_; }
43  void process_relay_sra(ICE::ServerReflexiveStateMachine::StateChange);
44  void disable_relay_stun_task();
45 #endif
46 
47  virtual void update_locators(const GUID_t& /*remote*/,
48  const TransportLocatorSeq& /*locators*/);
49 
50  virtual void get_last_recv_locator(const GUID_t& /*remote_id*/,
51  TransportLocator& /*locators*/);
52 
53  void rtps_relay_address_change();
54  void append_transport_statistics(TransportStatisticsSequence& seq);
55 
56 private:
57  virtual AcceptConnectResult connect_datalink(const RemoteTransport& remote,
58  const ConnectionAttribs& attribs,
59  const TransportClient_rch& client);
60 
61  virtual AcceptConnectResult accept_datalink(const RemoteTransport& remote,
62  const ConnectionAttribs& attribs,
63  const TransportClient_rch& client);
64 
65  virtual void stop_accepting_or_connecting(const TransportClient_wrch& client,
66  const GUID_t& remote_id,
67  bool disassociate,
68  bool association_failed);
69 
70  bool configure_i(const RtpsUdpInst_rch& config);
71 
72  void client_stop(const GUID_t& localId);
73 
74  virtual void shutdown_i();
75 
76  virtual void register_for_reader(const GUID_t& participant,
77  const GUID_t& writerid,
78  const GUID_t& readerid,
79  const TransportLocatorSeq& locators,
80  DiscoveryListener* listener);
81 
82  virtual void unregister_for_reader(const GUID_t& participant,
83  const GUID_t& writerid,
84  const GUID_t& readerid);
85 
86  virtual void register_for_writer(const GUID_t& /*participant*/,
87  const GUID_t& /*readerid*/,
88  const GUID_t& /*writerid*/,
89  const TransportLocatorSeq& /*locators*/,
90  DiscoveryListener* /*listener*/);
91 
92  virtual void unregister_for_writer(const GUID_t& /*participant*/,
93  const GUID_t& /*readerid*/,
94  const GUID_t& /*writerid*/);
95 
96  virtual bool connection_info_i(TransportLocator& info, ConnectionInfoFlags flags) const;
97 
98  void get_connection_addrs(const TransportBLOB& data,
99  AddrSet* uc_addrs,
100  AddrSet* mc_addrs = 0,
101  bool* requires_inline_qos = 0,
102  unsigned int* blob_bytes_read = 0) const;
103 
104  virtual void release_datalink(DataLink* link);
105 
106  virtual OPENDDS_STRING transport_type() const { return "rtps_udp"; }
107 
108  RtpsUdpDataLink_rch make_datalink(const GuidPrefix_t& local_prefix);
109 
110  bool use_datalink(const GUID_t& local_id,
111  const GUID_t& remote_id,
112  const TransportBLOB& remote_data,
113  const TransportBLOB& discovery_locator,
114  const MonotonicTime_t& participant_discovered_at,
115  ACE_CDR::ULong participant_flags,
116  bool local_reliable, bool remote_reliable,
117  bool local_durable, bool remote_durable,
118  SequenceNumber max_sn,
119  const TransportClient_rch& client);
120 
121 #if defined(OPENDDS_SECURITY)
122  void local_crypto_handle(DDS::Security::ParticipantCryptoHandle pch);
123 #endif
124 
125  //protects access to link_ for duration of make_datalink
128  ThreadLockType links_lock_;
129 
130  /// This protects the connections_ data member
134 
137 
138  /// RTPS uses only one link per transport.
139  /// This link can be safely reused by any clients that belong to the same
140  /// domain participant (same GUID prefix). Use by a second participant
141  /// is not possible because the network location returned by
142  /// connection_info_i() can't be shared among participants.
144 
146 #ifdef ACE_HAS_IPV6
147  ACE_SOCK_Dgram ipv6_unicast_socket_;
148 #endif
150 
152 
153 #ifdef OPENDDS_SECURITY
154 
156 
157 #ifndef DDS_HAS_MINIMUM_BIT
158  ConnectionRecords deferred_connection_records_;
159 #endif
160 
161  struct IceEndpoint : public virtual ACE_Event_Handler, public virtual ICE::Endpoint {
163 
165  : transport(a_transport)
166  , network_is_unreachable_(false)
167  {}
168 
169  const ACE_SOCK_Dgram& choose_recv_socket(ACE_HANDLE fd) const;
170  virtual int handle_input(ACE_HANDLE fd);
171  virtual ICE::AddressListType host_addresses() const;
172  ACE_SOCK_Dgram& choose_send_socket(const ACE_INET_Addr& address) const;
173  virtual void send(const ACE_INET_Addr& address, const STUN::Message& message);
174  virtual ACE_INET_Addr stun_server_address() const;
175 
177  };
179 
181  void relay_stun_task(const MonotonicTimePoint& now);
186 
187  void start_ice();
188  void stop_ice();
189 
191 #endif
192 
195 
196  friend class RtpsUdpSendStrategy;
198 };
199 
200 } // namespace DCPS
201 } // namespace OpenDDS
202 
204 
205 #endif /* OPENDDS_DCPS_TRANSPORT_RTPS_UDP_RTPSUDPTRANSPORT_H */
#define ACE_SYNCH_MUTEX
RcHandle< BitSubscriber > bit_sub_
ACE_Thread_Mutex transport_statistics_mutex_
ssize_t send(ACE_HANDLE handle, const void *buf, size_t len, int flags, const ACE_Time_Value *timeout=0)
RcHandle< Sporadic > relay_stun_task_
ICE::ServerReflexiveStateMachine relay_srsm_
sequence< TransportLocator > TransportLocatorSeq
IceEndpoint(RtpsUdpTransport &a_transport)
ACE_Guard< LockType > GuardType
#define OPENDDS_STRING
DDS::Security::ParticipantCryptoHandle local_crypto_handle_
ThreadLockType relay_stun_task_falloff_mutex_
FibonacciSequence< TimeDuration > relay_stun_task_falloff_
sequence< TransportStatistics > TransportStatisticsSequence
ICE::ServerReflexiveStateMachine & relay_srsm()
ConnectionRecords deferred_connection_records_
RcHandle< ICE::Agent > ice_agent_
TransportClient_wrch default_listener_
ACE_UINT32 ULong
ACE_SYNCH_MUTEX LockType
This protects the connections_ data member.
ACE_Guard< ThreadLockType > GuardThreadType
Sequence number abstraction. Only allows positive 64 bit values.
octet GuidPrefix_t[12]
Definition: DdsDcpsGuid.idl:19
virtual OPENDDS_STRING transport_type() const
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
InternalTransportStatistics transport_statistics_
PmfSporadicTask< RtpsUdpTransport > Sporadic
RcHandle< IceEndpoint > ice_endpoint_
DDS::OctetSeq TransportBLOB
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28
Defines the interface that allows DataWriters (and lower levels) to inform discovery.
#define OpenDDS_Rtps_Udp_Export
size_t ConnectionInfoFlags