NDN-DPDK
High-Speed Named Data Networking Forwarder
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
pit-iterator.h
Go to the documentation of this file.
1 #ifndef NDNDPDK_PCCT_PIT_DN_UP_IT_H
2 #define NDNDPDK_PCCT_PIT_DN_UP_IT_H
3 
6 #include "pit-entry.h"
7 
8 typedef struct PitDnUpIt_ {
9  union {
10  void* current;
11  PitDn* dn;
12  PitUp* up;
13  };
14  int index;
15 
16  int i;
17  int max;
18  union {
19  void* array; // (pvt) start of array
22  };
25 
26 __attribute__((nonnull)) static inline PitDnUpIt_
27 PitDnUpIt_New_(PitEntry* entry, int maxInEntry, void* array) {
28  return (PitDnUpIt_){
29  current: array,
30  max: maxInEntry,
31  array: array,
32  nextPtr: &entry->ext,
33  };
34 }
35 
36 __attribute__((nonnull)) bool
37 PitDnUpIt_Extend_(PitDnUpIt_* it, PitEntry* entry, int maxInExt, size_t offsetInExt);
38 
39 __attribute__((nonnull)) static inline bool
40 PitDnUpIt_Valid_(PitDnUpIt_* it, bool canExtend, PitEntry* entry, int maxInExt,
41  size_t offsetInExt) {
42  if (likely(it->i < it->max)) {
43  return true;
44  }
45  return canExtend && PitDnUpIt_Extend_(it, entry, maxInExt, offsetInExt);
46 }
47 
48 __attribute__((nonnull)) static inline void
49 PitDnUpIt_EnterExt_(PitDnUpIt_* it, PitEntryExt* ext, int maxInExt, size_t offsetInExt) {
50  it->i = 0;
51  it->max = maxInExt;
52  it->array = RTE_PTR_ADD(ext, offsetInExt);
53  it->current = it->array;
54  it->nextPtr = &ext->next;
55 }
56 
57 __attribute__((nonnull)) static inline void
58 PitDnUpIt_Next_(PitDnUpIt_* it, size_t sizeofRecord, int maxInExt, size_t offsetInExt) {
59  NDNDPDK_ASSERT(it->i < it->max);
60  ++it->index;
61  ++it->i;
62  it->current = RTE_PTR_ADD(it->current, sizeofRecord);
63  if (likely(it->i < it->max)) {
64  return;
65  }
66 
67  PitEntryExt* ext = *it->nextPtr;
68  if (ext == NULL) {
69  return;
70  }
71  PitDnUpIt_EnterExt_(it, ext, maxInExt, offsetInExt);
72 }
73 
76 
82 __attribute__((nonnull)) static inline void
83 PitDn_UseSlot(PitDnIt* it) {
84  int next = it->i + 1;
85  if (likely(next < it->max)) {
86  it->dns[next].face = 0;
87  }
88 }
89 
118 #define PitDn_Each(var, entry, canExtend) \
119  for (PitDnIt var = PitDnUpIt_New_((entry), PitMaxDns, (entry)->dns); \
120  PitDnUpIt_Valid_(&var, (canExtend), (entry), PitMaxExtDns, offsetof(PitEntryExt, dns)); \
121  PitDnUpIt_Next_(&var, sizeof(PitDn), PitMaxExtDns, offsetof(PitEntryExt, dns)))
122 
125 
131 __attribute__((nonnull)) static inline void
132 PitUp_UseSlot(PitUpIt* it) {
133  int next = it->i + 1;
134  if (likely(next < it->max)) {
135  it->ups[next].face = 0;
136  }
137 }
138 
150 #define PitUp_Each(var, entry, canExtend) \
151  for (PitUpIt var = PitDnUpIt_New_((entry), PitMaxUps, (entry)->ups); \
152  PitDnUpIt_Valid_(&var, (canExtend), (entry), PitMaxExtUps, offsetof(PitEntryExt, ups)); \
153  PitDnUpIt_Next_(&var, sizeof(PitUp), PitMaxExtUps, offsetof(PitEntryExt, ups)))
154 
155 #endif // NDNDPDK_PCCT_PIT_DN_UP_IT_H
#define NDNDPDK_ASSERT(x)
Definition: common.h:60
PitDnUpIt_ PitDnIt
Iterator of DN slots in PIT entry.
Definition: pit-iterator.h:75
bool PitDnUpIt_Extend_(PitDnUpIt_ *it, PitEntry *entry, int maxInExt, size_t offsetInExt)
Definition: pit-iterator.c:5
PitDnUpIt_ PitUpIt
Iterator of UP slots in PIT entry.
Definition: pit-iterator.h:124
struct PitDnUpIt_ PitDnUpIt_
Definition: pit-iterator.h:8
int index
index of PitDn/PitUp
Definition: pit-iterator.h:14
int max
(pvt) upper bound of this array
Definition: pit-iterator.h:17
void * current
Definition: pit-iterator.h:10
PitUp * up
current PitUp
Definition: pit-iterator.h:12
int i
(pvt) index within this array
Definition: pit-iterator.h:16
PitUp * ups
Definition: pit-iterator.h:21
PitDn * dn
current PitDn
Definition: pit-iterator.h:11
PitDn * dns
Definition: pit-iterator.h:20
void * array
Definition: pit-iterator.h:19
PitEntryExt ** nextPtr
(pvt) next extension
Definition: pit-iterator.h:23
A PIT downstream record.
Definition: pit-dn.h:11
FaceID face
Definition: pit-dn.h:14
Definition: pit-entry.h:47
PitEntryExt * next
Definition: pit-entry.h:50
A PIT entry.
Definition: pit-entry.h:24
PitEntryExt * ext
Definition: pit-entry.h:39
A PIT upstream record.
Definition: pit-up.h:14
FaceID face
the upstream face
Definition: pit-up.h:16