Configure the number of channels for SCTP servers too

We already do this on the client, but on the server we left the default.
Turns out that default is 10, which we hit.

Change-Id: Ib5d895e3a5feb478673bc362a800c9708b8b8b83
Signed-off-by: Brian Silverman <brian.silverman@bluerivertech.com>
Signed-off-by: Austin Schuh <austin.schuh@bluerivertech.com>
diff --git a/aos/network/message_bridge_server_lib.cc b/aos/network/message_bridge_server_lib.cc
index da925f5..4f32e95 100644
--- a/aos/network/message_bridge_server_lib.cc
+++ b/aos/network/message_bridge_server_lib.cc
@@ -244,7 +244,8 @@
 MessageBridgeServer::MessageBridgeServer(aos::ShmEventLoop *event_loop)
     : event_loop_(event_loop),
       timestamp_loggers_(event_loop_),
-      server_("::", event_loop->node()->port()),
+      server_(max_channels() + kControlStreams(),
+              "::", event_loop->node()->port()),
       server_status_(event_loop, [this](const Context &context) {
         timestamp_state_->SendData(&server_, context);
       }) {
@@ -448,6 +449,10 @@
     }
     VLOG(1) << FlatbufferToJson(connect);
 
+    CHECK_LE(connect->channels_to_transfer()->size(),
+             static_cast<size_t>(max_channels()))
+        << ": Client has more channels than we do";
+
     // Account for the control channel and delivery times channel.
     size_t channel_index = kControlStreams();
     int node_index = -1;
diff --git a/aos/network/message_bridge_server_lib.h b/aos/network/message_bridge_server_lib.h
index db6e6d9..6f96c02 100644
--- a/aos/network/message_bridge_server_lib.h
+++ b/aos/network/message_bridge_server_lib.h
@@ -120,6 +120,13 @@
   // received.
   void HandleData(const Message *message);
 
+  // The maximum number of channels we support on a single connection. We need
+  // to configure the SCTP socket with this before any clients connect, so we
+  // need an upper bound on the number of channels any of them will use.
+  int max_channels() const {
+    return event_loop_->configuration()->channels()->size();
+  }
+
   // Event loop to schedule everything on.
   aos::ShmEventLoop *event_loop_;
 
diff --git a/aos/network/sctp_server.cc b/aos/network/sctp_server.cc
index 894a1f1..33046d0 100644
--- a/aos/network/sctp_server.cc
+++ b/aos/network/sctp_server.cc
@@ -20,12 +20,21 @@
 namespace aos {
 namespace message_bridge {
 
-SctpServer::SctpServer(std::string_view local_host, int local_port)
+SctpServer::SctpServer(int streams, std::string_view local_host, int local_port)
     : sockaddr_local_(ResolveSocket(local_host, local_port)) {
   while (true) {
     sctp_.OpenSocket(sockaddr_local_);
 
     {
+      struct sctp_initmsg initmsg;
+      memset(&initmsg, 0, sizeof(struct sctp_initmsg));
+      initmsg.sinit_num_ostreams = streams;
+      initmsg.sinit_max_instreams = streams;
+      PCHECK(setsockopt(fd(), IPPROTO_SCTP, SCTP_INITMSG, &initmsg,
+                        sizeof(struct sctp_initmsg)) == 0);
+    }
+
+    {
       // Turn off the NAGLE algorithm.
       int on = 1;
       PCHECK(setsockopt(fd(), IPPROTO_SCTP, SCTP_NODELAY, &on, sizeof(int)) ==
diff --git a/aos/network/sctp_server.h b/aos/network/sctp_server.h
index c6737d6..6ffe93e 100644
--- a/aos/network/sctp_server.h
+++ b/aos/network/sctp_server.h
@@ -22,7 +22,8 @@
 
 class SctpServer {
  public:
-  SctpServer(std::string_view local_host = "0.0.0.0", int local_port = 9971);
+  SctpServer(int streams, std::string_view local_host = "0.0.0.0",
+             int local_port = 9971);
 
   ~SctpServer() {}