prrt.pyx 5.51 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

Andreas Schmidt's avatar
Andreas Schmidt committed
15 16 17 18
cdef extern from "proto/stores/receptionTable.c":
    pass

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

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

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

27
cdef extern from "proto/stores/repairBlockStore.c":
28 29
    pass

30
cdef extern from "proto/stores/packetDeliveryStore.c":
31 32
    pass

Andreas Schmidt's avatar
Andreas Schmidt committed
33 34 35
cdef extern from "proto/types/packetTimeout.c":
    pass

Andreas Schmidt's avatar
Andreas Schmidt committed
36 37 38
cdef extern from "proto/types/lossStatistics.c":
    pass

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

42
cdef extern from "proto/processes/dataReceiver.c":
43
    pass
44

45
cdef extern from "proto/processes/dataTransmitter.c":
46
    pass
47

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

51
cdef extern from "proto/clock.c":
52
    pass
Andreas Schmidt's avatar
Andreas Schmidt committed
53

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

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

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

63
cdef extern from "proto/receiver.c":
64
    pass
Andreas Schmidt's avatar
Andreas Schmidt committed
65

66
cdef extern from "proto/types/packet.c":
67
    pass
68

69
cdef extern from "proto/socket.c":
70
    pass
71 72

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

75 76
cdef extern from "util/bitmap.c":
    pass
77

78 79 80
cdef extern from "util/common.c":
    pass

81 82
cdef extern from "util/list.c":
    pass
83

Andreas Schmidt's avatar
Andreas Schmidt committed
84 85 86
cdef extern from "util/pipe.c":
    pass

Andreas Schmidt's avatar
Andreas Schmidt committed
87 88 89
cdef extern from "util/mpsc_queue.c":
    pass

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
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)

120 121
cdef class PrrtSocket:
    cdef cprrt.PrrtSocket* _c_socket
Andreas Schmidt's avatar
Andreas Schmidt committed
122
    cdef bint isSender
123

124
    def __cinit__(self, port, isSender, target_delay = 1, thread_pinning = False):
125 126
        target_delay_us = target_delay * 1000**2
        self._c_socket = cprrt.PrrtSocket_create(isSender, target_delay_us)
127 128
        if thread_pinning:
            cprrt.PrrtSocket_enable_thread_pinning(self._c_socket)
Andreas Schmidt's avatar
Andreas Schmidt committed
129
        cprrt.PrrtSocket_bind(self._c_socket, "0.0.0.0", port)
Andreas Schmidt's avatar
Andreas Schmidt committed
130

Andreas Schmidt's avatar
Andreas Schmidt committed
131
        self.isSender = isSender
132

Andreas Schmidt's avatar
Andreas Schmidt committed
133 134 135 136 137 138 139
    property plr:

        def __get__(self):
            if not self.isSender:
                raise Exception("Not a sender.")
            return cprrt.PrrtSocket_get_plr(self._c_socket)

140 141 142 143 144
    property thread_pinning:

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

145
    property target_delay:
146

147 148 149
        def __get__(self):
            if not self.isSender:
                raise Exception("Not a sender.")
150
            return cprrt.PrrtSocket_get_sock_opt(self._c_socket, "targetdelay") * 0.000001
151

152 153 154 155 156 157 158 159 160 161 162
    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)

163
    property rtt:
164 165 166
        def __get__(self):
            if not self.isSender:
                raise Exception("Not a sender.")
167
            return cprrt.PrrtSocket_get_rtprop(self._c_socket) * 0.000001
168

169 170 171 172 173 174 175 176 177 178
    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

179 180 181 182 183 184
    property delivery_rate:
        def __get__(self):
            if not self.isSender:
                raise Exception("Not a sender.")
            return cprrt.PrrtSocket_get_delivery_rate(self._c_socket)

Andreas Schmidt's avatar
Andreas Schmidt committed
185
    def recv(self):
Andreas Schmidt's avatar
Andreas Schmidt committed
186 187 188 189
        cdef char buffer[65536]
        cdef int32_t len
        with nogil:
            len = cprrt.PrrtSocket_recv(self._c_socket, <void*> buffer)
190
        return buffer[:len]
191

192
    def receive_ordered_wait(self, time_window):
193 194
        cdef char buffer[65536]
        cdef int32_t len
195
        cdef uint32_t time_window_us = time_window * (1000**2)
196
        with nogil:
197
            len = cprrt.PrrtSocket_receive_ordered_wait(self._c_socket, <void*> buffer, time_window_us)
198 199
        return buffer[:len]

200
    def connect(self, host, port):
Andreas Schmidt's avatar
Andreas Schmidt committed
201 202 203 204
        cdef bytes encodedHost = host.encode("utf-8")
        cprrt.PrrtSocket_connect(self._c_socket, encodedHost, port)

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

207 208 209
    def __dealloc__(self):
        if self._c_socket != NULL:
            cprrt.PrrtSocket_close(self._c_socket)