Skip to content
11 changes: 11 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,3 +62,14 @@ Message Flags/Types:
- `0x08`: Ping | The extra data is a `ping` or `pong` response to a ping.
- `0x16`: Pause the remote reader
- `0x32`: Resume the remote reader

## Configuration via environment variables

The following environment variables, which, to be effective, must be set before importing this package, are available to override internal defaults:

- `MULTIPLEXER_INCOMING_QUEUE_MAX_BYTES_CHANNEL` - The maximum number of bytes allowed in the incoming queue for each multiplexer channel.
- `MULTIPLEXER_INCOMING_QUEUE_LOW_WATERMARK` - The low watermark threshold, in bytes, for the incoming queue for each multiplexer channel.
- `MULTIPLEXER_INCOMING_QUEUE_HIGH_WATERMARK` - The high watermark threshold, in bytes, for the incoming queue for each multiplexer channel.
- `MULTIPLEXER_OUTGOING_QUEUE_MAX_BYTES_CHANNEL` - The maximum number of bytes allowed in the outgoing queue for the multiplexer channel.
- `MULTIPLEXER_OUTGOING_QUEUE_LOW_WATERMARK` - The low watermark threshold, in bytes, for the outgoing queue for each multiplexer channel.
- `MULTIPLEXER_OUTGOING_QUEUE_HIGH_WATERMARK` - The high watermark threshold, in bytes, for the outgoing queue for each multiplexer channel.
52 changes: 46 additions & 6 deletions snitun/multiplexer/const.py
Original file line number Diff line number Diff line change
@@ -1,15 +1,55 @@
"""This file contains the constants used by the multiplexer."""

import os

# When downloading a file, the message size will be
# ~4199990 bytes which is the protocol maximum. Make
# sure we have enough space to store 16 messages
# in the incoming queue before we drop the connection.
INCOMING_QUEUE_MAX_BYTES_CHANNEL = 1024 * 1024 * 65
INCOMING_QUEUE_LOW_WATERMARK = 1024 * 512
INCOMING_QUEUE_HIGH_WATERMARK = 1024 * 1024 * 2
DEFAULT_INCOMING_QUEUE_MAX_BYTES_CHANNEL = 1024 * 1024 * 65
DEFAULT_INCOMING_QUEUE_LOW_WATERMARK = 1024 * 512
DEFAULT_INCOMING_QUEUE_HIGH_WATERMARK = 1024 * 1024 * 2

DEFAULT_OUTGOING_QUEUE_MAX_BYTES_CHANNEL = 1024 * 1024 * 12
DEFAULT_OUTGOING_QUEUE_LOW_WATERMARK = 1024 * 512
DEFAULT_OUTGOING_QUEUE_HIGH_WATERMARK = 1024 * 1024 * 1

INCOMING_QUEUE_MAX_BYTES_CHANNEL = int(
os.getenv(
"MULTIPLEXER_INCOMING_QUEUE_MAX_BYTES_CHANNEL",
DEFAULT_INCOMING_QUEUE_MAX_BYTES_CHANNEL,
),
)
INCOMING_QUEUE_LOW_WATERMARK = int(
os.getenv(
"MULTIPLEXER_INCOMING_QUEUE_LOW_WATERMARK",
DEFAULT_INCOMING_QUEUE_LOW_WATERMARK,
),
)
INCOMING_QUEUE_HIGH_WATERMARK = int(
os.getenv(
"MULTIPLEXER_INCOMING_QUEUE_HIGH_WATERMARK",
DEFAULT_INCOMING_QUEUE_HIGH_WATERMARK,
),
)

OUTGOING_QUEUE_MAX_BYTES_CHANNEL = 1024 * 1024 * 12
OUTGOING_QUEUE_LOW_WATERMARK = 1024 * 512
OUTGOING_QUEUE_HIGH_WATERMARK = 1024 * 1024 * 1
OUTGOING_QUEUE_MAX_BYTES_CHANNEL = int(
os.getenv(
"MULTIPLEXER_OUTGOING_QUEUE_MAX_BYTES_CHANNEL",
DEFAULT_OUTGOING_QUEUE_MAX_BYTES_CHANNEL,
),
)
OUTGOING_QUEUE_LOW_WATERMARK = int(
os.getenv(
"MULTIPLEXER_OUTGOING_QUEUE_LOW_WATERMARK",
DEFAULT_OUTGOING_QUEUE_LOW_WATERMARK,
),
)
OUTGOING_QUEUE_HIGH_WATERMARK = int(
os.getenv(
"MULTIPLEXER_OUTGOING_QUEUE_HIGH_WATERMARK",
DEFAULT_OUTGOING_QUEUE_HIGH_WATERMARK,
),
)

PEER_TCP_TIMEOUT = 90
79 changes: 79 additions & 0 deletions tests/multiplexer/test_const.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import importlib
import os

