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/multibuf.h"
35#include "pw_status/status.h"
36
37namespace pw::hdlc {
38
40
43class Router final {
44 public:
45 class Registration;
46
57 Router(pw::channel::ByteReaderWriter& io_channel, ByteSpan decode_buffer)
58 : io_channel_(io_channel), decoder_(decode_buffer) {}
59
60 // Router is not copyable or movable.
61 Router(const Router&) = delete;
62 Router& operator=(const Router&) = delete;
63 Router(Router&&) = delete;
64 Router& operator=(Router&&) = delete;
65
93 uint64_t receive_address,
94 uint64_t send_address);
95
104 uint64_t receive_address,
105 uint64_t send_address);
106
114
117
118 private:
119 // TODO: https://pwbug.dev/329902904 - Use allocator-based collections and
120 // remove this arbitrary limit.
121 constexpr static size_t kSomeNumberOfChannels = 16;
122
124 struct ChannelData {
125 ChannelData(pw::channel::DatagramReaderWriter& channel_arg,
126 uint64_t receive_address_arg,
127 uint64_t send_address_arg)
128 : channel(&channel_arg),
129 receive_address(receive_address_arg),
130 send_address(send_address_arg) {}
131
132 ChannelData(const ChannelData&) = delete;
133 ChannelData& operator=(const ChannelData&) = delete;
134 ChannelData(ChannelData&&) = default;
135 ChannelData& operator=(ChannelData&&) = default;
136
139
142
145 uint64_t send_address;
146 };
147
150 ChannelData* FindChannelForReceiveAddress(uint64_t receive_address);
151
154 void DecodeAndWriteIncoming(pw::async2::Context& cx);
155
158 pw::async2::Poll<> PollDeliverIncomingFrame(pw::async2::Context& cx,
159 const Frame& frame);
160
162 void TryFillBufferToEncodeAndSend(pw::async2::Context& cx);
163
166 void WriteOutgoingMessages(pw::async2::Context& cx);
167
172 void RemoveClosedChannels();
173
177
181
184
188
190 pw::multibuf::MultiBuf incoming_data_;
191
193 pw::hdlc::Decoder decoder_;
194
196 std::optional<pw::hdlc::Frame> decoded_frame_;
197
201
202 struct OutgoingBuffer {
203 pw::multibuf::MultiBuf buffer;
204 size_t hdlc_encoded_size;
205 uint64_t target_address;
206 };
209 std::optional<OutgoingBuffer> buffer_to_encode_and_send_;
210
214 size_t next_first_read_index_ = 0;
215};
216
217} // namespace pw::hdlc
Definition: status.h:120
Definition: vector.h:66
Definition: context.h:46
Definition: poll.h:138
Definition: channel.h:59
Definition: decoder.h:66
Definition: decoder.h:36
Definition: router.h:43
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:138
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:57
uint64_t receive_address
Data received over HDLC with this address will be sent to channel.
Definition: router.h:141
Status RemoveChannel(pw::channel::DatagramReaderWriter &channel, uint64_t receive_address, uint64_t send_address)
uint64_t send_address
Definition: router.h:145
pw::async2::Poll Pend(pw::async2::Context &cx)