OpenDDS  Snapshot(2023/03/10-19:29)
RTPS/ICE/Ice.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 #ifdef OPENDDS_SECURITY
7 #ifndef OPENDDS_DCPS_RTPS_ICE_ICE_H
8 #define OPENDDS_DCPS_RTPS_ICE_ICE_H
9 
10 #include "Stun.h"
11 
12 #include <dds/DCPS/Ice.h>
13 #include <dds/DCPS/TimeTypes.h>
14 #include <dds/DCPS/RcObject.h>
15 #include <dds/DCPS/GuidUtils.h>
16 
17 #ifndef ACE_LACKS_PRAGMA_ONCE
18 # pragma once
19 #endif
20 
22 
23 namespace OpenDDS {
24 namespace ICE {
25 
26 typedef OPENDDS_VECTOR(ACE_INET_Addr) AddressListType;
27 
28 bool candidates_equal(const Candidate& x, const Candidate& y);
29 bool candidates_sorted(const Candidate& x, const Candidate& y);
30 
31 ACE_UINT32 local_priority(const ACE_INET_Addr& addr);
32 
33 Candidate make_host_candidate(const ACE_INET_Addr& address);
34 Candidate make_server_reflexive_candidate(const ACE_INET_Addr& address, const ACE_INET_Addr& base, const ACE_INET_Addr& server_address);
35 Candidate make_peer_reflexive_candidate(const ACE_INET_Addr& address, const ACE_INET_Addr& base, const ACE_INET_Addr& server_address, ACE_UINT32 priority);
36 Candidate make_peer_reflexive_candidate(const ACE_INET_Addr& address, ACE_UINT32 priority, size_t q);
37 
38 using DCPS::GuidPair;
39 typedef std::set<GuidPair> GuidSetType;
40 
42 public:
43  virtual ~Endpoint() {}
44  virtual AddressListType host_addresses() const = 0;
45  virtual void send(const ACE_INET_Addr& address, const STUN::Message& message) = 0;
46  virtual ACE_INET_Addr stun_server_address() const = 0;
47  virtual void ice_connect(const GuidSetType&, const ACE_INET_Addr&) {}
48  virtual void ice_disconnect(const GuidSetType&, const ACE_INET_Addr&) {}
49 };
50 
52 public:
53  virtual ~AgentInfoListener() {}
54  virtual void update_agent_info(const DCPS::GUID_t& a_local_guid,
55  const AgentInfo& a_agent_info) = 0;
56  virtual void remove_agent_info(const DCPS::GUID_t& a_local_guid) = 0;
57 };
58 
60 public:
62  T_a_(0, 50000),
63  connectivity_check_ttl_(5 * 60),
64  checklist_period_(10),
65  indication_period_(15),
66  nominated_ttl_(5 * 60),
67  server_reflexive_address_period_(30),
68  server_reflexive_indication_count_(10),
69  deferred_triggered_check_ttl_(5 * 60),
70  change_password_period_(5 * 60)
71  {}
72 
73  void T_a(const DCPS::TimeDuration& x)
74  {
75  T_a_ = x;
76  }
78  {
79  return T_a_;
80  }
81 
83  {
84  connectivity_check_ttl_ = x;
85  }
87  {
88  return connectivity_check_ttl_;
89  }
90 
92  {
93  checklist_period_ = x;
94  }
96  {
97  return checklist_period_;
98  }
99 
101  {
102  indication_period_ = x;
103  }
105  {
106  return indication_period_;
107  }
108 
110  {
111  nominated_ttl_ = x;
112  }
114  {
115  return nominated_ttl_;
116  }
117 
119  {
120  server_reflexive_address_period_ = x;
121  }
123  {
124  return server_reflexive_address_period_;
125  }
126 
128  {
129  server_reflexive_indication_count_ = x;
130  }
132  {
133  return server_reflexive_indication_count_;
134  }
135 
137  {
138  deferred_triggered_check_ttl_ = x;
139  }
141  {
142  return deferred_triggered_check_ttl_;
143  }
144 
146  {
147  change_password_period_ = x;
148  }
150  {
151  return change_password_period_;
152  }
153 
154  static Configuration* instance();
155 
156 private:
157  // Mininum time between consecutive sends.
158  // RFC 8445 Section 14.2
160  // Repeat a check for this long before failing it.
162  // Run all of the ordinary checks in a checklist in this amount of time.
164  // Send an indication at this interval once an address is selected.
166  // The nominated pair will still be valid if an indication has been received within this amount of time.
168  // Perform server-reflexive candidate gathering this often.
170  // Send this many binding indications to the STUN server before sending a binding request.
172  // Lifetime of a deferred triggered check.
174  // Change the password this often.
176 };
177 
178 class OpenDDS_Rtps_Export Agent : public virtual DCPS::RcObject {
179 public:
180  virtual ~Agent() {}
181  virtual void add_endpoint(DCPS::WeakRcHandle<Endpoint> a_endpoint) = 0;
182  virtual void remove_endpoint(DCPS::WeakRcHandle<Endpoint> a_endpoint) = 0;
183  virtual AgentInfo get_local_agent_info(DCPS::WeakRcHandle<Endpoint> a_endpoint) const = 0;
184  virtual void add_local_agent_info_listener(DCPS::WeakRcHandle<Endpoint> a_endpoint,
185  const DCPS::GUID_t& a_local_guid,
186  DCPS::WeakRcHandle<AgentInfoListener> a_agent_info_listener) = 0;
187  virtual void remove_local_agent_info_listener(DCPS::WeakRcHandle<Endpoint> a_endpoint,
188  const DCPS::GUID_t& a_local_guid) = 0;
189  virtual void start_ice(DCPS::WeakRcHandle<Endpoint> a_endpoint,
190  const DCPS::GUID_t& a_local_guid,
191  const DCPS::GUID_t& a_remote_guid,
192  const AgentInfo& a_remote_agent_info) = 0;
193  virtual void stop_ice(DCPS::WeakRcHandle<Endpoint> a_endpoint,
194  const DCPS::GUID_t& a_local_guid,
195  const DCPS::GUID_t& a_remote_guid) = 0;
196  virtual ACE_INET_Addr get_address(DCPS::WeakRcHandle<Endpoint> a_endpoint,
197  const DCPS::GUID_t& a_local_guid,
198  const DCPS::GUID_t& a_remote_guid) const = 0;
199 
200  // Receive a STUN message.
201  virtual void receive(DCPS::WeakRcHandle<Endpoint> a_endpoint,
202  const ACE_INET_Addr& a_local_address,
203  const ACE_INET_Addr& a_remote_address,
204  const STUN::Message& a_message) = 0;
205 
206  virtual void shutdown() = 0;
207 
208  static DCPS::RcHandle<Agent> instance();
209 };
210 
212 public:
213  enum StateChange {
217  SRSM_Change
218  };
219 
221  : message_class_(STUN::REQUEST)
222  , send_count_(0)
223  , latency_available_(false)
224  {}
225 
226  // Return Unset if transitioning from a determined SRA to an undetermined SRA.
227  // Return None otherwise.
228  StateChange send(const ACE_INET_Addr& address,
229  size_t indication_count_limit,
230  const DCPS::GuidPrefix_t& guid_prefix);
231 
232  // Return Set if transitioning from an undetermined SRA to a determined SRA.
233  // Return Change if transitioning from a determined SRA to a different SRA.
234  // Return None otherwise.
235  StateChange receive(const STUN::Message& message);
236 
237  const STUN::Message& message() const { return message_; }
238  const ACE_INET_Addr& unset_stun_server_address() const { return unset_stun_server_address_; }
239  const ACE_INET_Addr& stun_server_address() const { return stun_server_address_; }
240 
241  bool is_response(const STUN::Message& message) const
242  {
243  return message.transaction_id == message_.transaction_id;
244  }
245 
247  {
248  return latency_;
249  }
250 
251  bool latency_available() const
252  {
253  return latency_available_;
254  }
255 
256  void latency_available(bool flag)
257  {
258  latency_available_ = flag;
259  }
260 
261  bool connected() const
262  {
263  return server_reflexive_address_ != ACE_INET_Addr();
264  }
265 
266 private:
267  StateChange start(const ACE_INET_Addr& address, size_t indication_count_limit, const DCPS::GuidPrefix_t& guid_prefix);
268  StateChange stop();
269  StateChange next_send(size_t indication_count_limit, const DCPS::GuidPrefix_t& guid_prefix);
270  StateChange success_response(const STUN::Message& message);
271  StateChange error_response(const STUN::Message& message);
272 
278  size_t send_count_;
282  };
283 
284 } // namespace ICE
285 } // namespace OpenDDS
286 
288 
289 #endif /* OPENDDS_RTPS_ICE_H */
290 #endif /* OPENDDS_SECURITY */
DCPS::TimeDuration connectivity_check_ttl() const
Definition: RTPS/ICE/Ice.h:86
const ACE_INET_Addr & unset_stun_server_address() const
Definition: RTPS/ICE/Ice.h:238
bool candidates_equal(const Candidate &x, const Candidate &y)
Definition: Ice.cpp:34
void deferred_triggered_check_ttl(const DCPS::TimeDuration &x)
Definition: RTPS/ICE/Ice.h:136
DCPS::TimeDuration nominated_ttl() const
Definition: RTPS/ICE/Ice.h:113
void server_reflexive_indication_count(size_t x)
Definition: RTPS/ICE/Ice.h:127
DCPS::TimeDuration indication_period_
Definition: RTPS/ICE/Ice.h:165
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
DCPS::TimeDuration server_reflexive_address_period() const
Definition: RTPS/ICE/Ice.h:122
DCPS::TimeDuration checklist_period() const
Definition: RTPS/ICE/Ice.h:95
ssize_t send(ACE_HANDLE handle, const void *buf, size_t len, int flags, const ACE_Time_Value *timeout=0)
const STUN::Message & message() const
Definition: RTPS/ICE/Ice.h:237
void nominated_ttl(const DCPS::TimeDuration &x)
Definition: RTPS/ICE/Ice.h:109
The Internal API and Implementation of OpenDDS.
Definition: AddressCache.h:28
DCPS::TimeDuration indication_period() const
Definition: RTPS/ICE/Ice.h:104
DCPS::TimeDuration T_a() const
Definition: RTPS/ICE/Ice.h:77
Candidate make_server_reflexive_candidate(const ACE_INET_Addr &address, const ACE_INET_Addr &base, const ACE_INET_Addr &server_address)
Definition: Ice.cpp:76
typedef OPENDDS_VECTOR(ACE_INET_Addr) AddressListType
void connectivity_check_ttl(const DCPS::TimeDuration &x)
Definition: RTPS/ICE/Ice.h:82
TransactionId transaction_id
Definition: Stun.h:186
#define OpenDDS_Rtps_Export
Definition: rtps_export.h:23
DCPS::TimeDuration checklist_period_
Definition: RTPS/ICE/Ice.h:163
std::set< GuidPair > GuidSetType
Definition: RTPS/ICE/Ice.h:39
bool candidates_sorted(const Candidate &x, const Candidate &y)
Definition: Ice.cpp:21
DCPS::TimeDuration deferred_triggered_check_ttl_
Definition: RTPS/ICE/Ice.h:173
DCPS::TimeDuration deferred_triggered_check_ttl() const
Definition: RTPS/ICE/Ice.h:140
DCPS::TimeDuration server_reflexive_address_period_
Definition: RTPS/ICE/Ice.h:169
Candidate make_peer_reflexive_candidate(const ACE_INET_Addr &address, const ACE_INET_Addr &base, const ACE_INET_Addr &server_address, ACE_UINT32 priority)
Definition: Ice.cpp:88
void indication_period(const DCPS::TimeDuration &x)
Definition: RTPS/ICE/Ice.h:100
DCPS::TimeDuration nominated_ttl_
Definition: RTPS/ICE/Ice.h:167
void checklist_period(const DCPS::TimeDuration &x)
Definition: RTPS/ICE/Ice.h:91
void change_password_period(const DCPS::TimeDuration &x)
Definition: RTPS/ICE/Ice.h:145
DCPS::TimeDuration latency() const
Definition: RTPS/ICE/Ice.h:246
Candidate make_host_candidate(const ACE_INET_Addr &address)
Definition: Ice.cpp:64
virtual void ice_connect(const GuidSetType &, const ACE_INET_Addr &)
Definition: RTPS/ICE/Ice.h:47
void T_a(const DCPS::TimeDuration &x)
Definition: RTPS/ICE/Ice.h:73
DCPS::TimeDuration connectivity_check_ttl_
Definition: RTPS/ICE/Ice.h:161
void server_reflexive_address_period(const DCPS::TimeDuration &x)
Definition: RTPS/ICE/Ice.h:118
DCPS::TimeDuration change_password_period() const
Definition: RTPS/ICE/Ice.h:149
int shutdown(ACE_HANDLE handle, int how)
virtual void ice_disconnect(const GuidSetType &, const ACE_INET_Addr &)
Definition: RTPS/ICE/Ice.h:48
octet GuidPrefix_t[12]
Definition: DdsDcpsGuid.idl:19
ACE_UINT32 local_priority(const ACE_INET_Addr &addr)
Definition: Ice.cpp:56
DCPS::TimeDuration change_password_period_
Definition: RTPS/ICE/Ice.h:175
const ACE_INET_Addr & stun_server_address() const
Definition: RTPS/ICE/Ice.h:239
DCPS::TimeDuration T_a_
Definition: RTPS/ICE/Ice.h:159
size_t server_reflexive_indication_count() const
Definition: RTPS/ICE/Ice.h:131
bool is_response(const STUN::Message &message) const
Definition: RTPS/ICE/Ice.h:241