OpenDDS  Snapshot(2023/04/07-19:43)
Public Member Functions | Protected Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
OpenDDS::DCPS::UdpTransport Class Reference

#include <UdpTransport.h>

Inheritance diagram for OpenDDS::DCPS::UdpTransport:
Inheritance graph
[legend]
Collaboration diagram for OpenDDS::DCPS::UdpTransport:
Collaboration graph
[legend]

Public Member Functions

 UdpTransport (const UdpInst_rch &inst)
 
void passive_connection (const ACE_INET_Addr &remote_address, const ReceivedDataSample &data)
 
UdpInst_rch config () const
 
- Public Member Functions inherited from OpenDDS::DCPS::TransportImpl
virtual ~TransportImpl ()
 
virtual void unbind_link (DataLink *link)
 Remove any pending_release mappings. More...
 
bool release_link_resources (DataLink *link)
 
TransportInst_rch config () const
 
virtual void register_for_reader (const GUID_t &, const GUID_t &, const GUID_t &, const TransportLocatorSeq &, OpenDDS::DCPS::DiscoveryListener *)
 
virtual void unregister_for_reader (const GUID_t &, const GUID_t &, const GUID_t &)
 
virtual void register_for_writer (const GUID_t &, const GUID_t &, const GUID_t &, const TransportLocatorSeq &, DiscoveryListener *)
 
virtual void unregister_for_writer (const GUID_t &, const GUID_t &, const GUID_t &)
 
virtual void update_locators (const GUID_t &, const TransportLocatorSeq &)
 
virtual void get_last_recv_locator (const GUID_t &, TransportLocator &)
 
virtual void rtps_relay_address_change ()
 
virtual void append_transport_statistics (TransportStatisticsSequence &)
 
ACE_Reactor_Timer_Interfacetimer () const
 Interface to the transport's reactor for scheduling timers. More...
 
ACE_Reactorreactor () const
 
ACE_thread_t reactor_owner () const
 
bool is_shut_down () const
 
void create_reactor_task (bool useAsyncSend=false, const OPENDDS_STRING &name="")
 
void dump ()
 Diagnostic aid. More...
 
OPENDDS_STRING dump_to_str ()
 
void report ()
 
virtual WeakRcHandle< ICE::Endpointget_ice_endpoint ()
 
virtual void rtps_relay_only_now (bool)
 
virtual void use_rtps_relay_now (bool)
 
virtual void use_ice_now (bool)
 
ReactorTask_rch reactor_task ()
 
EventDispatcher_rch event_dispatcher ()
 
int acquire ()
 
int tryacquire ()
 
int release ()
 
int remove ()
 
bool connection_info (TransportLocator &local_info, ConnectionInfoFlags flags) const
 
- Public Member Functions inherited from OpenDDS::DCPS::RcObject
virtual ~RcObject ()
 
virtual void _add_ref ()
 
virtual void _remove_ref ()
 
long ref_count () const
 
WeakObject_get_weak_object () const
 

Protected Member Functions

virtual AcceptConnectResult connect_datalink (const RemoteTransport &remote, const ConnectionAttribs &attribs, const TransportClient_rch &client)
 
virtual AcceptConnectResult accept_datalink (const RemoteTransport &remote, const ConnectionAttribs &attribs, const TransportClient_rch &client)
 
virtual void stop_accepting_or_connecting (const TransportClient_wrch &client, const GUID_t &remote_id, bool disassociate, bool association_failed)
 
bool configure_i (const UdpInst_rch &config)
 
virtual void shutdown_i ()
 
virtual bool connection_info_i (TransportLocator &info, ConnectionInfoFlags flags) const
 
ACE_INET_Addr get_connection_addr (const TransportBLOB &data) const
 
virtual void release_datalink (DataLink *link)
 
virtual std::string transport_type () const
 
- Protected Member Functions inherited from OpenDDS::DCPS::TransportImpl
 TransportImpl (TransportInst_rch config)
 
bool open ()
 
typedef OPENDDS_MULTIMAP (TransportClient_wrch, DataLink_rch) PendConnMap
 
void add_pending_connection (const TransportClient_rch &client, DataLink_rch link)
 
void shutdown ()
 
- Protected Member Functions inherited from OpenDDS::DCPS::RcObject
 RcObject ()
 

Private Types

typedef ACE_SYNCH_MUTEX LockType
 
