rbsrt 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +752 -0
- data/Rakefile +29 -0
- data/bin/rbsrt-client +113 -0
- data/bin/rbsrt-server +68 -0
- data/bin/rbsrt-sockets +82 -0
- data/ext/rbsrt/extconf.rb +37 -0
- data/ext/rbsrt/rbsrt.c +2270 -0
- data/ext/rbsrt/rbsrt.h +265 -0
- data/ext/rbsrt/rbstats.c +960 -0
- data/ext/rbsrt/rbstats.h +24 -0
- data/lib/rbsrt/rbsrt.bundle +0 -0
- data/lib/rbsrt/streamid_components.rb +113 -0
- data/lib/rbsrt/version.rb +3 -0
- data/lib/rbsrt.rb +5 -0
- data/rbsrt.gemspec +22 -0
- data/test/rbsrt/poll_test.rb +153 -0
- data/test/rbsrt/stats_test.rb +546 -0
- data/test/rbsrt/streamid_components_test.rb +281 -0
- metadata +83 -0
data/ext/rbsrt/rbsrt.h
ADDED
@@ -0,0 +1,265 @@
|
|
1
|
+
/*
|
2
|
+
* Ruby SRT - Ruby binding for Secure, Reliable, Transport
|
3
|
+
* Copyright (c) 2019 Klaas Speller, Recce.
|
4
|
+
*
|
5
|
+
* This Source Code Form is subject to the terms of the Mozilla Public
|
6
|
+
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
7
|
+
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
8
|
+
*
|
9
|
+
*/
|
10
|
+
|
11
|
+
/**
|
12
|
+
* A Ruby wrapper for SRT (Secure Reliable Transport)
|
13
|
+
*
|
14
|
+
* @author: Klaas Speller <klaas@recce.nl>
|
15
|
+
*/
|
16
|
+
|
17
|
+
#ifndef RBSRT_HEADER
|
18
|
+
#define RBSRT_HEADER
|
19
|
+
|
20
|
+
#include <stdatomic.h>
|
21
|
+
|
22
|
+
#include <ruby/ruby.h>
|
23
|
+
#include <srt/srt.h>
|
24
|
+
|
25
|
+
|
26
|
+
// MARK: - Utils
|
27
|
+
|
28
|
+
// MARK: - Status
|
29
|
+
|
30
|
+
#define RBSRT_SUCCESS 0
|
31
|
+
#define RBSRT_FAILURE 1
|
32
|
+
|
33
|
+
|
34
|
+
// MARK: Debug
|
35
|
+
|
36
|
+
// #define RBSRT_HAVE_DEBUG
|
37
|
+
|
38
|
+
#ifdef RBSRT_HAVE_DEBUG
|
39
|
+
#define RBSRT_DEBUG 1
|
40
|
+
#endif
|
41
|
+
|
42
|
+
|
43
|
+
#if RBSRT_DEBUG
|
44
|
+
#define RBSRT_DEBUG_MSG_MAX 1024
|
45
|
+
#define RBSRT_DEBUG_PRINT(...) \
|
46
|
+
{ \
|
47
|
+
char debugmsg__[RBSRT_DEBUG_MSG_MAX]; \
|
48
|
+
sprintf(debugmsg__, ## __VA_ARGS__); \
|
49
|
+
fprintf(stderr, "rbsrt - %s\n", debugmsg__); \
|
50
|
+
} \
|
51
|
+
|
52
|
+
#define DEBUG_ERROR_PRINT(...) \
|
53
|
+
{ \
|
54
|
+
char debugmsg__[RBSRT_DEBUG_MSG_MAX]; \
|
55
|
+
sprintf(debugmsg__, ## __VA_ARGS__); \
|
56
|
+
fprintf(stderr, "rbsrt error - %s\n", debugmsg__); \
|
57
|
+
}
|
58
|
+
#else
|
59
|
+
#define RBSRT_DEBUG_PRINT(...)
|
60
|
+
#define DEBUG_ERROR_PRINT(...)
|
61
|
+
#endif
|
62
|
+
|
63
|
+
|
64
|
+
// MARK: Constants
|
65
|
+
|
66
|
+
#define RBSRT_PAYLOAD_SIZE 1316
|
67
|
+
|
68
|
+
|
69
|
+
// MARK: - Structs
|
70
|
+
|
71
|
+
typedef struct RBSRTSocketBase
|
72
|
+
{
|
73
|
+
SRTSOCKET socket;
|
74
|
+
} rbsrt_socket_base_t;
|
75
|
+
|
76
|
+
typedef struct RBSRTSocket
|
77
|
+
{
|
78
|
+
SRTSOCKET socket;
|
79
|
+
} rbsrt_socket_t;
|
80
|
+
|
81
|
+
typedef struct RBSRTConnection
|
82
|
+
{
|
83
|
+
SRTSOCKET socket;
|
84
|
+
VALUE at_data_block;
|
85
|
+
VALUE at_close_block;
|
86
|
+
} rbsrt_connection_t;
|
87
|
+
|
88
|
+
typedef struct RBSRTServer
|
89
|
+
{
|
90
|
+
SRTSOCKET socket;
|
91
|
+
int flags; // TODO: Deprecate flags
|
92
|
+
atomic_size_t num_connections;
|
93
|
+
SRT_EPOLL_T epollid;
|
94
|
+
VALUE acceptor_block;
|
95
|
+
} rbsrt_server_t;
|
96
|
+
|
97
|
+
typedef struct RBSRTClient
|
98
|
+
{
|
99
|
+
SRTSOCKET socket;
|
100
|
+
int flags; // TODO: Deprecate flags
|
101
|
+
} rbsrt_client_t;
|
102
|
+
|
103
|
+
typedef struct RBSRTPoll
|
104
|
+
{
|
105
|
+
SRT_EPOLL_T epollid;
|
106
|
+
VALUE sockets_by_id;
|
107
|
+
} rbsrt_poll_t;
|
108
|
+
|
109
|
+
typedef struct RBSRTStats
|
110
|
+
{
|
111
|
+
SRT_TRACEBSTATS perf;
|
112
|
+
} rbsrt_stats_t;
|
113
|
+
|
114
|
+
|
115
|
+
// MARK: - Ruby Struct Headers
|
116
|
+
|
117
|
+
// MARK: SRT::Socket Class
|
118
|
+
|
119
|
+
size_t rbsrt_socket_dsize(const void *socket);
|
120
|
+
void rbsrt_socket_dmark(void *data);
|
121
|
+
void rbsrt_socket_deallocate(rbsrt_socket_t *socket);
|
122
|
+
|
123
|
+
// MARK: SRT::Connection Class
|
124
|
+
|
125
|
+
size_t rbsrt_connection_dsize(const void *connection);
|
126
|
+
void rbsrt_connection_dmark(void *data);
|
127
|
+
void rbsrt_connection_deallocate(rbsrt_connection_t *connection);
|
128
|
+
|
129
|
+
// MARK: SRT::Server Class
|
130
|
+
|
131
|
+
size_t rbsrt_server_dsize(const void *server);
|
132
|
+
void rbsrt_server_dmark(void *data);
|
133
|
+
void rbsrt_server_deallocate(rbsrt_server_t *server);
|
134
|
+
|
135
|
+
// MARK: SRT::Client Class
|
136
|
+
|
137
|
+
size_t rbsrt_client_dsize(const void *client);
|
138
|
+
void rbsrt_client_dmark(void *data);
|
139
|
+
void rbsrt_client_deallocate(rbsrt_client_t *client);
|
140
|
+
|
141
|
+
// MARK: SRT::Poll Class
|
142
|
+
|
143
|
+
size_t rbsrt_poll_dsize(const void *poll);
|
144
|
+
void rbsrt_poll_dmark(void *data);
|
145
|
+
void rbsrt_poll_deallocate(rbsrt_poll_t *poll);
|
146
|
+
|
147
|
+
|
148
|
+
// MARK: SRT::Stats Class
|
149
|
+
|
150
|
+
size_t rbsrt_stats_dsize(const void *stats);
|
151
|
+
void rbsrt_stats_dmark(void *data);
|
152
|
+
void rbsrt_stats_deallocate(rbsrt_stats_t *stats);
|
153
|
+
|
154
|
+
|
155
|
+
// MARK: - Ruby Structs
|
156
|
+
|
157
|
+
static const rb_data_type_t rbsrt_socket_rbtype = {
|
158
|
+
.wrap_struct_name = "rbsrt_socket",
|
159
|
+
.function = {
|
160
|
+
.dfree = (void *)rbsrt_socket_deallocate,
|
161
|
+
.dsize = rbsrt_socket_dsize,
|
162
|
+
.dmark = rbsrt_socket_dmark
|
163
|
+
},
|
164
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
165
|
+
};
|
166
|
+
|
167
|
+
static const rb_data_type_t rbsrt_connection_rbtype = {
|
168
|
+
.wrap_struct_name = "rbsrt_connection",
|
169
|
+
.function = {
|
170
|
+
.dfree = (void *)rbsrt_connection_deallocate,
|
171
|
+
.dsize = rbsrt_connection_dsize,
|
172
|
+
.dmark = rbsrt_connection_dmark,
|
173
|
+
},
|
174
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
175
|
+
};
|
176
|
+
|
177
|
+
static const rb_data_type_t rbsrt_server_rbtype = {
|
178
|
+
.wrap_struct_name = "rbsrt_server",
|
179
|
+
.function = {
|
180
|
+
.dfree = (void *)rbsrt_server_deallocate,
|
181
|
+
.dsize = rbsrt_server_dsize,
|
182
|
+
.dmark = rbsrt_server_dmark
|
183
|
+
},
|
184
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
185
|
+
};
|
186
|
+
|
187
|
+
static const rb_data_type_t rbsrt_client_rbtype = {
|
188
|
+
.wrap_struct_name = "rbsrt_client",
|
189
|
+
.function = {
|
190
|
+
.dfree = (void *)rbsrt_client_deallocate,
|
191
|
+
.dsize = rbsrt_client_dsize,
|
192
|
+
.dmark = rbsrt_client_dmark
|
193
|
+
},
|
194
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
195
|
+
};
|
196
|
+
|
197
|
+
static const rb_data_type_t rbsrt_poll_rbtype = {
|
198
|
+
.wrap_struct_name = "rbsrt_poll",
|
199
|
+
.function = {
|
200
|
+
.dfree = (void *)rbsrt_poll_deallocate,
|
201
|
+
.dsize = rbsrt_poll_dsize,
|
202
|
+
.dmark = rbsrt_poll_dmark
|
203
|
+
},
|
204
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
205
|
+
};
|
206
|
+
|
207
|
+
static const rb_data_type_t rbsrt_stats_rbtype = {
|
208
|
+
.wrap_struct_name = "rbsrt_stats",
|
209
|
+
.function = {
|
210
|
+
.dfree = (void *)rbsrt_stats_deallocate,
|
211
|
+
.dsize = rbsrt_stats_dsize,
|
212
|
+
.dmark = rbsrt_stats_dmark
|
213
|
+
},
|
214
|
+
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
215
|
+
};
|
216
|
+
|
217
|
+
|
218
|
+
// MARK: Unwraps
|
219
|
+
|
220
|
+
#define RBSRT_IS_SOCKET(socket) (srt_getsockstate(socket->socket) != SRTS_NONEXIST)
|
221
|
+
|
222
|
+
#define RBSRT_CHECK_SOCKET(input, socket) \
|
223
|
+
if (!RBSRT_IS_SOCKET(socket)) \
|
224
|
+
{ \
|
225
|
+
rb_raise(rb_eTypeError, \
|
226
|
+
"wrong type %"PRIsVALUE" is not a SRT Socket Type", \
|
227
|
+
rb_obj_class(input)); \
|
228
|
+
} \
|
229
|
+
|
230
|
+
// NOTE: Bypassing some safty guards allowing us to use same function for server,
|
231
|
+
// connection, socket, etc.
|
232
|
+
#define RBSRT_SOCKET_BASE_UNWRAP(input, output) \
|
233
|
+
rbsrt_socket_base_t *output = (rbsrt_socket_base_t *)DATA_PTR(input); \
|
234
|
+
RBSRT_CHECK_SOCKET(input, output); \
|
235
|
+
|
236
|
+
#define RBSRT_SOCKET_UNWRAP(input, output) \
|
237
|
+
rbsrt_socket_t *output; \
|
238
|
+
TypedData_Get_Struct(input, rbsrt_socket_t, &rbsrt_socket_rbtype, output); \
|
239
|
+
|
240
|
+
#define RBSRT_CONNECTION_UNWRAP(input, output) \
|
241
|
+
rbsrt_connection_t *output; \
|
242
|
+
TypedData_Get_Struct(input, rbsrt_connection_t, &rbsrt_connection_rbtype, output); \
|
243
|
+
|
244
|
+
#define RBSRT_SERVER_UNWRAP(input, output) \
|
245
|
+
rbsrt_server_t *output; \
|
246
|
+
TypedData_Get_Struct(input, rbsrt_server_t, &rbsrt_server_rbtype, output); \
|
247
|
+
|
248
|
+
#define RBSRT_CLIENT_UNWRAP(input, output) \
|
249
|
+
rbsrt_client_t *output; \
|
250
|
+
TypedData_Get_Struct(input, rbsrt_client_t, &rbsrt_client_rbtype, output); \
|
251
|
+
|
252
|
+
#define RBSRT_POLL_UNWRAP(input, output) \
|
253
|
+
rbsrt_poll_t *output; \
|
254
|
+
TypedData_Get_Struct(input, rbsrt_poll_t, &rbsrt_poll_rbtype, output); \
|
255
|
+
|
256
|
+
#define RBSRT_STATS_UNWRAP(input, output) \
|
257
|
+
rbsrt_stats_t *output; \
|
258
|
+
TypedData_Get_Struct(input, rbsrt_stats_t, &rbsrt_stats_rbtype, output); \
|
259
|
+
|
260
|
+
|
261
|
+
// MARK: - Errors
|
262
|
+
|
263
|
+
_Noreturn void rbsrt_raise_last_srt_error(void);
|
264
|
+
|
265
|
+
#endif
|