diff options
Diffstat (limited to 'src/bin/perfdhcp/avalanche_scen.h')
-rw-r--r-- | src/bin/perfdhcp/avalanche_scen.h | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/bin/perfdhcp/avalanche_scen.h b/src/bin/perfdhcp/avalanche_scen.h new file mode 100644 index 0000000..b745efe --- /dev/null +++ b/src/bin/perfdhcp/avalanche_scen.h @@ -0,0 +1,81 @@ +// Copyright (C) 2012-2019,2021 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 +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +#ifndef AVALANCHE_SCEN_H +#define AVALANCHE_SCEN_H + +#include <config.h> + +#include <perfdhcp/abstract_scen.h> + + +namespace isc { +namespace perfdhcp { + +// This class fixes an issue in older compilers +// that cannot handle enum class as key in std::unordered_map. +// See: https://stackoverflow.com/questions/18837857/cant-use-enum-class-as-unordered-map-key +struct EnumClassHash +{ + template <typename T> + std::size_t operator()(T t) const + { + return static_cast<std::size_t>(t); + } +}; + +/// \brief Avalanche Scenario class. +/// +/// This class is used to run the performance test where DHCP server +/// is first loaded with indicated buffer of Discover or Solicit messages +/// and then the class is waiting till receiving all required responses. +/// Full DORA and SARR message sequences are expected. +class AvalancheScen : public AbstractScen { +public: + /// \brief Default and the only constructor of AvalancheScen. + /// + /// \param options reference to command options, + /// \param socket reference to a socket. + AvalancheScen(CommandOptions& options, BasePerfSocket &socket): + AbstractScen(options, socket), + socket_(socket), + total_resent_(0) {}; + + /// brief\ Run performance test. + /// + /// Method runs whole performance test. + /// + /// \return execution status. + int run() override; + +protected: + + // A reference to socket; + BasePerfSocket &socket_; + + /// A map xchg type -> (a map of trans id -> retransmissions count. + std::unordered_map<ExchangeType, std::unordered_map<uint32_t, int>, EnumClassHash> retransmissions_; + /// A map xchg type -> (a map of trans id -> time of sending first packet. + std::unordered_map<ExchangeType, std::unordered_map<uint32_t, boost::posix_time::ptime>, EnumClassHash> start_times_; + + /// Total number of resent packets. + int total_resent_; + + /// \\brief Resend packets. + /// + /// It resends packets for given exchange type that did not receive + /// a response yet. + /// + /// \param xchg_type exchange type that should be looked for. + /// \return number of packets still waiting for resending. + int resendPackets(ExchangeType xchg_type); + +}; + +} +} + +#endif // AVALANCHE_SCEN_H |