blob: dbfd1acf38835dde50d91ef11894ab851fd36866 [file] [log] [blame]
Austin Schuhe84c3ed2019-12-14 15:29:48 -08001#ifndef AOS_NETWORK_SCTP_SERVER_H_
2#define AOS_NETWORK_SCTP_SERVER_H_
3
4#include <arpa/inet.h>
5#include <net/if.h>
6#include <netdb.h>
7#include <netinet/in.h>
8#include <netinet/sctp.h>
Austin Schuhe84c3ed2019-12-14 15:29:48 -08009#include <sys/socket.h>
10
Tyler Chatowbf0609c2021-07-31 16:13:27 -070011#include <cstdio>
12#include <cstdlib>
13#include <cstring>
14#include <memory>
15
Austin Schuhe84c3ed2019-12-14 15:29:48 -080016#include "aos/network/sctp_lib.h"
17#include "aos/unique_malloc_ptr.h"
18#include "glog/logging.h"
19
20namespace aos {
21namespace message_bridge {
22
23class SctpServer {
24 public:
Brian Silverman833dfb62021-11-03 10:47:55 -070025 SctpServer(int streams, std::string_view local_host = "0.0.0.0",
26 int local_port = 9971);
Austin Schuhe84c3ed2019-12-14 15:29:48 -080027
Austin Schuh507f7582021-07-31 20:39:55 -070028 ~SctpServer() {}
Austin Schuhe84c3ed2019-12-14 15:29:48 -080029
30 // Receives the next packet from the remote.
Austin Schuh507f7582021-07-31 20:39:55 -070031 aos::unique_c_ptr<Message> Read() { return sctp_.ReadMessage(); }
Austin Schuhe84c3ed2019-12-14 15:29:48 -080032
Austin Schuh83afb7a2020-03-15 23:09:22 -070033 // Sends a block of data to a client on a stream with a TTL. Returns true on
34 // success.
35 bool Send(std::string_view data, sctp_assoc_t snd_assoc_id, int stream,
Austin Schuh507f7582021-07-31 20:39:55 -070036 int time_to_live) {
37 return sctp_.SendMessage(stream, data, time_to_live, std::nullopt,
38 snd_assoc_id);
39 }
Austin Schuhe84c3ed2019-12-14 15:29:48 -080040
Austin Schuh4889b182020-11-18 19:11:56 -080041 // Aborts a connection. Returns true on success.
Sarah Newman80e955e2022-04-13 11:19:36 -070042 bool Abort(sctp_assoc_t snd_assoc_id) { return sctp_.Abort(snd_assoc_id); }
Austin Schuh4889b182020-11-18 19:11:56 -080043
Austin Schuh507f7582021-07-31 20:39:55 -070044 int fd() { return sctp_.fd(); }
Austin Schuhe84c3ed2019-12-14 15:29:48 -080045
46 // Enables the priority scheduler. This is a SCTP feature which lets us
47 // configure the priority per stream so that higher priority packets don't get
48 // backed up behind lower priority packets in the networking queues.
49 void SetPriorityScheduler(sctp_assoc_t assoc_id);
50
51 // Sets the priority of a specific stream.
52 void SetStreamPriority(sctp_assoc_t assoc_id, int stream_id,
53 uint16_t priority);
54
Austin Schuh507f7582021-07-31 20:39:55 -070055 void SetMaxSize(size_t max_size) { sctp_.SetMaxSize(max_size); }
Austin Schuh7bc59052020-02-16 23:48:33 -080056
Austin Schuhe84c3ed2019-12-14 15:29:48 -080057 private:
58 struct sockaddr_storage sockaddr_local_;
Austin Schuh507f7582021-07-31 20:39:55 -070059 SctpReadWrite sctp_;
Austin Schuhe84c3ed2019-12-14 15:29:48 -080060};
61
Austin Schuhe84c3ed2019-12-14 15:29:48 -080062} // namespace message_bridge
63} // namespace aos
64
65#endif // AOS_NETWORK_SCTP_SERVER_H_