aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Staessens <dimitri@ouroboros.rocks>2022-03-11 16:54:12 +0100
committerDimitri Staessens <dimitri@ouroboros.rocks>2022-03-11 16:54:12 +0100
commit114e3952a51ed51126207e77ac305e4f5665e9eb (patch)
treea0353f7fc03d5422abb8be97b198513256dd8148
parent5974215c9864ca72945b553f5374dbc8ba9a191d (diff)
downloadpyouroboros-0.19.tar.gz
pyouroboros-0.19.zip
ouroboros: Add support for flow timeout, O7s 0.19HEAD0.19master
-rw-r--r--README.md5
-rw-r--r--ffi/pyouroboros_build.py1
-rw-r--r--ouroboros/dev.py13
-rw-r--r--ouroboros/qos.py11
-rwxr-xr-xsetup.py2
5 files changed, 19 insertions, 13 deletions
diff --git a/README.md b/README.md
index dec2db5..a7b3a8c 100644
--- a/README.md
+++ b/README.md
@@ -83,12 +83,13 @@ You can specify a QoSSpec for flow allocation.
For instance,
```Python
-qos = QoSSpec(loss=0, cypher_s=256)
+qos = QoSSpec(loss=0, cypher_s=256, timeout=60000)
f = flow_alloc("name", qos)
```
will create a new flow with FRCP retransmission enabled and encrypted
-using a 256-bit ECDHE-AES-SHA3 cypher.
+using a 256-bit ECDHE-AES-SHA3 cypher that will timeout if the peer is
+not responsive for 1 minute.
## Manipulating flows
diff --git a/ffi/pyouroboros_build.py b/ffi/pyouroboros_build.py
index b4ace8e..d216895 100644
--- a/ffi/pyouroboros_build.py
+++ b/ffi/pyouroboros_build.py
@@ -34,6 +34,7 @@ typedef struct qos_spec {
uint8_t in_order; /* In-order delivery, enables FRCT */
uint32_t max_gap; /* In ms */
uint16_t cypher_s; /* Cypher strength, 0 = no encryption */
+ uint32_t timeout; /* Timeout in ms */
} qosspec_t;
/* OUROBOROS DEV.H */
diff --git a/ouroboros/dev.py b/ouroboros/dev.py
index 7d29624..e0b1488 100644
--- a/ouroboros/dev.py
+++ b/ouroboros/dev.py
@@ -19,15 +19,16 @@
# Foundation, Inc., http://www.fsf.org/about/contact/.
#
-from _ouroboros_cffi import ffi, lib
import errno
from enum import IntFlag
+
+from _ouroboros_cffi import ffi, lib
from ouroboros.qos import *
from ouroboros.qos import _qos_to_qosspec, _fl_to_timespec, _qosspec_to_qos, _timespec_to_fl
# Some constants
-MILLION = 1000 * 1000
-BILLION = 1000 * 1000 * 1000
+MILLION = 1000_1000
+BILLION = 1000_1000_1000
# ouroboros exceptions
@@ -196,8 +197,8 @@ class Flow:
if count is None:
return lib.flow_write(self.__fd, ffi.from_buffer(buf), len(buf))
- else:
- return lib.flow_write(self.__fd, ffi.from_buffer(buf), count)
+
+ return lib.flow_write(self.__fd, ffi.from_buffer(buf), count)
def writeline(self,
ln: str) -> int:
@@ -394,5 +395,3 @@ def flow_join(dst: str,
f = Flow()
f.join(dst, qos, timeo)
return f
-
-
diff --git a/ouroboros/qos.py b/ouroboros/qos.py
index f437ee2..ccf2c7a 100644
--- a/ouroboros/qos.py
+++ b/ouroboros/qos.py
@@ -38,6 +38,7 @@ class QoSSpec:
in_order: In-order delivery, enables FRCT, default 0
max_gap: Maximum interruption in ms, default MILLION
cypher_s: Requested encryption strength in bits
+ timeout: Peer timeout (ms), default 120000 (2 minutes)
"""
def __init__(self,
@@ -48,7 +49,8 @@ class QoSSpec:
ber: int = MILLION,
in_order: int = 0,
max_gap: int = MILLION,
- cypher_s: int = 0):
+ cypher_s: int = 0,
+ timeout: int = 120000):
self.delay = delay
self.bandwidth = bandwidth
self.availability = availability
@@ -57,6 +59,7 @@ class QoSSpec:
self.in_order = in_order
self.max_gap = max_gap
self.cypher_s = cypher_s
+ self.timeout = timeout
def _fl_to_timespec(timeo: float):
@@ -93,7 +96,8 @@ def _qos_to_qosspec(qos: QoSSpec):
qos.ber,
qos.in_order,
qos.max_gap,
- qos.cypher_s])
+ qos.cypher_s,
+ qos.timeout])
def _qosspec_to_qos(_qos) -> Optional[QoSSpec]:
@@ -107,4 +111,5 @@ def _qosspec_to_qos(_qos) -> Optional[QoSSpec]:
ber=_qos.ber,
in_order=_qos.in_order,
max_gap=_qos.max_gap,
- cypher_s=_qos.cypher_s)
+ cypher_s=_qos.cypher_s,
+ timeout=_qos.timeout)
diff --git a/setup.py b/setup.py
index 023f3b4..876f782 100755
--- a/setup.py
+++ b/setup.py
@@ -4,7 +4,7 @@ import setuptools
setuptools.setup(
name='PyOuroboros',
- version=0.17,
+ version=0.19,
url='https://ouroboros.rocks',
keywords='ouroboros IPC subsystem',
author='Dimitri Staessens',