int main()

in tools/xdpdump/xdpdump_tool.cpp [61:149]


int main(int argc, char** argv) {
  gflags::ParseCommandLineFlags(&argc, &argv, true);
  google::InitGoogleLogging(argv[0]);
  xdpdump::XdpDumpFilter filter = {};
  // flags to filter parsing
  if (!FLAGS_src.empty()) {
    filter.flags |= xdpdump::kSrcSet;
    auto src_addr = katran::IpHelpers::parseAddrToBe(FLAGS_src);
    if (src_addr.flags > 0) {
      // ipv6
      std::memcpy(&filter.srcv6, &src_addr.v6daddr, 16);
      filter.ipv6 = true;
    } else {
      filter.src = src_addr.daddr;
    }
  }
  if (!FLAGS_dst.empty()) {
    filter.flags |= xdpdump::kDstSet;
    auto dst_addr = katran::IpHelpers::parseAddrToBe(FLAGS_dst);
    if (dst_addr.flags > 0) {
      // ipv6
      if (!FLAGS_src.empty() && !filter.ipv6) {
        // src is specified and it's ipv4
        std::cout << "v4 src and v6 dst is not supported\n";
        return -1;
      }
      std::memcpy(&filter.dstv6, &dst_addr.v6daddr, 16);
      filter.ipv6 = true;
    } else {
      if (filter.ipv6) {
        // src is specified and it's ipv6
        std::cout << "v6 src and v4 dst is not supported\n";
        return -1;
      }
      filter.dst = dst_addr.daddr;
    }
  }
  if (FLAGS_snaplen < 0 || FLAGS_snaplen > 0xFFFF) {
    std::cout << "snaplen should be between 0 and 65535."
              << " Set to 0 to capture whole packet." << std::endl;
    return -1;
  }

  if (FLAGS_sport != 0) {
    filter.flags |= xdpdump::kSportSet;
    filter.sport = (uint16_t)FLAGS_sport;
  }
  if (FLAGS_dport != 0) {
    filter.flags |= xdpdump::kDportSet;
    filter.dport = (uint16_t)FLAGS_dport;
  }
  if (FLAGS_proto != 0) {
    filter.flags |= xdpdump::kProtoSet;
    filter.proto = (uint8_t)FLAGS_proto;
  }

  filter.offset = (uint16_t)FLAGS_offset;
  filter.offset_len = (uint16_t)FLAGS_offset_len;
  filter.pattern = (uint32_t)FLAGS_pattern;
  filter.map_path = FLAGS_map_path;
  filter.mute = FLAGS_mute;
  filter.cpu = FLAGS_cpu;
  filter.pages = FLAGS_bpf_mmap_pages;
  // end of parsing

  std::shared_ptr<PcapWriter> pcapWriter;
  if (!FLAGS_pcap_path.empty()) {
    auto fileWriter = std::make_shared<katran::FileWriter>(FLAGS_pcap_path);
    pcapWriter = std::make_shared<PcapWriter>(
        fileWriter, FLAGS_packet_limit, FLAGS_snaplen);
  }

  auto evb = folly::EventBaseManager::get()->getEventBase();
  xdpdump::XdpDump xdpdump(evb, filter, pcapWriter);

  try {
    if (FLAGS_clear) {
      xdpdump.clear();
    } else {
      // if (FLAGS_duration_ms.count() != 0) {
      //  xdpdump.scheduleTimeout(FLAGS_duration_ms);
      //}
      xdpdump.run();
    }
  } catch (const std::runtime_error& e) {
    LOG(ERROR) << "XdpDump error: " << e.what();
  }
  return 0;
}