Coverage Report

Created: 2023-11-12 09:30

/proc/self/cwd/source/server/active_udp_listener.h
Line
Count
Source (jump to first uncovered line)
1
#pragma once
2
3
#include <cstdint>
4
#include <list>
5
#include <memory>
6
7
#include "envoy/network/connection_handler.h"
8
#include "envoy/network/filter.h"
9
#include "envoy/network/listen_socket.h"
10
#include "envoy/network/listener.h"
11
12
#include "source/common/network/utility.h"
13
#include "source/server/active_listener_base.h"
14
15
namespace Envoy {
16
namespace Server {
17
18
#define ALL_UDP_LISTENER_STATS(COUNTER) COUNTER(downstream_rx_datagram_dropped)
19
20
/**
21
 * Wrapper struct for UDP listener stats. @see stats_macros.h
22
 */
23
struct UdpListenerStats {
24
  ALL_UDP_LISTENER_STATS(GENERATE_COUNTER_STRUCT)
25
};
26
27
class ActiveUdpListenerBase : public ActiveListenerImplBase,
28
                              public Network::ConnectionHandler::ActiveUdpListener {
29
public:
30
  ActiveUdpListenerBase(uint32_t worker_index, uint32_t concurrency,
31
                        Network::UdpConnectionHandler& parent, Network::Socket& listen_socket,
32
                        Network::UdpListenerPtr&& listener, Network::ListenerConfig* config);
33
  ~ActiveUdpListenerBase() override;
34
35
  // Network::UdpListenerCallbacks
36
  void onData(Network::UdpRecvData&& data) final;
37
0
  uint32_t workerIndex() const final { return worker_index_; }
38
  void post(Network::UdpRecvData&& data) final;
39
0
  void onDatagramsDropped(uint32_t dropped) final {
40
0
    udp_stats_.downstream_rx_datagram_dropped_.add(dropped);
41
0
  }
42
43
  // ActiveListenerImplBase
44
0
  Network::Listener* listener() override { return udp_listener_.get(); }
45
46
protected:
47
0
  uint32_t destination(const Network::UdpRecvData& /*data*/) const override {
48
    // By default, route to the current worker.
49
0
    return worker_index_;
50
0
  }
51
52
  const uint32_t worker_index_;
53
  const uint32_t concurrency_;
54
  Network::UdpConnectionHandler& parent_;
55
  Network::Socket& listen_socket_;
56
  Network::UdpListenerPtr udp_listener_;
57
  UdpListenerStats udp_stats_;
58
  Network::UdpListenerWorkerRouter& udp_listener_worker_router_;
59
};
60
61
/**
62
 * Wrapper for an active udp listener owned by this handler.
63
 */
64
class ActiveRawUdpListener : public ActiveUdpListenerBase,
65
                             public Network::UdpListenerFilterManager,
66
                             public Network::UdpReadFilterCallbacks,
67
                             Logger::Loggable<Logger::Id::conn_handler> {
68
public:
69
  ActiveRawUdpListener(uint32_t worker_index, uint32_t concurrency,
70
                       Network::UdpConnectionHandler& parent,
71
                       Network::SocketSharedPtr listen_socket_ptr, Event::Dispatcher& dispatcher,
72
                       Network::ListenerConfig& config);
73
  ActiveRawUdpListener(uint32_t worker_index, uint32_t concurrency,
74
                       Network::UdpConnectionHandler& parent, Network::Socket& listen_socket,
75
                       Network::SocketSharedPtr listen_socket_ptr, Event::Dispatcher& dispatcher,
76
                       Network::ListenerConfig& config);
77
  ActiveRawUdpListener(uint32_t worker_index, uint32_t concurrency,
78
                       Network::UdpConnectionHandler& parent, Network::Socket& listen_socket,
79
                       Network::UdpListenerPtr&& listener, Network::ListenerConfig& config);
80
81
  // Network::UdpListenerCallbacks
82
  void onReadReady() override;
83
  void onWriteReady(const Network::Socket& socket) override;
84
  void onReceiveError(Api::IoError::IoErrorCode error_code) override;
85
0
  Network::UdpPacketWriter& udpPacketWriter() override { return *udp_packet_writer_; }
86
0
  size_t numPacketsExpectedPerEventLoop() const final {
87
    // TODO(mattklein123) change this to a reasonable number if needed.
88
0
    return Network::MAX_NUM_PACKETS_PER_EVENT_LOOP;
89
0
  }
90
91
  // Network::UdpWorker
92
  void onDataWorker(Network::UdpRecvData&& data) override;
93
94
  // ActiveListenerImplBase
95
0
  void pauseListening() override { udp_listener_->disable(); }
96
0
  void resumeListening() override { udp_listener_->enable(); }
97
0
  void shutdownListener(const Network::ExtraShutdownListenerOptions&) override {
98
    // The read filter should be deleted before the UDP listener is deleted.
99
    // The read filter refers to the UDP listener to send packets to downstream.
100
    // If the UDP listener is deleted before the read filter, the read filter may try to use it
101
    // after deletion.
102
0
    read_filters_.clear();
103
0
    udp_listener_.reset();
104
0
  }
105
  // These two are unreachable because a config will be rejected if it configures both this listener
106
  // and any L4 filter chain.
107
0
  void updateListenerConfig(Network::ListenerConfig&) override {
108
0
    IS_ENVOY_BUG("unexpected call to updateListenerConfig");
109
0
  }
110
0
  void onFilterChainDraining(const std::list<const Network::FilterChain*>&) override {
111
0
    IS_ENVOY_BUG("unexpected call to onFilterChainDraining");
112
0
  }
113
114
  // Network::UdpListenerFilterManager
115
  void addReadFilter(Network::UdpListenerReadFilterPtr&& filter) override;
116
117
  // Network::UdpReadFilterCallbacks
118
  Network::UdpListener& udpListener() override;
119
120
private:
121
  std::list<Network::UdpListenerReadFilterPtr> read_filters_;
122
  Network::UdpPacketWriterPtr udp_packet_writer_;
123
};
124
125
} // namespace Server
126
} // namespace Envoy