|
@@ -178,11 +178,10 @@ void SctpTransport::Cleanup() {
|
|
|
std::this_thread::sleep_for(100ms);
|
|
|
}
|
|
|
|
|
|
-SctpTransport::SctpTransport(shared_ptr<Transport> lower, const Configuration &config,
|
|
|
- uint16_t port, message_callback recvCallback,
|
|
|
- amount_callback bufferedAmountCallback,
|
|
|
+SctpTransport::SctpTransport(shared_ptr<Transport> lower, const Configuration &config, Ports ports,
|
|
|
+ message_callback recvCallback, amount_callback bufferedAmountCallback,
|
|
|
state_callback stateChangeCallback)
|
|
|
- : Transport(lower, std::move(stateChangeCallback)), mPort(port),
|
|
|
+ : Transport(lower, std::move(stateChangeCallback)), mPorts(std::move(ports)),
|
|
|
mSendQueue(0, message_size_func), mBufferedAmountCallback(std::move(bufferedAmountCallback)) {
|
|
|
onRecv(std::move(recvCallback));
|
|
|
|
|
@@ -361,28 +360,34 @@ void SctpTransport::close() {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-void SctpTransport::connect() {
|
|
|
- if (!mSock)
|
|
|
- throw std::logic_error("Attempted SCTP connect with closed socket");
|
|
|
-
|
|
|
- PLOG_DEBUG << "SCTP connecting";
|
|
|
- changeState(State::Connecting);
|
|
|
-
|
|
|
+struct sockaddr_conn SctpTransport::getSockAddrConn(uint16_t port) {
|
|
|
struct sockaddr_conn sconn = {};
|
|
|
sconn.sconn_family = AF_CONN;
|
|
|
- sconn.sconn_port = htons(mPort);
|
|
|
+ sconn.sconn_port = htons(port);
|
|
|
sconn.sconn_addr = this;
|
|
|
#ifdef HAVE_SCONN_LEN
|
|
|
sconn.sconn_len = sizeof(sconn);
|
|
|
#endif
|
|
|
+ return sconn;
|
|
|
+}
|
|
|
+
|
|
|
+void SctpTransport::connect() {
|
|
|
+ if (!mSock)
|
|
|
+ throw std::logic_error("Attempted SCTP connect with closed socket");
|
|
|
+
|
|
|
+ PLOG_DEBUG << "SCTP connecting (local port=" << mPorts.local
|
|
|
+ << ", remote port=" << mPorts.remote << ")";
|
|
|
+ changeState(State::Connecting);
|
|
|
|
|
|
- if (usrsctp_bind(mSock, reinterpret_cast<struct sockaddr *>(&sconn), sizeof(sconn)))
|
|
|
+ auto local = getSockAddrConn(mPorts.local);
|
|
|
+ if (usrsctp_bind(mSock, reinterpret_cast<struct sockaddr *>(&local), sizeof(local)))
|
|
|
throw std::runtime_error("Could not bind usrsctp socket, errno=" + std::to_string(errno));
|
|
|
|
|
|
// According to RFC 8841, both endpoints must initiate the SCTP association, in a
|
|
|
// simultaneous-open manner, irrelevent to the SDP setup role.
|
|
|
// See https://tools.ietf.org/html/rfc8841#section-9.3
|
|
|
- int ret = usrsctp_connect(mSock, reinterpret_cast<struct sockaddr *>(&sconn), sizeof(sconn));
|
|
|
+ auto remote = getSockAddrConn(mPorts.remote);
|
|
|
+ int ret = usrsctp_connect(mSock, reinterpret_cast<struct sockaddr *>(&remote), sizeof(remote));
|
|
|
if (ret && errno != EINPROGRESS)
|
|
|
throw std::runtime_error("Connection attempt failed, errno=" + std::to_string(errno));
|
|
|
}
|