Skip to content

Commit 59f2fb1

Browse files
author
Guillaume Valadon
committed
Accept Scapy Packets as offline inputs
1 parent 10af736 commit 59f2fb1

File tree

2 files changed

+29
-2
lines changed

2 files changed

+29
-2
lines changed

scapy/sendrecv.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from scapy.data import ETH_P_ALL
2121
from scapy.config import conf
2222
from scapy.error import warning
23-
from scapy.packet import Gen
23+
from scapy.packet import Gen, Packet
2424
from scapy.utils import get_temp_file, tcpdump, wrpcap, \
2525
ContextManagerSubprocess, PcapReader
2626
from scapy.plist import PacketList, SndRcvList
@@ -772,7 +772,8 @@ def _run(self,
772772
message = "tcpdump is not available. Cannot use filter!"
773773
raise Scapy_Exception(message)
774774

775-
if isinstance(offline, list):
775+
if isinstance(offline, list) and \
776+
all(isinstance(elt, str) for elt in offline):
776777
sniff_sockets.update((PcapReader(
777778
fname if flt is None else
778779
tcpdump(fname, args=["-w", "-", flt], getfd=True)
@@ -783,6 +784,18 @@ def _run(self,
783784
tcpdump(fname, args=["-w", "-", flt], getfd=True)
784785
), label) for fname, label in six.iteritems(offline))
785786
else:
787+
# Write Scapy Packet objects to a pcap file
788+
def _write_to_pcap(packets_list):
789+
filename = get_temp_file(autoext=".pcap")
790+
wrpcap(filename, offline)
791+
return filename, filename
792+
793+
if isinstance(offline, Packet):
794+
tempfile_written, offline = _write_to_pcap([offline])
795+
elif isinstance(offline, list) and \
796+
all(isinstance(elt, Packet) for elt in offline):
797+
tempfile_written, offline = _write_to_pcap(offline)
798+
786799
sniff_sockets[PcapReader(
787800
offline if flt is None else
788801
tcpdump(offline, args=["-w", "-", flt], getfd=True)

test/regression.uts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6728,6 +6728,20 @@ fdesc.close()
67286728
assert list(pktpcap[TCP]) == list(pktpcap_tcp)
67296729
os.unlink(filename)
67306730

6731+
= Check offline sniff() with Packets and tcpdump
6732+
~ tcpdump
6733+
6734+
l = sniff(offline=IP()/UDP(sport=(10000, 10001)), filter="udp")
6735+
assert len(l) == 2
6736+
assert(all(UDP in p for p in l))
6737+
6738+
l = sniff(offline=[p for p in IP()/UDP(sport=(10000, 10001))], filter="udp")
6739+
assert len(l) == 2
6740+
assert(all(UDP in p for p in l))
6741+
6742+
l = sniff(offline=IP()/UDP(sport=(10000, 10001)), filter="tcp")
6743+
assert len(l) == 0
6744+
67316745
= Check offline sniff() without a tcpdump binary
67326746
~ tcpdump
67336747
import mock

0 commit comments

Comments
 (0)