esp8266ndn
NDN Arduino library for ESP8266 and more
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
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 
11 namespace ndnph {
12 namespace transport {
13 
14 struct RxQueueItem {
15  Region* region = nullptr;
16  uint64_t endpointId = 0;
17  uint8_t* pkt = nullptr;
18  ssize_t pktLen = -1;
19 };
20 
22 class RxQueueMixin : public virtual Transport {
23 protected:
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 
126 private:
129 };
130 
135 public:
136  static constexpr size_t DEFAULT_BUFLEN = 1500;
137 
138 protected:
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 
148 private:
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:23
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
uint8_t * buf()
Definition: transport-rxqueue.hpp:71
~RxContext()
Definition: transport-rxqueue.hpp:54
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
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
Region * makeSubRegion(Region &parent, size_t capacity)
Create Region inside a parent Region.
Definition: region.hpp:173
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