typedef ACE_Guard< LockTypeGuardType
 
typedef ConditionVariable< LockTypeConditionVariableType
 
typedef std::vector< DataLink::OnStartCallbackCallbacks
 

Private Member Functions

UdpDataLink_rch make_datalink (const ACE_INET_Addr &remote_address, Priority priority, bool active)
 
PriorityKey blob_to_key (const TransportBLOB &remote, Priority priority, ACE_INET_Addr local_addr, bool active)
 
typedef OPENDDS_MAP (PriorityKey, UdpDataLink_rch) UdpDataLinkMap
 Map of fully associated DataLinks for this transport. Protected. More...
 
typedef OPENDDS_MAP (PriorityKey, Callbacks) PendConnMap
 

Private Attributes

LockType client_links_lock_
 This lock is used to protect the client_links_ data member. More...
 
UdpDataLinkMap client_links_
 
UdpDataLink_rch server_link_
 The single datalink for the passive side. No locking required. More...
 
ACE_Recursive_Thread_Mutex connections_lock_
 
std::set< PriorityKeyserver_link_keys_
 
PendConnMap pending_connections_
 
std::set< PriorityKeypending_server_link_keys_
 

Additional Inherited Members

- Public Attributes inherited from OpenDDS::DCPS::TransportImpl
LockType lock_
 Lock to protect the config_ and reactor_task_ data members. More...
 
WeakRcHandle< TransportInstconfig_
 
ReactorTask_rch reactor_task_
 
EventDispatcher_rch event_dispatcher_
 smart ptr to the associated DL cleanup task More...
 
unique_ptr< Monitormonitor_
 Monitor object for this entity. More...
 
- Protected Types inherited from OpenDDS::DCPS::TransportImpl
typedef ACE_SYNCH_MUTEX LockType
 
typedef ACE_Guard< LockTypeGuardType
 
- Protected Attributes inherited from OpenDDS::DCPS::TransportImpl
LockType pending_connections_lock_
 Lock to protect the pending_connections_ data member. More...
 
PendConnMap pending_connections_
 
AtomicBool is_shut_down_
 Id of the last link established. More...
 

Detailed Description

Definition at line 29 of file UdpTransport.h.

Member Typedef Documentation

◆ Callbacks

Definition at line 94 of file UdpTransport.h.

◆ ConditionVariableType

Definition at line 70 of file UdpTransport.h.

◆ GuardType

Definition at line 69 of file UdpTransport.h.

◆ LockType

Definition at line 68 of file UdpTransport.h.

Constructor & Destructor Documentation

◆ UdpTransport()

OpenDDS::DCPS::UdpTransport::UdpTransport ( const UdpInst_rch inst)
explicit

Definition at line 35 of file UdpTransport.cpp.

References configure_i(), and OpenDDS::DCPS::TransportImpl::open().

36  : TransportImpl(inst)
37 {
38  if (!(configure_i(inst) && open())) {
39  throw Transport::UnableToCreate();
40  }
41 }
bool configure_i(const UdpInst_rch &config)
TransportImpl(TransportInst_rch config)

Member Function Documentation

◆ accept_datalink()

TransportImpl::AcceptConnectResult OpenDDS::DCPS::UdpTransport::accept_datalink ( const RemoteTransport remote,
const ConnectionAttribs attribs,
const TransportClient_rch client 
)
protectedvirtual

accept_datalink() is called from TransportClient to initiate an association as the passive peer. A DataLink may be returned if one is already connected and ready to use, otherwise passively wait for a physical connection from the active side (either in the form of a connection event or handshaking message). Upon completion of the physical connection, the transport calls back to TransportClient::use_datalink().

Implements OpenDDS::DCPS::TransportImpl.

Definition at line 113 of file UdpTransport.cpp.

References OpenDDS::DCPS::TransportImpl::AcceptConnectResult::ACR_FAILED, OpenDDS::DCPS::TransportImpl::AcceptConnectResult::ACR_SUCCESS, OpenDDS::DCPS::PriorityKey::address(), OpenDDS::DCPS::TransportImpl::RemoteTransport::blob_, blob_to_key(), config(), connections_lock_, OpenDDS::DCPS::PriorityKey::is_active(), OpenDDS::DCPS::PriorityKey::is_loopback(), OpenDDS::DCPS::TransportImpl::is_shut_down(), LM_DEBUG, pending_connections_, pending_server_link_keys_, OpenDDS::DCPS::PriorityKey::priority(), OpenDDS::DCPS::TransportImpl::ConnectionAttribs::priority_, OpenDDS::DCPS::TransportImpl::RemoteTransport::repo_id_, server_link_, server_link_keys_, VDBG, and VDBG_LVL.

