Skip to content

Commit

Permalink
mgmt: add Flags field to FaceStatus
Browse files Browse the repository at this point in the history
refs #3732

Change-Id: I933c1471a185fd96777e6935c6810210868b0765
  • Loading branch information
eric135 committed Sep 27, 2016
1 parent 50e2002 commit 1ce8ab2
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 5 deletions.
57 changes: 55 additions & 2 deletions src/mgmt/nfd/face-status.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ FaceStatus::FaceStatus()
, m_nOutNacks(0)
, m_nInBytes(0)
, m_nOutBytes(0)
, m_flags(0)
{
}

Expand All @@ -57,6 +58,8 @@ FaceStatus::wireEncode(EncodingImpl<TAG>& encoder) const
{
size_t totalLength = 0;

totalLength += prependNonNegativeIntegerBlock(encoder,
tlv::nfd::Flags, m_flags);
totalLength += prependNonNegativeIntegerBlock(encoder,
tlv::nfd::NOutBytes, m_nOutBytes);
totalLength += prependNonNegativeIntegerBlock(encoder,
Expand Down Expand Up @@ -248,6 +251,14 @@ FaceStatus::wireDecode(const Block& block)
else {
BOOST_THROW_EXCEPTION(Error("missing required NOutBytes field"));
}

if (val != m_wire.elements_end() && val->type() == tlv::nfd::Flags) {
m_flags = readNonNegativeInteger(*val);
++val;
}
else {
BOOST_THROW_EXCEPTION(Error("missing required Flags field"));
}
}

FaceStatus&
Expand Down Expand Up @@ -323,6 +334,43 @@ FaceStatus::setNOutBytes(uint64_t nOutBytes)
return *this;
}

FaceStatus&
FaceStatus::setFlags(uint64_t flags)
{
m_wire.reset();
m_flags = flags;
return *this;
}

bool
FaceStatus::getFlagBit(size_t bit) const
{
if (bit >= 64) {
BOOST_THROW_EXCEPTION(std::out_of_range("bit must be within range [0, 64)"));
}

return m_flags & (1 << bit);
}

FaceStatus&
FaceStatus::setFlagBit(size_t bit, bool value)
{
if (bit >= 64) {
BOOST_THROW_EXCEPTION(std::out_of_range("bit must be within range [0, 64)"));
}

m_wire.reset();

if (value) {
m_flags |= (1 << bit);
}
else {
m_flags &= ~(1 << bit);
}

return *this;
}

void
FaceStatus::wireReset() const
{
Expand All @@ -346,8 +394,13 @@ operator<<(std::ostream& os, const FaceStatus& status)

os << "FaceScope: " << status.getFaceScope() << ",\n"
<< "FacePersistency: " << status.getFacePersistency() << ",\n"
<< "LinkType: " << status.getLinkType() << ",\n"
<< "Counters: { Interests: {in: " << status.getNInInterests() << ", "
<< "LinkType: " << status.getLinkType() << ",\n";

auto osFlags = os.flags();
os << "Flags: " << std::showbase << std::hex << status.getFlags() << ",\n";
os.flags(osFlags);

os << "Counters: { Interests: {in: " << status.getNInInterests() << ", "
<< "out: " << status.getNOutInterests() << "},\n"
<< " Data: {in: " << status.getNInDatas() << ", "
<< "out: " << status.getNOutDatas() << "},\n"
Expand Down
16 changes: 16 additions & 0 deletions src/mgmt/nfd/face-status.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,21 @@ class FaceStatus : public FaceTraits<FaceStatus>
FaceStatus&
setNOutBytes(uint64_t nOutBytes);

uint64_t
getFlags() const
{
return m_flags;
}

FaceStatus&
setFlags(uint64_t flags);

bool
getFlagBit(size_t bit) const;

FaceStatus&
setFlagBit(size_t bit, bool value);

protected:
void
wireReset() const;
Expand All @@ -162,6 +177,7 @@ class FaceStatus : public FaceTraits<FaceStatus>
uint64_t m_nOutNacks;
uint64_t m_nInBytes;
uint64_t m_nOutBytes;
uint64_t m_flags;

mutable Block m_wire;
};
Expand Down
29 changes: 26 additions & 3 deletions tests/unit-tests/mgmt/nfd/face-status.t.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ BOOST_AUTO_TEST_CASE(Encode)
.setNOutDatas(4)
.setNOutNacks(2)
.setNInBytes(1329719163)
.setNOutBytes(999110448);
.setNOutBytes(999110448)
.setFlags(0x7);

