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;
}