NDN-DPDK
High-Speed Named Data Networking Forwarder
Loading...
Searching...
No Matches
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
5
6#include "pit-entry.h"
7
8typedef struct PitDnUpIt_ {
9 union {
10 void* current;
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_
27PitDnUpIt_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
37PitDnUpIt_Extend_(PitDnUpIt_* it, PitEntry* entry, int maxInExt, size_t offsetInExt);
38
39__attribute__((nonnull)) static inline bool
40PitDnUpIt_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
49PitDnUpIt_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
58PitDnUpIt_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
83PitDn_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
132PitUp_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
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