OpenVPN 3 Core Library
Loading...
Searching...
No Matches
memq_dgram.hpp
Go to the documentation of this file.
1// OpenVPN -- An application to securely tunnel IP networks
2// over a single port, with support for SSL/TLS-based
3// session authentication and key exchange,
4// packet encryption, packet authentication, and
5// packet compression.
6//
7// Copyright (C) 2012- OpenVPN Inc.
8//
9// SPDX-License-Identifier: MPL-2.0 OR AGPL-3.0-only WITH openvpn3-openssl-exception
10//
11
12// A queue of datagram buffers for handling sequences of UDP packets
13
14#ifndef OPENVPN_FRAME_MEMQ_DGRAM_H
15#define OPENVPN_FRAME_MEMQ_DGRAM_H
16
21
22namespace openvpn {
23
24class MemQDgram : public MemQBase
25{
26 public:
27 OPENVPN_SIMPLE_EXCEPTION(frame_uninitialized);
28
29 MemQDgram() = default;
30
31 explicit MemQDgram(const Frame::Ptr &frame)
32 : frame_(frame)
33 {
34 }
35 void set_frame(const Frame::Ptr &frame)
36 {
37 frame_ = frame;
38 }
39
40 size_t pending() const
41 {
42 return empty() ? 0 : q.front()->size();
43 }
44
45 void write(const unsigned char *data, size_t size)
46 {
47 if (frame_)
48 {
49 const Frame::Context &fc = (*frame_)[Frame::READ_BIO_MEMQ_STREAM];
50 q.push_back(fc.copy(data, size));
51 length += size;
52 }
53 else
54 throw frame_uninitialized();
55 }
56
57 size_t read(unsigned char *data, size_t len)
58 {
59 BufferPtr &b = q.front();
60 if (len > b->size())
61 len = b->size();
62 b->read(data, len);
63 if (b->empty())
64 q.pop_front();
65 length -= len;
66 return len;
67 }
68
69 private:
71};
72
73} // namespace openvpn
74
75#endif // OPENVPN_FRAME_MEMQ_DGRAM_H
BufferPtr copy(const unsigned char *data, const size_t size) const
Definition frame.hpp:138
@ READ_BIO_MEMQ_STREAM
Definition frame.hpp:41
bool empty() const
Definition memq.hpp:37
size_t size() const
Definition memq.hpp:32
size_t length
Definition memq.hpp:86
OPENVPN_SIMPLE_EXCEPTION(frame_uninitialized)
size_t pending() const
MemQDgram(const Frame::Ptr &frame)
void set_frame(const Frame::Ptr &frame)
void write(const unsigned char *data, size_t size)
size_t read(unsigned char *data, size_t len)