116 {
117  UdpInst_rch cfg = config();
118  if (!cfg && is_shut_down()) {
119  return AcceptConnectResult(AcceptConnectResult::ACR_FAILED);
120  }
122 
123  const PriorityKey key = blob_to_key(remote.blob_,
124  attribs.priority_, cfg->local_address(), false /* !active */);
125 
126  VDBG_LVL((LM_DEBUG, "(%P|%t) UdpTransport::accept_datalink PriorityKey "
127  "prio=%d, addr=%C, is_loopback=%d, is_active=%d\n",
128  key.priority(), LogAddr(key.address()).c_str(), key.is_loopback(),
129  key.is_active()), 2);
130 
131  if (server_link_keys_.count(key)) {
132  VDBG((LM_DEBUG, "(%P|%t) UdpTransport::accept_datalink found\n"));
133  return AcceptConnectResult(UdpDataLink_rch(server_link_));
134  } else if (pending_server_link_keys_.count(key)) {
135  pending_server_link_keys_.erase(key);
136  server_link_keys_.insert(key);
137  VDBG((LM_DEBUG, "(%P|%t) UdpTransport::accept_datalink completed\n"));
138  return AcceptConnectResult(UdpDataLink_rch(server_link_));
139  } else {
140  const DataLink::OnStartCallback callback(client, remote.repo_id_);
141  pending_connections_[key].push_back(callback);
142  VDBG((LM_DEBUG, "(%P|%t) UdpTransport::accept_datalink pending\n"));
143  return AcceptConnectResult(AcceptConnectResult::ACR_SUCCESS);
144  }
145  return AcceptConnectResult();
146 }
std::set< PriorityKey > server_link_keys_
Definition: UdpTransport.h:92
RcHandle< UdpDataLink > UdpDataLink_rch
sequence< octet > key
PendConnMap pending_connections_
Definition: UdpTransport.h:99
std::pair< TransportClient_wrch, GUID_t > OnStartCallback
Definition: DataLink.h:259
std::set< PriorityKey > pending_server_link_keys_
Definition: UdpTransport.h:104
#define VDBG(DBG_ARGS)
UdpDataLink_rch server_link_
The single datalink for the passive side. No locking required.
Definition: UdpTransport.h:81
PriorityKey blob_to_key(const TransportBLOB &remote, Priority priority, ACE_INET_Addr local_addr, bool active)
#define VDBG_LVL(DBG_ARGS, LEVEL)
RcHandle< UdpInst > UdpInst_rch
Definition: UdpInst_rch.h:18
UdpInst_rch config() const
ACE_Recursive_Thread_Mutex connections_lock_
Definition: UdpTransport.h:86

◆ blob_to_key()

PriorityKey OpenDDS::DCPS::UdpTransport::blob_to_key ( const TransportBLOB remote,
Priority  priority,
ACE_INET_Addr  local_addr,
bool  active 
)
private

Definition at line 256 of file UdpTransport.cpp.

References ACE_ERROR, ACE_TEXT(), LM_ERROR, and OpenDDS::DCPS::NetworkResource::to_addr().

Referenced by accept_datalink(), connect_datalink(), and passive_connection().

260 {
261  NetworkResource network_resource;
262  ACE_InputCDR cdr((const char*)remote.get_buffer(), remote.length());
263 
264  if (!(cdr >> network_resource)) {
265  ACE_ERROR((LM_ERROR,
266  ACE_TEXT("(%P|%t) ERROR: UdpTransport::blob_to_key")
267  ACE_TEXT(" failed to de-serialize the NetworkResource\n")));
268  }
269 
270  ACE_INET_Addr remote_address;
271  network_resource.to_addr(remote_address);
272  const bool is_loopback = remote_address == local_addr;
273 
274  return PriorityKey(priority, remote_address, is_loopback, active);
275 }
#define ACE_ERROR(X)
ACE_TEXT("TCP_Factory")

◆ config()

UdpInst_rch OpenDDS::DCPS::UdpTransport::config ( ) const

Definition at line 44 of file UdpTransport.cpp.

