sctp-socket 0.0.2 → 0.0.3
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.tar.gz.sig +0 -0
- data/CHANGES.md +4 -0
- data/README.md +3 -2
- data/ext/sctp/socket.c +207 -16
- data/sctp-socket.gemspec +1 -1
- 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: '0192244d6b63f84e1c1ed7eeca4a15e94a9f857bb932b2e246c929fa5d85a16c'
|
4
|
+
data.tar.gz: 61e37646cdb4138a8db5f43f9d8bbb9ade8094430b08a038f515edbb917b96be
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 06f2c3e32b6197647f22be5be5f6321167a9cc0db70035acf19522a9e27364d42c5b3511fd5958d7b27f09afad569ff5f679139d9d1c7c039ba5f23067272c49
|
7
|
+
data.tar.gz: 76326d271f9c36450698f8bafa4b63ce7167286814e09109c9a297f2bafec3ec0ecf7948970fd95c17ffb509be79dd934d8167f377e7dac6f504eeb908d331ba
|
checksums.yaml.gz.sig
CHANGED
Binary file
|
data.tar.gz.sig
CHANGED
Binary file
|
data/CHANGES.md
CHANGED
@@ -1,3 +1,7 @@
|
|
1
|
+
## 1-Dec-2020
|
2
|
+
* Added notification hooks that you can subscribe to, so now the subscribe method
|
3
|
+
actually does something.
|
4
|
+
|
1
5
|
## 29-Nov-2020
|
2
6
|
* Fixed the homepage link in the gemspec metadata. Thanks go to Nick LaMuro for the patch.
|
3
7
|
* The getlocalnames and getpeernames now return an array of addresses.
|
data/README.md
CHANGED
data/ext/sctp/socket.c
CHANGED
@@ -7,6 +7,15 @@
|
|
7
7
|
VALUE mSCTP;
|
8
8
|
VALUE cSocket;
|
9
9
|
VALUE v_sndrcv_struct;
|
10
|
+
VALUE v_assoc_change_struct;
|
11
|
+
VALUE v_peeraddr_change_struct;
|
12
|
+
VALUE v_remote_error_struct;
|
13
|
+
VALUE v_send_failed_event_struct;
|
14
|
+
VALUE v_shutdown_event_struct;
|
15
|
+
VALUE v_sndinfo_struct;
|
16
|
+
VALUE v_adaptation_event_struct;
|
17
|
+
VALUE v_partial_delivery_event_struct;
|
18
|
+
VALUE v_auth_event_struct;
|
10
19
|
|
11
20
|
// Helper function to get a hash value via string or symbol.
|
12
21
|
VALUE rb_hash_aref2(VALUE v_hash, const char* key){
|
@@ -425,7 +434,7 @@ static VALUE rsctp_sendmsg(VALUE self, VALUE v_options){
|
|
425
434
|
* end
|
426
435
|
*/
|
427
436
|
static VALUE rsctp_recvmsg(int argc, VALUE* argv, VALUE self){
|
428
|
-
VALUE v_flags;
|
437
|
+
VALUE v_flags, v_notification, v_message;
|
429
438
|
struct sctp_sndrcvinfo sndrcvinfo;
|
430
439
|
struct sockaddr_in clientaddr;
|
431
440
|
int flags, bytes, sock_fd;
|
@@ -456,39 +465,176 @@ static VALUE rsctp_recvmsg(int argc, VALUE* argv, VALUE self){
|
|
456
465
|
if(bytes < 0)
|
457
466
|
rb_raise(rb_eSystemCallError, "sctp_recvmsg: %s", strerror(errno));
|
458
467
|
|
459
|
-
|
460
|
-
|
468
|
+
v_notification = Qnil;
|
469
|
+
|
461
470
|
if(flags & MSG_NOTIFICATION){
|
471
|
+
uint32_t i;
|
472
|
+
char str[16];
|
462
473
|
union sctp_notification* snp;
|
474
|
+
VALUE v_str;
|
475
|
+
VALUE* v_temp;
|
476
|
+
|
463
477
|
snp = (union sctp_notification*)buffer;
|
464
478
|
|
465
|
-
switch(snp->sn_type){
|
479
|
+
switch(snp->sn_header.sn_type){
|
466
480
|
case SCTP_ASSOC_CHANGE:
|
481
|
+
switch(snp->sn_assoc_change.sac_state){
|
482
|
+
case SCTP_COMM_LOST:
|
483
|
+
v_str = rb_str_new2("comm lost");
|
484
|
+
break;
|
485
|
+
case SCTP_COMM_UP:
|
486
|
+
v_str = rb_str_new2("comm up");
|
487
|
+
break;
|
488
|
+
case SCTP_RESTART:
|
489
|
+
v_str = rb_str_new2("restart");
|
490
|
+
break;
|
491
|
+
case SCTP_SHUTDOWN_COMP:
|
492
|
+
v_str = rb_str_new2("shutdown complete");
|
493
|
+
break;
|
494
|
+
case SCTP_CANT_STR_ASSOC:
|
495
|
+
v_str = rb_str_new2("association setup failed");
|
496
|
+
break;
|
497
|
+
default:
|
498
|
+
v_str = rb_str_new2("unknown");
|
499
|
+
}
|
500
|
+
|
501
|
+
v_notification = rb_struct_new(v_assoc_change_struct,
|
502
|
+
UINT2NUM(snp->sn_assoc_change.sac_type),
|
503
|
+
UINT2NUM(snp->sn_assoc_change.sac_length),
|
504
|
+
UINT2NUM(snp->sn_assoc_change.sac_state),
|
505
|
+
UINT2NUM(snp->sn_assoc_change.sac_error),
|
506
|
+
UINT2NUM(snp->sn_assoc_change.sac_outbound_streams),
|
507
|
+
UINT2NUM(snp->sn_assoc_change.sac_inbound_streams),
|
508
|
+
UINT2NUM(snp->sn_assoc_change.sac_assoc_id),
|
509
|
+
v_str
|
510
|
+
);
|
467
511
|
break;
|
468
512
|
case SCTP_PEER_ADDR_CHANGE:
|
513
|
+
switch(snp->sn_paddr_change.spc_state){
|
514
|
+
case SCTP_ADDR_AVAILABLE:
|
515
|
+
v_str = rb_str_new2("available");
|
516
|
+
break;
|
517
|
+
case SCTP_ADDR_UNREACHABLE:
|
518
|
+
v_str = rb_str_new2("unreachable");
|
519
|
+
break;
|
520
|
+
case SCTP_ADDR_REMOVED:
|
521
|
+
v_str = rb_str_new2("removed from association");
|
522
|
+
break;
|
523
|
+
case SCTP_ADDR_ADDED:
|
524
|
+
v_str = rb_str_new2("added to association");
|
525
|
+
break;
|
526
|
+
case SCTP_ADDR_MADE_PRIM:
|
527
|
+
v_str = rb_str_new2("primary destination");
|
528
|
+
break;
|
529
|
+
default:
|
530
|
+
v_str = rb_str_new2("unknown");
|
531
|
+
}
|
532
|
+
|
533
|
+
inet_ntop(
|
534
|
+
((struct sockaddr_in *)&snp->sn_paddr_change.spc_aaddr)->sin_family,
|
535
|
+
&(((struct sockaddr_in *)&snp->sn_paddr_change.spc_aaddr)->sin_addr),
|
536
|
+
str,
|
537
|
+
sizeof(str)
|
538
|
+
);
|
539
|
+
|
540
|
+
v_notification = rb_struct_new(v_peeraddr_change_struct,
|
541
|
+
UINT2NUM(snp->sn_paddr_change.spc_type),
|
542
|
+
UINT2NUM(snp->sn_paddr_change.spc_length),
|
543
|
+
rb_str_new2(str),
|
544
|
+
UINT2NUM(snp->sn_paddr_change.spc_state),
|
545
|
+
UINT2NUM(snp->sn_paddr_change.spc_error),
|
546
|
+
UINT2NUM(snp->sn_paddr_change.spc_assoc_id),
|
547
|
+
v_str
|
548
|
+
);
|
469
549
|
break;
|
470
550
|
case SCTP_REMOTE_ERROR:
|
551
|
+
v_temp = ALLOCA_N(VALUE, snp->sn_remote_error.sre_length);
|
552
|
+
|
553
|
+
for(i = 0; i < snp->sn_remote_error.sre_length; i++){
|
554
|
+
v_temp[i] = UINT2NUM(snp->sn_remote_error.sre_data[i]);
|
555
|
+
}
|
556
|
+
|
557
|
+
v_notification = rb_struct_new(v_remote_error_struct,
|
558
|
+
UINT2NUM(snp->sn_remote_error.sre_type),
|
559
|
+
UINT2NUM(snp->sn_remote_error.sre_length),
|
560
|
+
UINT2NUM(snp->sn_remote_error.sre_error),
|
561
|
+
UINT2NUM(snp->sn_remote_error.sre_assoc_id),
|
562
|
+
rb_ary_new4(snp->sn_remote_error.sre_length, v_temp)
|
563
|
+
);
|
471
564
|
break;
|
472
|
-
case
|
565
|
+
case SCTP_SEND_FAILED_EVENT:
|
566
|
+
v_temp = ALLOCA_N(VALUE, snp->sn_send_failed_event.ssf_length);
|
567
|
+
|
568
|
+
for(i = 0; i < snp->sn_send_failed_event.ssf_length; i++){
|
569
|
+
v_temp[i] = UINT2NUM(snp->sn_send_failed_event.ssf_data[i]);
|
570
|
+
}
|
571
|
+
|
572
|
+
v_notification = rb_struct_new(v_send_failed_event_struct,
|
573
|
+
UINT2NUM(snp->sn_send_failed_event.ssf_type),
|
574
|
+
UINT2NUM(snp->sn_send_failed_event.ssf_length),
|
575
|
+
UINT2NUM(snp->sn_send_failed_event.ssf_error),
|
576
|
+
rb_struct_new(v_sndinfo_struct,
|
577
|
+
UINT2NUM(snp->sn_send_failed_event.ssfe_info.snd_sid),
|
578
|
+
UINT2NUM(snp->sn_send_failed_event.ssfe_info.snd_flags),
|
579
|
+
UINT2NUM(snp->sn_send_failed_event.ssfe_info.snd_ppid),
|
580
|
+
UINT2NUM(snp->sn_send_failed_event.ssfe_info.snd_context),
|
581
|
+
UINT2NUM(snp->sn_send_failed_event.ssfe_info.snd_assoc_id)
|
582
|
+
),
|
583
|
+
UINT2NUM(snp->sn_send_failed_event.ssf_assoc_id),
|
584
|
+
rb_ary_new4(snp->sn_send_failed_event.ssf_length, v_temp)
|
585
|
+
);
|
473
586
|
break;
|
474
587
|
case SCTP_SHUTDOWN_EVENT:
|
588
|
+
v_notification = rb_struct_new(v_shutdown_event_struct,
|
589
|
+
UINT2NUM(snp->sn_shutdown_event.sse_type),
|
590
|
+
UINT2NUM(snp->sn_shutdown_event.sse_length),
|
591
|
+
UINT2NUM(snp->sn_shutdown_event.sse_assoc_id)
|
592
|
+
);
|
475
593
|
break;
|
476
594
|
case SCTP_ADAPTATION_INDICATION:
|
595
|
+
v_notification = rb_struct_new(v_adaptation_event_struct,
|
596
|
+
UINT2NUM(snp->sn_adaptation_event.sai_type),
|
597
|
+
UINT2NUM(snp->sn_adaptation_event.sai_length),
|
598
|
+
UINT2NUM(snp->sn_adaptation_event.sai_adaptation_ind),
|
599
|
+
UINT2NUM(snp->sn_adaptation_event.sai_assoc_id)
|
600
|
+
);
|
477
601
|
break;
|
478
602
|
case SCTP_PARTIAL_DELIVERY_EVENT:
|
603
|
+
v_notification = rb_struct_new(v_partial_delivery_event_struct,
|
604
|
+
UINT2NUM(snp->sn_pdapi_event.pdapi_type),
|
605
|
+
UINT2NUM(snp->sn_pdapi_event.pdapi_length),
|
606
|
+
UINT2NUM(snp->sn_pdapi_event.pdapi_indication),
|
607
|
+
UINT2NUM(snp->sn_pdapi_event.pdapi_stream),
|
608
|
+
UINT2NUM(snp->sn_pdapi_event.pdapi_seq),
|
609
|
+
UINT2NUM(snp->sn_pdapi_event.pdapi_assoc_id)
|
610
|
+
);
|
611
|
+
break;
|
612
|
+
case SCTP_AUTHENTICATION_EVENT:
|
613
|
+
v_notification = rb_struct_new(v_auth_event_struct,
|
614
|
+
UINT2NUM(snp->sn_authkey_event.auth_type),
|
615
|
+
UINT2NUM(snp->sn_authkey_event.auth_length),
|
616
|
+
UINT2NUM(snp->sn_authkey_event.auth_keynumber),
|
617
|
+
UINT2NUM(snp->sn_authkey_event.auth_indication),
|
618
|
+
UINT2NUM(snp->sn_authkey_event.auth_assoc_id)
|
619
|
+
);
|
479
620
|
break;
|
480
621
|
}
|
481
622
|
}
|
482
|
-
|
623
|
+
|
624
|
+
if(NIL_P(v_notification))
|
625
|
+
v_message = rb_str_new(buffer, bytes);
|
626
|
+
else
|
627
|
+
v_message = Qnil;
|
483
628
|
|
484
629
|
return rb_struct_new(v_sndrcv_struct,
|
485
|
-
|
630
|
+
v_message,
|
486
631
|
UINT2NUM(sndrcvinfo.sinfo_stream),
|
487
632
|
UINT2NUM(sndrcvinfo.sinfo_flags),
|
488
633
|
UINT2NUM(sndrcvinfo.sinfo_ppid),
|
489
634
|
UINT2NUM(sndrcvinfo.sinfo_context),
|
490
635
|
UINT2NUM(sndrcvinfo.sinfo_timetolive),
|
491
|
-
UINT2NUM(sndrcvinfo.sinfo_assoc_id)
|
636
|
+
UINT2NUM(sndrcvinfo.sinfo_assoc_id),
|
637
|
+
v_notification
|
492
638
|
);
|
493
639
|
}
|
494
640
|
|
@@ -558,14 +704,19 @@ static VALUE rsctp_set_initmsg(VALUE self, VALUE v_options){
|
|
558
704
|
* :shutdown
|
559
705
|
* - The peer has sent a shutdown to the local endpoint.
|
560
706
|
*
|
707
|
+
* :data_io
|
708
|
+
* - Message data was received. On by default.
|
709
|
+
*
|
561
710
|
* Others:
|
562
711
|
*
|
563
|
-
* :
|
564
|
-
* :
|
565
|
-
* :data_io
|
566
|
-
* :peer_error
|
712
|
+
* :adaptation
|
713
|
+
* :authentication
|
567
714
|
* :partial_delivery
|
715
|
+
*
|
716
|
+
* Not yet supported:
|
717
|
+
*
|
568
718
|
* :sender_dry
|
719
|
+
* :peer_error
|
569
720
|
*
|
570
721
|
* By default only data_io is subscribed to.
|
571
722
|
*
|
@@ -592,8 +743,9 @@ static VALUE rsctp_subscribe(VALUE self, VALUE v_options){
|
|
592
743
|
if(RTEST(rb_hash_aref2(v_options, "address")))
|
593
744
|
events.sctp_address_event = 1;
|
594
745
|
|
746
|
+
// Use the new version
|
595
747
|
if(RTEST(rb_hash_aref2(v_options, "send_failure")))
|
596
|
-
events.
|
748
|
+
events.sctp_send_failure_event_event = 1;
|
597
749
|
|
598
750
|
if(RTEST(rb_hash_aref2(v_options, "peer_error")))
|
599
751
|
events.sctp_peer_error_event = 1;
|
@@ -700,8 +852,47 @@ void Init_socket(){
|
|
700
852
|
cSocket = rb_define_class_under(mSCTP, "Socket", rb_cObject);
|
701
853
|
|
702
854
|
v_sndrcv_struct = rb_struct_define(
|
703
|
-
"
|
704
|
-
"ppid", "context", "ttl", "association_id", NULL
|
855
|
+
"SendReceiveInfo", "message", "stream", "flags",
|
856
|
+
"ppid", "context", "ttl", "association_id", "notification", NULL
|
857
|
+
);
|
858
|
+
|
859
|
+
v_assoc_change_struct = rb_struct_define(
|
860
|
+
"AssocChange", "type", "length", "state", "error",
|
861
|
+
"outbound_streams", "inbound_streams", "association_id", "info", NULL
|
862
|
+
);
|
863
|
+
|
864
|
+
v_peeraddr_change_struct = rb_struct_define(
|
865
|
+
"PeerAddrChange", "type", "length", "ip_address",
|
866
|
+
"state", "error", "association_id", "info", NULL
|
867
|
+
);
|
868
|
+
|
869
|
+
v_remote_error_struct = rb_struct_define(
|
870
|
+
"RemoteError", "type", "length", "error", "association_id", "data", NULL
|
871
|
+
);
|
872
|
+
|
873
|
+
v_send_failed_event_struct = rb_struct_define(
|
874
|
+
"SendFailedEvent", "type", "length", "error", "association_id", "data", NULL
|
875
|
+
);
|
876
|
+
|
877
|
+
v_shutdown_event_struct = rb_struct_define(
|
878
|
+
"ShutdownEvent", "type", "length", "association_id", NULL
|
879
|
+
);
|
880
|
+
|
881
|
+
v_sndinfo_struct = rb_struct_define(
|
882
|
+
"SendInfo", "sid", "flags", "ppid", "context", "association_id", NULL
|
883
|
+
);
|
884
|
+
|
885
|
+
v_adaptation_event_struct = rb_struct_define(
|
886
|
+
"AdaptationEvent", "type", "length", "adaptation_indication", "association_id", NULL
|
887
|
+
);
|
888
|
+
|
889
|
+
v_partial_delivery_event_struct = rb_struct_define(
|
890
|
+
"PartialDeliveryEvent", "type", "length", "indication", "stream",
|
891
|
+
"sequence_number", "association_id", NULL
|
892
|
+
);
|
893
|
+
|
894
|
+
v_auth_event_struct = rb_struct_define(
|
895
|
+
"AuthEvent", "type", "length", "key_number", "indication", "association_id", NULL
|
705
896
|
);
|
706
897
|
|
707
898
|
rb_define_method(cSocket, "initialize", rsctp_init, -1);
|
@@ -726,5 +917,5 @@ void Init_socket(){
|
|
726
917
|
rb_define_attr(cSocket, "port", 1, 1);
|
727
918
|
|
728
919
|
/* 0.0.2: The version of this library */
|
729
|
-
rb_define_const(cSocket, "VERSION", rb_str_new2("0.0.
|
920
|
+
rb_define_const(cSocket, "VERSION", rb_str_new2("0.0.3"));
|
730
921
|
}
|
data/sctp-socket.gemspec
CHANGED
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.0.
|
4
|
+
version: 0.0.3
|
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: 2020-
|
38
|
+
date: 2020-12-01 00:00:00.000000000 Z
|
39
39
|
dependencies:
|
40
40
|
- !ruby/object:Gem::Dependency
|
41
41
|
name: bundler
|
metadata.gz.sig
CHANGED
Binary file
|