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)