References OpenDDS::DCPS::TransportImpl::config(), and OpenDDS::DCPS::dynamic_rchandle_cast().

Referenced by accept_datalink(), connect_datalink(), connection_info_i(), and passive_connection().

45 {
47 }
RcHandle< T > dynamic_rchandle_cast(const RcHandle< U > &h)
Definition: RcHandle_T.h:214
TransportInst_rch config() const

◆ configure_i()

bool OpenDDS::DCPS::UdpTransport::configure_i ( const UdpInst_rch config)
protected

Definition at line 174 of file UdpTransport.cpp.

References OpenDDS::DCPS::TransportImpl::create_reactor_task(), make_datalink(), server_link_, and TheServiceParticipant.

Referenced by UdpTransport().

175 {
176  if (!config) {
177  return false;
178  }
179  create_reactor_task(false, "UdpTransport" + config->name());
180 
181  // Override with DCPSDefaultAddress.
182  if (config->local_address() == ACE_INET_Addr() &&
183  TheServiceParticipant->default_address().to_addr() != ACE_INET_Addr()) {
184  config->local_address(TheServiceParticipant->default_address().to_addr());
185  }
186 
187  // Our "server side" data link is created here, similar to the acceptor_
188  // in the TcpTransport implementation. This establishes a socket as an
189  // endpoint that we can advertise to peers via connection_info_i().
190  server_link_ = make_datalink(config->local_address(), 0 /* priority */, false);
191  return true;
192 }
UdpDataLink_rch make_datalink(const ACE_INET_Addr &remote_address, Priority priority, bool active)
UdpDataLink_rch server_link_
The single datalink for the passive side. No locking required.
Definition: UdpTransport.h:81
void create_reactor_task(bool useAsyncSend=false, const OPENDDS_STRING &name="")
UdpInst_rch config() const
#define TheServiceParticipant

◆ connect_datalink()

TransportImpl::AcceptConnectResult OpenDDS::DCPS::UdpTransport::connect_datalink ( const RemoteTransport remote,
const ConnectionAttribs attribs,
const TransportClient_rch client 
)
protectedvirtual

connect_datalink() is called from TransportClient to initiate an association as the active peer. A DataLink may be returned if one is already connected and ready to use, otherwise initiate a connection to the passive side and return from this method. Upon completion of the physical connection, the transport calls back to TransportClient::use_datalink().

Implements OpenDDS::DCPS::TransportImpl.

Definition at line 71 of file UdpTransport.cpp.

References OpenDDS::DCPS::TransportImpl::AcceptConnectResult::ACR_FAILED, OpenDDS::DCPS::PriorityKey::address(), OpenDDS::DCPS::TransportImpl::RemoteTransport::blob_, blob_to_key(), client_links_, client_links_lock_, config(), get_connection_addr(), OpenDDS::DCPS::PriorityKey::is_active(), OpenDDS::DCPS::PriorityKey::is_loopback(), OpenDDS::DCPS::RcHandle< T >::is_nil(), OpenDDS::DCPS::TransportImpl::is_shut_down(), LM_DEBUG, make_datalink(), OpenDDS::DCPS::PriorityKey::priority(), OpenDDS::DCPS::TransportImpl::ConnectionAttribs::priority_, VDBG, and VDBG_LVL.