Block wire;
BOOST_REQUIRE_NO_THROW(wire = status1.wireEncode());
Expand All @@ -59,7 +60,7 @@ BOOST_AUTO_TEST_CASE(Encode)
// printf("0x%02x, ", *it);
// }
static const uint8_t expected[] = {
0x80, 0x5e, 0x69, 0x01, 0x64, 0x72, 0x15, 0x74, 0x63, 0x70,
0x80, 0x61, 0x69, 0x01, 0x64, 0x72, 0x15, 0x74, 0x63, 0x70,
0x34, 0x3a, 0x2f, 0x2f, 0x31, 0x39, 0x32, 0x2e, 0x30, 0x2e,
0x32, 0x2e, 0x31, 0x3a, 0x36, 0x33, 0x36, 0x33, 0x81, 0x16,
0x74, 0x63, 0x70, 0x34, 0x3a, 0x2f, 0x2f, 0x31, 0x39, 0x32,
Expand All @@ -68,7 +69,7 @@ BOOST_AUTO_TEST_CASE(Encode)
0x01, 0x01, 0x86, 0x01, 0x01, 0x90, 0x01, 0x0a, 0x91, 0x01,
0xc8, 0x97, 0x01, 0x01, 0x92, 0x02, 0x0b, 0xb8, 0x93, 0x01,
0x04, 0x98, 0x01, 0x02, 0x94, 0x04, 0x4f, 0x41, 0xe7, 0x7b,
0x95, 0x04, 0x3b, 0x8d, 0x37, 0x30,
0x95, 0x04, 0x3b, 0x8d, 0x37, 0x30, 0x6c, 0x01, 0x07,
};
BOOST_CHECK_EQUAL_COLLECTIONS(expected, expected + sizeof(expected),
wire.begin(), wire.end());
Expand All @@ -89,6 +90,7 @@ BOOST_AUTO_TEST_CASE(Encode)
BOOST_CHECK_EQUAL(status1.getNOutNacks(), status2.getNOutNacks());
BOOST_CHECK_EQUAL(status1.getNInBytes(), status2.getNInBytes());
BOOST_CHECK_EQUAL(status1.getNOutBytes(), status2.getNOutBytes());
BOOST_CHECK_EQUAL(status1.getFlags(), status2.getFlags());

std::ostringstream os;
os << status2;
Expand All @@ -99,13 +101,34 @@ BOOST_AUTO_TEST_CASE(Encode)
"FaceScope: local,\n"
"FacePersistency: on-demand,\n"
"LinkType: multi-access,\n"
"Flags: 0x7,\n"
"Counters: { Interests: {in: 10, out: 3000},\n"
" Data: {in: 200, out: 4},\n"
" Nack: {in: 1, out: 2},\n"
" bytes: {in: 1329719163, out: 999110448} }\n"
")");
}

BOOST_AUTO_TEST_CASE(FlagBit)
{
FaceStatus status;
status.setFlags(0x7);
BOOST_CHECK_EQUAL(status.getFlags(), 0x7);

BOOST_CHECK(status.getFlagBit(0));
BOOST_CHECK(status.getFlagBit(1));
BOOST_CHECK(status.getFlagBit(2));
BOOST_CHECK(!status.getFlagBit(3));

status.setFlagBit(3, true);
BOOST_CHECK_EQUAL(status.getFlags(), 0xf);
BOOST_CHECK(status.getFlagBit(3));

status.setFlagBit(1, false);
BOOST_CHECK_EQUAL(status.getFlags(), 0xd);
BOOST_CHECK(!status.getFlagBit(1));
}

BOOST_AUTO_TEST_SUITE_END() // TestFaceStatus
BOOST_AUTO_TEST_SUITE_END() // Nfd
BOOST_AUTO_TEST_SUITE_END() // Mgmt
Expand Down

0 comments on commit 1ce8ab2

Please sign in to comment.