mgmt: add Mtu to faces/create and FaceStatus
refs #4005
Change-Id: I26c02aa088dc59aecd331cd579036177fef0f64c
diff --git a/src/encoding/tlv-nfd.hpp b/src/encoding/tlv-nfd.hpp
index 12ef55b..dcaed7e 100644
--- a/src/encoding/tlv-nfd.hpp
+++ b/src/encoding/tlv-nfd.hpp
@@ -69,6 +69,7 @@
LinkType = 134,
BaseCongestionMarkingInterval = 135,
DefaultCongestionThreshold = 136,
+ Mtu = 137,
FaceQueryFilter = 150,
FaceEventNotification = 192,
FaceEventKind = 193,
diff --git a/src/mgmt/nfd/control-command.cpp b/src/mgmt/nfd/control-command.cpp
index 07e8b17..f851bf1 100644
--- a/src/mgmt/nfd/control-command.cpp
+++ b/src/mgmt/nfd/control-command.cpp
@@ -105,6 +105,7 @@
.optional(CONTROL_PARAMETER_FACE_PERSISTENCY)
.optional(CONTROL_PARAMETER_BASE_CONGESTION_MARKING_INTERVAL)
.optional(CONTROL_PARAMETER_DEFAULT_CONGESTION_THRESHOLD)
+ .optional(CONTROL_PARAMETER_MTU)
.optional(CONTROL_PARAMETER_FLAGS)
.optional(CONTROL_PARAMETER_MASK);
m_responseValidator
@@ -114,6 +115,7 @@
.required(CONTROL_PARAMETER_FACE_PERSISTENCY)
.optional(CONTROL_PARAMETER_BASE_CONGESTION_MARKING_INTERVAL)
.optional(CONTROL_PARAMETER_DEFAULT_CONGESTION_THRESHOLD)
+ .optional(CONTROL_PARAMETER_MTU)
.required(CONTROL_PARAMETER_FLAGS);
}
diff --git a/src/mgmt/nfd/control-parameters.cpp b/src/mgmt/nfd/control-parameters.cpp
index 65360a5..4d826ef 100644
--- a/src/mgmt/nfd/control-parameters.cpp
+++ b/src/mgmt/nfd/control-parameters.cpp
@@ -51,6 +51,9 @@
{
size_t totalLength = 0;
+ if (this->hasMtu()) {
+ totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::Mtu, m_mtu);
+ }
if (this->hasDefaultCongestionThreshold()) {
totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::DefaultCongestionThreshold,
m_defaultCongestionThreshold);
@@ -228,6 +231,12 @@
if (this->hasDefaultCongestionThreshold()) {
m_defaultCongestionThreshold = readNonNegativeInteger(*val);
}
+
+ val = m_wire.find(tlv::nfd::Mtu);
+ m_hasFields[CONTROL_PARAMETER_MTU] = val != m_wire.elements_end();
+ if (this->hasMtu()) {
+ m_mtu = readNonNegativeInteger(*val);
+ }
}
bool
@@ -368,6 +377,10 @@
os << "DefaultCongestionThreshold: " << parameters.getDefaultCongestionThreshold() << ", ";
}
+ if (parameters.hasMtu()) {
+ os << "Mtu: " << parameters.getMtu() << ", ";
+ }
+
os << ")";
return os;
}
diff --git a/src/mgmt/nfd/control-parameters.hpp b/src/mgmt/nfd/control-parameters.hpp
index c325e0b..2291096 100644
--- a/src/mgmt/nfd/control-parameters.hpp
+++ b/src/mgmt/nfd/control-parameters.hpp
@@ -49,6 +49,7 @@
CONTROL_PARAMETER_FACE_PERSISTENCY,
CONTROL_PARAMETER_BASE_CONGESTION_MARKING_INTERVAL,
CONTROL_PARAMETER_DEFAULT_CONGESTION_THRESHOLD,
+ CONTROL_PARAMETER_MTU,
CONTROL_PARAMETER_UBOUND
};
@@ -67,7 +68,8 @@
"ExpirationPeriod",
"FacePersistency",
"BaseCongestionMarkingInterval",
- "DefaultCongestionThreshold"
+ "DefaultCongestionThreshold",
+ "Mtu"
};
/**
@@ -559,6 +561,44 @@
return *this;
}
+ bool
+ hasMtu() const
+ {
+ return m_hasFields[CONTROL_PARAMETER_MTU];
+ }
+
+ /** \brief get MTU (measured in bytes)
+ *
+ * This value is capped at MAX_NDN_PACKET_SIZE, even if the MTU of the face is unlimited.
+ */
+ uint64_t
+ getMtu() const
+ {
+ BOOST_ASSERT(this->hasMtu());
+ return m_mtu;
+ }
+
+ /** \brief set MTU (measured in bytes)
+ *
+ * This value is capped at MAX_NDN_PACKET_SIZE, even if the MTU of the face is unlimited.
+ */
+ ControlParameters&
+ setMtu(uint64_t mtu)
+ {
+ m_wire.reset();
+ m_mtu = mtu;
+ m_hasFields[CONTROL_PARAMETER_MTU] = true;
+ return *this;
+ }
+
+ ControlParameters&
+ unsetMtu()
+ {
+ m_wire.reset();
+ m_hasFields[CONTROL_PARAMETER_MTU] = false;
+ return *this;
+ }
+
const std::vector<bool>&
getPresentFields() const
{
@@ -615,6 +655,7 @@
FacePersistency m_facePersistency;
time::nanoseconds m_baseCongestionMarkingInterval;
uint64_t m_defaultCongestionThreshold;
+ uint64_t m_mtu;
private:
mutable Block m_wire;
diff --git a/src/mgmt/nfd/face-status.cpp b/src/mgmt/nfd/face-status.cpp
index 0c127ae..dc74eb1 100644
--- a/src/mgmt/nfd/face-status.cpp
+++ b/src/mgmt/nfd/face-status.cpp
@@ -63,6 +63,9 @@
totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NInNacks, m_nInNacks);
totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NInData, m_nInData);
totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::NInInterests, m_nInInterests);
+ if (m_mtu) {
+ totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::Mtu, *m_mtu);
+ }
if (m_defaultCongestionThreshold) {
totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::DefaultCongestionThreshold,
*m_defaultCongestionThreshold);
@@ -187,6 +190,14 @@
m_defaultCongestionThreshold = nullopt;
}
+ if (val != m_wire.elements_end() && val->type() == tlv::nfd::Mtu) {
+ m_mtu = readNonNegativeInteger(*val);
+ ++val;
+ }
+ else {
+ m_mtu = nullopt;
+ }
+
if (val != m_wire.elements_end() && val->type() == tlv::nfd::NInInterests) {
m_nInInterests = readNonNegativeInteger(*val);
++val;
@@ -309,6 +320,22 @@
}
FaceStatus&
+FaceStatus::setMtu(uint64_t mtu)
+{
+ m_wire.reset();
+ m_mtu = mtu;
+ return *this;
+}
+
+FaceStatus&
+FaceStatus::unsetMtu()
+{
+ m_wire.reset();
+ m_mtu = nullopt;
+ return *this;
+}
+
+FaceStatus&
FaceStatus::setNInInterests(uint64_t nInInterests)
{
m_wire.reset();
@@ -390,6 +417,8 @@
a.hasDefaultCongestionThreshold() == b.hasDefaultCongestionThreshold() &&
(!a.hasDefaultCongestionThreshold() ||
a.getDefaultCongestionThreshold() == b.getDefaultCongestionThreshold()) &&
+ a.hasMtu() == b.hasMtu() &&
+ (!a.hasMtu() || a.getMtu() == b.getMtu()) &&
a.getNInInterests() == b.getNInInterests() &&
a.getNInData() == b.getNInData() &&
a.getNInNacks() == b.getNInNacks() &&
@@ -426,6 +455,10 @@
os << " DefaultCongestionThreshold: " << status.getDefaultCongestionThreshold() << " bytes,\n";
}
+ if (status.hasMtu()) {
+ os << " Mtu: " << status.getMtu() << " bytes,\n";
+ }
+
os << " Flags: " << AsHex{status.getFlags()} << ",\n"
<< " Counters: {Interests: {in: " << status.getNInInterests() << ", "
<< "out: " << status.getNOutInterests() << "},\n"
diff --git a/src/mgmt/nfd/face-status.hpp b/src/mgmt/nfd/face-status.hpp
index 30a97f5..3de21fe 100644
--- a/src/mgmt/nfd/face-status.hpp
+++ b/src/mgmt/nfd/face-status.hpp
@@ -119,6 +119,33 @@
FaceStatus&
unsetDefaultCongestionThreshold();
+ bool
+ hasMtu() const
+ {
+ return !!m_mtu;
+ }
+
+ /** \brief get MTU (measured in bytes)
+ *
+ * This value is capped at MAX_NDN_PACKET_SIZE, even if the MTU of the face is unlimited.
+ */
+ uint64_t
+ getMtu() const
+ {
+ BOOST_ASSERT(hasMtu());
+ return *m_mtu;
+ }
+
+ /** \brief set MTU (measured in bytes)
+ *
+ * This value is capped at MAX_NDN_PACKET_SIZE, even if the MTU of the face is unlimited.
+ */
+ FaceStatus&
+ setMtu(uint64_t mtu);
+
+ FaceStatus&
+ unsetMtu();
+
uint64_t
getNInInterests() const
{
@@ -195,6 +222,7 @@
optional<time::milliseconds> m_expirationPeriod;
optional<time::nanoseconds> m_baseCongestionMarkingInterval;
optional<uint64_t> m_defaultCongestionThreshold;
+ optional<uint64_t> m_mtu;
uint64_t m_nInInterests;
uint64_t m_nInData;
uint64_t m_nInNacks;