74 {
75  UdpInst_rch cfg = config();
76  if (!cfg && is_shut_down()) {
77  return AcceptConnectResult(AcceptConnectResult::ACR_FAILED);
78  }
79  const ACE_INET_Addr remote_address = get_connection_addr(remote.blob_);
80  const bool active = true;
81  const PriorityKey key = blob_to_key(remote.blob_, attribs.priority_, cfg->local_address(), active);
82 
83  VDBG_LVL((LM_DEBUG, "(%P|%t) UdpTransport::connect_datalink PriorityKey "
84  "prio=%d, addr=%C, is_loopback=%d, is_active=%d\n",
85  key.priority(), LogAddr(key.address()).c_str(), key.is_loopback(),
86  key.is_active()), 2);
87 
89  if (this->is_shut_down()) {
90  return AcceptConnectResult(AcceptConnectResult::ACR_FAILED);
91  }
92 
93  const UdpDataLinkMap::iterator it(client_links_.find(key));
94  if (it != client_links_.end()) {
95  VDBG((LM_DEBUG, "(%P|%t) UdpTransport::connect_datalink found\n"));
96  return AcceptConnectResult(UdpDataLink_rch(it->second));
97  }
98 
99  // Create new DataLink for logical connection:
100  UdpDataLink_rch link (make_datalink(remote_address,
101  attribs.priority_,
102  active));
103 
104  if (!link.is_nil()) {
105  client_links_.insert(UdpDataLinkMap::value_type(key, link));
106  VDBG((LM_DEBUG, "(%P|%t) UdpTransport::connect_datalink connected\n"));
107  }
108 
109  return AcceptConnectResult(link);
110 }
RcHandle< UdpDataLink > UdpDataLink_rch
sequence< octet > key
LockType client_links_lock_
This lock is used to protect the client_links_ data member.
Definition: UdpTransport.h:73
ACE_INET_Addr get_connection_addr(const TransportBLOB &data) const
UdpDataLinkMap client_links_
Definition: UdpTransport.h:78
#define VDBG(DBG_ARGS)
UdpDataLink_rch make_datalink(const ACE_INET_Addr &remote_address, Priority priority, bool active)
PriorityKey blob_to_key(const TransportBLOB &remote, Priority priority, ACE_INET_Addr local_addr, bool active)
#define VDBG_LVL(DBG_ARGS, LEVEL)
ACE_Guard< LockType > GuardType
Definition: UdpTransport.h:69
RcHandle< UdpInst > UdpInst_rch
Definition: UdpInst_rch.h:18
UdpInst_rch config() const

◆ connection_info_i()

bool OpenDDS::DCPS::UdpTransport::connection_info_i ( TransportLocator local_info,
ConnectionInfoFlags  flags 
) const
protectedvirtual

Called by our connection_info() method to allow the concrete TransportImpl subclass to do the dirty work since it really is the one that knows how to populate the supplied TransportLocator object.

Implements OpenDDS::DCPS::TransportImpl.

Definition at line 212 of file UdpTransport.cpp.

References config().

213 {
214  UdpInst_rch cfg = config();
215  if (cfg) {
216  cfg->populate_locator(info, flags);
217  return true;
218  }
219  return false;
220 }
RcHandle< UdpInst > UdpInst_rch
Definition: UdpInst_rch.h:18
UdpInst_rch config() const

◆ get_connection_addr()

ACE_INET_Addr OpenDDS::DCPS::UdpTransport::get_connection_addr ( const TransportBLOB data) const
protected

Definition at line 223 of file UdpTransport.cpp.

References OpenDDS::DCPS::NetworkResource::to_addr().

Referenced by connect_datalink().

224 {
225  ACE_INET_Addr local_address;
226  NetworkResource network_resource;
227 
228  size_t len = data.length();
229  const char* buffer = reinterpret_cast<const char*>(data.get_buffer());
230 
231  ACE_InputCDR cdr(buffer, len);
232  if (cdr >> network_resource) {
233  network_resource.to_addr(local_address);
234  }
235 
236  return local_address;
237 }

◆ make_datalink()

UdpDataLink_rch OpenDDS::DCPS::UdpTransport::make_datalink ( const ACE_INET_Addr remote_address,
Priority  priority,
bool  active 
)
private

Definition at line 51 of file UdpTransport.cpp.

References ACE_ERROR, ACE_TEXT(), LM_ERROR, OpenDDS::DCPS::UdpDataLink::open(), OpenDDS::DCPS::rchandle_from(), and OpenDDS::DCPS::TransportImpl::reactor_task().

Referenced by configure_i(), and connect_datalink().

53 {
54  UdpDataLink_rch link(make_rch<UdpDataLink>(rchandle_from(this), priority, reactor_task(), active));
55  // Configure link with transport configuration and reactor task:
56 
57  // Open logical connection:
58  if (link->open(remote_address)) {
59  return link;
60  }
61 
62  ACE_ERROR((LM_ERROR,
63  ACE_TEXT("(%P|%t) ERROR: ")
64  ACE_TEXT("UdpTransport::make_datalink: ")
65  ACE_TEXT("failed to open DataLink!\n")));
66 
67  return UdpDataLink_rch();
68 }
#define ACE_ERROR(X)
ReactorTask_rch reactor_task()
RcHandle< UdpDataLink > UdpDataLink_rch
ACE_TEXT("TCP_Factory")
RcHandle< T > rchandle_from(T *pointer)
Definition: RcHandle_T.h:310

