Commit 747e18f5 authored by Tomek Mrugalski's avatar Tomek Mrugalski 🛰
Browse files

[5131] Relay information is now printed in Pkt6::toText()

parent 371a5b0b
[submodule "premium"]
path = premium
url = ssh://tomasz@repo.isc.org:/proj/git/prod/kea-premium.git
premium @ 2684a802
Subproject commit 2684a802c496ece3f8c8fa320c8b5585a72769be
......@@ -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<int>(msg_type_) << "(" << getName(msg_type_)
<< "), hop-count=" << static_cast<int>(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<int>(msg_type_) << ", transid=0x" <<
<< " remoteAddr=[" << remote_addr_ << "]:" << remote_port_ << endl;
tmp << "msgtype=" << static_cast<int>(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();
}
......
// 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
......
......@@ -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) {
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment