NDN-DPDK
High-Speed Named Data Networking Forwarder
Loading...
Searching...
No Matches
packet.h
Go to the documentation of this file.
1#ifndef NDNDPDK_NDNI_PACKET_H
2#define NDNDPDK_NDNI_PACKET_H
3
5
6#include "data.h"
7#include "nack.h"
8#include "tlv-encoder.h"
9
10extern const char* PktType_Strings_[];
11
12__attribute__((returns_nonnull)) static inline const char*
13PktType_ToString(PktType t) {
14 return PktType_Strings_[t];
15}
16
18static __rte_always_inline PktType
19PktType_ToFull(PktType t) {
20 return (t & 0x03);
21}
22
24static __rte_always_inline PktType
25PktType_ToSlim(PktType t) {
26 return (t & 0x03) | 0x04;
27}
28
30typedef union PacketPriv {
32 struct {
34 union {
37 };
38 };
41static_assert(offsetof(PacketPriv, lp.l3) == offsetof(PacketPriv, lpl3), "");
42static_assert(offsetof(PacketPriv, nack.lpl3) == offsetof(PacketPriv, lpl3), "");
43static_assert(offsetof(PacketPriv, nack.interest) == offsetof(PacketPriv, interest), "");
44
49__attribute__((nonnull, returns_nonnull)) static __rte_always_inline Packet*
50Packet_FromMbuf(struct rte_mbuf* pkt) {
51 return (Packet*)pkt;
52}
53
55static __rte_always_inline struct rte_mbuf*
56Packet_ToMbuf(const Packet* npkt) {
57 return (struct rte_mbuf*)npkt;
58}
59
61__attribute__((nonnull)) static __rte_always_inline PktType
62Packet_GetType(const Packet* npkt) {
63 return Packet_ToMbuf(npkt)->inner_l3_type;
64}
65
67__attribute__((nonnull)) static __rte_always_inline void
68Packet_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*
73Packet_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*
82Packet_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*
89Packet_GetLpL3Hdr(Packet* npkt) {
90 return &Packet_GetPriv_(npkt)->lpl3;
91}
92
97__attribute__((nonnull, returns_nonnull)) static __rte_always_inline PInterest*
98Packet_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*
108Packet_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*
118Packet_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
132Packet_Parse(Packet* npkt, ParseFor parseFor);
133
143__attribute__((nonnull, warn_unused_result)) bool
144Packet_ParseL3(Packet* npkt, ParseFor parseFor);
145
150__attribute__((nonnull)) static inline PName*
151Packet_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
180Packet_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*
193Packet_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 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
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
Packet * Packet_Clone(Packet *npkt, PacketMempools *mp, PacketTxAlign align)
Clone packet to new mbufs.
Definition packet.c:102
bool Packet_ParseL3(Packet *npkt, ParseFor parseFor)
Parse layer 3 in mbuf.
Definition packet.c:33
Parsed NDNLPv2 header.
Definition lp.h:63
NDNLPv2 layer 3 fields.
Definition lp.h:56
Parsed Data packet.
Definition data.h:9
Parsed Interest packet.
Definition interest.h:9
Packet * diskData
DiskStore loaded Data.
Definition interest.h:30
Parsed Nack packet.
Definition nack.h:19
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