prrt.pyx 4.93 KB
Newer Older
Andreas Schmidt's avatar
Andreas Schmidt committed
1
from libc.stdint cimport uint32_t, uint16_t, uint8_t, int32_t
Andreas Schmidt's avatar
Andreas Schmidt committed
2 3
from libc.stdlib cimport malloc, free

4 5
cimport cprrt

6
cdef extern from "proto/applicationConstraints.c":
7 8
    pass

9
cdef extern from "proto/stores/dataPacketStore.c":
10 11
    pass

12
cdef extern from "proto/stores/deliveredPacketTable.c":
13
    pass
14

15
cdef extern from "proto/stores/lossGatherer.c":
16 17
    pass

18
cdef extern from "proto/stores/packetTimeoutTable.c":
19 20
    pass

21
cdef extern from "proto/stores/repairBlockStore.c":
22 23
    pass

24 25 26
cdef extern from "proto/stores/receiveDataQueue.c":
    pass

Andreas Schmidt's avatar
Andreas Schmidt committed
27 28 29
cdef extern from "proto/types/packetTimeout.c":
    pass

30
cdef extern from "proto/processes/feedbackReceiver.c":
31
    pass
32

33
cdef extern from "proto/processes/dataReceiver.c":
34
    pass
35

36
cdef extern from "proto/processes/dataTransmitter.c":
37
    pass
38

39
cdef extern from "proto/block.c":
40
    pass
41

42
cdef extern from "proto/clock.c":
43
    pass
Andreas Schmidt's avatar
Andreas Schmidt committed
44

45
cdef extern from "proto/channelStateInformation.c":
46
    pass
Andreas Schmidt's avatar
Andreas Schmidt committed
47

48
cdef extern from "proto/vdmcode/block_code.c":
49
    pass
50

51
cdef extern from "proto/codingParams.c":
52
    pass
53

54
cdef extern from "proto/receiver.c":
55
    pass
Andreas Schmidt's avatar
Andreas Schmidt committed
56

57
cdef extern from "proto/packet.c":
58
    pass
59

60
cdef extern from "proto/socket.c":
61
    pass
62 63

cdef extern from "util/bptree.c":
64
    pass
65

66 67
cdef extern from "util/bitmap.c":
    pass
68

69 70 71
cdef extern from "util/common.c":
    pass

72 73
cdef extern from "util/list.c":
    pass
74

Andreas Schmidt's avatar
Andreas Schmidt committed
75 76 77
cdef extern from "util/pipe.c":
    pass

Andreas Schmidt's avatar
Andreas Schmidt committed
78 79 80
cdef extern from "util/mpsc_queue.c":
    pass

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
cdef class PrrtCodingConfiguration:
    cdef cprrt.PrrtCodingParams* _c_config

    def __cinit__(self):
        self._c_config = cprrt.PrrtCodingParams_create()

    def __dealloc__(self):
        if self._c_config != NULL:
            cprrt.PrrtCodingParams_destroy(self._c_config)

    cdef copy(self, cprrt.PrrtCodingParams* other):
        cprrt.PrrtCodingParams_destroy(self._c_config)
        self._c_config = other

    property k:
        def __get__(self):
            return int(self._c_config.k)
    property n:
        def __get__(self):
            return int(self._c_config.n)
    property r:
        def __get__(self):
            return int(self._c_config.r)
    property c:
        def __get__(self):
            return int(self._c_config.c)
    property n_cycle:
        def __get__(self):
            return list(<uint8_t[:self._c_config.c]> self._c_config.n_cycle)

111 112
cdef class PrrtSocket:
    cdef cprrt.PrrtSocket* _c_socket
Andreas Schmidt's avatar
Andreas Schmidt committed
113
    cdef bint isSender
114

115
    def __cinit__(self, port, isSender, target_delay = 1, thread_pinning = False):
116 117
        target_delay_us = target_delay * 1000**2
        self._c_socket = cprrt.PrrtSocket_create(isSender, target_delay_us)
118 119
        if thread_pinning:
            cprrt.PrrtSocket_enable_thread_pinning(self._c_socket)
Andreas Schmidt's avatar
Andreas Schmidt committed
120
        cprrt.PrrtSocket_bind(self._c_socket, "0.0.0.0", port)
Andreas Schmidt's avatar
Andreas Schmidt committed
121

Andreas Schmidt's avatar
Andreas Schmidt committed
122
        self.isSender = isSender
123

124 125 126 127 128
    property thread_pinning:

        def __get__(self):
            return cprrt.PrrtSocket_uses_thread_pinning(self._c_socket)

129
    property target_delay:
130

131 132 133
        def __get__(self):
            if not self.isSender:
                raise Exception("Not a sender.")
134
            return cprrt.PrrtSocket_get_sock_opt(self._c_socket, "targetdelay") * 0.000001
135

136 137 138 139 140 141 142 143 144 145 146
    property app_queue_size:
        def __get__(self):
            if not self.isSender:
                raise Exception("Not a sender.")
            return cprrt.PrrtSocket_get_sock_opt(self._c_socket, "app_queue_size")

        def __set__(self, value):
            if not self.isSender:
                raise Exception("Not a sender.")
            cprrt.PrrtSocket_set_sock_opt(self._c_socket, "app_queue_size", value)

147
    property rtt:
148 149 150
        def __get__(self):
            if not self.isSender:
                raise Exception("Not a sender.")
151
            return cprrt.PrrtSocket_get_rtprop(self._c_socket) * 0.000001
152

153 154 155 156 157 158 159 160 161 162
    property coding_configuration:

        def __get__(self):
            if not self.isSender:
                raise Exception("Not a sender.")
            res = PrrtCodingConfiguration()
            cdef cprrt.PrrtCodingParams *params = cprrt.PrrtSocket_get_coding_parameters(self._c_socket)
            res.copy(params)
            return res

Andreas Schmidt's avatar
Andreas Schmidt committed
163
    def recv(self):
Andreas Schmidt's avatar
Andreas Schmidt committed
164 165 166 167
        cdef char buffer[65536]
        cdef int32_t len
        with nogil:
            len = cprrt.PrrtSocket_recv(self._c_socket, <void*> buffer)
168
        return buffer[:len]
169

170
    def receive_ordered_wait(self, time_window):
171 172
        cdef char buffer[65536]
        cdef int32_t len
173
        cdef uint32_t time_window_us = time_window * (1000**2)
174
        with nogil:
175
            len = cprrt.PrrtSocket_receive_ordered_wait(self._c_socket, <void*> buffer, time_window_us)
176 177
        return buffer[:len]

178
    def connect(self, host, port):
Andreas Schmidt's avatar
Andreas Schmidt committed
179 180 181 182
        cdef bytes encodedHost = host.encode("utf-8")
        cprrt.PrrtSocket_connect(self._c_socket, encodedHost, port)

    def send(self, data):
183
        cprrt.PrrtSocket_send(self._c_socket, data, len(data))
Andreas Schmidt's avatar
Andreas Schmidt committed
184

185 186 187
    def __dealloc__(self):
        if self._c_socket != NULL:
            cprrt.PrrtSocket_close(self._c_socket)