You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
1.9 KiB
66 lines
1.9 KiB
7 months ago
|
.. _module-pw_router:
|
||
|
|
||
|
---------
|
||
|
pw_router
|
||
|
---------
|
||
|
The ``pw_router`` module provides transport-agnostic classes for routing packets
|
||
|
over network links.
|
||
|
|
||
|
Common router interfaces
|
||
|
========================
|
||
|
|
||
|
PacketParser
|
||
|
------------
|
||
|
To work with arbitrary packet formats, routers require a common interface for
|
||
|
extracting relevant packet data, such as the destination. This interface is
|
||
|
``pw::router::PacketParser``, defined in ``pw_router/packet_parser.h``, which
|
||
|
must be implemented for the packet framing format used by the network.
|
||
|
|
||
|
Egress
|
||
|
------
|
||
|
The Egress class is a virtual interface for sending packet data over a network
|
||
|
link. Egress implementations provide a single ``SendPacket`` function, which
|
||
|
takes the raw packet data and transmits it.
|
||
|
|
||
|
Some common egress implementations are provided upstream in Pigweed.
|
||
|
|
||
|
StaticRouter
|
||
|
============
|
||
|
``pw::router::StaticRouter`` is a router with a static table of address to
|
||
|
egress mappings. Routes in a static router never change; packets with the same
|
||
|
address are always sent through the same egress. If links are unavailable,
|
||
|
packets will be dropped.
|
||
|
|
||
|
Static routers are suitable for basic networks with persistent links.
|
||
|
|
||
|
Usage example
|
||
|
-------------
|
||
|
|
||
|
.. code-block:: c++
|
||
|
|
||
|
namespace {
|
||
|
|
||
|
// Define packet parser and egresses.
|
||
|
HdlcFrameParser hdlc_parser;
|
||
|
UartEgress uart_egress;
|
||
|
BluetoothEgress ble_egress;
|
||
|
|
||
|
// Define the routing table.
|
||
|
constexpr pw::router::StaticRouter::Route routes[] = {{1, uart_egress},
|
||
|
{7, ble_egress}};
|
||
|
pw::router::StaticRouter router(hdlc_parser, routes);
|
||
|
|
||
|
} // namespace
|
||
|
|
||
|
void ProcessPacket(pw::ConstByteSpan packet) {
|
||
|
router.RoutePacket(packet);
|
||
|
}
|
||
|
|
||
|
.. TODO(frolv): Re-enable this when the size report builds.
|
||
|
.. Size report
|
||
|
.. -----------
|
||
|
.. The following size report shows the cost of a ``StaticRouter`` with a simple
|
||
|
.. ``PacketParser`` implementation and a single route using an ``EgressFunction``.
|
||
|
|
||
|
.. .. include:: static_router_size
|