/proc/self/cwd/source/common/network/udp_listener_impl.h
Line | Count | Source (jump to first uncovered line) |
1 | | #pragma once |
2 | | |
3 | | #include <atomic> |
4 | | |
5 | | #include "envoy/common/time.h" |
6 | | |
7 | | #include "source/common/buffer/buffer_impl.h" |
8 | | #include "source/common/event/event_impl_base.h" |
9 | | #include "source/common/event/file_event_impl.h" |
10 | | #include "source/common/network/utility.h" |
11 | | |
12 | | #include "base_listener_impl.h" |
13 | | |
14 | | namespace Envoy { |
15 | | namespace Network { |
16 | | |
17 | | /** |
18 | | * Implementation of Network::Listener for UDP. |
19 | | */ |
20 | | class UdpListenerImpl : public BaseListenerImpl, |
21 | | public virtual UdpListener, |
22 | | public UdpPacketProcessor, |
23 | | protected Logger::Loggable<Logger::Id::udp> { |
24 | | public: |
25 | | UdpListenerImpl(Event::Dispatcher& dispatcher, SocketSharedPtr socket, UdpListenerCallbacks& cb, |
26 | | TimeSource& time_source, const envoy::config::core::v3::UdpSocketConfig& config); |
27 | | ~UdpListenerImpl() override; |
28 | 0 | uint32_t packetsDropped() { return packets_dropped_; } |
29 | | |
30 | | // Network::Listener |
31 | | void disable() override; |
32 | | void enable() override; |
33 | 0 | void setRejectFraction(UnitFloat) override {} |
34 | 0 | void configureLoadShedPoints(Server::LoadShedPointProvider&) override {} |
35 | | |
36 | | // Network::UdpListener |
37 | | Event::Dispatcher& dispatcher() override; |
38 | | const Address::InstanceConstSharedPtr& localAddress() const override; |
39 | | Api::IoCallUint64Result send(const UdpSendData& data) override; |
40 | | Api::IoCallUint64Result flush() override; |
41 | | void activateRead() override; |
42 | | |
43 | | // Network::UdpPacketProcessor |
44 | | void processPacket(Address::InstanceConstSharedPtr local_address, |
45 | | Address::InstanceConstSharedPtr peer_address, Buffer::InstancePtr buffer, |
46 | | MonotonicTime receive_time) override; |
47 | 0 | uint64_t maxDatagramSize() const override { return config_.max_rx_datagram_size_; } |
48 | 0 | void onDatagramsDropped(uint32_t dropped) override { cb_.onDatagramsDropped(dropped); } |
49 | 0 | size_t numPacketsExpectedPerEventLoop() const override { |
50 | 0 | return cb_.numPacketsExpectedPerEventLoop(); |
51 | 0 | } |
52 | | |
53 | | protected: |
54 | | void handleWriteCallback(); |
55 | | void handleReadCallback(); |
56 | | |
57 | | UdpListenerCallbacks& cb_; |
58 | | uint32_t packets_dropped_{0}; |
59 | | |
60 | | private: |
61 | | void onSocketEvent(short flags); |
62 | | void disableEvent(); |
63 | | |
64 | | TimeSource& time_source_; |
65 | | const ResolvedUdpSocketConfig config_; |
66 | | }; |
67 | | |
68 | | class UdpListenerWorkerRouterImpl : public UdpListenerWorkerRouter { |
69 | | public: |
70 | | UdpListenerWorkerRouterImpl(uint32_t concurrency); |
71 | | |
72 | | // UdpListenerWorkerRouter |
73 | | void registerWorkerForListener(UdpListenerCallbacks& listener) override; |
74 | | void unregisterWorkerForListener(UdpListenerCallbacks& listener) override; |
75 | | void deliver(uint32_t dest_worker_index, UdpRecvData&& data) override; |
76 | | |
77 | | private: |
78 | | absl::Mutex mutex_; |
79 | | std::vector<UdpListenerCallbacks*> workers_ ABSL_GUARDED_BY(mutex_); |
80 | | }; |
81 | | |
82 | | } // namespace Network |
83 | | } // namespace Envoy |