Ejemplo n.º 1
0
void
PcapFilesReader::scan() {
  if (nonEmptyFiles == 0) {
#if DEBUG_TIMING
    std::cout << "End of all inputs files" << std::endl;
#endif
    // notifyAllEnd();
    return;
  }

  int earliest_index = -1;
  const struct timeval* earliest_time;

  for (unsigned i=0; i < files.size(); i++) {
    auto file = files.at(i).get();
    if (file->atEOF()) continue;

    std::unique_ptr<PcapPacket> p = file->current();
    if (earliest_index == -1) {
      earliest_index = i;
      earliest_time = p->getTime();
    } else {
      const struct timeval *time = p->getTime();
      if (timercmp(time, earliest_time, <)) {
        earliest_index = i;
        earliest_time = time;
      }
    }
  }

  assert(earliest_index >= 0);
  struct timeval delay;

#if DEBUG_TIMING
  std::cout << "First packet to send "
            << PcapPacket::timevalToString(earliest_time) << std::endl;
#endif

  if (respectTiming) {
    struct timeval delta;
    timersub(earliest_time, &firstPacketTime, &delta);

    struct timeval now;
    gettimeofday(&now, nullptr);

    struct timeval elapsed;
    timersub(&now, &startTime, &elapsed);

    timersub(&delta, &elapsed, &delay);
#if DEBUG_TIMING
    std::cout << "Delta " << PcapPacket::timevalToString(&delta)
              << " elapsed " << PcapPacket::timevalToString(&elapsed)
              << " delay " << PcapPacket::timevalToString(&delay) << std::endl;
#endif
  } else {
    timerclear(&delay);
  }

  schedulePacket((unsigned)earliest_index, &delay);
}
Ejemplo n.º 2
0
void
PcapFilesReader::scan() {
    while (true) {
        if (nonEmptyFiles == 0) {
            BMLOG_DEBUG("Pcap reader: end of all input files");
            // notifyAllEnd();
            return;
        }

        int earliest_index = -1;
        const struct timeval *earliest_time;

        for (unsigned i=0; i < files.size(); i++) {
            auto file = files.at(i).get();
            if (file->atEOF()) continue;

            std::unique_ptr<PcapPacket> p = file->current();
            if (earliest_index == -1) {
                earliest_index = i;
                earliest_time = p->getTime();
            } else {
                const struct timeval *time = p->getTime();
                if (timercmp(time, earliest_time, <)) {
                    earliest_index = i;
                    earliest_time = time;
                }
            }
        }

        assert(earliest_index >= 0);
        struct timeval delay;

        BMLOG_DEBUG("Pcap reader: first packet to send {}",
                    PcapPacket::timevalToString(earliest_time));

        if (respectTiming) {
            struct timeval delta;
            timersub(earliest_time, &firstPacketTime, &delta);

            struct timeval now;
            gettimeofday(&now, nullptr);

            struct timeval elapsed;
            timersub(&now, &startTime, &elapsed);

            timersub(&delta, &elapsed, &delay);
            BMLOG_DEBUG("Pcap reader: delta {}, elapsed {}, delay {}",
                        PcapPacket::timevalToString(&delta),
                        PcapPacket::timevalToString(&elapsed),
                        PcapPacket::timevalToString(&delay));
        } else {
            timerclear(&delay);
        }

        schedulePacket((unsigned)earliest_index, &delay);
    }
}