]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[#1416] perfdhcp v6 generate multiple subnet traffic
authorWlodek Wencel <wlodek@isc.org>
Thu, 13 May 2021 07:54:52 +0000 (09:54 +0200)
committerWlodzimierz Wencel <wlodek@isc.org>
Mon, 17 May 2021 12:53:34 +0000 (12:53 +0000)
src/bin/perfdhcp/command_options.cc
src/bin/perfdhcp/command_options.h
src/bin/perfdhcp/test_control.cc
src/bin/perfdhcp/tests/command_options_unittest.cc
src/bin/perfdhcp/tests/testdata/relay-list.txt [new file with mode: 0644]

index 03336797ca07256e1924d29445498ccd8faa4ac7..51c55e0af5f643183c0d731b40b6e4897b829619 100644 (file)
@@ -126,8 +126,8 @@ CommandOptions::reset() {
     addr_unique_ = false;
     mac_list_file_.clear();
     mac_list_.clear();
-    giaddr_list_file_.clear();
-    giaddr_list_.clear();
+    relay_addr_list_file_.clear();
+    relay_addr_list_.clear();
     multi_subnet_ = false;
     num_request_.clear();
     exit_wait_time_ = 0;
@@ -390,8 +390,8 @@ CommandOptions::initialize(int argc, char** argv, bool print_cmd_line) {
         case 'J':
             check(num_subnet_list_files >= 1, "only one -J option can be specified");
             num_subnet_list_files++;
-            giaddr_list_file_ = std::string(optarg);
-            loadGiaddr();
+            relay_addr_list_file_ = std::string(optarg);
+            loadRelayAddr();
             break;
 
         case 'l':
@@ -856,14 +856,14 @@ bool CommandOptions::validateIP(const std::string& line) {
     } catch (const isc::asiolink::IOError& e) {
         return (true);
     }
-    giaddr_list_.push_back(line);
+    relay_addr_list_.push_back(line);
     multi_subnet_ = true;
     return (false);
 }
 
-void CommandOptions::loadGiaddr() {
+void CommandOptions::loadRelayAddr() {
     std::string line;
-    std::ifstream infile(giaddr_list_file_.c_str());
+    std::ifstream infile(relay_addr_list_file_.c_str());
     size_t cnt = 0;
     while (std::getline(infile, line)) {
         cnt++;
@@ -871,6 +871,7 @@ void CommandOptions::loadGiaddr() {
         tmp << "invalid address in line: "<< cnt;
         check(validateIP(line), tmp.str());
     }
+    check(cnt == 0, "file with addresses is empty!");
 }
 
 void CommandOptions::loadMacs() {
index 742780e63ff7e10df07d4992dc55c26d874df08a..9ebf6df80dab940ffafe52074b09c718d02b9523 100644 (file)
@@ -392,20 +392,20 @@ public:
     /// \return server name.
     std::string getServerName() const { return server_name_; }
 
-    /// \brief Returns giaddr file location.
+    /// \brief Returns file location with set of relay addresses.
     ///
-    /// \return giaddr list file location.
-    std::string getGiaddrListFile() const { return giaddr_list_file_; }
+    /// \return relay addresses list file location.
+    std::string getRelayAddrListFile() const { return relay_addr_list_file_; }
 
-    /// \brief Returns list of giaddr addresses.
+    /// \brief Returns list of relay addresses.
     ///
-    /// \return list of giaddr.
-    std::vector<std::string> getGiaddrList() const { return giaddr_list_; }
+    /// \return list of relay addresses.
+    std::vector<std::string> getRelayAddrList() const { return relay_addr_list_; }
 
-    /// \brief Returns random giaddr.
+    /// \brief Returns random relay address.
     ///
-    /// \return single string containing giaddr.
-    std::string getRandGiaddr() { return giaddr_list_[rand() % giaddr_list_.size()]; }
+    /// \return single string containing relay address.
+    std::string getRandRelayAddr() { return relay_addr_list_[rand() % relay_addr_list_.size()]; }
 
     /// \brief Check if multi subnet mode is enabled.
     ///
@@ -566,10 +566,10 @@ private:
     bool decodeMacString(const std::string& line);
 
     /// \brief Opens the text file containing list of addresses (one per line).
-    void loadGiaddr();
+    void loadRelayAddr();
 
-    /// \brief Checks if loaded giaddr from text file are correct,
-    /// adds them to giaddr_list_.
+    /// \brief Checks if loaded relay addresses from text file are correct,
+    /// adds them to relay_addr_list_.
     ///
     /// \return true if address is incorrect.
     bool validateIP(const std::string& line);
@@ -706,10 +706,10 @@ private:
     std::vector<std::vector<uint8_t> > mac_list_;
 
     /// Location of a file containing a list of subnet addresses, one per line.
-    std::string giaddr_list_file_;
+    std::string relay_addr_list_file_;
 
     /// List of validated subnet addresses.
-    std::vector<std::string> giaddr_list_;
+    std::vector<std::string> relay_addr_list_;
 
     /// Flag to indicate multiple subnets testing.
     bool multi_subnet_;
index 18d5b133c0c71635520cb5c549a0385405a21c38..8346daa7d8a447e5771e9bc9d169d5e0fd0c39c5 100644 (file)
@@ -1770,7 +1770,7 @@ TestControl::setDefaults4(const Pkt4Ptr& pkt) {
     if (!options_.checkMultiSubnet()) {
         pkt->setGiaddr(IOAddress(socket_.addr_));
     } else {
-        pkt->setGiaddr(IOAddress(options_.getRandGiaddr()));
+        pkt->setGiaddr(IOAddress(options_.getRandRelayAddr()));
     }
     // Pretend that we have one relay (which is us).
     pkt->setHops(1);
@@ -1805,8 +1805,12 @@ TestControl::setDefaults6(const Pkt6Ptr& pkt) {
     if (options_.isUseRelayedV6()) {
       Pkt6::RelayInfo relay_info;
       relay_info.msg_type_ = DHCPV6_RELAY_FORW;
-      relay_info.hop_count_ = 1;
-      relay_info.linkaddr_ = IOAddress(socket_.addr_);
+      relay_info.hop_count_ = 0;
+      if (options_.checkMultiSubnet()) {
+          relay_info.linkaddr_ = IOAddress(options_.getRandRelayAddr());
+      } else {
+          relay_info.linkaddr_ = IOAddress(socket_.addr_);
+      }
       relay_info.peeraddr_ = IOAddress(socket_.addr_);
       pkt->addRelayInfo(relay_info);
     }
index 056ef2b55942eb044fc563e3fc8970d87eeb7b34..10cd5431b1d4cbad3f092f7b6c3a3e965709444b 100644 (file)
@@ -841,15 +841,15 @@ TEST_F(CommandOptionsTest, LoadMacsFromFile) {
     EXPECT_EQ(4, m.size());
 }
 
-TEST_F(CommandOptionsTest, LoadGiaddrFromFile) {
+TEST_F(CommandOptionsTest, LoadRelayAddrFromFile) {
     CommandOptions opt;
-    std::string giaddr_list_full_path = getFullPath("giaddr-list.txt");
+    std::string relay_addr_list_full_path = getFullPath("relay-addr-list.txt");
     std::ostringstream cmd;
-    cmd << "perfdhcp -J " << giaddr_list_full_path << " abc";
+    cmd << "perfdhcp -J " << relay_addr_list_full_path << " abc";
     EXPECT_NO_THROW(process(opt, cmd.str()));
-    EXPECT_EQ(giaddr_list_full_path, opt.getGiaddrListFile());
+    EXPECT_EQ(relay_addr_list_full_path, opt.getRelayAddrListFile());
     EXPECT_TRUE(opt.checkMultiSubnet());
-    EXPECT_EQ(5, opt.getGiaddrList().size());
+    EXPECT_EQ(7, opt.getRelayAddrList().size());
 }
 
 TEST_F(CommandOptionsTest, LoadMacsFromFileNegativeCases) {
diff --git a/src/bin/perfdhcp/tests/testdata/relay-list.txt b/src/bin/perfdhcp/tests/testdata/relay-list.txt
new file mode 100644 (file)
index 0000000..2750475
--- /dev/null
@@ -0,0 +1,7 @@
+100.95.0.1
+20.86.12.1
+101.64.4.1
+1.86.0.1
+92.86.238.1
+3000::1
+fe80::6e2b:59ff:fe94:19d1