1
#pragma once
2

            
3
#include "envoy/buffer/buffer.h"
4
#include "envoy/network/socket.h"
5
#include "envoy/network/udp_packet_writer_handler.h"
6

            
7
#include "source/common/network/io_socket_error_impl.h"
8

            
9
namespace Envoy {
10
namespace Network {
11

            
12
class UdpDefaultWriter : public UdpPacketWriter {
13
public:
14
  UdpDefaultWriter(Network::IoHandle& io_handle);
15

            
16
  ~UdpDefaultWriter() override;
17

            
18
  // Following writePacket utilizes Utility::writeToSocket() implementation
19
  Api::IoCallUint64Result writePacket(const Buffer::Instance& buffer, const Address::Ip* local_ip,
20
                                      const Address::Instance& peer_address) override;
21

            
22
3843180
  bool isWriteBlocked() const override { return write_blocked_; }
23
138161
  void setWritable() override { write_blocked_ = false; }
24
9739
  uint64_t getMaxPacketSize(const Address::Instance& /*peer_address*/) const override {
25
9739
    return Network::UdpMaxOutgoingPacketSize;
26
9739
  }
27
721807
  bool isBatchMode() const override { return false; }
28
  Network::UdpPacketWriterBuffer
29
  getNextWriteLocation(const Address::Ip* /*local_ip*/,
30
575487
                       const Address::Instance& /*peer_address*/) override {
31
575487
    return {nullptr, 0, nullptr};
32
575487
  }
33
67
  Api::IoCallUint64Result flush() override {
34
67
    return {/*rc=*/0,
35
67
            /*err=*/Api::IoError::none()};
36
67
  }
37

            
38
  void setBlocked() { write_blocked_ = true; }
39

            
40
  Network::IoHandle& ioHandle() { return io_handle_; }
41

            
42
private:
43
  bool write_blocked_{false};
44
  Network::IoHandle& io_handle_;
45
};
46

            
47
class UdpDefaultWriterFactory : public Network::UdpPacketWriterFactory {
48
public:
49
  Network::UdpPacketWriterPtr createUdpPacketWriter(Network::IoHandle& io_handle, Stats::Scope&,
50
                                                    Envoy::Event::Dispatcher&,
51
1336
                                                    absl::AnyInvocable<void() &&>) override {
52
1336
    return std::make_unique<UdpDefaultWriter>(io_handle);
53
1336
  }
54
};
55

            
56
} // namespace Network
57
} // namespace Envoy