from snitun.multiplexer import const


def test_override_constants_from_env():
"""Test overriding constants from environment variables."""
os.environ.pop("MULTIPLEXER_INCOMING_QUEUE_MAX_BYTES_CHANNEL", None)
os.environ.pop("MULTIPLEXER_INCOMING_QUEUE_LOW_WATERMARK", None)
os.environ.pop("MULTIPLEXER_INCOMING_QUEUE_HIGH_WATERMARK", None)
os.environ.pop("MULTIPLEXER_OUTGOING_QUEUE_MAX_BYTES_CHANNEL", None)
os.environ.pop("MULTIPLEXER_OUTGOING_QUEUE_LOW_WATERMARK", None)
os.environ.pop("MULTIPLEXER_OUTGOING_QUEUE_HIGH_WATERMARK", None)
importlib.reload(const)
assert (
const.INCOMING_QUEUE_MAX_BYTES_CHANNEL
== const.DEFAULT_INCOMING_QUEUE_MAX_BYTES_CHANNEL
)
assert (
const.INCOMING_QUEUE_LOW_WATERMARK == const.DEFAULT_INCOMING_QUEUE_LOW_WATERMARK
)
assert (
const.INCOMING_QUEUE_HIGH_WATERMARK
== const.DEFAULT_INCOMING_QUEUE_HIGH_WATERMARK
)
assert (
const.OUTGOING_QUEUE_MAX_BYTES_CHANNEL
== const.DEFAULT_OUTGOING_QUEUE_MAX_BYTES_CHANNEL
)
assert (
const.OUTGOING_QUEUE_LOW_WATERMARK == const.DEFAULT_OUTGOING_QUEUE_LOW_WATERMARK
)
assert (
const.OUTGOING_QUEUE_HIGH_WATERMARK
== const.DEFAULT_OUTGOING_QUEUE_HIGH_WATERMARK
)
os.environ["MULTIPLEXER_INCOMING_QUEUE_MAX_BYTES_CHANNEL"] = "1"
os.environ["MULTIPLEXER_INCOMING_QUEUE_LOW_WATERMARK"] = "2"
os.environ["MULTIPLEXER_INCOMING_QUEUE_HIGH_WATERMARK"] = "3"
os.environ["MULTIPLEXER_OUTGOING_QUEUE_MAX_BYTES_CHANNEL"] = "4"
os.environ["MULTIPLEXER_OUTGOING_QUEUE_LOW_WATERMARK"] = "5"
os.environ["MULTIPLEXER_OUTGOING_QUEUE_HIGH_WATERMARK"] = "6"
importlib.reload(const)
assert const.INCOMING_QUEUE_MAX_BYTES_CHANNEL == 1
assert const.INCOMING_QUEUE_LOW_WATERMARK == 2
assert const.INCOMING_QUEUE_HIGH_WATERMARK == 3
assert const.OUTGOING_QUEUE_MAX_BYTES_CHANNEL == 4
assert const.OUTGOING_QUEUE_LOW_WATERMARK == 5
assert const.OUTGOING_QUEUE_HIGH_WATERMARK == 6
del os.environ["MULTIPLEXER_INCOMING_QUEUE_MAX_BYTES_CHANNEL"]
del os.environ["MULTIPLEXER_INCOMING_QUEUE_LOW_WATERMARK"]
del os.environ["MULTIPLEXER_INCOMING_QUEUE_HIGH_WATERMARK"]
del os.environ["MULTIPLEXER_OUTGOING_QUEUE_MAX_BYTES_CHANNEL"]
del os.environ["MULTIPLEXER_OUTGOING_QUEUE_LOW_WATERMARK"]
del os.environ["MULTIPLEXER_OUTGOING_QUEUE_HIGH_WATERMARK"]
importlib.reload(const)
assert (
const.INCOMING_QUEUE_MAX_BYTES_CHANNEL
== const.DEFAULT_INCOMING_QUEUE_MAX_BYTES_CHANNEL
)
assert (
const.INCOMING_QUEUE_LOW_WATERMARK == const.DEFAULT_INCOMING_QUEUE_LOW_WATERMARK
)
assert (
const.INCOMING_QUEUE_HIGH_WATERMARK
== const.DEFAULT_INCOMING_QUEUE_HIGH_WATERMARK
)
assert (
const.OUTGOING_QUEUE_MAX_BYTES_CHANNEL
== const.DEFAULT_OUTGOING_QUEUE_MAX_BYTES_CHANNEL
)
assert (
const.OUTGOING_QUEUE_LOW_WATERMARK == const.DEFAULT_OUTGOING_QUEUE_LOW_WATERMARK
)
assert (
const.OUTGOING_QUEUE_HIGH_WATERMARK
== const.DEFAULT_OUTGOING_QUEUE_HIGH_WATERMARK
)