Pigweed
 
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
42class Router final {
43 public:
44 class Registration;
45
56 Router(pw::channel::ByteReaderWriter& io_channel, ByteSpan decode_buffer)
57 : io_channel_(io_channel), decoder_(decode_buffer) {}
58
59 // Router is not copyable or movable.
60 Router(const Router&) = delete;
61 Router& operator=(const Router&) = delete;
62 Router(Router&&) = delete;
63 Router& operator=(Router&&) = delete;
64
98 uint64_t receive_address,
99 uint64_t send_address);
100
115 uint64_t receive_address,
116 uint64_t send_address);
117
125
128
129 private:
130 // TODO: https://pwbug.dev/329902904 - Use allocator-based collections and
131 // remove this arbitrary limit.
132 constexpr static size_t kSomeNumberOfChannels = 16;
133
135 struct ChannelData {
136 ChannelData(pw::channel::DatagramReaderWriter& channel_arg,
137 uint64_t receive_address_arg,
138 uint64_t send_address_arg)
139 : channel(&channel_arg),
140 receive_address(receive_address_arg),
141 send_address(send_address_arg) {}
142
143 ChannelData(const ChannelData&) = delete;
144 ChannelData& operator=(const ChannelData&) = delete;
145 ChannelData(ChannelData&&) = default;
146 ChannelData& operator=(ChannelData&&) = default;
147
150
152 uint64_t receive_address;
153
156 uint64_t send_address;
157 };
158
161 ChannelData* FindChannelForReceiveAddress(uint64_t receive_address);
162
165 void DecodeAndWriteIncoming(pw::async2::Context& cx);
166
169 pw::async2::Poll<> PollDeliverIncomingFrame(pw::async2::Context& cx,
170 const Frame& frame);
171
173 void TryFillBufferToEncodeAndSend(pw::async2::Context& cx);
174
177 void WriteOutgoingMessages(pw::async2::Context& cx);
178
183 void RemoveClosedChannels();
184
188
192
195
199
201 pw::multibuf::MultiBuf incoming_data_;
202
204 pw::hdlc::Decoder decoder_;
205
207 std::optional<pw::hdlc::Frame> decoded_frame_;
208
212
213 struct OutgoingBuffer {
215 size_t hdlc_encoded_size;
216 uint64_t target_address;
217 };
220 std::optional<OutgoingBuffer> buffer_to_encode_and_send_;
221
225 size_t next_first_read_index_ = 0;
226};
227
228} // namespace pw::hdlc
Definition: status.h:85
Definition: vector.h:65
Definition: dispatcher_base.h:52
Definition: poll.h:54
Definition: channel.h:56
Definition: decoder.h:66
Definition: router.h:42
pw::async2::Poll PendClose(pw::async2::Context &cx)
Closes all underlying channels, attempting to flush any data.
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:56
Status RemoveChannel(pw::channel::DatagramReaderWriter &channel, uint64_t receive_address, uint64_t send_address)
pw::async2::Poll Pend(pw::async2::Context &cx)
Definition: multibuf.h:245