Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions demos/03-pcap-demo.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from time import sleep

from libAnt.drivers.pcap import PcapDriver
from libAnt.loggers.pcap import PcapLogger
from libAnt.node import Node
from libAnt.profiles.factory import Factory

Expand All @@ -14,8 +15,8 @@ def eCallback(e):
print(e)


with Node(PcapDriver('demo-capture-1.pcap'), 'PcapNode1') as n:
with Node(PcapDriver('log-0.pcap', loopplayback=True), 'PcapNode1') as n:
# n.enableRxScanMode() # Pcap driver is read-only
f = Factory(callback)
n.start(f.parseMessage, eCallback)
sleep(30) # Listen for 30sec
sleep(10)
60 changes: 33 additions & 27 deletions libAnt/drivers/pcap.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,53 +8,59 @@


class PcapDriver(Driver):
def __init__(self, pcap : str, logger: Logger = None):
def __init__(self, pcap : str, logger: Logger = None, loopplayback: bool = False):
super().__init__(logger=logger)
self._isopen = False
self._pcap = pcap
self._loopplayback = loopplayback
self._buffer = Queue()

self._loop = None

class PcapLoop(Thread):
def __init__(self, pcap, buffer: Queue):
def __init__(self, pcap, buffer: Queue, loopplayback):
super().__init__()
self._stopper = Event()
self._pcap = pcap
self._loopplayback = loopplayback
self._buffer = buffer

def stop(self) -> None:
self._stopper.set()

def run(self) -> None:
self._pcapfile = open(self._pcap, 'rb')
# move file pointer to first packet header
global_header_length = 24
self._pcapfile.seek(global_header_length, 0)

first_ts = 0
start_time = time.time()
while not self._stopper.is_set():
try:
ts_sec, = unpack('i', self._pcapfile.read(4))
except error:
# move file pointer to first packet header
global_header_length = 24
self._pcapfile.seek(global_header_length, 0)

first_ts = 0
start_time = time.time()
while not self._stopper.is_set():
try:
ts_sec, = unpack('i', self._pcapfile.read(4))
except error:
break
ts_usec = unpack('i', self._pcapfile.read(4))[0] / 1000000

if first_ts is 0:
first_ts = ts_sec + ts_usec

ts = ts_sec + ts_usec
send_time = ts - first_ts
elapsed_time = time.time() - start_time
if send_time > elapsed_time:
sleep_time = send_time - elapsed_time
time.sleep(sleep_time)

packet_length = unpack('i', self._pcapfile.read(4))[0]
self._pcapfile.seek(4, 1)
for i in range(packet_length):
self._buffer.put(self._pcapfile.read(1))
if not self._loopplayback:
break
ts_usec = unpack('i', self._pcapfile.read(4))[0] / 1000000

if first_ts is 0:
first_ts = ts_sec + ts_usec

ts = ts_sec + ts_usec
send_time = ts - first_ts
elapsed_time = time.time() - start_time
if send_time > (elapsed_time):
sleep_time = send_time - elapsed_time
time.sleep(sleep_time)

packet_length = unpack('i', self._pcapfile.read(4))[0]
self._pcapfile.seek(4, 1)
for i in range(packet_length):
self._buffer.put(self._pcapfile.read(1))

self._pcapfile.close()

Expand All @@ -63,7 +69,7 @@ def _isOpen(self) -> bool:

def _open(self) -> None:
self._isopen = True
self._loop = self.PcapLoop(self._pcap, self._buffer)
self._loop = self.PcapLoop(self._pcap, self._buffer, self._loopplayback)
self._loop.start()

def _close(self) -> None:
Expand Down