-
Notifications
You must be signed in to change notification settings - Fork 865
/
Copy pathsrt.h
997 lines (832 loc) · 42.5 KB
/
srt.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
/*
* SRT - Secure, Reliable, Transport
* Copyright (c) 2018 Haivision Systems Inc.
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
*/
/*****************************************************************************
written by
Haivision Systems Inc.
*****************************************************************************/
#ifndef INC_SRTC_H
#define INC_SRTC_H
#include "version.h"
#include "platform_sys.h"
#include <string.h>
#include <stdlib.h>
#include "logging_api.h"
////////////////////////////////////////////////////////////////////////////////
//if compiling on VC6.0 or pre-WindowsXP systems
//use -DLEGACY_WIN32
//if compiling with MinGW, it only works on XP or above
//use -D_WIN32_WINNT=0x0501
#ifdef _WIN32
#ifndef __MINGW32__
// Explicitly define 32-bit and 64-bit numbers
typedef __int32 int32_t;
typedef __int64 int64_t;
typedef unsigned __int32 uint32_t;
#ifndef LEGACY_WIN32
typedef unsigned __int64 uint64_t;
#else
// VC 6.0 does not support unsigned __int64: may cause potential problems.
typedef __int64 uint64_t;
#endif
#endif
#ifdef SRT_DYNAMIC
#ifdef SRT_EXPORTS
#define SRT_API __declspec(dllexport)
#else
#define SRT_API __declspec(dllimport)
#endif
#else // !SRT_DYNAMIC
#define SRT_API
#endif
#else
#define SRT_API __attribute__ ((visibility("default")))
#endif
// For feature tests if you need.
// You can use these constants with SRTO_MINVERSION option.
#define SRT_VERSION_FEAT_HSv5 0x010300
#if defined(__cplusplus) && __cplusplus > 201406
#define SRT_HAVE_CXX17 1
#else
#define SRT_HAVE_CXX17 0
#endif
// Stadnard attributes
// When compiling in C++17 mode, use the standard C++17 attributes
// (out of these, only [[deprecated]] is supported in C++14, so
// for all lesser standard use compiler-specific attributes).
#if SRT_HAVE_CXX17
// Unused: DO NOT issue a warning if this entity is unused.
#define SRT_ATR_UNUSED [[maybe_unused]]
// Nodiscard: issue a warning if the return value was discarded.
#define SRT_ATR_NODISCARD [[nodiscard]]
// GNUG is GNU C/C++; this syntax is also supported by Clang
#elif defined(__GNUC__)
#define SRT_ATR_UNUSED __attribute__((unused))
#define SRT_ATR_NODISCARD __attribute__((warn_unused_result))
#elif defined(_MSC_VER)
#define SRT_ATR_UNUSED __pragma(warning(suppress: 4100 4101))
#define SRT_ATR_NODISCARD _Check_return_
#else
#define SRT_ATR_UNUSED
#define SRT_ATR_NODISCARD
#endif
// DEPRECATED attributes
// There's needed DEPRECATED and DEPRECATED_PX, as some compilers require them
// before the entity, others after the entity.
// The *_PX version is the prefix attribute, which applies only
// to functions (Microsoft compilers).
// When deprecating a function, mark it:
//
// SRT_ATR_DEPRECATED_PX retval function(arguments) SRT_ATR_DEPRECATED;
//
// When SRT_NO_DEPRECATED defined, do not issue any deprecation warnings.
// Regardless of the compiler type.
#if defined(SRT_NO_DEPRECATED)
#define SRT_ATR_DEPRECATED
#define SRT_ATR_DEPRECATED_PX
#elif SRT_HAVE_CXX17
#define SRT_ATR_DEPRECATED
#define SRT_ATR_DEPRECATED_PX [[deprecated]]
// GNUG is GNU C/C++; this syntax is also supported by Clang
#elif defined(__GNUC__)
#define SRT_ATR_DEPRECATED_PX
#define SRT_ATR_DEPRECATED __attribute__((deprecated))
#elif defined(_MSC_VER)
#define SRT_ATR_DEPRECATED_PX __declspec(deprecated)
#define SRT_ATR_DEPRECATED // no postfix-type modifier
#else
#define SRT_ATR_DEPRECATED_PX
#define SRT_ATR_DEPRECATED
#endif
#ifdef __cplusplus
extern "C" {
#endif
typedef int32_t SRTSOCKET;
// The most significant bit 31 (sign bit actually) is left unused,
// so that all people who check the value for < 0 instead of -1
// still get what they want. The bit 30 is reserved for marking
// the "socket group". Most of the API functions should work
// transparently with the socket descriptor designating a single
// socket or a socket group.
static const int32_t SRTGROUP_MASK = (1 << 30);
#ifdef _WIN32
typedef SOCKET SYSSOCKET;
#else
typedef int SYSSOCKET;
#endif
#ifndef ENABLE_BONDING
#define ENABLE_BONDING 0
#endif
typedef SYSSOCKET UDPSOCKET;
// Values returned by srt_getsockstate()
typedef enum SRT_SOCKSTATUS {
SRTS_INIT = 1,
SRTS_OPENED,
SRTS_LISTENING,
SRTS_CONNECTING,
SRTS_CONNECTED,
SRTS_BROKEN,
SRTS_CLOSING,
SRTS_CLOSED,
SRTS_NONEXIST
} SRT_SOCKSTATUS;
// This is a duplicate enum. Must be kept in sync with the original UDT enum for
// backward compatibility until all compat is destroyed.
typedef enum SRT_SOCKOPT {
SRTO_MSS = 0, // the Maximum Transfer Unit
SRTO_SNDSYN = 1, // if sending is blocking
SRTO_RCVSYN = 2, // if receiving is blocking
SRTO_ISN = 3, // Initial Sequence Number (valid only after srt_connect or srt_accept-ed sockets)
SRTO_FC = 4, // Flight flag size (window size)
SRTO_SNDBUF = 5, // maximum buffer in sending queue
SRTO_RCVBUF = 6, // UDT receiving buffer size
SRTO_LINGER = 7, // waiting for unsent data when closing
SRTO_UDP_SNDBUF = 8, // UDP sending buffer size
SRTO_UDP_RCVBUF = 9, // UDP receiving buffer size
// (some space left)
SRTO_RENDEZVOUS = 12, // rendezvous connection mode
SRTO_SNDTIMEO = 13, // send() timeout
SRTO_RCVTIMEO = 14, // recv() timeout
SRTO_REUSEADDR = 15, // reuse an existing port or create a new one
SRTO_MAXBW = 16, // maximum bandwidth (bytes per second) that the connection can use
SRTO_STATE = 17, // current socket state, see UDTSTATUS, read only
SRTO_EVENT = 18, // current available events associated with the socket
SRTO_SNDDATA = 19, // size of data in the sending buffer
SRTO_RCVDATA = 20, // size of data available for recv
SRTO_SENDER = 21, // Sender mode (independent of conn mode), for encryption, tsbpd handshake.
SRTO_TSBPDMODE = 22, // Enable/Disable TsbPd. Enable -> Tx set origin timestamp, Rx deliver packet at origin time + delay
SRTO_LATENCY = 23, // NOT RECOMMENDED. SET: to both SRTO_RCVLATENCY and SRTO_PEERLATENCY. GET: same as SRTO_RCVLATENCY.
SRTO_INPUTBW = 24, // Estimated input stream rate.
SRTO_OHEADBW, // MaxBW ceiling based on % over input stream rate. Applies when UDT_MAXBW=0 (auto).
SRTO_PASSPHRASE = 26, // Crypto PBKDF2 Passphrase (must be 10..79 characters, or empty to disable encryption)
SRTO_PBKEYLEN, // Crypto key len in bytes {16,24,32} Default: 16 (AES-128)
SRTO_KMSTATE, // Key Material exchange status (UDT_SRTKmState)
SRTO_IPTTL = 29, // IP Time To Live (passthru for system sockopt IPPROTO_IP/IP_TTL)
SRTO_IPTOS, // IP Type of Service (passthru for system sockopt IPPROTO_IP/IP_TOS)
SRTO_TLPKTDROP = 31, // Enable receiver pkt drop
SRTO_SNDDROPDELAY = 32, // Extra delay towards latency for sender TLPKTDROP decision (-1 to off)
SRTO_NAKREPORT = 33, // Enable receiver to send periodic NAK reports
SRTO_VERSION = 34, // Local SRT Version
SRTO_PEERVERSION, // Peer SRT Version (from SRT Handshake)
SRTO_CONNTIMEO = 36, // Connect timeout in msec. Caller default: 3000, rendezvous (x 10)
SRTO_DRIFTTRACER = 37, // Enable or disable drift tracer
SRTO_MININPUTBW = 38, // Minimum estimate of input stream rate.
// (some space left)
SRTO_SNDKMSTATE = 40, // (GET) the current state of the encryption at the peer side
SRTO_RCVKMSTATE, // (GET) the current state of the encryption at the agent side
SRTO_LOSSMAXTTL, // Maximum possible packet reorder tolerance (number of packets to receive after loss to send lossreport)
SRTO_RCVLATENCY, // TsbPd receiver delay (mSec) to absorb burst of missed packet retransmission
SRTO_PEERLATENCY, // Minimum value of the TsbPd receiver delay (mSec) for the opposite side (peer)
SRTO_MINVERSION, // Minimum SRT version needed for the peer (peers with less version will get connection reject)
SRTO_STREAMID, // A string set to a socket and passed to the listener's accepted socket
SRTO_CONGESTION, // Congestion controller type selection
SRTO_MESSAGEAPI, // In File mode, use message API (portions of data with boundaries)
SRTO_PAYLOADSIZE, // Maximum payload size sent in one UDP packet (0 if unlimited)
SRTO_TRANSTYPE = 50, // Transmission type (set of options required for given transmission type)
SRTO_KMREFRESHRATE, // After sending how many packets the encryption key should be flipped to the new key
SRTO_KMPREANNOUNCE, // How many packets before key flip the new key is annnounced and after key flip the old one decommissioned
SRTO_ENFORCEDENCRYPTION, // Connection to be rejected or quickly broken when one side encryption set or bad password
SRTO_IPV6ONLY, // IPV6_V6ONLY mode
SRTO_PEERIDLETIMEO, // Peer-idle timeout (max time of silence heard from peer) in [ms]
SRTO_BINDTODEVICE, // Forward the SOL_SOCKET/SO_BINDTODEVICE option on socket (pass packets only from that device)
SRTO_GROUPCONNECT, // Set on a listener to allow group connection (ENABLE_BONDING)
SRTO_GROUPMINSTABLETIMEO, // Minimum Link Stability timeout (backup mode) in milliseconds (ENABLE_BONDING)
SRTO_GROUPTYPE, // Group type to which an accepted socket is about to be added, available in the handshake (ENABLE_BONDING)
SRTO_PACKETFILTER = 60, // Add and configure a packet filter
SRTO_RETRANSMITALGO = 61, // An option to select packet retransmission algorithm
SRTO_E_SIZE // Always last element, not a valid option.
} SRT_SOCKOPT;
#ifdef __cplusplus
#if __cplusplus > 199711L // C++11
// Newer compilers report error when [[deprecated]] is applied to types,
// and C++11 and higher uses this.
// Note that this doesn't exactly use the 'deprecated' attribute,
// as it's introduced in C++14. What is actually used here is the
// fact that unknown attributes are ignored, but still warned about.
// This should only catch an eye - and that's what it does.
#define SRT_DEPRECATED_OPTION(value) ((SRT_SOCKOPT [[deprecated]])value)
#else
// Older (pre-C++11) compilers use gcc deprecated applied to a typedef
typedef SRT_ATR_DEPRECATED_PX SRT_SOCKOPT SRT_SOCKOPT_DEPRECATED SRT_ATR_DEPRECATED;
#define SRT_DEPRECATED_OPTION(value) ((SRT_SOCKOPT_DEPRECATED)value)
#endif
#else
// deprecated enum labels are supported only since gcc 6, so in C there
// will be a whole deprecated enum type, as it's not an error in C to mix
// enum types
enum SRT_ATR_DEPRECATED SRT_SOCKOPT_DEPRECATED
{
// Dummy last option, as every entry ends with a comma
SRTO_DEPRECATED_END = 0
};
#define SRT_DEPRECATED_OPTION(value) ((enum SRT_SOCKOPT_DEPRECATED)value)
#endif
// Note that there are no deprecated options at the moment, but the mechanism
// stays so that it can be used in future. Example:
// #define SRTO_STRICTENC SRT_DEPRECATED_OPTION(53)
typedef enum SRT_TRANSTYPE
{
SRTT_LIVE,
SRTT_FILE,
SRTT_INVALID
} SRT_TRANSTYPE;
// These sizes should be used for Live mode. In Live mode you should not
// exceed the size that fits in a single MTU.
// This is for MPEG TS and it's a default SRTO_PAYLOADSIZE for SRTT_LIVE.
static const int SRT_LIVE_DEF_PLSIZE = 1316; // = 188*7, recommended for MPEG TS
// This is the maximum payload size for Live mode, should you have a different
// payload type than MPEG TS.
static const int SRT_LIVE_MAX_PLSIZE = 1456; // MTU(1500) - UDP.hdr(28) - SRT.hdr(16)
// Latency for Live transmission: default is 120
static const int SRT_LIVE_DEF_LATENCY_MS = 120;
// Importrant note: please add new fields to this structure to the end and don't remove any existing fields
struct CBytePerfMon
{
// global measurements
int64_t msTimeStamp; // time since the UDT entity is started, in milliseconds
int64_t pktSentTotal; // total number of sent data packets, including retransmissions
int64_t pktRecvTotal; // total number of received packets
int pktSndLossTotal; // total number of lost packets (sender side)
int pktRcvLossTotal; // total number of lost packets (receiver side)
int pktRetransTotal; // total number of retransmitted packets
int pktSentACKTotal; // total number of sent ACK packets
int pktRecvACKTotal; // total number of received ACK packets
int pktSentNAKTotal; // total number of sent NAK packets
int pktRecvNAKTotal; // total number of received NAK packets
int64_t usSndDurationTotal; // total time duration when UDT is sending data (idle time exclusive)
//>new
int pktSndDropTotal; // number of too-late-to-send dropped packets
int pktRcvDropTotal; // number of too-late-to play missing packets
int pktRcvUndecryptTotal; // number of undecrypted packets
uint64_t byteSentTotal; // total number of sent data bytes, including retransmissions
uint64_t byteRecvTotal; // total number of received bytes
uint64_t byteRcvLossTotal; // total number of lost bytes
uint64_t byteRetransTotal; // total number of retransmitted bytes
uint64_t byteSndDropTotal; // number of too-late-to-send dropped bytes
uint64_t byteRcvDropTotal; // number of too-late-to play missing bytes (estimate based on average packet size)
uint64_t byteRcvUndecryptTotal; // number of undecrypted bytes
//<
// local measurements
int64_t pktSent; // number of sent data packets, including retransmissions
int64_t pktRecv; // number of received packets
int pktSndLoss; // number of lost packets (sender side)
int pktRcvLoss; // number of lost packets (receiver side)
int pktRetrans; // number of retransmitted packets
int pktRcvRetrans; // number of retransmitted packets received
int pktSentACK; // number of sent ACK packets
int pktRecvACK; // number of received ACK packets
int pktSentNAK; // number of sent NAK packets
int pktRecvNAK; // number of received NAK packets
double mbpsSendRate; // sending rate in Mb/s
double mbpsRecvRate; // receiving rate in Mb/s
int64_t usSndDuration; // busy sending time (i.e., idle time exclusive)
int pktReorderDistance; // size of order discrepancy in received sequences
double pktRcvAvgBelatedTime; // average time of packet delay for belated packets (packets with sequence past the ACK)
int64_t pktRcvBelated; // number of received AND IGNORED packets due to having come too late
//>new
int pktSndDrop; // number of too-late-to-send dropped packets
int pktRcvDrop; // number of too-late-to play missing packets
int pktRcvUndecrypt; // number of undecrypted packets
uint64_t byteSent; // number of sent data bytes, including retransmissions
uint64_t byteRecv; // number of received bytes
uint64_t byteRcvLoss; // number of retransmitted bytes
uint64_t byteRetrans; // number of retransmitted bytes
uint64_t byteSndDrop; // number of too-late-to-send dropped bytes
uint64_t byteRcvDrop; // number of too-late-to play missing bytes (estimate based on average packet size)
uint64_t byteRcvUndecrypt; // number of undecrypted bytes
//<
// instant measurements
double usPktSndPeriod; // packet sending period, in microseconds
int pktFlowWindow; // flow window size, in number of packets
int pktCongestionWindow; // congestion window size, in number of packets
int pktFlightSize; // number of packets on flight
double msRTT; // RTT, in milliseconds
double mbpsBandwidth; // estimated bandwidth, in Mb/s
int byteAvailSndBuf; // available UDT sender buffer size
int byteAvailRcvBuf; // available UDT receiver buffer size
//>new
double mbpsMaxBW; // Transmit Bandwidth ceiling (Mbps)
int byteMSS; // MTU
int pktSndBuf; // UnACKed packets in UDT sender
int byteSndBuf; // UnACKed bytes in UDT sender
int msSndBuf; // UnACKed timespan (msec) of UDT sender
int msSndTsbPdDelay; // Timestamp-based Packet Delivery Delay
int pktRcvBuf; // Undelivered packets in UDT receiver
int byteRcvBuf; // Undelivered bytes of UDT receiver
int msRcvBuf; // Undelivered timespan (msec) of UDT receiver
int msRcvTsbPdDelay; // Timestamp-based Packet Delivery Delay
int pktSndFilterExtraTotal; // number of control packets supplied by packet filter
int pktRcvFilterExtraTotal; // number of control packets received and not supplied back
int pktRcvFilterSupplyTotal; // number of packets that the filter supplied extra (e.g. FEC rebuilt)
int pktRcvFilterLossTotal; // number of packet loss not coverable by filter
int pktSndFilterExtra; // number of control packets supplied by packet filter
int pktRcvFilterExtra; // number of control packets received and not supplied back
int pktRcvFilterSupply; // number of packets that the filter supplied extra (e.g. FEC rebuilt)
int pktRcvFilterLoss; // number of packet loss not coverable by filter
int pktReorderTolerance; // packet reorder tolerance value
//<
// New stats in 1.5.0
// Total
int64_t pktSentUniqueTotal; // total number of data packets sent by the application
int64_t pktRecvUniqueTotal; // total number of packets to be received by the application
uint64_t byteSentUniqueTotal; // total number of data bytes, sent by the application
uint64_t byteRecvUniqueTotal; // total number of data bytes to be received by the application
// Local
int64_t pktSentUnique; // number of data packets sent by the application
int64_t pktRecvUnique; // number of packets to be received by the application
uint64_t byteSentUnique; // number of data bytes, sent by the application
uint64_t byteRecvUnique; // number of data bytes to be received by the application
};
////////////////////////////////////////////////////////////////////////////////
// Error codes - define outside the CUDTException class
// because otherwise you'd have to use CUDTException::MJ_SUCCESS etc.
// in all throw CUDTException expressions.
enum CodeMajor
{
MJ_UNKNOWN = -1,
MJ_SUCCESS = 0,
MJ_SETUP = 1,
MJ_CONNECTION = 2,
MJ_SYSTEMRES = 3,
MJ_FILESYSTEM = 4,
MJ_NOTSUP = 5,
MJ_AGAIN = 6,
MJ_PEERERROR = 7
};
enum CodeMinor
{
// These are "minor" error codes from various "major" categories
// MJ_SETUP
MN_NONE = 0,
MN_TIMEOUT = 1,
MN_REJECTED = 2,
MN_NORES = 3,
MN_SECURITY = 4,
MN_CLOSED = 5,
// MJ_CONNECTION
MN_CONNLOST = 1,
MN_NOCONN = 2,
// MJ_SYSTEMRES
MN_THREAD = 1,
MN_MEMORY = 2,
MN_OBJECT = 3,
// MJ_FILESYSTEM
MN_SEEKGFAIL = 1,
MN_READFAIL = 2,
MN_SEEKPFAIL = 3,
MN_WRITEFAIL = 4,
// MJ_NOTSUP
MN_ISBOUND = 1,
MN_ISCONNECTED = 2,
MN_INVAL = 3,
MN_SIDINVAL = 4,
MN_ISUNBOUND = 5,
MN_NOLISTEN = 6,
MN_ISRENDEZVOUS = 7,
MN_ISRENDUNBOUND = 8,
MN_INVALMSGAPI = 9,
MN_INVALBUFFERAPI = 10,
MN_BUSY = 11,
MN_XSIZE = 12,
MN_EIDINVAL = 13,
MN_EEMPTY = 14,
MN_BUSYPORT = 15,
// MJ_AGAIN
MN_WRAVAIL = 1,
MN_RDAVAIL = 2,
MN_XMTIMEOUT = 3,
MN_CONGESTION = 4
};
// Stupid, but effective. This will be #undefined, so don't worry.
#define SRT_EMJ(major) (1000 * MJ_##major)
#define SRT_EMN(major, minor) (1000 * MJ_##major + MN_##minor)
// Some better way to define it, and better for C language.
typedef enum SRT_ERRNO
{
SRT_EUNKNOWN = -1,
SRT_SUCCESS = MJ_SUCCESS,
SRT_ECONNSETUP = SRT_EMJ(SETUP),
SRT_ENOSERVER = SRT_EMN(SETUP, TIMEOUT),
SRT_ECONNREJ = SRT_EMN(SETUP, REJECTED),
SRT_ESOCKFAIL = SRT_EMN(SETUP, NORES),
SRT_ESECFAIL = SRT_EMN(SETUP, SECURITY),
SRT_ESCLOSED = SRT_EMN(SETUP, CLOSED),
SRT_ECONNFAIL = SRT_EMJ(CONNECTION),
SRT_ECONNLOST = SRT_EMN(CONNECTION, CONNLOST),
SRT_ENOCONN = SRT_EMN(CONNECTION, NOCONN),
SRT_ERESOURCE = SRT_EMJ(SYSTEMRES),
SRT_ETHREAD = SRT_EMN(SYSTEMRES, THREAD),
SRT_ENOBUF = SRT_EMN(SYSTEMRES, MEMORY),
SRT_ESYSOBJ = SRT_EMN(SYSTEMRES, OBJECT),
SRT_EFILE = SRT_EMJ(FILESYSTEM),
SRT_EINVRDOFF = SRT_EMN(FILESYSTEM, SEEKGFAIL),
SRT_ERDPERM = SRT_EMN(FILESYSTEM, READFAIL),
SRT_EINVWROFF = SRT_EMN(FILESYSTEM, SEEKPFAIL),
SRT_EWRPERM = SRT_EMN(FILESYSTEM, WRITEFAIL),
SRT_EINVOP = SRT_EMJ(NOTSUP),
SRT_EBOUNDSOCK = SRT_EMN(NOTSUP, ISBOUND),
SRT_ECONNSOCK = SRT_EMN(NOTSUP, ISCONNECTED),
SRT_EINVPARAM = SRT_EMN(NOTSUP, INVAL),
SRT_EINVSOCK = SRT_EMN(NOTSUP, SIDINVAL),
SRT_EUNBOUNDSOCK = SRT_EMN(NOTSUP, ISUNBOUND),
SRT_ENOLISTEN = SRT_EMN(NOTSUP, NOLISTEN),
SRT_ERDVNOSERV = SRT_EMN(NOTSUP, ISRENDEZVOUS),
SRT_ERDVUNBOUND = SRT_EMN(NOTSUP, ISRENDUNBOUND),
SRT_EINVALMSGAPI = SRT_EMN(NOTSUP, INVALMSGAPI),
SRT_EINVALBUFFERAPI = SRT_EMN(NOTSUP, INVALBUFFERAPI),
SRT_EDUPLISTEN = SRT_EMN(NOTSUP, BUSY),
SRT_ELARGEMSG = SRT_EMN(NOTSUP, XSIZE),
SRT_EINVPOLLID = SRT_EMN(NOTSUP, EIDINVAL),
SRT_EPOLLEMPTY = SRT_EMN(NOTSUP, EEMPTY),
SRT_EBINDCONFLICT = SRT_EMN(NOTSUP, BUSYPORT),
SRT_EASYNCFAIL = SRT_EMJ(AGAIN),
SRT_EASYNCSND = SRT_EMN(AGAIN, WRAVAIL),
SRT_EASYNCRCV = SRT_EMN(AGAIN, RDAVAIL),
SRT_ETIMEOUT = SRT_EMN(AGAIN, XMTIMEOUT),
SRT_ECONGEST = SRT_EMN(AGAIN, CONGESTION),
SRT_EPEERERR = SRT_EMJ(PEERERROR)
} SRT_ERRNO;
#undef SRT_EMJ
#undef SRT_EMN
enum SRT_REJECT_REASON
{
SRT_REJ_UNKNOWN, // initial set when in progress
SRT_REJ_SYSTEM, // broken due to system function error
SRT_REJ_PEER, // connection was rejected by peer
SRT_REJ_RESOURCE, // internal problem with resource allocation
SRT_REJ_ROGUE, // incorrect data in handshake messages
SRT_REJ_BACKLOG, // listener's backlog exceeded
SRT_REJ_IPE, // internal program error
SRT_REJ_CLOSE, // socket is closing
SRT_REJ_VERSION, // peer is older version than agent's minimum set
SRT_REJ_RDVCOOKIE, // rendezvous cookie collision
SRT_REJ_BADSECRET, // wrong password
SRT_REJ_UNSECURE, // password required or unexpected
SRT_REJ_MESSAGEAPI, // streamapi/messageapi collision
SRT_REJ_CONGESTION, // incompatible congestion-controller type
SRT_REJ_FILTER, // incompatible packet filter
SRT_REJ_GROUP, // incompatible group
SRT_REJ_TIMEOUT, // connection timeout
SRT_REJ_E_SIZE,
};
// XXX This value remains for some time, but it's deprecated
// Planned deprecation removal: rel1.6.0.
#define SRT_REJ__SIZE SRT_REJ_E_SIZE
// Reject category codes:
#define SRT_REJC_VALUE(code) (1000 * (code/1000))
#define SRT_REJC_INTERNAL 0 // Codes from above SRT_REJECT_REASON enum
#define SRT_REJC_PREDEFINED 1000 // Standard server error codes
#define SRT_REJC_USERDEFINED 2000 // User defined error codes
// Logging API - specialization for SRT.
// WARNING: This part is generated.
// Logger Functional Areas
// Note that 0 is "general".
// Values 0* - general, unqualified
// Values 1* - control
// Values 2* - receiving
// Values 3* - sending
// Values 4* - management
// Made by #define so that it's available also for C API.
// Use ../scripts/generate-logging-defs.tcl to regenerate.
// SRT_LOGFA BEGIN GENERATED SECTION {
#define SRT_LOGFA_GENERAL 0 // gglog: General uncategorized log, for serious issues only
#define SRT_LOGFA_SOCKMGMT 1 // smlog: Socket create/open/close/configure activities
#define SRT_LOGFA_CONN 2 // cnlog: Connection establishment and handshake
#define SRT_LOGFA_XTIMER 3 // xtlog: The checkTimer and around activities
#define SRT_LOGFA_TSBPD 4 // tslog: The TsBPD thread
#define SRT_LOGFA_RSRC 5 // rslog: System resource allocation and management
#define SRT_LOGFA_CONGEST 7 // cclog: Congestion control module
#define SRT_LOGFA_PFILTER 8 // pflog: Packet filter module
#define SRT_LOGFA_API_CTRL 11 // aclog: API part for socket and library managmenet
#define SRT_LOGFA_QUE_CTRL 13 // qclog: Queue control activities
#define SRT_LOGFA_EPOLL_UPD 16 // eilog: EPoll, internal update activities
#define SRT_LOGFA_API_RECV 21 // arlog: API part for receiving
#define SRT_LOGFA_BUF_RECV 22 // brlog: Buffer, receiving side
#define SRT_LOGFA_QUE_RECV 23 // qrlog: Queue, receiving side
#define SRT_LOGFA_CHN_RECV 24 // krlog: CChannel, receiving side
#define SRT_LOGFA_GRP_RECV 25 // grlog: Group, receiving side
#define SRT_LOGFA_API_SEND 31 // aslog: API part for sending
#define SRT_LOGFA_BUF_SEND 32 // bslog: Buffer, sending side
#define SRT_LOGFA_QUE_SEND 33 // qslog: Queue, sending side
#define SRT_LOGFA_CHN_SEND 34 // kslog: CChannel, sending side
#define SRT_LOGFA_GRP_SEND 35 // gslog: Group, sending side
#define SRT_LOGFA_INTERNAL 41 // inlog: Internal activities not connected directly to a socket
#define SRT_LOGFA_QUE_MGMT 43 // qmlog: Queue, management part
#define SRT_LOGFA_CHN_MGMT 44 // kmlog: CChannel, management part
#define SRT_LOGFA_GRP_MGMT 45 // gmlog: Group, management part
#define SRT_LOGFA_EPOLL_API 46 // ealog: EPoll, API part
#define SRT_LOGFA_HAICRYPT 6 // hclog: Haicrypt module area
#define SRT_LOGFA_APPLOG 10 // aplog: Applications
// } SRT_LOGFA END GENERATED SECTION
// To make a typical int64_t size, although still use std::bitset.
// C API will carry it over.
#define SRT_LOGFA_LASTNONE 63
enum SRT_KM_STATE
{
SRT_KM_S_UNSECURED = 0, //No encryption
SRT_KM_S_SECURING = 1, //Stream encrypted, exchanging Keying Material
SRT_KM_S_SECURED = 2, //Stream encrypted, keying Material exchanged, decrypting ok.
SRT_KM_S_NOSECRET = 3, //Stream encrypted and no secret to decrypt Keying Material
SRT_KM_S_BADSECRET = 4 //Stream encrypted and wrong secret, cannot decrypt Keying Material
};
enum SRT_EPOLL_OPT
{
SRT_EPOLL_OPT_NONE = 0x0, // fallback
// Values intended to be the same as in `<sys/epoll.h>`.
// so that if system values are used by mistake, they should have the same effect
// This applies to: IN, OUT, ERR and ET.
/// Ready for 'recv' operation:
///
/// - For stream mode it means that at least 1 byte is available.
/// In this mode the buffer may extract only a part of the packet,
/// leaving next data possible for extraction later.
///
/// - For message mode it means that there is at least one packet
/// available (this may change in future, as it is desired that
/// one full message should only wake up, not single packet of a
/// not yet extractable message).
///
/// - For live mode it means that there's at least one packet
/// ready to play.
///
/// - For listener sockets, this means that there is a new connection
/// waiting for pickup through the `srt_accept()` call, that is,
/// the next call to `srt_accept()` will succeed without blocking
/// (see an alias SRT_EPOLL_ACCEPT below).
SRT_EPOLL_IN = 0x1,
/// Ready for 'send' operation.
///
/// - For stream mode it means that there's a free space in the
/// sender buffer for at least 1 byte of data. The next send
/// operation will only allow to send as much data as it is free
/// space in the buffer.
///
/// - For message mode it means that there's a free space for at
/// least one UDP packet. The edge-triggered mode can be used to
/// pick up updates as the free space in the sender buffer grows.
///
/// - For live mode it means that there's a free space for at least
/// one UDP packet. On the other hand, no readiness for OUT usually
/// means an extraordinary congestion on the link, meaning also that
/// you should immediately slow down the sending rate or you may get
/// a connection break soon.
///
/// - For non-blocking sockets used with `srt_connect*` operation,
/// this flag simply means that the connection was established.
SRT_EPOLL_OUT = 0x4,
/// The socket has encountered an error in the last operation
/// and the next operation on that socket will end up with error.
/// You can retry the operation, but getting the error from it
/// is certain, so you may as well close the socket.
SRT_EPOLL_ERR = 0x8,
// To avoid confusion in the internal code, the following
// duplicates are introduced to improve clarity.
SRT_EPOLL_CONNECT = SRT_EPOLL_OUT,
SRT_EPOLL_ACCEPT = SRT_EPOLL_IN,
SRT_EPOLL_UPDATE = 0x10,
SRT_EPOLL_ET = 1u << 31
};
// These are actually flags - use a bit container:
typedef int32_t SRT_EPOLL_T;
// Define which epoll flags determine events. All others are special flags.
#define SRT_EPOLL_EVENTTYPES (SRT_EPOLL_IN | SRT_EPOLL_OUT | SRT_EPOLL_UPDATE | SRT_EPOLL_ERR)
#define SRT_EPOLL_ETONLY (SRT_EPOLL_UPDATE)
enum SRT_EPOLL_FLAGS
{
/// This allows the EID container to be empty when calling the waiting
/// function with infinite time. This means an infinite hangup, although
/// a socket can be added to this EID from a separate thread.
SRT_EPOLL_ENABLE_EMPTY = 1,
/// This makes the waiting function check if there is output container
/// passed to it, and report an error if it isn't. By default it is allowed
/// that the output container is 0 size or NULL and therefore the readiness
/// state is reported only as a number of ready sockets from return value.
SRT_EPOLL_ENABLE_OUTPUTCHECK = 2
};
#ifdef __cplusplus
// In C++ these enums cannot be treated as int and glued by operator |.
// Unless this operator is defined.
inline SRT_EPOLL_OPT operator|(SRT_EPOLL_OPT a1, SRT_EPOLL_OPT a2)
{
return SRT_EPOLL_OPT( (int)a1 | (int)a2 );
}
#endif
typedef struct CBytePerfMon SRT_TRACEBSTATS;
static const SRTSOCKET SRT_INVALID_SOCK = -1;
static const int SRT_ERROR = -1;
// library initialization
SRT_API int srt_startup(void);
SRT_API int srt_cleanup(void);
//
// Socket operations
//
// DEPRECATED: srt_socket with 3 arguments. All these arguments are ignored
// and socket creation doesn't need any arguments. Use srt_create_socket().
// Planned deprecation removal: rel1.6.0
SRT_ATR_DEPRECATED_PX SRT_API SRTSOCKET srt_socket(int, int, int) SRT_ATR_DEPRECATED;
SRT_API SRTSOCKET srt_create_socket(void);
SRT_API int srt_bind (SRTSOCKET u, const struct sockaddr* name, int namelen);
SRT_API int srt_bind_acquire (SRTSOCKET u, UDPSOCKET sys_udp_sock);
// Old name of srt_bind_acquire(), please don't use
// Planned deprecation removal: rel1.6.0
SRT_ATR_DEPRECATED_PX static inline int srt_bind_peerof(SRTSOCKET u, UDPSOCKET sys_udp_sock) SRT_ATR_DEPRECATED;
static inline int srt_bind_peerof (SRTSOCKET u, UDPSOCKET sys_udp_sock) { return srt_bind_acquire(u, sys_udp_sock); }
SRT_API int srt_listen (SRTSOCKET u, int backlog);
SRT_API SRTSOCKET srt_accept (SRTSOCKET u, struct sockaddr* addr, int* addrlen);
SRT_API SRTSOCKET srt_accept_bond (const SRTSOCKET listeners[], int lsize, int64_t msTimeOut);
typedef int srt_listen_callback_fn (void* opaq, SRTSOCKET ns, int hsversion, const struct sockaddr* peeraddr, const char* streamid);
SRT_API int srt_listen_callback(SRTSOCKET lsn, srt_listen_callback_fn* hook_fn, void* hook_opaque);
typedef void srt_connect_callback_fn (void* opaq, SRTSOCKET ns, int errorcode, const struct sockaddr* peeraddr, int token);
SRT_API int srt_connect_callback(SRTSOCKET clr, srt_connect_callback_fn* hook_fn, void* hook_opaque);
SRT_API int srt_connect (SRTSOCKET u, const struct sockaddr* name, int namelen);
SRT_API int srt_connect_debug(SRTSOCKET u, const struct sockaddr* name, int namelen, int forced_isn);
SRT_API int srt_connect_bind (SRTSOCKET u, const struct sockaddr* source,
const struct sockaddr* target, int len);
SRT_API int srt_rendezvous (SRTSOCKET u, const struct sockaddr* local_name, int local_namelen,
const struct sockaddr* remote_name, int remote_namelen);
SRT_API int srt_close (SRTSOCKET u);
SRT_API int srt_getpeername (SRTSOCKET u, struct sockaddr* name, int* namelen);
SRT_API int srt_getsockname (SRTSOCKET u, struct sockaddr* name, int* namelen);
SRT_API int srt_getsockopt (SRTSOCKET u, int level /*ignored*/, SRT_SOCKOPT optname, void* optval, int* optlen);
SRT_API int srt_setsockopt (SRTSOCKET u, int level /*ignored*/, SRT_SOCKOPT optname, const void* optval, int optlen);
SRT_API int srt_getsockflag (SRTSOCKET u, SRT_SOCKOPT opt, void* optval, int* optlen);
SRT_API int srt_setsockflag (SRTSOCKET u, SRT_SOCKOPT opt, const void* optval, int optlen);
typedef struct SRT_SocketGroupData_ SRT_SOCKGROUPDATA;
typedef struct SRT_MsgCtrl_
{
int flags; // Left for future
int msgttl; // TTL for a message (millisec), default -1 (no TTL limitation)
int inorder; // Whether a message is allowed to supersede partially lost one. Unused in stream and live mode.
int boundary; // 0:mid pkt, 1(01b):end of frame, 2(11b):complete frame, 3(10b): start of frame
int64_t srctime; // source time since epoch (usec), 0: use internal time (sender)
int32_t pktseq; // sequence number of the first packet in received message (unused for sending)
int32_t msgno; // message number (output value for both sending and receiving)
SRT_SOCKGROUPDATA* grpdata;
size_t grpdata_size;
} SRT_MSGCTRL;
// Trap representation for sequence and message numbers
// This value means that this is "unset", and it's never
// a result of an operation made on this number.
static const int32_t SRT_SEQNO_NONE = -1; // -1: no seq (0 is a valid seqno!)
static const int32_t SRT_MSGNO_NONE = -1; // -1: unset
static const int32_t SRT_MSGNO_CONTROL = 0; // 0: control (used by packet filter)
static const int SRT_MSGTTL_INF = -1; // unlimited TTL specification for message TTL
// XXX Might be useful also other special uses of -1:
// - -1 as infinity for srt_epoll_wait
// - -1 as a trap index value used in list.cpp
// You are free to use either of these two methods to set SRT_MSGCTRL object
// to default values: either call srt_msgctrl_init(&obj) or obj = srt_msgctrl_default.
SRT_API void srt_msgctrl_init(SRT_MSGCTRL* mctrl);
SRT_API extern const SRT_MSGCTRL srt_msgctrl_default;
// The send/receive functions.
// These functions have different names due to different sets of parameters
// to be supplied. Not all of them are needed or make sense in all modes:
// Plain: supply only the buffer and its size.
// Msg: supply additionally
// - TTL (message is not delivered when exceeded) and
// - INORDER (when false, the message is allowed to be delivered in different
// order than when it was sent, when the later message is earlier ready to
// deliver)
// Msg2: Supply extra parameters in SRT_MSGCTRL. When receiving, these
// parameters will be filled, as needed. NULL is acceptable, in which case
// the defaults are used.
//
// Sending functions
//
SRT_API int srt_send (SRTSOCKET u, const char* buf, int len);
SRT_API int srt_sendmsg (SRTSOCKET u, const char* buf, int len, int ttl/* = -1*/, int inorder/* = false*/);
SRT_API int srt_sendmsg2(SRTSOCKET u, const char* buf, int len, SRT_MSGCTRL *mctrl);
//
// Receiving functions
//
SRT_API int srt_recv (SRTSOCKET u, char* buf, int len);
// srt_recvmsg is actually an alias to srt_recv, it stays under the old name for compat reasons.
SRT_API int srt_recvmsg (SRTSOCKET u, char* buf, int len);
SRT_API int srt_recvmsg2(SRTSOCKET u, char *buf, int len, SRT_MSGCTRL *mctrl);
// Special send/receive functions for files only.
#define SRT_DEFAULT_SENDFILE_BLOCK 364000
#define SRT_DEFAULT_RECVFILE_BLOCK 7280000
SRT_API int64_t srt_sendfile(SRTSOCKET u, const char* path, int64_t* offset, int64_t size, int block);
SRT_API int64_t srt_recvfile(SRTSOCKET u, const char* path, int64_t* offset, int64_t size, int block);
// last error detection
SRT_API const char* srt_getlasterror_str(void);
SRT_API int srt_getlasterror(int* errno_loc);
SRT_API const char* srt_strerror(int code, int errnoval);
SRT_API void srt_clearlasterror(void);
// Performance tracking
// Performance monitor with Byte counters for better bitrate estimation.
SRT_API int srt_bstats(SRTSOCKET u, SRT_TRACEBSTATS * perf, int clear);
// Performance monitor with Byte counters and instantaneous stats instead of moving averages for Snd/Rcvbuffer sizes.
SRT_API int srt_bistats(SRTSOCKET u, SRT_TRACEBSTATS * perf, int clear, int instantaneous);
// Socket Status (for problem tracking)
SRT_API SRT_SOCKSTATUS srt_getsockstate(SRTSOCKET u);
SRT_API int srt_epoll_create(void);
SRT_API int srt_epoll_clear_usocks(int eid);
SRT_API int srt_epoll_add_usock(int eid, SRTSOCKET u, const int* events);
SRT_API int srt_epoll_add_ssock(int eid, SYSSOCKET s, const int* events);
SRT_API int srt_epoll_remove_usock(int eid, SRTSOCKET u);
SRT_API int srt_epoll_remove_ssock(int eid, SYSSOCKET s);
SRT_API int srt_epoll_update_usock(int eid, SRTSOCKET u, const int* events);
SRT_API int srt_epoll_update_ssock(int eid, SYSSOCKET s, const int* events);
SRT_API int srt_epoll_wait(int eid, SRTSOCKET* readfds, int* rnum, SRTSOCKET* writefds, int* wnum, int64_t msTimeOut,
SYSSOCKET* lrfds, int* lrnum, SYSSOCKET* lwfds, int* lwnum);
typedef struct SRT_EPOLL_EVENT_STR
{
SRTSOCKET fd;
int events; // SRT_EPOLL_IN | SRT_EPOLL_OUT | SRT_EPOLL_ERR
#ifdef __cplusplus
SRT_EPOLL_EVENT_STR(SRTSOCKET s, int ev): fd(s), events(ev) {}
SRT_EPOLL_EVENT_STR(): fd(-1), events(0) {} // NOTE: allows singular values, no init.
#endif
} SRT_EPOLL_EVENT;
SRT_API int srt_epoll_uwait(int eid, SRT_EPOLL_EVENT* fdsSet, int fdsSize, int64_t msTimeOut);
SRT_API int32_t srt_epoll_set(int eid, int32_t flags);
SRT_API int srt_epoll_release(int eid);
// Logging control
SRT_API void srt_setloglevel(int ll);
SRT_API void srt_addlogfa(int fa);
SRT_API void srt_dellogfa(int fa);
SRT_API void srt_resetlogfa(const int* fara, size_t fara_size);
// This isn't predicted, will be only available in SRT C++ API.
// For the time being, until this API is ready, use UDT::setlogstream.
// SRT_API void srt_setlogstream(std::ostream& stream);
SRT_API void srt_setloghandler(void* opaque, SRT_LOG_HANDLER_FN* handler);
SRT_API void srt_setlogflags(int flags);
SRT_API int srt_getsndbuffer(SRTSOCKET sock, size_t* blocks, size_t* bytes);
SRT_API int srt_getrejectreason(SRTSOCKET sock);
SRT_API int srt_setrejectreason(SRTSOCKET sock, int value);
// The srt_rejectreason_msg[] array is deprecated (as unsafe).
// Planned removal: v1.6.0.
SRT_API SRT_ATR_DEPRECATED extern const char* const srt_rejectreason_msg [];
SRT_API const char* srt_rejectreason_str(int id);
SRT_API uint32_t srt_getversion(void);
SRT_API int64_t srt_time_now(void);
SRT_API int64_t srt_connection_time(SRTSOCKET sock);
// Possible internal clock types
#define SRT_SYNC_CLOCK_STDCXX_STEADY 0 // C++11 std::chrono::steady_clock
#define SRT_SYNC_CLOCK_GETTIME_MONOTONIC 1 // clock_gettime with CLOCK_MONOTONIC
#define SRT_SYNC_CLOCK_WINQPC 2
#define SRT_SYNC_CLOCK_MACH_ABSTIME 3
#define SRT_SYNC_CLOCK_POSIX_GETTIMEOFDAY 4
#define SRT_SYNC_CLOCK_AMD64_RDTSC 5
#define SRT_SYNC_CLOCK_IA32_RDTSC 6
#define SRT_SYNC_CLOCK_IA64_ITC 7
SRT_API int srt_clock_type(void);
// SRT Socket Groups API (ENABLE_BONDING)
typedef enum SRT_GROUP_TYPE
{
SRT_GTYPE_UNDEFINED,
SRT_GTYPE_BROADCAST,
SRT_GTYPE_BACKUP,
// ...
SRT_GTYPE_E_END
} SRT_GROUP_TYPE;
// Free-form flags for groups
// Flags may be type-specific!
static const uint32_t SRT_GFLAG_SYNCONMSG = 1;
typedef enum SRT_MemberStatus
{
SRT_GST_PENDING, // The socket is created correctly, but not yet ready for getting data.
SRT_GST_IDLE, // The socket is ready to be activated
SRT_GST_RUNNING, // The socket was already activated and is in use
SRT_GST_BROKEN // The last operation broke the socket, it should be closed.
} SRT_MEMBERSTATUS;
struct SRT_SocketGroupData_
{
SRTSOCKET id;
struct sockaddr_storage peeraddr; // Don't want to expose sockaddr_any to public API
SRT_SOCKSTATUS sockstate;
uint16_t weight;
SRT_MEMBERSTATUS memberstate;
int result;
int token;
};
typedef struct SRT_SocketOptionObject SRT_SOCKOPT_CONFIG;
typedef struct SRT_GroupMemberConfig_
{
SRTSOCKET id;
struct sockaddr_storage srcaddr;
struct sockaddr_storage peeraddr; // Don't want to expose sockaddr_any to public API
uint16_t weight;
SRT_SOCKOPT_CONFIG* config;
int errorcode;
int token;
} SRT_SOCKGROUPCONFIG;
SRT_API SRTSOCKET srt_create_group(SRT_GROUP_TYPE);
SRT_API SRTSOCKET srt_groupof(SRTSOCKET socket);
SRT_API int srt_group_data(SRTSOCKET socketgroup, SRT_SOCKGROUPDATA* output, size_t* inoutlen);
SRT_API SRT_SOCKOPT_CONFIG* srt_create_config(void);
SRT_API void srt_delete_config(SRT_SOCKOPT_CONFIG* config /*nullable*/);
SRT_API int srt_config_add(SRT_SOCKOPT_CONFIG* config, SRT_SOCKOPT option, const void* contents, int len);
SRT_API SRT_SOCKGROUPCONFIG srt_prepare_endpoint(const struct sockaddr* src /*nullable*/, const struct sockaddr* adr, int namelen);
SRT_API int srt_connect_group(SRTSOCKET group, SRT_SOCKGROUPCONFIG name[], int arraysize);
#ifdef __cplusplus
}
#endif
#endif