esp8266ndn
NDN Arduino library for ESP8266 and more
Loading...
Searching...
No Matches
transport-rxqueue.hpp
Go to the documentation of this file.
1#ifndef NDNPH_FACE_TRANSPORT_RXQUEUE_HPP
2#define NDNPH_FACE_TRANSPORT_RXQUEUE_HPP
3
4#include "../port/queue/port.hpp"
5#include "transport.hpp"
6
7#ifndef NDNPH_TRANSPORT_RXQUEUELEN
8#define NDNPH_TRANSPORT_RXQUEUELEN 8
9#endif
10
11namespace ndnph {
12namespace transport {
13
15 Region* region = nullptr;
16 uint64_t endpointId = 0;
17 uint8_t* pkt = nullptr;
18 ssize_t pktLen = -1;
19};
20
22class RxQueueMixin : public virtual Transport {
23protected:
28 template<typename F>
29 void initAllocBuffers(const F& makeRegion) {
30 for (size_t i = 0; i < NDNPH_TRANSPORT_RXQUEUELEN; ++i) {
31 RxQueueItem item;
32 item.region = makeRegion();
33 if (item.region == nullptr || !m_allocQ.push(item)) {
34 break;
35 }
36 }
37 }
38
39 class RxContext {
40 public:
41 explicit RxContext(RxQueueMixin& transport)
42 : m_transport(transport) {
43 bool ok = false;
44 std::tie(m_item, ok) = transport.m_allocQ.pop();
45 if (ok) {
46 Region& region = *m_item.region;
47 region.reset();
48 m_bufLen = region.available();
49 m_item.pkt = region.alloc(m_bufLen);
50 m_item.pktLen = -1;
51 }
52 }
53
55 if (m_item.region == nullptr) {
56 return;
57 }
58 bool ok = false;
59 if (m_item.pktLen < 0) {
60 ok = m_transport.m_allocQ.push(m_item);
61 } else {
62 ok = m_transport.m_rxQ.push(m_item);
63 }
64 NDNPH_ASSERT(ok);
65 }
66
67 operator bool() const {
68 return m_item.pkt != nullptr;
69 }
70
71 uint8_t* buf() {
72 return m_item.pkt;
73 }
74
75 size_t bufLen() {
76 return m_bufLen;
77 }
78
79 void operator()(size_t pktLen, uint64_t endpointId = 0) {
80 m_item.pktLen = pktLen;
81 m_item.endpointId = endpointId;
82 }
83
84 private:
85 RxQueueMixin& m_transport;
86 RxQueueItem m_item;
87 size_t m_bufLen;
88 };
89
104 return RxContext(*this);
105 }
106
113 void loopRxQueue() {
114 while (true) {
115 RxQueueItem item;
116 bool ok = false;
117 std::tie(item, ok) = m_rxQ.pop();
118 if (!ok) {
119 break;
120 }
121 invokeRxCallback(item.pkt, item.pktLen, item.endpointId);
122 m_allocQ.push(item);
123 }
124 }
125
126private:
129};
130
135public:
136 static constexpr size_t DEFAULT_BUFLEN = 1500;
137
138protected:
143 explicit DynamicRxQueueMixin(size_t bufLen = DEFAULT_BUFLEN)
144 : m_region(sizeofSubRegions(bufLen, NDNPH_TRANSPORT_RXQUEUELEN)) {
145 this->initAllocBuffers([this, bufLen] { return makeSubRegion(m_region, bufLen); });
146 }
147
148private:
149 DynamicRegion m_region;
150};
151
152} // namespace transport
153} // namespace ndnph
154
155#endif // NDNPH_FACE_TRANSPORT_RXQUEUE_HPP
Generic thread-safe queue, implemented with FreeRTOS queue API.
Definition queue-freertos.hpp:17
Region with dynamically allocated memory.
Definition region.hpp:155
Region-based memory allocator thats owns memory of NDNph objects.
Definition region.hpp:9
size_t available() const
Compute remaining space for alloc().
Definition region.hpp:106
uint8_t * alloc(size_t size)
Allocate a buffer with no alignment requirement.
Definition region.hpp:27
void reset()
Discard allocated items.
Definition region.hpp:100
Mixin of RX queue in Transport, allocating buffers from DynamicRegion.
Definition transport-rxqueue.hpp:134
static constexpr size_t DEFAULT_BUFLEN
Definition transport-rxqueue.hpp:136
DynamicRxQueueMixin(size_t bufLen=DEFAULT_BUFLEN)
Constructor.
Definition transport-rxqueue.hpp:143
Definition transport-rxqueue.hpp:39
void operator()(size_t pktLen, uint64_t endpointId=0)
Definition transport-rxqueue.hpp:79
~RxContext()
Definition transport-rxqueue.hpp:54
uint8_t * buf()
Definition transport-rxqueue.hpp:71
RxContext(RxQueueMixin &transport)
Definition transport-rxqueue.hpp:41
size_t bufLen()
Definition transport-rxqueue.hpp:75
Mixin of RX queue in Transport.
Definition transport-rxqueue.hpp:22
RxContext receiving()
Receive packets in a loop.
Definition transport-rxqueue.hpp:103
void loopRxQueue()
Process periodical events.
Definition transport-rxqueue.hpp:113
void initAllocBuffers(const F &makeRegion)
Allocate receive buffers during initialization.
Definition transport-rxqueue.hpp:29
Base class of low-level transport.
Definition transport.hpp:10
void invokeRxCallback(const uint8_t *pkt, size_t pktLen, uint64_t endpointId=0)
Invoke incoming packet callback for a received packet.
Definition transport.hpp:39
#define NDNPH_ASSERT(x)
Definition common.hpp:30
Definition fs.hpp:33
Region * makeSubRegion(Region &parent, size_t capacity)
Create Region inside a parent Region.
Definition region.hpp:173
constexpr size_t sizeofSubRegions(size_t capacity, size_t count=1)
Compute total size of several sub Regions of given capacity.
Definition region.hpp:167
Definition transport-rxqueue.hpp:14
ssize_t pktLen
Definition transport-rxqueue.hpp:18
uint64_t endpointId
Definition transport-rxqueue.hpp:16
Region * region
Definition transport-rxqueue.hpp:15
uint8_t * pkt
Definition transport-rxqueue.hpp:17
#define NDNPH_TRANSPORT_RXQUEUELEN
Definition transport-rxqueue.hpp:8