◆ OPENDDS_MAP() [1/2]

typedef OpenDDS::DCPS::UdpTransport::OPENDDS_MAP ( PriorityKey  ,
UdpDataLink_rch   
)
private

Map of fully associated DataLinks for this transport. Protected.

◆ OPENDDS_MAP() [2/2]

typedef OpenDDS::DCPS::UdpTransport::OPENDDS_MAP ( PriorityKey  ,
Callbacks   
)
private

◆ passive_connection()

void OpenDDS::DCPS::UdpTransport::passive_connection ( const ACE_INET_Addr remote_address,
const ReceivedDataSample data 
)

Definition at line 278 of file UdpTransport.cpp.

References blob_to_key(), config(), connections_lock_, OpenDDS::DCPS::ReceivedDataSample::data(), OpenDDS::DCPS::ReceivedDataSample::data_length(), OpenDDS::DCPS::find(), LM_DEBUG, OpenDDS::DCPS::WeakRcHandle< T >::lock(), OPENDDS_END_VERSIONED_NAMESPACE_DECL, pending_connections_, pending_server_link_keys_, ACE_SOCK_Dgram::send(), server_link_, server_link_keys_, OpenDDS::DCPS::UdpDataLink::socket(), OpenDDS::DCPS::static_rchandle_cast(), and VDBG.

280 {
281  UdpInst_rch cfg = config();
282  if (!cfg) {
283  return;
284  }
285  const size_t blob_len = data.data_length() - sizeof(Priority);
286  Message_Block_Ptr payload(data.data());
287  Priority priority;
288  Serializer serializer(payload.get(), encoding_kind);
289  serializer >> priority;
290  TransportBLOB blob(static_cast<CORBA::ULong>(blob_len));
291  blob.length(blob.maximum());
292  serializer.read_octet_array(blob.get_buffer(), blob.length());
293 
294  // Send an ack so that the active side can return from
295  // connect_datalink_i(). This is just a single byte of
296  // arbitrary data, the remote side is not yet using the
297  // framework (TransportHeader, DataSampleHeader,
298  // ReceiveStrategy).
299  const char ack_data = 23;
300  if (server_link_->socket().send(&ack_data, 1, remote_address) <= 0) {
301  VDBG((LM_DEBUG, "(%P|%t) UdpTransport::passive_connection failed to send ack\n"));
302  }
303 
304  const PriorityKey key = blob_to_key(blob, priority, cfg->local_address(), false /* passive */);
305 
307 
308  const PendConnMap::iterator pend = pending_connections_.find(key);
309 
310  if (pend != pending_connections_.end()) {
311 
312  //don't hold connections_lock_ while calling use_datalink
313  //guard.release();
314 
315  VDBG((LM_DEBUG, "(%P|%t) UdpTransport::passive_connection completing\n"));
316 
318 
319  //Insert key now to make sure when releasing guard to call use_datalink
320  //if an accept_datalink obtains lock first it will see that it can proceed
321  //with using the link and do its own use_datalink call.
322  server_link_keys_.insert(key);
323 
324  //create a copy of the size of callback vector so that if use_datalink_i -> stop_accepting_or_connecting
325  //finds that callbacks vector is empty and deletes pending connection & its callback vector for loop can
326  //still exit the loop without checking the size of invalid memory
327  //size_t num_callbacks = pend->second.size();
328 
329  //Create a copy of the vector of callbacks to process, making sure that each is
330  //still present in the actual pending_connections_ before calling use_datalink
331  Callbacks tmp(pend->second);
332  for (size_t i = 0; i < tmp.size(); ++i) {
333  const PendConnMap::iterator pend = pending_connections_.find(key);
334  if (pend != pending_connections_.end()) {
335  const Callbacks::iterator tmp_iter = find(pend->second.begin(),
336  pend->second.end(),
337  tmp.at(i));
338  if (tmp_iter != pend->second.end()) {
339  TransportClient_wrch pend_client = tmp.at(i).first;
340  GUID_t remote_repo = tmp.at(i).second;
341  guard.release();
342  TransportClient_rch client = pend_client.lock();
343  if (client)
344  client->use_datalink(remote_repo, link);
345  guard.acquire();
346  }
347  }
348  }
349  } else {
350  // still hold guard(connections_lock_) at this point so
351  // pending_server_link_keys_ is protected for insert
352 
353  VDBG((LM_DEBUG, "(%P|%t) UdpTransport::passive_connection pending\n"));
354  // accept_datalink() will complete the connection.
355  pending_server_link_keys_.insert(key);
356  }
357 }
std::set< PriorityKey > server_link_keys_
Definition: UdpTransport.h:92
RcHandle< T > static_rchandle_cast(const RcHandle< U > &h)
Definition: RcHandle_T.h:202
ACE_SOCK_Dgram & socket()
Definition: UdpDataLink.inl:40
sequence< octet > key
WeakRcHandle< TransportClient > TransportClient_wrch
Definition: TransportImpl.h:45
PendConnMap pending_connections_
Definition: UdpTransport.h:99
RcHandle< TransportClient > TransportClient_rch
RcHandle< DataLink > DataLink_rch
The type definition for the smart-pointer to the underlying type.
Definition: DataLink_rch.h:34
std::set< PriorityKey > pending_server_link_keys_
Definition: UdpTransport.h:104
std::vector< DataLink::OnStartCallback > Callbacks
Definition: UdpTransport.h:94
#define VDBG(DBG_ARGS)
UdpDataLink_rch server_link_
The single datalink for the passive side. No locking required.
Definition: UdpTransport.h:81
DDS::OctetSeq TransportBLOB
short Priority
PriorityKey blob_to_key(const TransportBLOB &remote, Priority priority, ACE_INET_Addr local_addr, bool active)
ACE_CDR::Long Priority
int find(Container &c, const Key &key, typename Container::mapped_type *&value)
Definition: Util.h:71
unique_ptr< ACE_Message_Block, Message_Block_Deleter > Message_Block_Ptr
RcHandle< UdpInst > UdpInst_rch
Definition: UdpInst_rch.h:18
UdpInst_rch config() const
ssize_t send(const void *buf, size_t n, const ACE_Addr &addr, int flags=0) const
ACE_Recursive_Thread_Mutex connections_lock_
Definition: UdpTransport.h:86

