prrt.pyx 4.85 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/forwardPacketTable.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

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

108 109
cdef class PrrtSocket:
    cdef cprrt.PrrtSocket* _c_socket
Andreas Schmidt's avatar
Andreas Schmidt committed
110
    cdef bint isSender
111

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

Andreas Schmidt's avatar
Andreas Schmidt committed
119
        self.isSender = isSender
120

121 122 123 124 125
    property thread_pinning:

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

126
    property target_delay:
127

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

133 134 135 136 137 138 139 140 141 142 143
    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)

144
    property rtt:
145 146 147 148
        def __get__(self):
            if not self.isSender:
                raise Exception("Not a sender.")
            return cprrt.PrrtSocket_get_rtt(self._c_socket) * 0.000001
149

150 151 152 153 154 155 156 157 158 159
    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
160
    def recv(self):
Andreas Schmidt's avatar
Andreas Schmidt committed
161 162 163 164
        cdef char buffer[65536]
        cdef int32_t len
        with nogil:
            len = cprrt.PrrtSocket_recv(self._c_socket, <void*> buffer)
165
        return buffer[:len]
166

167 168 169 170 171 172 173 174
    def recv_sync(self, granularity):
        cdef char buffer[65536]
        cdef int32_t len
        cdef uint32_t time_window_us = granularity * (1000**2)
        with nogil:
            len = cprrt.PrrtSocket_recv_sync(self._c_socket, <void*> buffer, time_window_us)
        return buffer[:len]

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

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

182 183 184
    def __dealloc__(self):
        if self._c_socket != NULL:
            cprrt.PrrtSocket_close(self._c_socket)