From 275a346804e3b0783ca6732fd661d58ec3518cf5 Mon Sep 17 00:00:00 2001 From: david Date: Thu, 17 Sep 2009 22:50:09 +0000 Subject: [PATCH] Add a BPF filter to traceroute so we only get packets sent to our own source address; i.e., not the packets we send. --- traceroute.cc | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/traceroute.cc b/traceroute.cc index d251635ba..f051131c3 100644 --- a/traceroute.cc +++ b/traceroute.cc @@ -750,6 +750,10 @@ Probe *Probe::make(HostState *host, struct probespec pspec, u8 ttl) TracerouteState::TracerouteState(std::vector &targets) { std::vector::iterator it; + struct sockaddr_storage srcaddr; + size_t sslen; + char pcap_filter[128]; + int n; assert(targets.size() > 0); @@ -774,6 +778,12 @@ TracerouteState::TracerouteState(std::vector &targets) { /* Assume that all the targets share the same device. */ pd = my_pcap_open_live(targets[0]->deviceName(), 128, o.spoofsource, 2); + sslen = sizeof(srcaddr); + targets[0]->SourceSockAddr(&srcaddr, &sslen); + n = Snprintf(pcap_filter, sizeof(pcap_filter), "dst host %s", + ss_to_string(&srcaddr)); + assert(n < (int) sizeof(pcap_filter)); + set_pcap_filter(targets[0]->deviceFullName(), pd, pcap_filter); for (it = targets.begin(); it != targets.end(); it++) { HostState *state = new HostState(*it);