nodecontainer_test.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  1. #include <gtest/gtest.h>
  2. #include <memory>
  3. #include <sstream>
  4. #include <tins/tins.h>
  5. #include "nodecontainer.hpp"
  6. #include "nodeinfo.hpp"
  7. class NodeContainerTest : public testing::Test
  8. {
  9. protected:
  10. // cppcheck-suppress duplInheritedMember
  11. static void SetUpTestSuite()
  12. {
  13. testing::Test::SetUpTestSuite();
  14. /* Container 1 */
  15. container1 = std::make_unique<NodeContainer>();
  16. c1_child_node1 = std::make_shared<NodeInfo>();
  17. c1_child_node1->set_hoplimit(20);
  18. c1_child_node1->set_mac_address(
  19. Tins::HWAddress<6>("52:54:00:b2:fa:7f"));
  20. c1_child_node1->add_address(Tins::IPv6Address("fd00::11"));
  21. c1_child_node1->add_address(Tins::IPv6Address("fd00::12"));
  22. container1->add_node(c1_child_node1);
  23. c1_child_node2 = std::make_shared<NodeInfo>();
  24. c1_child_node2->set_hoplimit(30);
  25. c1_child_node2->set_mac_address(
  26. Tins::HWAddress<6>("52:54:00:b2:fa:7e"));
  27. c1_child_node2->add_address(Tins::IPv6Address("fd00::21"));
  28. container1->add_node(c1_child_node2);
  29. c1_child_node3 = std::make_shared<NodeInfo>();
  30. c1_child_node3->set_mac_address(
  31. Tins::HWAddress<6>("52:54:00:b2:fa:7d"));
  32. c1_child_node3->add_address(Tins::IPv6Address("fd00::3"));
  33. c1_child_node3_child1 = std::make_shared<NodeInfo>();
  34. c1_child_node3_child1->add_address(Tins::IPv6Address("fd00::3:1"));
  35. c1_child_node3->add_node(c1_child_node3_child1);
  36. c1_child_node3_child2 = std::make_shared<NodeInfo>();
  37. c1_child_node3_child2->add_address(Tins::IPv6Address("fd00::3:2"));
  38. c1_child_node3_child2_child1 = std::make_shared<NodeInfo>();
  39. c1_child_node3_child2_child1->add_address(
  40. Tins::IPv6Address("fd00::3:2:1"));
  41. c1_child_node3_child2->add_node(c1_child_node3_child2_child1);
  42. c1_child_node3->add_node(c1_child_node3_child2);
  43. container1->add_node(c1_child_node3);
  44. /* Container 2 */
  45. container2 = std::make_unique<NodeContainer>();
  46. c2_child_node1 = std::make_shared<NodeInfo>();
  47. c2_child_node1->set_mac_address(
  48. Tins::HWAddress<6>("52:54:00:b2:fa:7f"));
  49. c2_child_node1->add_address(Tins::IPv6Address("fd01::"));
  50. container2->add_node(c2_child_node1);
  51. /* Container 3 */
  52. container3 = std::make_unique<NodeContainer>();
  53. }
  54. Tins::EthernetII
  55. create_echo_request(const Tins::HWAddress<6>& source_mac,
  56. const Tins::HWAddress<6>& destination_mac,
  57. const Tins::IPv6Address& source_address,
  58. const Tins::IPv6Address& destination_address,
  59. const int hoplimit,
  60. const int icmp_identifier,
  61. const int icmp_sequence,
  62. const Tins::RawPDU::payload_type& payload)
  63. {
  64. Tins::EthernetII packet =
  65. Tins::EthernetII(destination_mac, source_mac) /
  66. Tins::IPv6(destination_address, source_address) /
  67. Tins::ICMPv6(Tins::ICMPv6::Types::ECHO_REQUEST);
  68. Tins::IPv6& inner_ipv6 = packet.rfind_pdu<Tins::IPv6>();
  69. inner_ipv6.hop_limit(hoplimit);
  70. Tins::ICMPv6& inner_icmpv6 = inner_ipv6.rfind_pdu<Tins::ICMPv6>();
  71. inner_icmpv6.identifier(icmp_identifier);
  72. inner_icmpv6.sequence(icmp_sequence);
  73. inner_icmpv6.inner_pdu(Tins::RawPDU(payload));
  74. const Tins::PDU::serialization_type serialized_packet =
  75. packet.serialize();
  76. const Tins::EthernetII final_packet(serialized_packet.data(),
  77. serialized_packet.size());
  78. return final_packet;
  79. }
  80. Tins::EthernetII
  81. create_udp_request(const Tins::HWAddress<6>& source_mac,
  82. const Tins::HWAddress<6>& destination_mac,
  83. const Tins::IPv6Address& source_address,
  84. const Tins::IPv6Address& destination_address,
  85. const int hoplimit,
  86. const int udp_dport,
  87. const int udp_sport,
  88. const Tins::RawPDU::payload_type& payload)
  89. {
  90. Tins::EthernetII packet =
  91. Tins::EthernetII(destination_mac, source_mac) /
  92. Tins::IPv6(destination_address, source_address) /
  93. Tins::UDP(udp_dport, udp_sport);
  94. Tins::IPv6& inner_ipv6 = packet.rfind_pdu<Tins::IPv6>();
  95. inner_ipv6.hop_limit(hoplimit);
  96. Tins::UDP& inner_udp = inner_ipv6.rfind_pdu<Tins::UDP>();
  97. inner_udp.inner_pdu(Tins::RawPDU(payload));
  98. const Tins::PDU::serialization_type serialized_packet =
  99. packet.serialize();
  100. const Tins::EthernetII final_packet(serialized_packet.data(),
  101. serialized_packet.size());
  102. return final_packet;
  103. }
  104. Tins::EthernetII
  105. create_ndp_request(const Tins::HWAddress<6>& source_mac,
  106. const Tins::IPv6Address& source_address,
  107. const Tins::IPv6Address& target_address,
  108. const int hoplimit)
  109. {
  110. Tins::EthernetII packet =
  111. Tins::EthernetII(Tins::HWAddress<6>("33:33:ff:48:b2:ae"),
  112. source_mac) /
  113. Tins::IPv6(Tins::IPv6Address("ff02::1:ff48:b2ae"),
  114. source_address) /
  115. Tins::ICMPv6(Tins::ICMPv6::Types::NEIGHBOUR_SOLICIT);
  116. Tins::IPv6& inner_ipv6 = packet.rfind_pdu<Tins::IPv6>();
  117. inner_ipv6.hop_limit(hoplimit);
  118. Tins::ICMPv6& inner_icmpv6 = inner_ipv6.rfind_pdu<Tins::ICMPv6>();
  119. inner_icmpv6.target_addr(target_address);
  120. const Tins::PDU::serialization_type serialized_packet =
  121. packet.serialize();
  122. const Tins::EthernetII final_packet(serialized_packet.data(),
  123. serialized_packet.size());
  124. return final_packet;
  125. }
  126. // NOLINTBEGIN(cppcoreguidelines-avoid-non-const-global-variables)
  127. static std::unique_ptr<NodeContainer> container1;
  128. static std::shared_ptr<NodeInfo> c1_child_node1;
  129. static std::shared_ptr<NodeInfo> c1_child_node2;
  130. static std::shared_ptr<NodeInfo> c1_child_node3;
  131. static std::shared_ptr<NodeInfo> c1_child_node3_child1;
  132. static std::shared_ptr<NodeInfo> c1_child_node3_child2;
  133. static std::shared_ptr<NodeInfo> c1_child_node3_child2_child1;
  134. static std::unique_ptr<NodeContainer> container2;
  135. static std::shared_ptr<NodeInfo> c2_child_node1;
  136. static std::unique_ptr<NodeContainer> container3;
  137. // NOLINTEND(cppcoreguidelines-avoid-non-const-global-variables)
  138. };
  139. // NOLINTBEGIN(cppcoreguidelines-avoid-non-const-global-variables)
  140. std::unique_ptr<NodeContainer> NodeContainerTest::container1;
  141. std::shared_ptr<NodeInfo> NodeContainerTest::c1_child_node1;
  142. std::shared_ptr<NodeInfo> NodeContainerTest::c1_child_node2;
  143. std::shared_ptr<NodeInfo> NodeContainerTest::c1_child_node3;
  144. std::shared_ptr<NodeInfo> NodeContainerTest::c1_child_node3_child1;
  145. std::shared_ptr<NodeInfo> NodeContainerTest::c1_child_node3_child2;
  146. std::shared_ptr<NodeInfo> NodeContainerTest::c1_child_node3_child2_child1;
  147. std::unique_ptr<NodeContainer> NodeContainerTest::container2;
  148. std::shared_ptr<NodeInfo> NodeContainerTest::c2_child_node1;
  149. std::unique_ptr<NodeContainer> NodeContainerTest::container3;
  150. // NOLINTEND(cppcoreguidelines-avoid-non-const-global-variables)
  151. TEST_F(NodeContainerTest, Print)
  152. {
  153. std::ostringstream test_output;
  154. container1->print_all(test_output);
  155. EXPECT_EQ(
  156. test_output.str(),
  157. "NodeContainer: 3 childnodes\nChilds:\n\tNodeInfo: hoplimit=20 "
  158. "fd00::11 fd00::12 52:54:00:b2:fa:7f\n\tNodeInfo: hoplimit=30 fd00::21 "
  159. "52:54:00:b2:fa:7e\n\tNodeInfo: hoplimit=64 fd00::3 "
  160. "52:54:00:b2:fa:7d\n\tChilds:\n\t\tNodeInfo: hoplimit=64 "
  161. "fd00::3:1\n\t\tNodeInfo: hoplimit=64 "
  162. "fd00::3:2\n\t\tChilds:\n\t\t\tNodeInfo: hoplimit=64 fd00::3:2:1\n");
  163. test_output.str("");
  164. container2->print_all(test_output);
  165. EXPECT_EQ(test_output.str(),
  166. "NodeContainer: 1 childnodes\nChilds:\n\tNodeInfo: hoplimit=64 "
  167. "fd01:: 52:54:00:b2:fa:7f\n");
  168. test_output.str("");
  169. container3->print_all(test_output);
  170. EXPECT_EQ(test_output.str(), "NodeContainer: 0 childnodes\n");
  171. }
  172. TEST_F(NodeContainerTest, Output)
  173. {
  174. std::ostringstream test_output;
  175. test_output << *container1;
  176. EXPECT_EQ(test_output.str(), "NodeContainer: 3 childnodes");
  177. test_output.str("");
  178. test_output << *container2;
  179. EXPECT_EQ(test_output.str(), "NodeContainer: 1 childnodes");
  180. test_output.str("");
  181. test_output << *container3;
  182. EXPECT_EQ(test_output.str(), "NodeContainer: 0 childnodes");
  183. }
  184. TEST_F(NodeContainerTest, MaxDepth)
  185. {
  186. EXPECT_EQ(container1->max_depth(), 3);
  187. EXPECT_EQ(container2->max_depth(), 1);
  188. EXPECT_EQ(container3->max_depth(), 0);
  189. }
  190. TEST_F(NodeContainerTest, Comparison)
  191. {
  192. NodeContainer container;
  193. auto c1_child_node1 = std::make_shared<NodeInfo>();
  194. c1_child_node1->set_hoplimit(20);
  195. c1_child_node1->set_mac_address(Tins::HWAddress<6>("52:54:00:b2:fa:7f"));
  196. c1_child_node1->add_address(Tins::IPv6Address("fd00::11"));
  197. c1_child_node1->add_address(Tins::IPv6Address("fd00::12"));
  198. container.add_node(c1_child_node1);
  199. auto c1_child_node2 = std::make_shared<NodeInfo>();
  200. c1_child_node2->set_hoplimit(30);
  201. c1_child_node2->set_mac_address(Tins::HWAddress<6>("52:54:00:b2:fa:7e"));
  202. c1_child_node2->add_address(Tins::IPv6Address("fd00::21"));
  203. container.add_node(c1_child_node2);
  204. auto c1_child_node3 = std::make_shared<NodeInfo>();
  205. c1_child_node3->set_mac_address(Tins::HWAddress<6>("52:54:00:b2:fa:7d"));
  206. c1_child_node3->add_address(Tins::IPv6Address("fd00::3"));
  207. auto c1_child_node3_child1 = std::make_shared<NodeInfo>();
  208. c1_child_node3_child1->add_address(Tins::IPv6Address("fd00::3:1"));
  209. c1_child_node3->add_node(c1_child_node3_child1);
  210. auto c1_child_node3_child2 = std::make_shared<NodeInfo>();
  211. c1_child_node3_child2->add_address(Tins::IPv6Address("fd00::3:2"));
  212. auto c1_child_node3_child2_child1 = std::make_shared<NodeInfo>();
  213. c1_child_node3_child2_child1->add_address(Tins::IPv6Address("fd00::3:2:1"));
  214. c1_child_node3_child2->add_node(c1_child_node3_child2_child1);
  215. c1_child_node3->add_node(c1_child_node3_child2);
  216. container.add_node(c1_child_node3);
  217. EXPECT_EQ(*container1, container);
  218. EXPECT_NE(*container2, container);
  219. EXPECT_NE(*container3, container);
  220. }
  221. TEST_F(NodeContainerTest, GetReplyForEchoRequest)
  222. {
  223. const Tins::HWAddress<6> source_mac("52:54:01:b2:fa:7f");
  224. const Tins::HWAddress<6> destination_mac("52:54:00:b2:fa:7d");
  225. const Tins::IPv6Address source_address("fd01::1");
  226. const Tins::IPv6Address destination_address("fd00::3:2:1");
  227. constexpr int hoplimit = 55;
  228. constexpr int icmp_identifier = 56;
  229. constexpr int icmp_sequence = 1;
  230. const Tins::RawPDU::payload_type payload = {8, 4, 5, 9, 255, 0, 0, 0, 0, 0};
  231. const Tins::EthernetII request_packet =
  232. create_echo_request(source_mac,
  233. destination_mac,
  234. source_address,
  235. destination_address,
  236. hoplimit,
  237. icmp_identifier,
  238. icmp_sequence,
  239. payload);
  240. const NodeRequest echo_request(request_packet);
  241. const NodeReply echo_reply = container1->get_reply(echo_request);
  242. NodeReply expected_reply(NodeReplyType::ICMP_ECHO_REPLY,
  243. source_mac,
  244. source_address,
  245. destination_mac,
  246. destination_address);
  247. expected_reply.icmp_echo_reply(icmp_identifier, icmp_sequence, payload);
  248. expected_reply.set_hoplimit(62);
  249. EXPECT_EQ(echo_reply, expected_reply);
  250. }
  251. TEST_F(NodeContainerTest, GetReplyTimeExceededForEchoRequest)
  252. {
  253. const Tins::HWAddress<6> source_mac("52:54:01:b2:fa:7f");
  254. const Tins::HWAddress<6> destination_mac("52:54:00:b2:fa:7d");
  255. const Tins::IPv6Address source_address("fd01::1");
  256. const Tins::IPv6Address destination_address("fd00::3:2:1");
  257. constexpr int hoplimit = 1;
  258. constexpr int icmp_identifier = 56;
  259. constexpr int icmp_sequence = 1;
  260. const Tins::RawPDU::payload_type payload = {8, 4, 5, 9, 255, 0, 0, 0, 0, 0};
  261. const Tins::EthernetII request_packet =
  262. create_echo_request(source_mac,
  263. destination_mac,
  264. source_address,
  265. destination_address,
  266. hoplimit,
  267. icmp_identifier,
  268. icmp_sequence,
  269. payload);
  270. const NodeRequest echo_request(request_packet);
  271. const NodeReply echo_reply = container1->get_reply(echo_request);
  272. const Tins::IPv6Address time_exceeded_hop("fd00::3");
  273. NodeReply expected_reply(
  274. NodeReplyType::ICMP_TIME_EXCEEDED_ICMP_ECHO_REQUEST,
  275. source_mac,
  276. source_address,
  277. destination_mac,
  278. time_exceeded_hop);
  279. expected_reply.icmp_echo_reply(icmp_identifier, icmp_sequence, payload);
  280. expected_reply.packet_reassembly(destination_address);
  281. expected_reply.set_hoplimit(64);
  282. EXPECT_EQ(echo_reply, expected_reply);
  283. }
  284. TEST_F(NodeContainerTest, GetReplyForUdpRequest)
  285. {
  286. const Tins::HWAddress<6> source_mac("52:54:01:b2:fa:7f");
  287. const Tins::HWAddress<6> destination_mac("52:54:00:b2:fa:7d");
  288. const Tins::IPv6Address source_address("fd01::1");
  289. const Tins::IPv6Address destination_address("fd00::3");
  290. constexpr int hoplimit = 5;
  291. constexpr int udp_dport = 33434;
  292. constexpr int udp_sport = 16383;
  293. const Tins::RawPDU::payload_type payload = {8, 4, 5, 9, 255, 0, 0, 0, 0, 0};
  294. const Tins::EthernetII request_packet =
  295. create_udp_request(source_mac,
  296. destination_mac,
  297. source_address,
  298. destination_address,
  299. hoplimit,
  300. udp_dport,
  301. udp_sport,
  302. payload);
  303. const NodeRequest echo_request(request_packet);
  304. const NodeReply echo_reply = container1->get_reply(echo_request);
  305. NodeReply expected_reply(NodeReplyType::ICMP_PORT_UNREACHABLE,
  306. source_mac,
  307. source_address,
  308. destination_mac,
  309. destination_address);
  310. expected_reply.udp_response(payload, udp_dport, udp_sport);
  311. expected_reply.packet_reassembly(destination_address);
  312. expected_reply.set_hoplimit(64);
  313. EXPECT_EQ(echo_reply, expected_reply);
  314. }
  315. TEST_F(NodeContainerTest, GetTimeExceededReplyForUdpRequest)
  316. {
  317. const Tins::HWAddress<6> source_mac("52:54:01:b2:fa:7f");
  318. const Tins::HWAddress<6> destination_mac("52:54:00:b2:fa:7d");
  319. const Tins::IPv6Address source_address("fd01::1");
  320. const Tins::IPv6Address destination_address("fd00::3:2:1");
  321. constexpr int hoplimit = 1;
  322. constexpr int udp_dport = 33434;
  323. constexpr int udp_sport = 16383;
  324. const Tins::RawPDU::payload_type payload = {8, 4, 5, 9, 255, 0, 0, 0, 0, 0};
  325. const Tins::EthernetII request_packet =
  326. create_udp_request(source_mac,
  327. destination_mac,
  328. source_address,
  329. destination_address,
  330. hoplimit,
  331. udp_dport,
  332. udp_sport,
  333. payload);
  334. const NodeRequest echo_request(request_packet);
  335. const NodeReply echo_reply = container1->get_reply(echo_request);
  336. const Tins::IPv6Address time_exceeded_hop("fd00::3");
  337. NodeReply expected_reply(NodeReplyType::ICMP_TIME_EXCEEDED_UDP,
  338. source_mac,
  339. source_address,
  340. destination_mac,
  341. time_exceeded_hop);
  342. expected_reply.udp_response(payload, udp_dport, udp_sport);
  343. expected_reply.packet_reassembly(destination_address);
  344. expected_reply.set_hoplimit(64);
  345. EXPECT_EQ(echo_reply, expected_reply);
  346. }
  347. TEST_F(NodeContainerTest, GetNoReplyForNonExistAddress)
  348. {
  349. const Tins::HWAddress<6> source_mac("52:54:01:b2:fa:7f");
  350. const Tins::HWAddress<6> destination_mac("52:54:00:b2:fa:7d");
  351. const Tins::IPv6Address source_address("fd01::1");
  352. const Tins::IPv6Address destination_address("fd00::3:2:1");
  353. constexpr int hoplimit = 1;
  354. constexpr int udp_dport = 33434;
  355. constexpr int udp_sport = 16383;
  356. const Tins::RawPDU::payload_type payload = {8, 4, 5, 9, 255, 0, 0, 0, 0, 0};
  357. const Tins::EthernetII request_packet =
  358. create_udp_request(source_mac,
  359. destination_mac,
  360. source_address,
  361. destination_address,
  362. hoplimit,
  363. udp_dport,
  364. udp_sport,
  365. payload);
  366. const NodeRequest echo_request(request_packet);
  367. const NodeReply echo_reply = container2->get_reply(echo_request);
  368. const Tins::IPv6Address time_exceeded_hop("fd00::3");
  369. const NodeReply expected_reply(NodeReplyType::NOREPLY);
  370. EXPECT_EQ(echo_reply, expected_reply);
  371. }
  372. TEST_F(NodeContainerTest, GetNoReplyForUnknownPacket)
  373. {
  374. const Tins::HWAddress<6> source_mac("52:54:01:b2:fa:7f");
  375. const Tins::HWAddress<6> destination_mac("52:54:00:b2:fa:7d");
  376. const Tins::IPv4Address source_address("10.10.10.10");
  377. const Tins::IPv4Address destination_address("10.10.10.11");
  378. Tins::EthernetII packet = Tins::EthernetII(destination_mac, source_mac) /
  379. Tins::IP(destination_address, source_address);
  380. const Tins::PDU::serialization_type serialized_packet = packet.serialize();
  381. const Tins::EthernetII final_packet(serialized_packet.data(),
  382. serialized_packet.size());
  383. const NodeRequest echo_request(final_packet);
  384. const NodeReply echo_reply = container1->get_reply(echo_request);
  385. const NodeReply expected_reply(NodeReplyType::NOREPLY);
  386. EXPECT_EQ(echo_reply, expected_reply);
  387. }
  388. TEST_F(NodeContainerTest, GetReplyForNdpRequest)
  389. {
  390. const Tins::HWAddress<6> source_mac("52:54:01:b2:fa:7f");
  391. const Tins::HWAddress<6> target_mac("52:54:00:b2:fa:7d");
  392. const Tins::IPv6Address source_address("fd01::1");
  393. const Tins::IPv6Address target_address("fd00::3");
  394. constexpr int hoplimit = 5;
  395. const Tins::EthernetII request_packet = create_ndp_request(
  396. source_mac, source_address, target_address, hoplimit);
  397. const NodeRequest echo_request(request_packet);
  398. const NodeReply echo_reply = container1->get_reply(echo_request);
  399. const NodeReply expected_reply(NodeReplyType::ICMP_NDP,
  400. source_mac,
  401. source_address,
  402. target_mac,
  403. target_address);
  404. EXPECT_EQ(echo_reply, expected_reply);
  405. }
  406. TEST_F(NodeContainerTest, GetNoReplyForNdpRequestDueToHoplimit)
  407. {
  408. const Tins::HWAddress<6> source_mac("52:54:01:b2:fa:7f");
  409. const Tins::HWAddress<6> target_mac("52:54:00:b2:fa:7d");
  410. const Tins::IPv6Address source_address("fd01::1");
  411. const Tins::IPv6Address target_address("fd00::3");
  412. constexpr int hoplimit = 0;
  413. const Tins::EthernetII request_packet = create_ndp_request(
  414. source_mac, source_address, target_address, hoplimit);
  415. const NodeRequest echo_request(request_packet);
  416. const NodeReply echo_reply = container1->get_reply(echo_request);
  417. const NodeReply expected_reply(NodeReplyType::NOREPLY);
  418. EXPECT_EQ(echo_reply, expected_reply);
  419. }
  420. TEST_F(NodeContainerTest, GetNoReplyForNdpRequestDueToNonExistTarget)
  421. {
  422. const Tins::HWAddress<6> source_mac("52:54:01:b2:fa:7f");
  423. const Tins::HWAddress<6> target_mac("52:54:00:b2:fa:7d");
  424. const Tins::IPv6Address source_address("fd01::1");
  425. const Tins::IPv6Address target_address("fd00::3");
  426. constexpr int hoplimit = 5;
  427. const Tins::EthernetII request_packet = create_ndp_request(
  428. source_mac, source_address, target_address, hoplimit);
  429. const NodeRequest echo_request(request_packet);
  430. const NodeReply echo_reply = container2->get_reply(echo_request);
  431. const NodeReply expected_reply(NodeReplyType::NOREPLY);
  432. EXPECT_EQ(echo_reply, expected_reply);
  433. }