aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Sadie Powell2023-01-16 21:16:16 +0000
committerGravatar Sadie Powell2023-01-16 21:16:16 +0000
commit34de733223e2772f716765ec4e931d36ebedd714 (patch)
treed42963866def0643dbc3edfd9f6c48e7652889d8 /src
parentAdd support for SCTP listeners. (diff)
Add support for linking servers over SCTP sockets.
Diffstat (limited to 'src')
-rw-r--r--src/inspsocket.cpp8
-rw-r--r--src/modules/m_spanningtree/link.h1
-rw-r--r--src/modules/m_spanningtree/treesocket1.cpp2
-rw-r--r--src/modules/m_spanningtree/utils.cpp8
4 files changed, 14 insertions, 5 deletions
diff --git a/src/inspsocket.cpp b/src/inspsocket.cpp
index eb348e7b3..f4d123739 100644
--- a/src/inspsocket.cpp
+++ b/src/inspsocket.cpp
@@ -53,9 +53,9 @@ BufferedSocket::BufferedSocket(int newfd)
SocketEngine::AddFd(this, FD_WANT_FAST_READ | FD_WANT_EDGE_WRITE);
}
-void BufferedSocket::DoConnect(const irc::sockets::sockaddrs& dest, const irc::sockets::sockaddrs& bind, unsigned long maxtime)
+void BufferedSocket::DoConnect(const irc::sockets::sockaddrs& dest, const irc::sockets::sockaddrs& bind, unsigned long maxtime, int protocol)
{
- BufferedSocketError err = BeginConnect(dest, bind, maxtime);
+ BufferedSocketError err = BeginConnect(dest, bind, maxtime, protocol);
if (err != I_ERR_NONE)
{
state = I_ERROR;
@@ -64,10 +64,10 @@ void BufferedSocket::DoConnect(const irc::sockets::sockaddrs& dest, const irc::s
}
}
-BufferedSocketError BufferedSocket::BeginConnect(const irc::sockets::sockaddrs& dest, const irc::sockets::sockaddrs& bind, unsigned long timeout)
+BufferedSocketError BufferedSocket::BeginConnect(const irc::sockets::sockaddrs& dest, const irc::sockets::sockaddrs& bind, unsigned long timeout, int protocol)
{
if (!HasFd())
- SetFd(socket(dest.family(), SOCK_STREAM, 0));
+ SetFd(socket(dest.family(), SOCK_STREAM, protocol));
if (!HasFd())
return I_ERR_SOCKET;
diff --git a/src/modules/m_spanningtree/link.h b/src/modules/m_spanningtree/link.h
index 49e86bf3e..4f15f829d 100644
--- a/src/modules/m_spanningtree/link.h
+++ b/src/modules/m_spanningtree/link.h
@@ -42,6 +42,7 @@ public:
unsigned long Timeout;
std::string Bind;
bool Hidden;
+ int Protocol = 0;
Link(const std::shared_ptr<ConfigTag>& Tag)
: tag(Tag)
{
diff --git a/src/modules/m_spanningtree/treesocket1.cpp b/src/modules/m_spanningtree/treesocket1.cpp
index 37de1adc8..2da154642 100644
--- a/src/modules/m_spanningtree/treesocket1.cpp
+++ b/src/modules/m_spanningtree/treesocket1.cpp
@@ -66,7 +66,7 @@ TreeSocket::TreeSocket(const std::shared_ptr<Link>& link, const std::shared_ptr<
}
}
- DoConnect(dest, bind, link->Timeout);
+ DoConnect(dest, bind, link->Timeout, link->Protocol);
Utils->timeoutlist[this] = std::pair<std::string, unsigned int>(linkID, link->Timeout);
SendCapabilities(1);
}
diff --git a/src/modules/m_spanningtree/utils.cpp b/src/modules/m_spanningtree/utils.cpp
index f05c587f6..42a331ab6 100644
--- a/src/modules/m_spanningtree/utils.cpp
+++ b/src/modules/m_spanningtree/utils.cpp
@@ -263,6 +263,14 @@ void SpanningTreeUtilities::ReadConfiguration()
{
L->IPAddr = tag->getString("ipaddr");
L->Port = static_cast<in_port_t>(tag->getUInt("port", 0, 0, 65535));
+ if (tag->getBool("sctp"))
+ {
+#ifdef IPPROTO_SCTP
+ L->Protocol = IPPROTO_SCTP;
+#else
+ throw ModuleException((Module*)Creator, "Unable to use SCTP listener as this platform does not support SCTP!");
+#endif
+ }
}
else
{