◆ release_datalink()

void OpenDDS::DCPS::UdpTransport::release_datalink ( DataLink link)
protectedvirtual

Called by the TransportRegistry when this TransportImpl object is released while the TransportRegistry is handling a release() "event". The DataLink itself calls this method when it thinks it is no longer used for any associations. This occurs during a "remove associations" operation being performed by some TransportClient that uses this TransportImpl. The TransportClient is known to have acquired our reservation_lock_, so there won't be any reserve_datalink() calls being made from any other threads while we perform this release.

Implements OpenDDS::DCPS::TransportImpl.

Definition at line 240 of file UdpTransport.cpp.

References client_links_, client_links_lock_, and OpenDDS::DCPS::DataLink::stop().

241 {
243  for (UdpDataLinkMap::iterator it(client_links_.begin());
244  it != client_links_.end(); ++it) {
245  // We are guaranteed to have exactly one matching DataLink
246  // in the map; release any resources held and return.
247  if (link == static_cast<DataLink*>(it->second.in())) {
248  link->stop();
249  client_links_.erase(it);
250  return;
251  }
252  }
253 }
LockType client_links_lock_
This lock is used to protect the client_links_ data member.
Definition: UdpTransport.h:73
UdpDataLinkMap client_links_
Definition: UdpTransport.h:78
ACE_Guard< LockType > GuardType
Definition: UdpTransport.h:69

◆ shutdown_i()

void OpenDDS::DCPS::UdpTransport::shutdown_i ( )
protectedvirtual

Called during the shutdown() method in order to give the concrete TransportImpl subclass a chance to do something when the shutdown "event" occurs.

Implements OpenDDS::DCPS::TransportImpl.

Definition at line 195 of file UdpTransport.cpp.

References client_links_, client_links_lock_, OpenDDS::DCPS::RcHandle< T >::reset(), server_link_, and OpenDDS::DCPS::DataLink::transport_shutdown().

196 {
197  // Shutdown reserved datalinks and release configuration:
199  for (UdpDataLinkMap::iterator it(client_links_.begin());
200  it != client_links_.end(); ++it) {
201  it->second->transport_shutdown();
202  }
203  client_links_.clear();
204 
205  if (server_link_) {
208  }
209 }
LockType client_links_lock_
This lock is used to protect the client_links_ data member.
Definition: UdpTransport.h:73
UdpDataLinkMap client_links_
Definition: UdpTransport.h:78
UdpDataLink_rch server_link_
The single datalink for the passive side. No locking required.
Definition: UdpTransport.h:81
ACE_Guard< LockType > GuardType
Definition: UdpTransport.h:69

