[tor-commits] [ooni-probe/master] Refactor Parasitictraceroute.
art at torproject.org
art at torproject.org
Mon Sep 22 20:30:49 UTC 2014
commit 5a924d156bc567a3319241645df700d6f4b9023f
Author: aagbsn <aagbsn at extc.org>
Date: Wed Aug 20 14:23:04 2014 +0000
Refactor Parasitictraceroute.
In particular, scapy.supersocket.L3RawSocket does not capture
transmitted packets.
---
ooni/nettests/experimental/parasitictraceroute.py | 13 +++++++-----
ooni/utils/txscapy.py | 22 +++++++++++----------
2 files changed, 20 insertions(+), 15 deletions(-)
diff --git a/ooni/nettests/experimental/parasitictraceroute.py b/ooni/nettests/experimental/parasitictraceroute.py
index 9526455..882d25a 100644
--- a/ooni/nettests/experimental/parasitictraceroute.py
+++ b/ooni/nettests/experimental/parasitictraceroute.py
@@ -1,5 +1,6 @@
from twisted.python import usage
from twisted.internet import defer, reactor
+from ooni.errors import handleAllFailures
from ooni.templates import scapyt
from ooni.utils import log
from ooni.utils.txscapy import ParasiticTraceroute
@@ -14,19 +15,23 @@ class ParasiticTracerouteTest(scapyt.BaseScapyTest):
samplePeriod = 40
requiresTor = False
- requiresRoot = False
def setUp(self):
self.report['parasitic_traceroute'] = {}
def test_parasitic_traceroute(self):
self.pt = ParasiticTraceroute()
+ log.debug("Starting ParasiticTraceroute for up to %d hosts at inject "
+ "rate %d with %s" % (self.pt.numHosts, self.pt.rate, self.pt))
config.scapyFactory.registerProtocol(self.pt)
d = defer.Deferred()
- reactor.callLater(self.samplePeriod, d.callback, self.pt)
+ reactor.callLater(self.samplePeriod, d.callback, self)
+ d.addCallback(self.addToReport)
+ d.addErrback(handleAllFailures)
return d
- def postProcessor(self, *args, **kwargs):
+ def addToReport(self, result):
+ log.debug("Stopping ParasiticTraceroute")
self.pt.stopListening()
self.report['received_packets'] = self.pt.received_packets
@@ -46,5 +51,3 @@ class ParasiticTracerouteTest(scapyt.BaseScapyTest):
self.report['parasitic_traceroute'][p].sort(key=lambda x: x[0])
self.report['sent_packets'] = self.pt.sent_packets
- return self.report
-
diff --git a/ooni/utils/txscapy.py b/ooni/utils/txscapy.py
index ba90223..e8a27b6 100644
--- a/ooni/utils/txscapy.py
+++ b/ooni/utils/txscapy.py
@@ -160,7 +160,7 @@ class ScapyFactory(abstract.FileDescriptor):
if not super_socket and sys.platform == 'darwin':
super_socket = conf.L3socket(iface=interface, promisc=True, filter='')
elif not super_socket:
- super_socket = L3RawSocket(iface=interface, promisc=True)
+ super_socket = conf.L3socket(iface=interface)
self.protocols = []
fdesc._setCloseOnExec(super_socket.ins.fileno())
@@ -325,6 +325,8 @@ class ParasiticTraceroute(ScapyProtocol):
def sendPacket(self, packet):
self.factory.send(packet)
+ self.sent_packets.append(packet)
+ log.debug("Sent packet to %s with ttl %d" % (packet.dst, packet.ttl))
def packetReceived(self, packet):
try:
@@ -332,24 +334,25 @@ class ParasiticTraceroute(ScapyProtocol):
except IndexError:
return
+ # Add TTL Expired responses.
if isinstance(packet.getlayer(3), TCPerror):
self.received_packets.append(packet)
+ # Live traceroute?
+ log.debug("%s replied with icmp-ttl-exceeded for %s" % (packet.src, packet[IPerror].dst))
return
-
elif packet.dst in self.hosts:
if random.randint(1, 100) > self.rate:
+ # Don't send a packet this time
return
try:
packet[IP].ttl = self.hosts[packet.dst]['ttl'].pop()
del packet.chksum # XXX Why is this incorrect?
- log.debug("Sent packet to %s with ttl %d" % (packet.dst, packet.ttl))
self.sendPacket(packet)
k = (packet.id, packet[TCP].sport, packet[TCP].dport, packet[TCP].seq)
self.matched_packets[k] = {'ttl': packet.ttl}
return
except IndexError:
- pass
- return
+ return
def maxttl(packet=None):
if packet:
@@ -369,17 +372,16 @@ class ParasiticTraceroute(ScapyProtocol):
self.hosts[packet.dst] = {'ttl': genttl()}
log.debug("Tracing to %s" % packet.dst)
-
- elif packet.src not in self.hosts \
+ return
+ if packet.src not in self.hosts \
and packet.src not in self.addresses \
and isinstance(packet.getlayer(1), TCP):
-
self.hosts[packet.src] = {'ttl': genttl(packet),
'ttl_max': maxttl(packet)}
log.debug("Tracing to %s" % packet.src)
- return
+ return
- elif packet.src in self.hosts and not 'ttl_max' in self.hosts[packet.src]:
+ if packet.src in self.hosts and not 'ttl_max' in self.hosts[packet.src]:
self.hosts[packet.src]['ttl_max'] = ttl_max = maxttl(packet)
log.debug("set ttl_max to %d for host %s" % (ttl_max, packet.src))
ttl = []
More information about the tor-commits
mailing list