From: Tomek Mrugalski Date: Thu, 2 Feb 2017 14:26:35 +0000 (+0100) Subject: [5131] Relay information is now printed in Pkt6::toText() X-Git-Tag: trac3590_base~16^2~1^2~3 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=747e18f5566417d5141673ce42fec67a3504142a;p=thirdparty%2Fkea.git [5131] Relay information is now printed in Pkt6::toText() --- diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000..122d22c55b --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "premium"] + path = premium + url = ssh://tomasz@repo.isc.org:/proj/git/prod/kea-premium.git diff --git a/premium b/premium new file mode 160000 index 0000000000..2684a802c4 --- /dev/null +++ b/premium @@ -0,0 +1 @@ +Subproject commit 2684a802c496ece3f8c8fa320c8b5585a72769be diff --git a/src/lib/dhcp/pkt6.cc b/src/lib/dhcp/pkt6.cc index bb6c9723ec..b80d0683f4 100644 --- a/src/lib/dhcp/pkt6.cc +++ b/src/lib/dhcp/pkt6.cc @@ -37,6 +37,19 @@ Pkt6::RelayInfo::RelayInfo() peeraddr_(DEFAULT_ADDRESS6), relay_msg_len_(0) { } +std::string Pkt6::RelayInfo::toText() const { + stringstream tmp; + tmp << "msg-type=" << static_cast(msg_type_) << "(" << getName(msg_type_) + << "), hop-count=" << static_cast(hop_count_) << "," << endl + << "link-address=" << linkaddr_.toText() + << ", peer-address=" << peeraddr_.toText() << ", " + << options_.size() << " option(s)" << endl; + for (auto option = options_.cbegin(); option != options_.cend(); ++option) { + tmp << option->second->toText() << endl; + } + return (tmp.str()); +} + Pkt6::Pkt6(const uint8_t* buf, uint32_t buf_len, DHCPv6Proto proto /* = UDP */) :Pkt(buf, buf_len, DEFAULT_ADDRESS6, DEFAULT_ADDRESS6, 0, 0), proto_(proto), msg_type_(0) { @@ -607,16 +620,31 @@ Pkt6::getLabel() const { std::string Pkt6::toText() const { stringstream tmp; + + // First print the basics tmp << "localAddr=[" << local_addr_ << "]:" << local_port_ - << " remoteAddr=[" << remote_addr_ - << "]:" << remote_port_ << endl; - tmp << "msgtype=" << static_cast(msg_type_) << ", transid=0x" << + << " remoteAddr=[" << remote_addr_ << "]:" << remote_port_ << endl; + tmp << "msgtype=" << static_cast(msg_type_) << "(" << getName(msg_type_) + << "), transid=0x" << hex << transid_ << dec << endl; + + // Then print the options for (isc::dhcp::OptionCollection::const_iterator opt=options_.begin(); opt != options_.end(); ++opt) { tmp << opt->second->toText() << std::endl; } + + // Finally, print the relay information (if present) + if (!relay_info_.empty()) { + tmp << relay_info_.size() << " relay(s):" << endl; + int cnt = 0; + for (auto relay = relay_info_.cbegin(); relay != relay_info_.cend(); ++relay) { + tmp << "relay[" << cnt++ << "]: " << relay->toText(); + } + } else { + tmp << "No relays traversed." << endl; + } return tmp.str(); } diff --git a/src/lib/dhcp/pkt6.h b/src/lib/dhcp/pkt6.h index 6abe3db6df..eb0216cc47 100644 --- a/src/lib/dhcp/pkt6.h +++ b/src/lib/dhcp/pkt6.h @@ -1,4 +1,4 @@ -// Copyright (C) 2011-2016 Internet Systems Consortium, Inc. ("ISC") +// Copyright (C) 2011-2017 Internet Systems Consortium, Inc. ("ISC") // // This Source Code Form is subject to the terms of the Mozilla Public // License, v. 2.0. If a copy of the MPL was not distributed with this @@ -86,6 +86,11 @@ public: /// @brief default constructor RelayInfo(); + + /// @brief Returns prinable representation of the relay information. + /// @return text represenation of the structure (used in debug logging) + std::string toText() const; + uint8_t msg_type_; ///< message type (RELAY-FORW oro RELAY-REPL) uint8_t hop_count_; ///< number of traversed relays (up to 32) isc::asiolink::IOAddress linkaddr_;///< fixed field in relay-forw/relay-reply diff --git a/src/lib/dhcp/tests/pkt6_unittest.cc b/src/lib/dhcp/tests/pkt6_unittest.cc index 2ee4a2b034..d697c866e6 100644 --- a/src/lib/dhcp/tests/pkt6_unittest.cc +++ b/src/lib/dhcp/tests/pkt6_unittest.cc @@ -1049,6 +1049,38 @@ TEST_F(Pkt6Test, getAnyRelayOption) { EXPECT_FALSE(opt); } +// Tests whether Pkt6::toText() properly prints out all parameters, including +// relay options: remote-id, interface-id. +TEST_F(Pkt6Test, toText) { + + // This packet contains doubly relayed solicit. The inner-most + // relay-forward contains inteface-id and remote-id. We will + // check that these are printed correctly. + Pkt6Ptr msg(capture2()); + EXPECT_NO_THROW(msg->unpack()); + + ASSERT_EQ(2, msg->relay_info_.size()); + + string expected = + "localAddr=[ff05::1:3]:547 remoteAddr=[fe80::1234]:547\n" + "msgtype=1(SOLICIT), transid=0x6b4fe2\n" + "type=00001, len=00014: 00:01:00:01:18:b0:33:41:00:00:21:5c:18:a9\n" + "type=00003(IA_NA), len=00012: iaid=1, t1=4294967295, t2=4294967295\n" + "type=00006, len=00006: 23(uint16) 242(uint16) 243(uint16)\n" + "type=00008, len=00002: 0 (uint16)\n" + "2 relay(s):\n" + "relay[0]: msg-type=12(RELAY_FORWARD), hop-count=1,\n" + "link-address=2001:888:db8:1::, peer-address=fe80::200:21ff:fe5c:18a9, 2 option(s)\n" + "type=00018, len=00028: 49:53:41:4d:31:34:34:7c:32:39:39:7c:69:70:76:36:7c:6e:74:3a:76:70:3a:31:3a:31:31:30\n" + "type=00037, len=00018: 6527 (uint32) 0001000118B033410000215C18A9 (binary)\n" + "relay[1]: msg-type=12(RELAY_FORWARD), hop-count=0,\n" + "link-address=::, peer-address=fe80::200:21ff:fe5c:18a9, 2 option(s)\n" + "type=00018, len=00021: 49:53:41:4d:31:34:34:20:65:74:68:20:31:2f:31:2f:30:35:2f:30:31\n" + "type=00037, len=00004: 3561 (uint32) (binary)\n"; + + EXPECT_EQ(expected, msg->toText()); +} + // Tests whether a packet can be assigned to a class and later // checked if it belongs to a given class TEST_F(Pkt6Test, clientClasses) {