◆ stop_accepting_or_connecting()

void OpenDDS::DCPS::UdpTransport::stop_accepting_or_connecting ( const TransportClient_wrch client,
const GUID_t remote_id,
bool  disassociate,
bool  association_failed 
)
protectedvirtual

stop_accepting_or_connecting() is called from TransportClient to terminate the accepting process begun by accept_datalink() or connect_datalink(). This allows the TransportImpl to clean up any resources associated with this pending connection. The TransportClient* passed in to accept or connect is not valid after this method is called.

Implements OpenDDS::DCPS::TransportImpl.

Definition at line 149 of file UdpTransport.cpp.

References connections_lock_, LM_DEBUG, pending_connections_, and VDBG.

153 {
154  VDBG((LM_DEBUG, "(%P|%t) UdpTransport::stop_accepting_or_connecting\n"));
155 
157 
158  for (PendConnMap::iterator it = pending_connections_.begin();
159  it != pending_connections_.end(); ++it) {
160  for (size_t i = 0; i < it->second.size(); ++i) {
161  if (it->second[i].first == client && it->second[i].second == remote_id) {
162  it->second.erase(it->second.begin() + i);
163  break;
164  }
165  }
166  if (it->second.empty()) {
167  pending_connections_.erase(it);
168  return;
169  }
170  }
171 }
PendConnMap pending_connections_
Definition: UdpTransport.h:99
#define VDBG(DBG_ARGS)
ACE_Recursive_Thread_Mutex connections_lock_
Definition: UdpTransport.h:86

◆ transport_type()

virtual std::string OpenDDS::DCPS::UdpTransport::transport_type ( ) const
inlineprotectedvirtual

Implements OpenDDS::DCPS::TransportImpl.

Definition at line 59 of file UdpTransport.h.

59 { return "udp"; }

Member Data Documentation

◆ client_links_

UdpDataLinkMap OpenDDS::DCPS::UdpTransport::client_links_
private

Definition at line 78 of file UdpTransport.h.

Referenced by connect_datalink(), release_datalink(), and shutdown_i().

◆ client_links_lock_

LockType OpenDDS::DCPS::UdpTransport::client_links_lock_
private

This lock is used to protect the client_links_ data member.

Definition at line 73 of file UdpTransport.h.

Referenced by connect_datalink(), release_datalink(), and shutdown_i().

◆ connections_lock_

ACE_Recursive_Thread_Mutex OpenDDS::DCPS::UdpTransport::connections_lock_
private

This protects the pending_connections_, pending_server_link_keys_, and server_link_keys_ data members.

Definition at line 86 of file UdpTransport.h.

Referenced by accept_datalink(), passive_connection(), and stop_accepting_or_connecting().

◆ pending_connections_

PendConnMap OpenDDS::DCPS::UdpTransport::pending_connections_
private

Locked by connections_lock_. Tracks expected connections that we have learned about in accept_datalink() but have not yet performed the handshake.

Definition at line 99 of file UdpTransport.h.

Referenced by accept_datalink(), passive_connection(), and stop_accepting_or_connecting().

◆ pending_server_link_keys_

std::set<PriorityKey> OpenDDS::DCPS::UdpTransport::pending_server_link_keys_
private

Locked by connections_lock_. These are passive-side PriorityKeys that have finished handshaking, but have not been processed by accept_datalink()

Definition at line 104 of file UdpTransport.h.

Referenced by accept_datalink(), and passive_connection().

◆ server_link_

UdpDataLink_rch OpenDDS::DCPS::UdpTransport::server_link_
private

The single datalink for the passive side. No locking required.

Definition at line 81 of file UdpTransport.h.

Referenced by accept_datalink(), configure_i(), passive_connection(), and shutdown_i().

◆ server_link_keys_

std::set<PriorityKey> OpenDDS::DCPS::UdpTransport::server_link_keys_
private

Locked by connections_lock_. These are passive-side PriorityKeys that have been fully associated (processed by accept_datalink() and finished handshaking). They are ready for use and reuse via server_link_.

Definition at line 92 of file UdpTransport.h.

Referenced by accept_datalink(), and passive_connection().


The documentation for this class was generated from the following files: