TransportImpl::AcceptConnectResult RtpsUdpTransport::connect_datalink(const RemoteTransport& remote, const ConnectionAttribs& attribs, TransportClient* client ) { GuardThreadType guard_links(this->links_lock_); RtpsUdpDataLink_rch link = link_; if (link_.is_nil()) { link = make_datalink(attribs.local_id_.guidPrefix); if (link.is_nil()) { return AcceptConnectResult(); } } use_datalink(attribs.local_id_, remote.repo_id_, remote.blob_, attribs.local_reliable_, remote.reliable_, attribs.local_durable_, remote.durable_); if (0 == std::memcmp(attribs.local_id_.guidPrefix, remote.repo_id_.guidPrefix, sizeof(GuidPrefix_t))) { return AcceptConnectResult(link._retn()); // "loopback" connection return link right away } if (link->check_handshake_complete(attribs.local_id_, remote.repo_id_)){ return AcceptConnectResult(link._retn()); } if (!link->add_on_start_callback(client, remote.repo_id_)) { // link was started by the reactor thread before we could add a callback VDBG_LVL((LM_DEBUG, "(%P|%t) RtpsUdpTransport::connect_datalink got link.\n"), 2); return AcceptConnectResult(link._retn()); } GuardType guard(connections_lock_); add_pending_connection(client, link.in()); VDBG_LVL((LM_DEBUG, "(%P|%t) RtpsUdpTransport::connect_datalink pending.\n"), 2); return AcceptConnectResult(AcceptConnectResult::ACR_SUCCESS); /* const GuidConverter local_conv(attribs.local_id_), remote_conv(remote.repo_id_); VDBG_LVL((LM_DEBUG, "(%P|%t) RtpsUdpTransport::connect_datalink_i " "waiting for handshake local %C remote %C\n", std::string(local_conv).c_str(), std::string(remote_conv).c_str()), 2); //TODO: fix waiting if (!link->wait_for_handshake(attribs.local_id_, remote.repo_id_)) { VDBG_LVL((LM_ERROR, "(%P|%t) RtpsUdpTransport::connect_datalink_i " "ERROR: wait for handshake failed\n"), 2); return AcceptConnectResult(); } VDBG_LVL((LM_DEBUG, "(%P|%t) RtpsUdpTransport::connect_datalink_i " "wait for handshake completed\n"), 2); return AcceptConnectResult(link._retn()); */ }
TransportImpl::AcceptConnectResult RtpsUdpTransport::accept_datalink(const RemoteTransport& remote, const ConnectionAttribs& attribs, TransportClient* ) { GuardThreadType guard_links(this->links_lock_); RtpsUdpDataLink_rch link = link_; if (link_.is_nil()) { link = make_datalink(attribs.local_id_.guidPrefix); if (link.is_nil()) { return AcceptConnectResult(); } } use_datalink(attribs.local_id_, remote.repo_id_, remote.blob_, attribs.local_reliable_, remote.reliable_, attribs.local_durable_, remote.durable_); return AcceptConnectResult(link._retn()); }