1*61c4878aSAndroid Build Coastguard Worker.. _module-pw_router: 2*61c4878aSAndroid Build Coastguard Worker 3*61c4878aSAndroid Build Coastguard Worker--------- 4*61c4878aSAndroid Build Coastguard Workerpw_router 5*61c4878aSAndroid Build Coastguard Worker--------- 6*61c4878aSAndroid Build Coastguard Worker.. pigweed-module:: 7*61c4878aSAndroid Build Coastguard Worker :name: pw_router 8*61c4878aSAndroid Build Coastguard Worker 9*61c4878aSAndroid Build Coastguard WorkerThe ``pw_router`` module provides transport-agnostic classes for routing packets 10*61c4878aSAndroid Build Coastguard Workerover network links. 11*61c4878aSAndroid Build Coastguard Worker 12*61c4878aSAndroid Build Coastguard WorkerCommon router interfaces 13*61c4878aSAndroid Build Coastguard Worker======================== 14*61c4878aSAndroid Build Coastguard Worker 15*61c4878aSAndroid Build Coastguard Worker.. _module-pw_router-packet_parser: 16*61c4878aSAndroid Build Coastguard Worker 17*61c4878aSAndroid Build Coastguard WorkerPacketParser 18*61c4878aSAndroid Build Coastguard Worker------------ 19*61c4878aSAndroid Build Coastguard WorkerTo work with arbitrary packet formats, routers require a common interface for 20*61c4878aSAndroid Build Coastguard Workerextracting relevant packet data, such as the destination. This interface is 21*61c4878aSAndroid Build Coastguard Worker``pw::router::PacketParser``, defined in ``pw_router/packet_parser.h``, which 22*61c4878aSAndroid Build Coastguard Workermust be implemented for the packet framing format used by the network. 23*61c4878aSAndroid Build Coastguard Worker 24*61c4878aSAndroid Build Coastguard Worker.. _module-pw_router-egress: 25*61c4878aSAndroid Build Coastguard Worker 26*61c4878aSAndroid Build Coastguard WorkerEgress 27*61c4878aSAndroid Build Coastguard Worker------ 28*61c4878aSAndroid Build Coastguard WorkerThe Egress class is a virtual interface for sending packet data over a network 29*61c4878aSAndroid Build Coastguard Workerlink. Egress implementations provide a single ``SendPacket`` function, which 30*61c4878aSAndroid Build Coastguard Workertakes the raw packet data and transmits it. 31*61c4878aSAndroid Build Coastguard Worker 32*61c4878aSAndroid Build Coastguard WorkerEgresses are invoked with the ``PacketParser`` used to process the packet. This 33*61c4878aSAndroid Build Coastguard Workerallows additional information to be extracted from each packet to assist with 34*61c4878aSAndroid Build Coastguard Workertransmitting decisions. For example, if packets in a project include a priority, 35*61c4878aSAndroid Build Coastguard Workeregresses may use it to provide quality-of-service by dropping certain packets 36*61c4878aSAndroid Build Coastguard Workerunder heavy load. 37*61c4878aSAndroid Build Coastguard Worker 38*61c4878aSAndroid Build Coastguard Worker.. code-block:: c++ 39*61c4878aSAndroid Build Coastguard Worker 40*61c4878aSAndroid Build Coastguard Worker Status MyEgress::SendPacket( 41*61c4878aSAndroid Build Coastguard Worker ConstByteSpan packet, const PacketParser& parser) override { 42*61c4878aSAndroid Build Coastguard Worker // Downcast the base PacketParser to the custom implementation that was 43*61c4878aSAndroid Build Coastguard Worker // passed into RoutePacket(). 44*61c4878aSAndroid Build Coastguard Worker const CustomPacketParser& custom_parser = 45*61c4878aSAndroid Build Coastguard Worker static_cast<const CustomPacketParser&>(parser); 46*61c4878aSAndroid Build Coastguard Worker 47*61c4878aSAndroid Build Coastguard Worker // Custom packet fields can now be accessed if necessary. 48*61c4878aSAndroid Build Coastguard Worker if (custom_parser.priority() == MyPacketPriority::kHigh) { 49*61c4878aSAndroid Build Coastguard Worker return SendHighPriorityPacket(packet); 50*61c4878aSAndroid Build Coastguard Worker } 51*61c4878aSAndroid Build Coastguard Worker 52*61c4878aSAndroid Build Coastguard Worker return SendStandardPriorityPacket(packet); 53*61c4878aSAndroid Build Coastguard Worker } 54*61c4878aSAndroid Build Coastguard Worker 55*61c4878aSAndroid Build Coastguard WorkerSome common egress implementations are provided upstream in Pigweed. 56*61c4878aSAndroid Build Coastguard Worker 57*61c4878aSAndroid Build Coastguard Worker.. _module-pw_router-static_router: 58*61c4878aSAndroid Build Coastguard Worker 59*61c4878aSAndroid Build Coastguard WorkerStaticRouter 60*61c4878aSAndroid Build Coastguard Worker============ 61*61c4878aSAndroid Build Coastguard Worker``pw::router::StaticRouter`` is a router with a static table of address to 62*61c4878aSAndroid Build Coastguard Workeregress mappings. Routes in a static router never change; packets with the same 63*61c4878aSAndroid Build Coastguard Workeraddress are always sent through the same egress. If links are unavailable, 64*61c4878aSAndroid Build Coastguard Workerpackets will be dropped. 65*61c4878aSAndroid Build Coastguard Worker 66*61c4878aSAndroid Build Coastguard WorkerStatic routers are suitable for basic networks with persistent links. 67*61c4878aSAndroid Build Coastguard Worker 68*61c4878aSAndroid Build Coastguard WorkerUsage example 69*61c4878aSAndroid Build Coastguard Worker------------- 70*61c4878aSAndroid Build Coastguard Worker 71*61c4878aSAndroid Build Coastguard Worker.. code-block:: c++ 72*61c4878aSAndroid Build Coastguard Worker 73*61c4878aSAndroid Build Coastguard Worker namespace { 74*61c4878aSAndroid Build Coastguard Worker 75*61c4878aSAndroid Build Coastguard Worker // Define the router egresses. 76*61c4878aSAndroid Build Coastguard Worker UartEgress uart_egress; 77*61c4878aSAndroid Build Coastguard Worker BluetoothEgress ble_egress; 78*61c4878aSAndroid Build Coastguard Worker 79*61c4878aSAndroid Build Coastguard Worker // Define the routing table. 80*61c4878aSAndroid Build Coastguard Worker constexpr pw::router::StaticRouter::Route routes[] = {{1, uart_egress}, 81*61c4878aSAndroid Build Coastguard Worker {7, ble_egress}}; 82*61c4878aSAndroid Build Coastguard Worker pw::router::StaticRouter router(routes); 83*61c4878aSAndroid Build Coastguard Worker 84*61c4878aSAndroid Build Coastguard Worker } // namespace 85*61c4878aSAndroid Build Coastguard Worker 86*61c4878aSAndroid Build Coastguard Worker void ProcessPacket(pw::ConstByteSpan packet) { 87*61c4878aSAndroid Build Coastguard Worker HdlcFrameParser hdlc_parser; 88*61c4878aSAndroid Build Coastguard Worker router.RoutePacket(packet, hdlc_parser); 89*61c4878aSAndroid Build Coastguard Worker } 90*61c4878aSAndroid Build Coastguard Worker 91*61c4878aSAndroid Build Coastguard WorkerSize report 92*61c4878aSAndroid Build Coastguard Worker----------- 93*61c4878aSAndroid Build Coastguard WorkerThe following size report shows the cost of a ``StaticRouter`` with a simple 94*61c4878aSAndroid Build Coastguard Worker``PacketParser`` implementation and a single route using an ``EgressFunction``. 95*61c4878aSAndroid Build Coastguard Worker 96*61c4878aSAndroid Build Coastguard Worker.. include:: static_router_size 97*61c4878aSAndroid Build Coastguard Worker 98*61c4878aSAndroid Build Coastguard WorkerZephyr 99*61c4878aSAndroid Build Coastguard Worker====== 100*61c4878aSAndroid Build Coastguard WorkerTo enable ``pw_router.*`` for Zephyr add ``CONFIG_PIGWEED_ROUTER=y`` to the 101*61c4878aSAndroid Build Coastguard Workerproject's configuration. This will enable the Kconfig menu for the following: 102*61c4878aSAndroid Build Coastguard Worker 103*61c4878aSAndroid Build Coastguard Worker* ``pw_router.static_router`` which can be enabled via 104*61c4878aSAndroid Build Coastguard Worker ``CONFIG_PIGWEED_ROUTER_STATIC_ROUTER=y``. 105*61c4878aSAndroid Build Coastguard Worker* ``pw_router.egress`` which can be enabled via 106*61c4878aSAndroid Build Coastguard Worker ``CONFIG_PIGWEED_ROUTER_EGRESS=y``. 107*61c4878aSAndroid Build Coastguard Worker* ``pw_router.packet_parser`` which can be enabled via 108*61c4878aSAndroid Build Coastguard Worker ``CONFIG_PIGWEED_ROUTER_PACKET_PARSER=y``. 109*61c4878aSAndroid Build Coastguard Worker* ``pw_router.egress_function`` which can be enabled via 110*61c4878aSAndroid Build Coastguard Worker ``CONFIG_PIGWEED_ROUTER_EGRESS_FUNCTION=y``. 111