esp8266ndn
NDN Arduino library for ESP8266 and more
Loading...
Searching...
No Matches
nack.hpp
Go to the documentation of this file.
1#ifndef NDNPH_PACKET_NACK_HPP
2#define NDNPH_PACKET_NACK_HPP
3
4#include "interest.hpp"
5
6namespace ndnph {
7
13enum class NackReason : uint8_t {
14 None = 0,
15 Congestion = 1,
16 Duplicate = 2,
17 NoRoute = 3,
18 Unspecified = 7,
19};
20
22class NackHeader : public RefRegion<detail::InterestObj> {
23public:
25 using MaxSize = std::integral_constant<size_t, 3 + 1 + 3 + 1 + 1>;
26
28
30 return static_cast<NackReason>(obj->nackReason);
31 }
32
34 obj->nackReason = static_cast<uint8_t>(v);
35 }
36
37 void encodeTo(Encoder& encoder) const {
38 auto reason = getReason();
39 encoder.prependTlv(TT::Nack, [reason](Encoder& encoder) {
40 if (reason != NackReason::Unspecified) {
41 encoder.prependTlv(TT::NackReason, tlv::NNI(encodeNackReason(reason)));
42 }
43 });
44 }
45
46 bool decodeFrom(const Decoder::Tlv& input) {
47 uint64_t nackReasonV = 0;
48 bool ok = EvDecoder::decode(input, {TT::Nack}, EvDecoder::defNni<TT::NackReason>(&nackReasonV));
49 if (ok) {
50 obj->nackReason = static_cast<uint8_t>(decodeNackReason(nackReasonV));
51 }
52 return ok;
53 }
54
55private:
56 static uint64_t encodeNackReason(NackReason v) {
57 return static_cast<uint64_t>(v) * 50;
58 }
59
60 static NackReason decodeNackReason(uint64_t v) {
61 switch (v) {
62 case 50:
63 case 100:
64 case 150:
65 return static_cast<NackReason>(v / 50);
66 default:
68 }
69 }
70};
71
73class Nack : public RefRegion<detail::InterestObj> {
74public:
76
79 return NackHeader(obj);
80 }
81
83 return getHeader().getReason();
84 }
85
88 return Interest(obj);
89 }
90
98 static Nack create(Interest interest, NackReason reason) {
99 Region& region = regionOf(interest);
100 Nack nack = region.create<Nack>();
101 if (nack) {
102 nack.getHeader().setReason(reason);
103 auto ni = nack.getInterest();
104 ni.setName(interest.getName());
105 ni.setCanBePrefix(interest.getCanBePrefix());
106 ni.setMustBeFresh(interest.getMustBeFresh());
107 ni.setNonce(interest.getNonce());
108 }
109 return nack;
110 }
111};
112
113} // namespace ndnph
114
115#endif // NDNPH_PACKET_NACK_HPP
Decoded TLV.
Definition decoder.hpp:13
TLV encoder that accepts items in reverse order.
Definition encoder.hpp:10
bool prependTlv(uint32_t type, OmitEmptyTag omitEmpty, const Arg &... arg)
Prepend TLV, measuring TLV-LENGTH automatically.
Definition encoder.hpp:143
static bool decode(const Decoder::Tlv &input, std::initializer_list< uint32_t > topTypes, const E &... defs)
Decode input TLV with a sequence of element definitions.
Definition ev-decoder.hpp:115
Interest packet.
Definition interest.hpp:284
void setName(const Name &v)
Definition interest.hpp:288
Nack header field.
Definition nack.hpp:22
std::integral_constant< size_t, 3+1+3+1+1 > MaxSize
Maximum encoded size.
Definition nack.hpp:25
bool decodeFrom(const Decoder::Tlv &input)
Definition nack.hpp:46
void encodeTo(Encoder &encoder) const
Definition nack.hpp:37
NackReason getReason() const
Definition nack.hpp:29
void setReason(NackReason v)
Definition nack.hpp:33
Nack packet.
Definition nack.hpp:73
Interest getInterest() const
Access the Interest.
Definition nack.hpp:87
static Nack create(Interest interest, NackReason reason)
Create a Nack packet in reply to an Interest.
Definition nack.hpp:98
NackReason getReason() const
Definition nack.hpp:82
NackHeader getHeader() const
Access the Nack header.
Definition nack.hpp:78
Base class of an object referencing an InRegion object.
Definition region.hpp:210
friend Region & regionOf(const RefRegion< detail::InterestObj > &ref)
Definition region.hpp:228
ObjType * obj
Definition region.hpp:226
RefRegion(ObjType *obj=nullptr)
Definition region.hpp:215
Region-based memory allocator thats owns memory of NDNph objects.
Definition region.hpp:9
RefType create(Arg &&... arg)
Allocate and create an object, and return its reference.
Definition region.hpp:90
uint8_t nackReason
Definition interest.hpp:61
uint32_t getNonce() const
Definition interest.hpp:84
bool getCanBePrefix() const
Definition interest.hpp:72
bool getMustBeFresh() const
Definition interest.hpp:76
const Name & getName() const
Definition interest.hpp:68
NonNegativeInteger encoding.
Definition nni.hpp:118
@ NackReason
Definition an.hpp:16
@ Nack
Definition an.hpp:15
Definition fs.hpp:33
NackReason
Nack reason.
Definition nack.hpp:13