#ifndef PRRT_SOCKET_H #define PRRT_SOCKET_H #include "../defines.h" #include "../util/list.h" #include "../util/pipe.h" #include "../util/mpsc_queue.h" #include "../util/bptree.h" #include "channelStateInformation.h" #include "applicationConstraints.h" #include "stores/dataPacketStore.h" #include "stores/deliveredPacketTable.h" #include "stores/packetTimeoutTable.h" #include "stores/receptionTable.h" #include "stores/repairBlockStore.h" #include "stores/packetDeliveryStore.h" #include "types/lossStatistics.h" #include "types/packet.h" #include "clock.h" #include "../xlap/xlap.h" #include "receiver.h" #ifndef SIOCSHWTSTAMP # define SIOCSHWTSTAMP 0x89b0 # define SIOCGHWTSTAMP 0x89b1 #endif typedef struct prrtSocket { int dataSocketFd; int feedbackSocketFd; pthread_t receiveFeedbackThread; struct sockaddr_in *address; bool isBound; PrrtClock clock; pthread_t sendDataThread; Pipe *sendDataQueue; pthread_t receiveDataThread; PrrtPacketDeliveryStore* packetDeliveryStore; PrrtPacketTimeoutTable *packetTimeoutTable; PrrtDataPacketStore *dataPacketStore; PrrtRepairBlockStore *repairBlockStore; PrrtDeliveredPacketTable *deliveredPacketTable; PrrtReceiver* receiver; atomic_bool closing; prrtSequenceNumber_t packetsCount; prrtSequenceNumber_t sequenceNumberSource; prrtSequenceNumber_t sequenceNumberRepetition; prrtSequenceNumber_t sequenceNumberRedundancy; prrtSequenceNumber_t sequenceNumberFeedback; bool isSender; prrtTimestamp_t lastSentTimestamp; prrtTimestamp_t lastReceivedTimestamp; PrrtLossStatistics lossStatistics; PrrtReceptionTable* dataReceptionTable; PrrtReceptionTable* redundancyReceptionTable; PrrtApplicationConstraints *applicationConstraints; PrrtCodingParams *codingParameters; _Atomic (XlapTimestampTable *) tstable[2]; pthread_attr_t *receiveFeedbackThreadAttr; pthread_attr_t *sendDataThreadAttr; pthread_attr_t *receiveDataThreadAttr; atomic_bool isHardwareTimestamping; char *interfaceName; atomic_bool isThreadPinning; } PrrtSocket; PrrtSocket *PrrtSocket_create(bool is_sender, prrtTimedelta_t target_delay_us); bool PrrtSocket_enable_hardware_timestamping(PrrtSocket *s, const char * interface_name); bool PrrtSocket_enable_thread_pinning(PrrtSocket *s); bool PrrtSocket_bind(PrrtSocket *s, const char *ipAddress, const uint16_t port); bool PrrtSocket_set_sock_opt(PrrtSocket *s, const char *name, const uint32_t value); uint32_t PrrtSocket_get_sock_opt(PrrtSocket *s, const char *name); bool PrrtSocket_set_coding_parameters(PrrtSocket *s, uint8_t k, uint8_t n, uint8_t c, uint8_t *n_cycle); PrrtCodingParams *PrrtSocket_get_coding_parameters(PrrtSocket *s); int PrrtSocket_interrupt(PrrtSocket *s); int PrrtSocket_close(PrrtSocket *s); int PrrtSocket_connect(PrrtSocket *s, const char *host, uint16_t port); int PrrtSocket_send(PrrtSocket *s, const uint8_t *data, size_t data_len); int32_t PrrtSocket_recv(PrrtSocket *s, void *buf_ptr); int32_t PrrtSocket_receive_asap(PrrtSocket *s, void *buf_ptr); int32_t PrrtSocket_receive_asap_wait(PrrtSocket *s, void *buf_ptr); int32_t PrrtSocket_receive_asap_timedwait(PrrtSocket *s, void *buf_ptr, struct timespec* deadline); int32_t PrrtSocket_receive_ordered(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us); int32_t PrrtSocket_receive_ordered_wait(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us); int32_t PrrtSocket_receive_ordered_timedwait(PrrtSocket *s, void *buf_ptr, prrtTimedelta_t time_window_us, struct timespec* deadline); bool PrrtSocket_cleanup(PrrtSocket *s); bool PrrtSocket_closing(PrrtSocket *s); bool PrrtSocket_uses_thread_pinning(PrrtSocket *s); uint32_t PrrtSocket_get_rtprop(PrrtSocket *s); prrtPacketLossRate_t PrrtSocket_get_plr(PrrtSocket *s); prrtDeliveryRate_t PrrtSocket_get_delivery_rate(PrrtSocket *s); prrtDeliveryRate_t PrrtSocket_get_btlbw(PrrtSocket *s); bool PrrtSocket_get_app_limited(PrrtSocket *s); #endif // PRRT_SOCKET_H