blob: d995c553c369501ee5400872050581378f815b2f [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:
25 SctpServer(std::string_view local_host = "0.0.0.0", int local_port = 9971);
26
27 ~SctpServer() {
28 LOG(INFO) << "close(" << fd_ << ")";
29 PCHECK(close(fd_) == 0);
30 }
31
32 // Receives the next packet from the remote.
33 aos::unique_c_ptr<Message> Read();
34
Austin Schuh83afb7a2020-03-15 23:09:22 -070035 // Sends a block of data to a client on a stream with a TTL. Returns true on
36 // success.
37 bool Send(std::string_view data, sctp_assoc_t snd_assoc_id, int stream,
Austin Schuhe84c3ed2019-12-14 15:29:48 -080038 int timetolive);
39
Austin Schuh4889b182020-11-18 19:11:56 -080040 // Aborts a connection. Returns true on success.
41 bool Abort(sctp_assoc_t snd_assoc_id);
42
Austin Schuhe84c3ed2019-12-14 15:29:48 -080043 int fd() { return fd_; }
44
45 // Enables the priority scheduler. This is a SCTP feature which lets us
46 // configure the priority per stream so that higher priority packets don't get
47 // backed up behind lower priority packets in the networking queues.
48 void SetPriorityScheduler(sctp_assoc_t assoc_id);
49
50 // Sets the priority of a specific stream.
51 void SetStreamPriority(sctp_assoc_t assoc_id, int stream_id,
52 uint16_t priority);
53
Austin Schuh7bc59052020-02-16 23:48:33 -080054 void SetMaxSize(size_t max_size) {
55 max_size_ = max_size;
56 // Have the kernel give us a factor of 10 more. This lets us have more than
57 // one full sized packet in flight.
58 max_size = max_size * 10;
Austin Schuh2fe4b712020-03-15 14:21:45 -070059
60 CHECK_GE(ReadRMemMax(), max_size);
61 CHECK_GE(ReadWMemMax(), max_size);
Austin Schuh7bc59052020-02-16 23:48:33 -080062 PCHECK(setsockopt(fd_, SOL_SOCKET, SO_RCVBUF, &max_size,
63 sizeof(max_size)) == 0);
Austin Schuh2fe4b712020-03-15 14:21:45 -070064 PCHECK(setsockopt(fd_, SOL_SOCKET, SO_SNDBUF, &max_size,
65 sizeof(max_size)) == 0);
Austin Schuh7bc59052020-02-16 23:48:33 -080066 }
67
Austin Schuhe84c3ed2019-12-14 15:29:48 -080068 private:
69 struct sockaddr_storage sockaddr_local_;
70 int fd_;
71
Austin Schuhe84c3ed2019-12-14 15:29:48 -080072 size_t max_size_ = 1000;
73
74 int ppid_ = 1;
75};
76
Austin Schuhe84c3ed2019-12-14 15:29:48 -080077} // namespace message_bridge
78} // namespace aos
79
80#endif // AOS_NETWORK_SCTP_SERVER_H_