29    auto begin_it = std::get<0>(sent_packets_its);
 
   30    auto end_it = std::get<1>(sent_packets_its);
 
   35    int still_left_cnt = 0;
 
   36    int current_cycle_resent_cnt = 0;
 
   37    for (
auto it = begin_it; it != end_it; ++it) {
 
   41        auto trans_id = pkt->getTransid();
 
   44        auto start_time = pkt->getTimestamp();
 
   45        int current_pkt_resent_cnt = 0;
 
   46        auto r_it = retrans.find(trans_id);
 
   47        auto s_it = start_times.find(trans_id);
 
   48        if (r_it != retrans.end() && s_it != start_times.end()) {
 
   49            start_time = s_it->second;
 
   50            current_pkt_resent_cnt = r_it->second;
 
   52            start_times[trans_id] = start_time;
 
   56        int delay = (1 << current_pkt_resent_cnt); 
 
   61        delay += random() % 2000 - 1000;  
 
   64        auto now = microsec_clock::universal_time();
 
   65        if (now - start_time > milliseconds(delay)) {
 
   66            current_cycle_resent_cnt++;
 
   71                Pkt4Ptr pkt4 = boost::dynamic_pointer_cast<Pkt4>(pkt);
 
   74                Pkt6Ptr pkt6 = boost::dynamic_pointer_cast<Pkt6>(pkt);
 
   79            pkt->setTimestamp(start_time);
 
   81            current_pkt_resent_cnt++;
 
   82            retrans[trans_id] = current_pkt_resent_cnt;
 
   85    if (current_cycle_resent_cnt > 0) {
 
   86        auto now = microsec_clock::universal_time();
 
   87        std::cout << now << 
" " << xchg_type << 
": still waiting for " 
   88                  << still_left_cnt << 
" answers, resent " << current_cycle_resent_cnt
 
   89                  << 
", retrying " << retrans.size() << std::endl;
 
   91    return still_left_cnt;
 
 
  109    uint32_t clients_num = 
options_.getClientsNum() == 0 ?
 
  116    auto start = microsec_clock::universal_time();
 
  119    tc_.sendPackets(clients_num);
 
  121    auto now = microsec_clock::universal_time();
 
  122    auto prev_cycle_time = now;
 
  126        tc_.consumeReceivedPackets();
 
  130        now = microsec_clock::universal_time();
 
  135        if (now - prev_cycle_time > milliseconds(200)) { 
 
  136            prev_cycle_time = now;
 
  137            int still_left_cnt = 0;
 
  143            if (still_left_cnt == 0) {
 
  148        if (
tc_.interrupted()) {
 
  153    auto stop = microsec_clock::universal_time();
 
  154    boost::posix_time::time_period duration(start, stop);
 
  166    if (
options_.testDiags(
's') && 
tc_.serverIdReceived()) {
 
  167        std::cout << 
"Server id: " << 
tc_.getServerId() << std::endl;
 
  172        std::cout << 
"Interrupted" << std::endl;
 
  182    int total_rcvd_pkts = 0;  
 
  193    std::cout << 
"It took " << duration.length() << 
" to provision " << clients_num
 
  194              << 
" clients. " << std::endl
 
  195              << 
"Requests sent + resent: " << total_sent_pkts << std::endl
 
  197              << 
"Responses received: " << total_rcvd_pkts << std::endl;
 
 
std::unordered_map< ExchangeType, std::unordered_map< uint32_t, boost::posix_time::ptime >, EnumClassHash > start_times_
A map xchg type -> (a map of trans id -> time of sending first packet.