NDN-DPDK
High-Speed Named Data Networking Forwarder
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
cs-entry.h
Go to the documentation of this file.
1 #ifndef NDNDPDK_PCCT_CS_ENTRY_H
2 #define NDNDPDK_PCCT_CS_ENTRY_H
3 
6 #include "../dpdk/bdev.h"
7 #include "../ndni/packet.h"
8 #include "cs-struct.h"
9 
10 extern const char* CsEntryKind_Strings_[];
11 
12 __attribute__((returns_nonnull)) static inline const char*
13 CsEntryKind_ToString(CsEntryKind kind) {
14  return CsEntryKind_Strings_[kind];
15 }
16 
22 struct CsEntry {
25  struct PccEntry* pccEntry;
26 
27  RTE_MARKER zeroizeBegin_;
28  union {
34 
39  uint64_t diskSlot;
40 
46  };
47 
53 
55 
66  uint8_t nIndirects;
67 
69  RTE_MARKER zeroizeEnd_;
70 
76 
82 };
83 static_assert(CsMaxIndirects < UINT8_MAX, "");
84 
86 __attribute__((nonnull)) static inline void
87 CsEntry_Init(CsEntry* entry) {
88  memset(entry->zeroizeBegin_, 0, RTE_PTR_DIFF(entry->zeroizeEnd_, entry->zeroizeBegin_));
89 }
90 
92 __attribute__((nonnull)) static __rte_always_inline CsEntry*
93 CsEntry_GetDirect(CsEntry* entry) {
94  return unlikely(entry->kind == CsEntryIndirect) ? entry->direct : entry;
95 }
96 
101 __attribute__((nonnull)) static inline void
102 CsEntry_FreeData(CsEntry* entry) {
103  NDNDPDK_ASSERT(entry->kind == CsEntryMemory);
104  rte_pktmbuf_free(Packet_ToMbuf(entry->data));
105  NULLize(entry->data);
106  entry->kind = CsEntryNone;
107 }
108 
114 __attribute__((nonnull)) static inline bool
115 CsEntry_Assoc(CsEntry* indirect, CsEntry* direct) {
116  NDNDPDK_ASSERT(direct->kind != CsEntryIndirect);
117  if (unlikely(direct->nIndirects >= CsMaxIndirects)) {
118  return false;
119  }
120 
121  direct->indirect[direct->nIndirects++] = indirect;
122  indirect->kind = CsEntryIndirect;
123  indirect->direct = direct;
124  return true;
125 }
126 
128 __attribute__((nonnull)) static inline void
129 CsEntry_Disassoc(CsEntry* indirect) {
130  NDNDPDK_ASSERT(indirect->kind == CsEntryIndirect);
131  CsEntry* direct = indirect->direct;
132 
133  uint8_t i = 0;
134  for (; i < direct->nIndirects; ++i) {
135  if (direct->indirect[i] == indirect) {
136  break;
137  }
138  }
139  NDNDPDK_ASSERT(i < direct->nIndirects);
140 
141  direct->indirect[i] = direct->indirect[--direct->nIndirects];
142  indirect->kind = CsEntryNone;
143 }
144 
145 #endif // NDNDPDK_PCCT_CS_ENTRY_H
#define NDNDPDK_ASSERT(x)
Definition: common.h:60
#define NULLize(x)
Set x to NULL to expose memory access bugs.
Definition: common.h:79
const char * CsEntryKind_Strings_[]
Definition: cs-entry.c:3
@ CsMaxIndirects
Definition: cs-enum.h:7
CsListID
Definition: cs-enum.h:18
CsEntryKind
Definition: cs-enum.h:11
@ CsEntryIndirect
Definition: cs-enum.h:15
@ CsEntryMemory
Definition: cs-enum.h:13
@ CsEntryNone
Definition: cs-enum.h:12
struct Packet Packet
Definition: common.h:11
Length and alignment descriptor of a stored packet.
Definition: bdev.h:21
A CS entry.
Definition: cs-entry.h:22
CsEntry * indirect[CsMaxIndirects]
Associated indirect entries.
Definition: cs-entry.h:75
TscTime freshUntil
When Data becomes non-fresh.
Definition: cs-entry.h:52
CsNode * next
Definition: cs-entry.h:24
uint64_t diskSlot
Disk slot containing the Data packet.
Definition: cs-entry.h:39
struct PccEntry * pccEntry
Definition: cs-entry.h:25
CsListID arcList
Definition: cs-entry.h:68
CsEntry * direct
The direct entry.
Definition: cs-entry.h:45
uint8_t nIndirects
Count of indirect entries depending on this direct entry.
Definition: cs-entry.h:66
RTE_MARKER zeroizeEnd_
Definition: cs-entry.h:69
CsNode * prev
Definition: cs-entry.h:23
CsEntryKind kind
Definition: cs-entry.h:54
BdevStoredPacket diskStored
Disk packet length and alignment descriptor.
Definition: cs-entry.h:81
RTE_MARKER zeroizeBegin_
Definition: cs-entry.h:27
Packet * data
The Data packet.
Definition: cs-entry.h:33
The prev-next pointers common in CsEntry and CsList.
Definition: cs-struct.h:12
PIT-CS composite entry.
Definition: pcc-entry.h:56
uint64_t TscTime
TSC clock time point.
Definition: tsc.h:9