From 114e3952a51ed51126207e77ac305e4f5665e9eb Mon Sep 17 00:00:00 2001 From: Dimitri Staessens Date: Fri, 11 Mar 2022 16:54:12 +0100 Subject: ouroboros: Add support for flow timeout, O7s 0.19 --- README.md | 5 +++-- ffi/pyouroboros_build.py | 1 + ouroboros/dev.py | 13 ++++++------- ouroboros/qos.py | 11 ++++++++--- setup.py | 2 +- 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', -- cgit v1.2.3