C/C++ API Reference
Loading...
Searching...
No Matches
router.h
1// Copyright 2024 The Pigweed Authors
2//
3// Licensed under the Apache License, Version 2.0 (the "License"); you may not
4// use this file except in compliance with the License. You may obtain a copy of
5// the License at
6//
7// https://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
11// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
12// License for the specific language governing permissions and limitations under
13// the License.
14#pragma once
15
16// __ ___ ___ _ _ ___ _ _ ___
17// \ \ / /_\ | _ \ \| |_ _| \| |/ __|
18// \ \/\/ / _ \| / .` || || .` | (_ |
19// \_/\_/_/ \_\_|_\_|\_|___|_|\_|\___|
20// _____ _____ ___ ___ ___ __ __ ___ _ _ _____ _ _
21// | __\ \/ / _ \ __| _ \_ _| \/ | __| \| |_ _/_\ | |
22// | _| > <| _/ _|| /| || |\/| | _|| .` | | |/ _ \| |__
23// |___/_/\_\_| |___|_|_\___|_| |_|___|_|\_| |_/_/ \_\____|
24//
25// This module is in an early, experimental state. The APIs are in flux and may
26// change without notice. Please do not rely on it in production code, but feel
27// free to explore and share feedback with the Pigweed team!
28
29#include "pw_async2/dispatcher.h"
30#include "pw_async2/poll.h"
31#include "pw_channel/channel.h"
32#include "pw_containers/vector.h"
33#include "pw_hdlc/decoder.h"
34#include "pw_multibuf/allocator.h"
35#include "pw_multibuf/multibuf.h"
36#include "pw_status/status.h"
37
38namespace pw::hdlc {
39
41
44class Router final {
45 public:
46 class Registration;
47
58 Router(pw::channel::ByteReaderWriter& io_channel, ByteSpan decode_buffer)
59 : io_channel_(io_channel), decoder_(decode_buffer) {}
60
61 // Router is not copyable or movable.
62 Router(const Router&) = delete;
63 Router& operator=(const Router&) = delete;
64 Router(Router&&) = delete;
65 Router& operator=(Router&&) = delete;
66
100 uint64_t receive_address,
101 uint64_t send_address);
102
117 uint64_t receive_address,
118 uint64_t send_address);
119
127
130
131 private:
132 // TODO: https://pwbug.dev/329902904 - Use allocator-based collections and
133 // remove this arbitrary limit.
134 constexpr static size_t kSomeNumberOfChannels = 16;
135
137 struct ChannelData {
138 ChannelData(pw::channel::DatagramReaderWriter& channel_arg,
139 uint64_t receive_address_arg,
140 uint64_t send_address_arg)
141 : channel(&channel_arg),
142 receive_address(receive_address_arg),
143 send_address(send_address_arg) {}
144
145 ChannelData(const ChannelData&) = delete;
146 ChannelData& operator=(const ChannelData&) = delete;
147 ChannelData(ChannelData&&) = default;
148 ChannelData& operator=(ChannelData&&) = default;
149
152
155
158 uint64_t send_address;
159 };
160
163 ChannelData* FindChannelForReceiveAddress(uint64_t receive_address);
164
167 void DecodeAndWriteIncoming(pw::async2::Context& cx);
168
171 pw::async2::Poll<> PollDeliverIncomingFrame(pw::async2::Context& cx,
172 const Frame& frame);
173
175 void TryFillBufferToEncodeAndSend(pw::async2::Context& cx);
176
179 void WriteOutgoingMessages(pw::async2::Context& cx);
180
185 void RemoveClosedChannels();
186
190
194
197
201
203 pw::multibuf::MultiBuf incoming_data_;
204
206 pw::hdlc::Decoder decoder_;
207
209 std::optional<pw::hdlc::Frame> decoded_frame_;
210
214
215 struct OutgoingBuffer {
217 size_t hdlc_encoded_size;
218 uint64_t target_address;
219 };
222 std::optional<OutgoingBuffer> buffer_to_encode_and_send_;
223
227 size_t next_first_read_index_ = 0;
228};
229
230} // namespace pw::hdlc
Definition: status.h:86
Definition: vector.h:65
Definition: context.h:55
Definition: poll.h:60
Definition: channel.h:55
Definition: decoder.h:68
Definition: decoder.h:36
Definition: router.h:44
Definition: multibuf_v1.h:248
pw::async2::Poll PendClose(pw::async2::Context &cx)
Closes all underlying channels, attempting to flush any data.
pw::channel::DatagramReaderWriter * channel
A channel which reads and writes datagrams.
Definition: router.h:151
Status AddChannel(pw::channel::DatagramReaderWriter &channel, uint64_t receive_address, uint64_t send_address)
Router(pw::channel::ByteReaderWriter &io_channel, ByteSpan decode_buffer)
Definition: router.h:58
uint64_t receive_address
Data received over HDLC with this address will be sent to channel.
Definition: router.h:154
Status RemoveChannel(pw::channel::DatagramReaderWriter &channel, uint64_t receive_address, uint64_t send_address)
uint64_t send_address
Definition: router.h:158
pw::async2::Poll Pend(pw::async2::Context &cx)
Serial comms library.
Definition: decoder.h:29