NDN-DPDK
High-Speed Named Data Networking Forwarder
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
packet.h
Go to the documentation of this file.
1 #ifndef NDNDPDK_NDNI_PACKET_H
2 #define NDNDPDK_NDNI_PACKET_H
3 
6 #include "data.h"
7 #include "nack.h"
8 #include "tlv-encoder.h"
9 
10 extern const char* PktType_Strings_[];
11 
12 __attribute__((returns_nonnull)) static inline const char*
13 PktType_ToString(PktType t) {
14  return PktType_Strings_[t];
15 }
16 
18 static __rte_always_inline PktType
19 PktType_ToFull(PktType t) {
20  return (t & 0x03);
21 }
22 
24 static __rte_always_inline PktType
25 PktType_ToSlim(PktType t) {
26  return (t & 0x03) | 0x04;
27 }
28 
30 typedef union PacketPriv {
32  struct {
34  union {
37  };
38  };
41 static_assert(offsetof(PacketPriv, lp.l3) == offsetof(PacketPriv, lpl3), "");
42 static_assert(offsetof(PacketPriv, nack.lpl3) == offsetof(PacketPriv, lpl3), "");
43 static_assert(offsetof(PacketPriv, nack.interest) == offsetof(PacketPriv, interest), "");
44 
49 __attribute__((nonnull, returns_nonnull)) static __rte_always_inline Packet*
50 Packet_FromMbuf(struct rte_mbuf* pkt) {
51  return (Packet*)pkt;
52 }
53 
55 static __rte_always_inline struct rte_mbuf*
56 Packet_ToMbuf(const Packet* npkt) {
57  return (struct rte_mbuf*)npkt;
58 }
59 
61 __attribute__((nonnull)) static __rte_always_inline PktType
62 Packet_GetType(const Packet* npkt) {
63  return Packet_ToMbuf(npkt)->inner_l3_type;
64 }
65 
67 __attribute__((nonnull)) static __rte_always_inline void
68 Packet_SetType(Packet* npkt, PktType t) {
69  Packet_ToMbuf(npkt)->inner_l3_type = t;
70 }
71 
72 __attribute__((nonnull, returns_nonnull)) static __rte_always_inline PacketPriv*
73 Packet_GetPriv_(Packet* npkt) {
74  return (PacketPriv*)rte_mbuf_to_priv(rte_mbuf_from_indirect(Packet_ToMbuf(npkt)));
75 }
76 
81 __attribute__((nonnull, returns_nonnull)) static __rte_always_inline LpHeader*
82 Packet_GetLpHdr(Packet* npkt) {
83  NDNDPDK_ASSERT(Packet_GetType(npkt) == PktFragment);
84  return &Packet_GetPriv_(npkt)->lp;
85 }
86 
88 __attribute__((nonnull, returns_nonnull)) static __rte_always_inline LpL3*
89 Packet_GetLpL3Hdr(Packet* npkt) {
90  return &Packet_GetPriv_(npkt)->lpl3;
91 }
92 
97 __attribute__((nonnull, returns_nonnull)) static __rte_always_inline PInterest*
98 Packet_GetInterestHdr(Packet* npkt) {
99  NDNDPDK_ASSERT(Packet_GetType(npkt) == PktInterest);
100  return &Packet_GetPriv_(npkt)->interest;
101 }
102 
107 __attribute__((nonnull, returns_nonnull)) static __rte_always_inline PData*
108 Packet_GetDataHdr(Packet* npkt) {
109  NDNDPDK_ASSERT(Packet_GetType(npkt) == PktData);
110  return &Packet_GetPriv_(npkt)->data;
111 }
112 
117 __attribute__((nonnull, returns_nonnull)) static __rte_always_inline PNack*
118 Packet_GetNackHdr(Packet* npkt) {
119  NDNDPDK_ASSERT(Packet_GetType(npkt) == PktNack);
120  return &Packet_GetPriv_(npkt)->nack;
121 }
122 
131 __attribute__((nonnull, warn_unused_result)) bool
132 Packet_Parse(Packet* npkt, ParseFor parseFor);
133 
143 __attribute__((nonnull, warn_unused_result)) bool
144 Packet_ParseL3(Packet* npkt, ParseFor parseFor);
145 
150 __attribute__((nonnull)) static inline PName*
151 Packet_GetName(Packet* npkt) {
152  switch (Packet_GetType(npkt)) {
153  case PktInterest:
154  return &Packet_GetInterestHdr(npkt)->name;
155  case PktData:
156  return &Packet_GetDataHdr(npkt)->name;
157  case PktNack:
158  return &Packet_GetNackHdr(npkt)->interest.name;
159  default:
160  return NULL;
161  }
162 }
163 
170 __attribute__((nonnull)) Packet*
172 
179 __attribute__((nonnull)) static inline void
180 Packet_Free(Packet* npkt) {
181  if (Packet_GetType(npkt) == PktInterest) {
182  PInterest* interest = Packet_GetInterestHdr(npkt);
183  if (interest->diskData != NULL) {
184  struct rte_mbuf* mbufs[2] = {Packet_ToMbuf(npkt), Packet_ToMbuf(interest->diskData)};
185  rte_pktmbuf_free_bulk(mbufs, RTE_DIM(mbufs));
186  return;
187  }
188  }
189  rte_pktmbuf_free(Packet_ToMbuf(npkt));
190 }
191 
192 __attribute__((nonnull, returns_nonnull)) static inline Packet*
193 Packet_EncodeFinish_(struct rte_mbuf* m, uint32_t type, PktType t) {
194  TlvEncoder_PrependTL(m, type, m->pkt_len);
195  Packet* output = Packet_FromMbuf(m);
196  Packet_SetType(output, t);
197  *Packet_GetLpL3Hdr(output) = (const LpL3){0};
198  return output;
199 }
200 
201 #endif // NDNDPDK_NDNI_PACKET_H
#define NDNDPDK_ASSERT(x)
Definition: common.h:60
struct LpL3 LpL3
NDNLPv2 layer 3 fields.
struct Packet Packet
Definition: common.h:11
ParseFor
Definition: enum.h:29
PktType
Definition: enum.h:35
@ PktFragment
Definition: enum.h:36
@ PktInterest
Definition: enum.h:37
@ PktNack
Definition: enum.h:39
@ PktData
Definition: enum.h:38
union PacketPriv PacketPriv
mbuf private data for NDN packet.
const char * PktType_Strings_[]
Definition: packet.c:4
bool Packet_Parse(Packet *npkt, ParseFor parseFor)
Parse layer 2 and layer 3 in mbuf.
Definition: packet.c:11
bool Packet_ParseL3(Packet *npkt, ParseFor parseFor)
Parse layer 3 in mbuf.
Definition: packet.c:33
Packet * Packet_Clone(Packet *npkt, PacketMempools *mp, PacketTxAlign align)
Clone packet to new mbufs.
Definition: packet.c:102
Parsed NDNLPv2 header.
Definition: lp.h:63
NDNLPv2 layer 3 fields.
Definition: lp.h:56
Parsed Data packet.
Definition: data.h:9
PName name
Definition: data.h:10
Parsed Interest packet.
Definition: interest.h:9
Packet * diskData
DiskStore loaded Data.
Definition: interest.h:30
PName name
Definition: interest.h:24
Parsed Nack packet.
Definition: nack.h:19
PInterest interest
Definition: nack.h:21
Parsed name.
Definition: name.h:139
Mempools for packet modification.
Definition: common.h:17
mbuf alignment requirements for encoding or packet modification.
Definition: common.h:35
mbuf private data for NDN packet.
Definition: packet.h:30
LpHeader lp
Definition: packet.h:31
PData data
Definition: packet.h:36
PInterest interest
Definition: packet.h:35
PNack nack
Definition: packet.h:39
LpL3 lpl3
Definition: packet.h:33