40 void Connection::log_(
bool accept,
const Packet &packet)
45 ss << (accept ?
"accepted " :
"rejected ")
46 << packet <<
" source ";
49 if (connection ==
nullptr)
58 ss <<
" dest " << name_;
79 void Connection::send_to_address_(
80 std::shared_ptr<const Packet> packet,
const MAVAddress &dest)
83 if (pool_->contains(dest))
86 auto [accept, priority] = filter_->will_accept(*packet, dest);
92 queue_->push(std::move(packet), priority);
103 bool system_found =
false;
106 for (
const auto &addr : pool_->addresses())
109 if (addr.system() == dest.
system())
112 auto [accept, priority] = filter_->will_accept(*packet, dest);
117 queue_->push(std::move(packet), priority);
125 log_(
false, *packet);
141 void Connection::send_to_all_(std::shared_ptr<const Packet> packet)
144 int priority = std::numeric_limits<int>::min();
147 for (
const auto &addr : pool_->addresses())
150 auto [accept_, priority_] = filter_->will_accept(*packet, addr);
156 priority = std::max(priority, priority_);
164 queue_->push(std::move(packet), priority);
168 log_(
false, *packet);
183 void Connection::send_to_system_(
184 std::shared_ptr<const Packet> packet,
unsigned int system)
186 bool system_found =
false;
188 int priority = std::numeric_limits<int>::min();
191 for (
const auto &addr : pool_->addresses())
193 if (system == addr.system())
197 auto [accept_, priority_] = filter_->will_accept(*packet, addr);
203 priority = std::max(priority, priority_);
214 queue_->push(std::move(packet), priority);
218 log_(
false, *packet);
246 std::shared_ptr<Filter> filter,
bool mirror,
248 std::unique_ptr<PacketQueue> queue)
250 filter_(
std::move(filter)), pool_(
std::move(pool)),
251 queue_(
std::move(queue)), mirror_(mirror)
253 if (filter_ ==
nullptr)
255 throw std::invalid_argument(
"Given filter pointer is null.");
258 if (pool_ ==
nullptr)
260 throw std::invalid_argument(
"Given pool pointer is null.");
263 if (queue_ ==
nullptr)
265 throw std::invalid_argument(
"Given queue pointer is null.");
288 pool_->add(std::move(address));
304 const std::chrono::nanoseconds &timeout)
306 return queue_->pop(timeout);
329 if (packet ==
nullptr)
331 throw std::invalid_argument(
"Given packet pointer is null.");
335 if (pool_->contains(packet->source()))
341 auto dest = packet->dest();
344 if (!dest.has_value() || dest.value() ==
MAVAddress(0, 0) || mirror_)
346 send_to_all_(std::move(packet));
351 send_to_system_(std::move(packet), dest->
system());
356 send_to_address_(std::move(packet), dest.value());
370 os << connection.name_;
unsigned int component() const
std::string str(const T &object)
static void log(std::string message)
unsigned int system() const
Connection(std::string name, std::shared_ptr< Filter > filter, bool mirror=false, std::unique_ptr< AddressPool<>> pool=std::make_unique< AddressPool<>>(), std::unique_ptr< PacketQueue > queue=std::make_unique< PacketQueue >())
std::string name(unsigned long id)
void connection(std::weak_ptr< Connection > connection)
std::ostream & operator<<(std::ostream &os, const Action &action)
static unsigned int level()
TEST_VIRTUAL std::shared_ptr< const Packet > next_packet(const std::chrono::nanoseconds &timeout=std::chrono::nanoseconds(0))
TEST_VIRTUAL void add_address(MAVAddress address)
TEST_VIRTUAL void send(std::shared_ptr< const Packet > packet)