pamoja-routing
Reverse-path routing that learns the cheapest route from overheard traffic. One capability of pamoja, one memory-safe Rust core with bindings for TypeScript, Python, and C#.
Install
pip install pamoja-routing
from pamoja import routing
This pulls in pamoja-native, the compiled engine. pip install pamoja is the whole framework in one package.
Example
The script the test suite runs, spliced here as it ran.
From bindings/python/guides/routing.py:
from pamoja.routing import ForwardAction, Router
# The nodes on this mesh. An address is just a number; naming them is what makes the
# table below read as a map of the site rather than a list of numbers.
GATEWAY = 1
PUMP = 9
TANK = 10
NORTH_RELAY = 5
EAST_RELAY = 7
SOUTH_RELAY = 3
SILO = 32
# A node learns the way to another from traffic it already hears: a packet from the pump
# that arrived through a relay proves that relay is a way back, at the cost the packet
# reports. The table keeps the cheapest way it has heard, and a tie keeps the way in use so
# two equal paths do not flap. Word from the relay already in use is taken even when it is
# worse, which is how a failing link lets a detour win.
router = Router(GATEWAY, 4)
for via, cost in [
(NORTH_RELAY, 2),
(EAST_RELAY, 1),
(SOUTH_RELAY, 4),
(NORTH_RELAY, 1),
(EAST_RELAY, 3),
(NORTH_RELAY, 2),
]:
changed = router.observe(PUMP, via, cost)
route = router.route(PUMP)
outcome = "so the route is" if changed else "and the route stays"
print(
f"heard the pump via {via} at cost {cost}, {outcome} {route.next_hop} "
f"at cost {route.cost}"
)
# The table lists what it holds, one route for each node it has heard from.
router.observe(TANK, NORTH_RELAY, 3)
held = [f"to {route.dst} via {route.next_hop} at cost {route.cost}" for route in router.routes()]
print(f"table {len(router)} routes of {router.capacity}: {', '.join(held)}")
# Every packet gets one of three answers: deliver it here, relay it to the neighbor on the
# way, or flood it because no route is known yet.
for name, address in [("gateway", GATEWAY), ("pump", PUMP), ("silo", SILO)]:
decision = router.forward(address)
if decision.action == ForwardAction.DELIVER:
print(f"{name:<10}deliver here")
elif decision.action == ForwardAction.RELAY:
print(f"{name:<10}relay via {decision.next_hop}")
else:
print(f"{name:<10}flood, no route known")
# The table keeps no clock, so a route through a relay that has gone quiet stays until the
# caller forgets it, typically when a relayed packet goes unanswered. Forgetting returns the
# node's traffic to flooding, the answer that always works.
router.forget(PUMP)
if router.forward(PUMP).action == ForwardAction.FLOOD:
print(f"forgot the pump, so it floods again, and {len(router)} route is left")
The same capability in every language
| Language | Package | Reference |
|---|---|---|
| Rust | pamoja-routing |
reference, docs.rs, install |
| TypeScript | @pamoja/routing |
reference, install |
| Python | pamoja-routing |
reference, install |
| C# | Pamoja.Routing |
reference, install |
Documentation
pamoja.routingreference, every class and function in this module.- The Routing guide, with the same example in Rust, TypeScript, and C#.
- Every capability, and the install page.
License
MIT
Release files for pamoja-routing 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pamoja_routing-0.2.0.tar.gz | 4.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pamoja_routing-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 9.1 kB
Release files / pamoja_routing-0.2.0.tar.gz
| Download URL | pamoja_routing-0.2.0.tar.gz |
|---|---|
| Size | 4.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
dbfd2e3a6e49fe56402eb06194437cf39f3eb20abd92f3c48aacc61994d3c824
|
|
BLAKE2b-256 checksum How to use checksums |
d6902c24ba225484ff495ba8220cb66cd4024e5ba90a47310c4950a64e210442
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|
Release files / pamoja_routing-0.2.0-py3-none-any.whl
| Download URL | pamoja_routing-0.2.0-py3-none-any.whl |
|---|---|
| Size | 4.9 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
88b8f051442758b6fe9364c2833fb1ac9021ed57efb9e7ce9aaed3d476ff21a4
|
|
BLAKE2b-256 checksum How to use checksums |
5950d8d3091b6a20f9cfd360caacf21ea23687f11f89cc0ffa996961be8ccebc
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|