From: bert hubert Date: Sat, 15 Mar 2014 18:14:45 +0000 (+0100) Subject: make sure --help works, hook up --verbose/-v, properly detect & for now ignore fragme... X-Git-Tag: rec-3.6.0-rc1~135 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=be427910bb3d411a2a4228478c7aabcae46f1226;p=thirdparty%2Fpdns.git make sure --help works, hook up --verbose/-v, properly detect & for now ignore fragmented datagrams --- diff --git a/pdns/dnsscope.cc b/pdns/dnsscope.cc index 9315325eee..60704a0041 100644 --- a/pdns/dnsscope.cc +++ b/pdns/dnsscope.cc @@ -44,6 +44,7 @@ try ("rd", po::value(), "If set to true, only process RD packets, to false only non-RD, unset: both") ("ipv4", po::value()->default_value(true), "Process IPv4 packets") ("ipv6", po::value()->default_value(true), "Process IPv6 packets") + ("write-failures,w", po::value()->default_value(""), "if set, write weird packets to this PCAP file") ("verbose,v", "be verbose"); hidden.add_options() @@ -56,14 +57,18 @@ try po::store(po::command_line_parser(argc, argv).options(alloptions).positional(p).run(), g_vm); po::notify(g_vm); - - vector files = g_vm["files"].as >(); + + vector files; + if(g_vm.count("files")) + files = g_vm["files"].as >(); if(files.size() != 1 || g_vm.count("help")) { cerr<<"Syntax: dnsscope filename.pcap"<(); @@ -75,16 +80,15 @@ try PcapPacketReader pr(files[0]); PcapPacketWriter* pw=0; - /* - if(argc==3) - pw=new PcapPacketWriter(argv[2], pr); - */ + if(!g_vm["write-failures"].as().empty()) + pw=new PcapPacketWriter(g_vm["write-failures"].as(), pr); + int dnserrors=0, bogus=0; typedef map cumul_t; cumul_t cumul; unsigned int untracked=0, errorresult=0, reallylate=0, nonRDQueries=0, queries=0; - unsigned int ipv4Packets=0, ipv6Packets=0; + unsigned int ipv4Packets=0, ipv6Packets=0, fragmented=0; typedef map rcodes_t; rcodes_t rcodes; @@ -98,6 +102,13 @@ try try { if((pr.d_ip->ip_v == 4 && !doIPv4) || (pr.d_ip->ip_v == 6 && !doIPv6)) continue; + if(pr.d_ip->ip_v ==4) { + uint16_t frag = ntohs(pr.d_ip->ip_off); + if((frag & IP_MF) || (frag & IP_OFFMASK)) { // more fragments or IS a fragment + fragmented++; + continue; + } + } MOADNSParser mdp((const char*)pr.d_payload, pr.d_len); if(haveRDFilter && mdp.d_header.rd != rdFilter) continue; @@ -158,13 +169,17 @@ try rcodes[mdp.d_header.rcode]++; } catch(MOADNSException& mde) { - // cerr<<"error parsing packet: "<write(); dnserrors++; continue; } catch(std::exception& e) { + if(verbose) + cout<<"error parsing packet: "<write(); bogus++; @@ -176,6 +191,7 @@ try cout<<"Saw "<