Coverage Report

Created: 2023-11-12 09:30

/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