xref: /aosp_15_r20/external/pigweed/pw_router/docs.rst (revision 61c4878ac05f98d0ceed94b57d316916de578985)
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