sctp-socket 0.1.1 → 0.1.2
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 +4 -4
- checksums.yaml.gz.sig +0 -0
- data/CHANGES.md +3 -0
- data/README.md +3 -3
- data/ext/sctp/extconf.rb +20 -3
- data/ext/sctp/socket.c +169 -29
- data/sctp-socket.gemspec +1 -1
- data.tar.gz.sig +0 -0
- metadata +2 -2
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 89d20d26ad8e90c5673d4d126da8daa8f69d907a54ba0ddc9caf529ef5929c6e
|
4
|
+
data.tar.gz: 886d28171c2e7242a7875b7a998e7073a9bec469da7da5b9205859a4e2d3e257
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ee23fbff8da2e3efa66f87f583ba1f631d39957a6f74bff530d1b71ae1a15ab773ecb6653f34d8d5e17e034a15f6a736c90a16f3c8f3ed636734ab674dee54ca
|
7
|
+
data.tar.gz: 68ff54d9088bfe723f0726c3bcc41c102aab7c3f631f1156f64651bd078ffa1a852b247505a4babf36cb37c61aa11726587db407ad34171c974b6afca96283a8
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data/CHANGES.md
CHANGED
data/README.md
CHANGED
@@ -63,8 +63,8 @@ end
|
|
63
63
|
|
64
64
|
## Known Issues
|
65
65
|
|
66
|
-
Currently this has only been developed and tested on Linux. Other
|
67
|
-
will probably only be supported via community contributions.
|
66
|
+
Currently this has only been developed and tested on Linux and BSD. Other
|
67
|
+
platforms will probably only be supported via community contributions.
|
68
68
|
|
69
69
|
The sendv and recvv methods may not be available. Use the sendmsg and recvmsg
|
70
70
|
methods instead.
|
@@ -92,7 +92,7 @@ Apache-2.0
|
|
92
92
|
|
93
93
|
## Copyright
|
94
94
|
|
95
|
-
(C) 2020-
|
95
|
+
(C) 2020-2025, Daniel J. Berger
|
96
96
|
Al Rights Reserved
|
97
97
|
|
98
98
|
## Author
|
data/ext/sctp/extconf.rb
CHANGED
@@ -24,8 +24,25 @@ unless have_header('netinet/sctp.h')
|
|
24
24
|
exit
|
25
25
|
end
|
26
26
|
|
27
|
+
header = 'netinet/sctp.h'
|
28
|
+
|
27
29
|
have_library('sctp')
|
28
|
-
|
29
|
-
|
30
|
-
|
30
|
+
|
31
|
+
have_header('sys/param.h')
|
32
|
+
|
33
|
+
have_func('sctp_sendv', header)
|
34
|
+
have_func('sctp_recvv', header)
|
35
|
+
|
36
|
+
have_struct_member('struct sctp_event_subscribe', 'sctp_send_failure_event', header)
|
37
|
+
have_struct_member('struct sctp_event_subscribe', 'sctp_stream_reset_event', header)
|
38
|
+
have_struct_member('struct sctp_event_subscribe', 'sctp_assoc_reset_event', header)
|
39
|
+
have_struct_member('struct sctp_event_subscribe', 'sctp_stream_change_event', header)
|
40
|
+
have_struct_member('struct sctp_event_subscribe', 'sctp_send_failure_event_event', header)
|
41
|
+
|
42
|
+
have_struct_member('struct sctp_send_failed_event', 'ssfe_length', header)
|
43
|
+
|
44
|
+
have_struct_member('union sctp_notification', 'sn_auth_event', header)
|
45
|
+
|
46
|
+
have_const('SCTP_EMPTY', header)
|
47
|
+
|
31
48
|
create_makefile('sctp/socket')
|
data/ext/sctp/socket.c
CHANGED
@@ -4,6 +4,10 @@
|
|
4
4
|
#include <arpa/inet.h>
|
5
5
|
#include <netinet/sctp.h>
|
6
6
|
|
7
|
+
#ifdef HAVE_SYS_PARAM_H
|
8
|
+
#include <sys/param.h>
|
9
|
+
#endif
|
10
|
+
|
7
11
|
VALUE mSCTP;
|
8
12
|
VALUE cSocket;
|
9
13
|
VALUE v_sndrcv_struct;
|
@@ -163,6 +167,28 @@ VALUE get_notification_info(char* buffer){
|
|
163
167
|
break;
|
164
168
|
#ifdef SCTP_SEND_FAILED_EVENT
|
165
169
|
case SCTP_SEND_FAILED_EVENT:
|
170
|
+
#ifdef HAVE_STRUCT_SCTP_SEND_FAILED_EVENT_SSFE_LENGTH
|
171
|
+
v_temp = ALLOCA_N(VALUE, snp->sn_send_failed_event.ssfe_length);
|
172
|
+
|
173
|
+
for(i = 0; i < snp->sn_send_failed_event.ssfe_length; i++){
|
174
|
+
v_temp[i] = UINT2NUM(snp->sn_send_failed_event.ssfe_data[i]);
|
175
|
+
}
|
176
|
+
|
177
|
+
v_notification = rb_struct_new(v_send_failed_event_struct,
|
178
|
+
UINT2NUM(snp->sn_send_failed_event.ssfe_type),
|
179
|
+
UINT2NUM(snp->sn_send_failed_event.ssfe_length),
|
180
|
+
UINT2NUM(snp->sn_send_failed_event.ssfe_error),
|
181
|
+
rb_struct_new(v_sndinfo_struct,
|
182
|
+
UINT2NUM(snp->sn_send_failed_event.ssfe_info.snd_sid),
|
183
|
+
UINT2NUM(snp->sn_send_failed_event.ssfe_info.snd_flags),
|
184
|
+
UINT2NUM(snp->sn_send_failed_event.ssfe_info.snd_ppid),
|
185
|
+
UINT2NUM(snp->sn_send_failed_event.ssfe_info.snd_context),
|
186
|
+
UINT2NUM(snp->sn_send_failed_event.ssfe_info.snd_assoc_id)
|
187
|
+
),
|
188
|
+
UINT2NUM(snp->sn_send_failed_event.ssfe_assoc_id),
|
189
|
+
rb_ary_new4(snp->sn_send_failed_event.ssfe_length, v_temp)
|
190
|
+
);
|
191
|
+
#else
|
166
192
|
v_temp = ALLOCA_N(VALUE, snp->sn_send_failed_event.ssf_length);
|
167
193
|
|
168
194
|
for(i = 0; i < snp->sn_send_failed_event.ssf_length; i++){
|
@@ -183,6 +209,7 @@ VALUE get_notification_info(char* buffer){
|
|
183
209
|
UINT2NUM(snp->sn_send_failed_event.ssf_assoc_id),
|
184
210
|
rb_ary_new4(snp->sn_send_failed_event.ssf_length, v_temp)
|
185
211
|
);
|
212
|
+
#endif
|
186
213
|
break;
|
187
214
|
#else
|
188
215
|
case SCTP_SEND_FAILED:
|
@@ -229,11 +256,19 @@ VALUE get_notification_info(char* buffer){
|
|
229
256
|
break;
|
230
257
|
case SCTP_AUTHENTICATION_EVENT:
|
231
258
|
v_notification = rb_struct_new(v_auth_event_struct,
|
259
|
+
#ifdef HAVE_UNION_SCTP_NOTIFICATION_SN_AUTH_EVENT
|
260
|
+
UINT2NUM(snp->sn_auth_event.auth_type),
|
261
|
+
UINT2NUM(snp->sn_auth_event.auth_length),
|
262
|
+
UINT2NUM(snp->sn_auth_event.auth_keynumber),
|
263
|
+
UINT2NUM(snp->sn_auth_event.auth_indication),
|
264
|
+
UINT2NUM(snp->sn_auth_event.auth_assoc_id)
|
265
|
+
#else
|
232
266
|
UINT2NUM(snp->sn_authkey_event.auth_type),
|
233
267
|
UINT2NUM(snp->sn_authkey_event.auth_length),
|
234
268
|
UINT2NUM(snp->sn_authkey_event.auth_keynumber),
|
235
269
|
UINT2NUM(snp->sn_authkey_event.auth_indication),
|
236
270
|
UINT2NUM(snp->sn_authkey_event.auth_assoc_id)
|
271
|
+
#endif
|
237
272
|
);
|
238
273
|
break;
|
239
274
|
case SCTP_SENDER_DRY_EVENT:
|
@@ -349,7 +384,7 @@ static VALUE rsctp_bindx(int argc, VALUE* argv, VALUE self){
|
|
349
384
|
if(NIL_P(v_addresses))
|
350
385
|
num_ip = 1;
|
351
386
|
else
|
352
|
-
num_ip = RARRAY_LEN(v_addresses);
|
387
|
+
num_ip = (int)RARRAY_LEN(v_addresses);
|
353
388
|
|
354
389
|
domain = NUM2INT(rb_iv_get(self, "@domain"));
|
355
390
|
fileno = NUM2INT(rb_iv_get(self, "@fileno"));
|
@@ -360,12 +395,18 @@ static VALUE rsctp_bindx(int argc, VALUE* argv, VALUE self){
|
|
360
395
|
addrs[i].sin_family = domain;
|
361
396
|
addrs[i].sin_port = htons(port);
|
362
397
|
addrs[i].sin_addr.s_addr = inet_addr(StringValueCStr(v_address));
|
398
|
+
#ifdef BSD
|
399
|
+
addrs[i].sin_len = sizeof(struct sockaddr_in);
|
400
|
+
#endif
|
363
401
|
}
|
364
402
|
}
|
365
403
|
else{
|
366
404
|
addrs[0].sin_family = domain;
|
367
405
|
addrs[0].sin_port = htons(port);
|
368
406
|
addrs[0].sin_addr.s_addr = htonl(INADDR_ANY);
|
407
|
+
#ifdef BSD
|
408
|
+
addrs[0].sin_len = sizeof(struct sockaddr_in);
|
409
|
+
#endif
|
369
410
|
}
|
370
411
|
|
371
412
|
if(sctp_bindx(fileno, (struct sockaddr *) addrs, num_ip, flags) != 0)
|
@@ -427,7 +468,7 @@ static VALUE rsctp_connectx(int argc, VALUE* argv, VALUE self){
|
|
427
468
|
|
428
469
|
v_domain = rb_iv_get(self, "@domain");
|
429
470
|
|
430
|
-
num_ip = RARRAY_LEN(v_addresses);
|
471
|
+
num_ip = (int)RARRAY_LEN(v_addresses);
|
431
472
|
bzero(&addrs, sizeof(addrs));
|
432
473
|
|
433
474
|
for(i = 0; i < num_ip; i++){
|
@@ -435,6 +476,9 @@ static VALUE rsctp_connectx(int argc, VALUE* argv, VALUE self){
|
|
435
476
|
addrs[i].sin_family = NUM2INT(v_domain);
|
436
477
|
addrs[i].sin_port = htons(NUM2INT(v_port));
|
437
478
|
addrs[i].sin_addr.s_addr = inet_addr(StringValueCStr(v_address));
|
479
|
+
#ifdef BSD
|
480
|
+
addrs[i].sin_len = sizeof(struct sockaddr_in);
|
481
|
+
#endif
|
438
482
|
}
|
439
483
|
|
440
484
|
fileno = NUM2INT(rb_iv_get(self, "@fileno"));
|
@@ -617,7 +661,8 @@ static VALUE rsctp_sendv(VALUE self, VALUE v_options){
|
|
617
661
|
struct iovec iov[IOV_MAX];
|
618
662
|
struct sockaddr_in* addrs;
|
619
663
|
struct sctp_sendv_spa spa;
|
620
|
-
int i, fileno,
|
664
|
+
int i, fileno, size, num_ip;
|
665
|
+
ssize_t num_bytes;
|
621
666
|
|
622
667
|
Check_Type(v_options, T_HASH);
|
623
668
|
|
@@ -632,7 +677,7 @@ static VALUE rsctp_sendv(VALUE self, VALUE v_options){
|
|
632
677
|
|
633
678
|
if(!NIL_P(v_addresses)){
|
634
679
|
Check_Type(v_addresses, T_ARRAY);
|
635
|
-
num_ip = RARRAY_LEN(v_addresses);
|
680
|
+
num_ip = (int)RARRAY_LEN(v_addresses);
|
636
681
|
addrs = (struct sockaddr_in*)alloca(num_ip * sizeof(*addrs));
|
637
682
|
}
|
638
683
|
else{
|
@@ -641,7 +686,7 @@ static VALUE rsctp_sendv(VALUE self, VALUE v_options){
|
|
641
686
|
}
|
642
687
|
|
643
688
|
fileno = NUM2INT(rb_iv_get(self, "@fileno"));
|
644
|
-
size = RARRAY_LEN(v_message);
|
689
|
+
size = (int)RARRAY_LEN(v_message);
|
645
690
|
|
646
691
|
if(!size)
|
647
692
|
rb_raise(rb_eArgError, "Must contain at least one message");
|
@@ -671,6 +716,9 @@ static VALUE rsctp_sendv(VALUE self, VALUE v_options){
|
|
671
716
|
addrs[i].sin_family = domain;
|
672
717
|
addrs[i].sin_port = htons(port);
|
673
718
|
addrs[i].sin_addr.s_addr = inet_addr(StringValueCStr(v_address));
|
719
|
+
#ifdef BSD
|
720
|
+
addrs[i].sin_len = sizeof(struct sockaddr_in);
|
721
|
+
#endif
|
674
722
|
}
|
675
723
|
}
|
676
724
|
|
@@ -680,7 +728,7 @@ static VALUE rsctp_sendv(VALUE self, VALUE v_options){
|
|
680
728
|
iov[i].iov_len = RSTRING_LEN(v_msg);
|
681
729
|
}
|
682
730
|
|
683
|
-
num_bytes = sctp_sendv(
|
731
|
+
num_bytes = (ssize_t)sctp_sendv(
|
684
732
|
fileno,
|
685
733
|
iov,
|
686
734
|
size,
|
@@ -695,14 +743,15 @@ static VALUE rsctp_sendv(VALUE self, VALUE v_options){
|
|
695
743
|
if(num_bytes < 0)
|
696
744
|
rb_raise(rb_eSystemCallError, "sctp_sendv: %s", strerror(errno));
|
697
745
|
|
698
|
-
return
|
746
|
+
return LONG2NUM(num_bytes);
|
699
747
|
}
|
700
748
|
#endif
|
701
749
|
|
702
750
|
#ifdef HAVE_SCTP_RECVV
|
703
751
|
static VALUE rsctp_recvv(int argc, VALUE* argv, VALUE self){
|
704
752
|
VALUE v_flags;
|
705
|
-
int fileno, flags,
|
753
|
+
int fileno, flags, on;
|
754
|
+
ssize_t bytes;
|
706
755
|
uint infotype;
|
707
756
|
socklen_t infolen;
|
708
757
|
struct iovec iov[1];
|
@@ -732,7 +781,7 @@ static VALUE rsctp_recvv(int argc, VALUE* argv, VALUE self){
|
|
732
781
|
infolen = sizeof(struct sctp_rcvinfo);
|
733
782
|
infotype = 0;
|
734
783
|
|
735
|
-
bytes = sctp_recvv(
|
784
|
+
bytes = (ssize_t)sctp_recvv(
|
736
785
|
fileno,
|
737
786
|
iov,
|
738
787
|
1,
|
@@ -849,7 +898,7 @@ static VALUE rsctp_send(VALUE self, VALUE v_options){
|
|
849
898
|
|
850
899
|
fileno = NUM2INT(rb_iv_get(self, "@fileno"));
|
851
900
|
|
852
|
-
num_bytes = sctp_send(
|
901
|
+
num_bytes = (ssize_t)sctp_send(
|
853
902
|
fileno,
|
854
903
|
StringValueCStr(v_msg),
|
855
904
|
RSTRING_LEN(v_msg),
|
@@ -860,7 +909,7 @@ static VALUE rsctp_send(VALUE self, VALUE v_options){
|
|
860
909
|
if(num_bytes < 0)
|
861
910
|
rb_raise(rb_eSystemCallError, "sctp_send: %s", strerror(errno));
|
862
911
|
|
863
|
-
return
|
912
|
+
return LONG2NUM(num_bytes);
|
864
913
|
}
|
865
914
|
|
866
915
|
/*
|
@@ -901,7 +950,7 @@ static VALUE rsctp_sendmsg(VALUE self, VALUE v_options){
|
|
901
950
|
uint32_t ppid, flags, ttl, context;
|
902
951
|
ssize_t num_bytes;
|
903
952
|
struct sockaddr_in addrs[8];
|
904
|
-
int fileno, size;
|
953
|
+
int fileno, size, num_ip;
|
905
954
|
|
906
955
|
Check_Type(v_options, T_HASH);
|
907
956
|
|
@@ -944,10 +993,10 @@ static VALUE rsctp_sendmsg(VALUE self, VALUE v_options){
|
|
944
993
|
context = NUM2INT(v_context);
|
945
994
|
|
946
995
|
if(!NIL_P(v_addresses)){
|
947
|
-
int i,
|
996
|
+
int i, port;
|
948
997
|
VALUE v_address, v_port;
|
949
998
|
|
950
|
-
num_ip = RARRAY_LEN(v_addresses);
|
999
|
+
num_ip = (int)RARRAY_LEN(v_addresses);
|
951
1000
|
v_port = rb_hash_aref2(v_options, "port");
|
952
1001
|
|
953
1002
|
if(NIL_P(v_port))
|
@@ -960,17 +1009,51 @@ static VALUE rsctp_sendmsg(VALUE self, VALUE v_options){
|
|
960
1009
|
addrs[i].sin_family = NUM2INT(rb_iv_get(self, "@domain"));
|
961
1010
|
addrs[i].sin_port = htons(port);
|
962
1011
|
addrs[i].sin_addr.s_addr = inet_addr(StringValueCStr(v_address));
|
1012
|
+
#ifdef BSD
|
1013
|
+
addrs[i].sin_len = sizeof(struct sockaddr_in);
|
1014
|
+
#endif
|
963
1015
|
}
|
964
1016
|
|
965
1017
|
size = sizeof(addrs);
|
966
1018
|
}
|
967
1019
|
else{
|
1020
|
+
num_ip = 0;
|
968
1021
|
size = 0;
|
969
1022
|
}
|
970
1023
|
|
971
1024
|
fileno = NUM2INT(rb_iv_get(self, "@fileno"));
|
972
1025
|
|
973
|
-
|
1026
|
+
#ifdef BSD
|
1027
|
+
if(num_ip){
|
1028
|
+
num_bytes = (ssize_t)sctp_sendmsgx(
|
1029
|
+
fileno,
|
1030
|
+
StringValueCStr(v_msg),
|
1031
|
+
RSTRING_LEN(v_msg),
|
1032
|
+
(struct sockaddr*)addrs,
|
1033
|
+
num_ip,
|
1034
|
+
ppid,
|
1035
|
+
flags,
|
1036
|
+
stream,
|
1037
|
+
ttl,
|
1038
|
+
context
|
1039
|
+
);
|
1040
|
+
}
|
1041
|
+
else{
|
1042
|
+
num_bytes = (ssize_t)sctp_sendmsg(
|
1043
|
+
fileno,
|
1044
|
+
StringValueCStr(v_msg),
|
1045
|
+
RSTRING_LEN(v_msg),
|
1046
|
+
(struct sockaddr*)addrs,
|
1047
|
+
size,
|
1048
|
+
ppid,
|
1049
|
+
flags,
|
1050
|
+
stream,
|
1051
|
+
ttl,
|
1052
|
+
context
|
1053
|
+
);
|
1054
|
+
}
|
1055
|
+
#else
|
1056
|
+
num_bytes = (ssize_t)sctp_sendmsg(
|
974
1057
|
fileno,
|
975
1058
|
StringValueCStr(v_msg),
|
976
1059
|
RSTRING_LEN(v_msg),
|
@@ -982,11 +1065,20 @@ static VALUE rsctp_sendmsg(VALUE self, VALUE v_options){
|
|
982
1065
|
ttl,
|
983
1066
|
context
|
984
1067
|
);
|
1068
|
+
#endif
|
985
1069
|
|
986
|
-
if(num_bytes < 0)
|
1070
|
+
if(num_bytes < 0){
|
1071
|
+
#ifdef BSD
|
1072
|
+
if(num_ip > 0)
|
1073
|
+
rb_raise(rb_eSystemCallError, "sctp_sendmsgx: %s", strerror(errno));
|
1074
|
+
else
|
1075
|
+
rb_raise(rb_eSystemCallError, "sctp_sendmsg: %s", strerror(errno));
|
1076
|
+
#else
|
987
1077
|
rb_raise(rb_eSystemCallError, "sctp_sendmsg: %s", strerror(errno));
|
1078
|
+
#endif
|
1079
|
+
}
|
988
1080
|
|
989
|
-
return
|
1081
|
+
return LONG2NUM(num_bytes);
|
990
1082
|
}
|
991
1083
|
|
992
1084
|
/*
|
@@ -1015,7 +1107,8 @@ static VALUE rsctp_recvmsg(int argc, VALUE* argv, VALUE self){
|
|
1015
1107
|
VALUE v_flags, v_notification, v_message;
|
1016
1108
|
struct sctp_sndrcvinfo sndrcvinfo;
|
1017
1109
|
struct sockaddr_in clientaddr;
|
1018
|
-
int flags,
|
1110
|
+
int flags, fileno;
|
1111
|
+
ssize_t bytes;
|
1019
1112
|
char buffer[1024]; // TODO: Let this be configurable?
|
1020
1113
|
socklen_t length;
|
1021
1114
|
|
@@ -1033,7 +1126,7 @@ static VALUE rsctp_recvmsg(int argc, VALUE* argv, VALUE self){
|
|
1033
1126
|
bzero(&clientaddr, sizeof(clientaddr));
|
1034
1127
|
bzero(&sndrcvinfo, sizeof(sndrcvinfo));
|
1035
1128
|
|
1036
|
-
bytes = sctp_recvmsg(
|
1129
|
+
bytes = (ssize_t)sctp_recvmsg(
|
1037
1130
|
fileno,
|
1038
1131
|
buffer,
|
1039
1132
|
sizeof(buffer),
|
@@ -1555,7 +1648,8 @@ static VALUE rsctp_get_subscriptions(VALUE self){
|
|
1555
1648
|
if(sctp_opt_info(fileno, assoc_id, SCTP_EVENTS, (void*)&events, &size) < 0)
|
1556
1649
|
rb_raise(rb_eSystemCallError, "sctp_opt_info: %s", strerror(errno));
|
1557
1650
|
|
1558
|
-
return rb_struct_new(
|
1651
|
+
return rb_struct_new(
|
1652
|
+
v_sctp_event_subscribe_struct,
|
1559
1653
|
(events.sctp_data_io_event ? Qtrue : Qfalse),
|
1560
1654
|
(events.sctp_association_event ? Qtrue : Qfalse),
|
1561
1655
|
(events.sctp_address_event ? Qtrue : Qfalse),
|
@@ -1565,11 +1659,19 @@ static VALUE rsctp_get_subscriptions(VALUE self){
|
|
1565
1659
|
(events.sctp_partial_delivery_event ? Qtrue : Qfalse),
|
1566
1660
|
(events.sctp_adaptation_layer_event ? Qtrue : Qfalse),
|
1567
1661
|
(events.sctp_authentication_event ? Qtrue : Qfalse),
|
1568
|
-
(events.sctp_sender_dry_event ? Qtrue : Qfalse)
|
1569
|
-
|
1570
|
-
(events.
|
1571
|
-
|
1572
|
-
|
1662
|
+
(events.sctp_sender_dry_event ? Qtrue : Qfalse)
|
1663
|
+
#ifdef HAVE_STRUCT_SCTP_EVENT_SUBSCRIBE_SCTP_STREAM_RESET_EVENT
|
1664
|
+
,(events.sctp_stream_reset_event ? Qtrue : Qfalse)
|
1665
|
+
#endif
|
1666
|
+
#ifdef HAVE_STRUCT_SCTP_EVENT_SUBSCRIBE_SCTP_ASSOC_RESET_EVENT
|
1667
|
+
,(events.sctp_assoc_reset_event ? Qtrue : Qfalse)
|
1668
|
+
#endif
|
1669
|
+
#ifdef HAVE_STRUCT_SCTP_EVENT_SUBSCRIBE_SCTP_STREAM_CHANGE_EVENT
|
1670
|
+
,(events.sctp_stream_change_event ? Qtrue : Qfalse)
|
1671
|
+
#endif
|
1672
|
+
#ifdef HAVE_STRUCT_SCTP_EVENT_SUBSCRIBE_SCTP_SEND_FAILURE_EVENT_EVENT
|
1673
|
+
,(events.sctp_send_failure_event_event ? Qtrue : Qfalse)
|
1674
|
+
#endif
|
1573
1675
|
);
|
1574
1676
|
}
|
1575
1677
|
|
@@ -1724,6 +1826,40 @@ static VALUE rsctp_set_nodelay(VALUE self, VALUE v_bool){
|
|
1724
1826
|
return Qfalse;
|
1725
1827
|
}
|
1726
1828
|
|
1829
|
+
/*
|
1830
|
+
* call-seq:
|
1831
|
+
* SCTP::Socket#disable_fragments=(bool)
|
1832
|
+
*
|
1833
|
+
* This option is a on/off flag and is passed an integer where a non-
|
1834
|
+
* zero is on and a zero is off. If enabled no SCTP message
|
1835
|
+
* fragmentation will be performed. Instead if a message being sent
|
1836
|
+
* exceeds the current PMTU size, the message will NOT be sent and
|
1837
|
+
* instead a error will be indicated to the user.
|
1838
|
+
*/
|
1839
|
+
static VALUE rsctp_disable_fragments(VALUE self, VALUE v_bool){
|
1840
|
+
int fileno;
|
1841
|
+
socklen_t size;
|
1842
|
+
sctp_assoc_t assoc_id;
|
1843
|
+
int value;
|
1844
|
+
|
1845
|
+
fileno = NUM2INT(rb_iv_get(self, "@fileno"));
|
1846
|
+
assoc_id = NUM2INT(rb_iv_get(self, "@association_id"));
|
1847
|
+
size = sizeof(int);
|
1848
|
+
|
1849
|
+
if(NIL_P(v_bool) || v_bool == Qfalse)
|
1850
|
+
value = 0;
|
1851
|
+
else
|
1852
|
+
value = 1;
|
1853
|
+
|
1854
|
+
if(sctp_opt_info(fileno, assoc_id, SCTP_DISABLE_FRAGMENTS, (void*)&value, &size) < 0)
|
1855
|
+
rb_raise(rb_eSystemCallError, "sctp_opt_info: %s", strerror(errno));
|
1856
|
+
|
1857
|
+
if(value)
|
1858
|
+
return Qtrue;
|
1859
|
+
else
|
1860
|
+
return Qfalse;
|
1861
|
+
}
|
1862
|
+
|
1727
1863
|
/*
|
1728
1864
|
* call-seq:
|
1729
1865
|
* SCTP::Socket#autoclose
|
@@ -1845,7 +1981,8 @@ static VALUE rsctp_enable_auth_support(int argc, VALUE* argv, VALUE self){
|
|
1845
1981
|
* otherwise this will set a key on the endpoint.
|
1846
1982
|
*/
|
1847
1983
|
static VALUE rsctp_set_shared_key(int argc, VALUE* argv, VALUE self){
|
1848
|
-
int fileno
|
1984
|
+
int fileno;
|
1985
|
+
size_t len;
|
1849
1986
|
char* key;
|
1850
1987
|
uint keynum;
|
1851
1988
|
socklen_t size;
|
@@ -1860,7 +1997,7 @@ static VALUE rsctp_set_shared_key(int argc, VALUE* argv, VALUE self){
|
|
1860
1997
|
len = strlen(key);
|
1861
1998
|
unsigned char byte_array[len+1];
|
1862
1999
|
|
1863
|
-
for(
|
2000
|
+
for(size_t i = 0; i < len; i++)
|
1864
2001
|
byte_array[i] = key[i];
|
1865
2002
|
|
1866
2003
|
byte_array[len] = '\0';
|
@@ -2164,6 +2301,7 @@ void Init_socket(void){
|
|
2164
2301
|
rb_define_method(cSocket, "close", rsctp_close, 0);
|
2165
2302
|
rb_define_method(cSocket, "connectx", rsctp_connectx, -1);
|
2166
2303
|
rb_define_method(cSocket, "delete_shared_key", rsctp_delete_shared_key, -1);
|
2304
|
+
rb_define_method(cSocket, "disable_fragments=", rsctp_disable_fragments, 1);
|
2167
2305
|
rb_define_method(cSocket, "enable_auth_support", rsctp_enable_auth_support, -1);
|
2168
2306
|
rb_define_method(cSocket, "getpeernames", rsctp_getpeernames, -1);
|
2169
2307
|
rb_define_method(cSocket, "getlocalnames", rsctp_getlocalnames, -1);
|
@@ -2206,8 +2344,8 @@ void Init_socket(void){
|
|
2206
2344
|
rb_define_attr(cSocket, "association_id", 1, 1);
|
2207
2345
|
rb_define_attr(cSocket, "port", 1, 1);
|
2208
2346
|
|
2209
|
-
/* 0.1.
|
2210
|
-
rb_define_const(cSocket, "VERSION", rb_str_new2("0.1.
|
2347
|
+
/* 0.1.2: The version of this library */
|
2348
|
+
rb_define_const(cSocket, "VERSION", rb_str_new2("0.1.2"));
|
2211
2349
|
|
2212
2350
|
/* send flags */
|
2213
2351
|
|
@@ -2230,7 +2368,9 @@ void Init_socket(void){
|
|
2230
2368
|
|
2231
2369
|
// ASSOCIATION STATES //
|
2232
2370
|
|
2371
|
+
#ifdef HAVE_SCTP_EMPTY
|
2233
2372
|
rb_define_const(cSocket, "SCTP_EMPTY", INT2NUM(SCTP_EMPTY));
|
2373
|
+
#endif
|
2234
2374
|
rb_define_const(cSocket, "SCTP_CLOSED", INT2NUM(SCTP_CLOSED));
|
2235
2375
|
rb_define_const(cSocket, "SCTP_COOKIE_WAIT", INT2NUM(SCTP_COOKIE_WAIT));
|
2236
2376
|
rb_define_const(cSocket, "SCTP_COOKIE_ECHOED", INT2NUM(SCTP_COOKIE_ECHOED));
|
data/sctp-socket.gemspec
CHANGED
data.tar.gz.sig
CHANGED
Binary file
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sctp-socket
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Daniel Berger
|
@@ -35,7 +35,7 @@ cert_chain:
|
|
35
35
|
ORVCZpRuCPpmC8qmqxUnARDArzucjaclkxjLWvCVHeFa9UP7K3Nl9oTjJNv+7/jM
|
36
36
|
WZs4eecIcUc4tKdHxcAJ0MO/Dkqq7hGaiHpwKY76wQ1+8xAh
|
37
37
|
-----END CERTIFICATE-----
|
38
|
-
date: 2025-01-
|
38
|
+
date: 2025-01-10 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: bundler
|
metadata.gz.sig
CHANGED
Binary file
|