diff options
author | Matej Klotton <mklotton@cisco.com> | 2017-01-30 12:36:34 +0100 |
---|---|---|
committer | Matej Klotton <mklotton@cisco.com> | 2017-02-23 16:16:14 +0100 |
commit | 66919d66b8ab63369266eaab8db1628501e884aa (patch) | |
tree | 7a7ffa4c278244e7b9fe9c30a4972811f93066f2 /resources/libraries/python/PacketVerifier.py | |
parent | 8c465631f6029b174e6d2549e1305b5b4cb8b8de (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.py | 62 |
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. |