aboutsummaryrefslogtreecommitdiffstats
path: root/resources/libraries/python/PacketVerifier.py
diff options
context:
space:
mode:
authorMatej Klotton <mklotton@cisco.com>2017-01-30 12:36:34 +0100
committerMatej Klotton <mklotton@cisco.com>2017-02-23 16:16:14 +0100
commit66919d66b8ab63369266eaab8db1628501e884aa (patch)
tree7a7ffa4c278244e7b9fe9c30a4972811f93066f2 /resources/libraries/python/PacketVerifier.py
parent8c465631f6029b174e6d2549e1305b5b4cb8b8de (diff)
Add pypcap python requirement
Using pypcap's L2listen instead of standard AF_PACKET scapy can see received Dot1Q tag. Change-Id: Icb3dcb272a9611158a26a83fede7550bba3f367e Signed-off-by: Matej Klotton <mklotton@cisco.com>
Diffstat (limited to 'resources/libraries/python/PacketVerifier.py')
-rw-r--r--resources/libraries/python/PacketVerifier.py62
1 files changed, 34 insertions, 28 deletions
diff --git a/resources/libraries/python/PacketVerifier.py b/resources/libraries/python/PacketVerifier.py
index 793a8feb4b..4500961151 100644
--- a/resources/libraries/python/PacketVerifier.py
+++ b/resources/libraries/python/PacketVerifier.py
@@ -62,14 +62,18 @@
load = 'RT\x00\xca]\x0b\xaa\xbb\xcc\xdd\xee\xff\x08\x06\x00\x01\x08\x00'
"""
-
import os
-import socket
import select
+import interruptingcow
+from scapy.config import conf
from scapy.all import ETH_P_IP, ETH_P_IPV6, ETH_P_ALL, ETH_P_ARP
-from scapy.all import Ether, ARP
from scapy.layers.inet6 import IPv6
+from scapy.layers.l2 import Ether, ARP
+
+# Enable libpcap's L2listen
+conf.use_pcap = True
+import scapy.arch.pcapdnet # pylint: disable=C0413, unused-import
__all__ = ['RxQueue', 'TxQueue', 'Interface', 'create_gratuitous_arp_request',
'auto_pad', 'checksum_equal']
@@ -84,9 +88,6 @@ class PacketVerifier(object):
os.system('sudo echo 1 > /proc/sys/net/ipv6/conf/{0}/disable_ipv6'
.format(interface_name))
os.system('sudo ip link set {0} up promisc on'.format(interface_name))
- self._sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW,
- ETH_P_ALL)
- self._sock.bind((interface_name, ETH_P_ALL))
self._ifname = interface_name
@@ -180,8 +181,7 @@ def packet_reader(interface_name, queue):
:type queue: multiprocessing.Queue
:returns: None
"""
- sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, ETH_P_ALL)
- sock.bind((interface_name, ETH_P_ALL))
+ sock = conf.L2listen(iface=interface_name, type=ETH_P_ALL)
while True:
pkt = sock.recv(0x7fff)
@@ -199,6 +199,7 @@ class RxQueue(PacketVerifier):
"""
def __init__(self, interface_name):
PacketVerifier.__init__(self, interface_name)
+ self._sock = conf.L2listen(iface=interface_name, type=ETH_P_ALL)
def recv(self, timeout=3, ignore=None, verbose=True):
"""Read next received packet.
@@ -220,26 +221,30 @@ class RxQueue(PacketVerifier):
(rlist, _, _) = select.select([self._sock], [], [], timeout)
if self._sock not in rlist:
return None
-
- pkt = self._sock.recv(0x7fff)
- pkt_pad = auto_pad(pkt)
- print'Received packet on {0} of len {1}'.format(self._ifname, len(pkt))
- if verbose:
- Ether(pkt).show2()
- print
-
- if ignore is not None:
- for i, ig_pkt in enumerate(ignore):
- # Auto pad all packets in ignore list
- ignore[i] = auto_pad(ig_pkt)
- for ig_pkt in ignore:
- if ig_pkt == pkt_pad:
- # Found the packet in ignore list, get another one
- # TODO: subtract timeout - time_spent in here
- ignore.remove(ig_pkt)
- return self.recv(timeout, ignore, verbose)
-
- return Ether(pkt)
+ try:
+ with interruptingcow.timeout(timeout,
+ exception=RuntimeError('Timeout')):
+ ignore_list = list()
+ if ignore is not None:
+ for ig_pkt in ignore:
+ # Auto pad all packets in ignore list
+ ignore_list.append(auto_pad(ig_pkt))
+ while True:
+ pkt = self._sock.recv(0x7fff)
+ pkt_pad = auto_pad(pkt)
+ print 'Received packet on {0} of len {1}'\
+ .format(self._ifname, len(pkt))
+ if verbose:
+ pkt.show2() # pylint: disable=no-member
+ print
+ if pkt_pad in ignore_list:
+ ignore_list.remove(pkt_pad)
+ print 'Received packet ignored.'
+ continue
+ else:
+ return pkt
+ except RuntimeError:
+ return None
class TxQueue(PacketVerifier):
@@ -252,6 +257,7 @@ class TxQueue(PacketVerifier):
"""
def __init__(self, interface_name):
PacketVerifier.__init__(self, interface_name)
+ self._sock = conf.L2socket(iface=interface_name, type=ETH_P_ALL)
def send(self, pkt, verbose=True):
"""Send packet out of the bound interface.