diff options
Diffstat (limited to 'resources/libraries')
-rw-r--r-- | resources/libraries/python/PacketVerifier.py | 62 | ||||
-rw-r--r-- | resources/libraries/robot/ipv4.robot | 5 | ||||
-rw-r--r-- | resources/libraries/robot/ipv6.robot | 11 |
3 files changed, 44 insertions, 34 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. diff --git a/resources/libraries/robot/ipv4.robot b/resources/libraries/robot/ipv4.robot index 6fb2b753ba..d279892ec3 100644 --- a/resources/libraries/robot/ipv4.robot +++ b/resources/libraries/robot/ipv4.robot @@ -88,11 +88,12 @@ | | ${src_mac}= | Get Interface Mac | ${src_node} | ${src_port} | | ${dst_mac}= | Get Interface Mac | ${dst_node} | ${dst_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} -| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} | ${src_mac} -| | | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} +| | | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} | | ${args}= | Set Variable | | ... | ${args} --start_size ${start_size} --end_size ${end_size} --step ${step} | | Run Traffic Script On Node | ipv4_sweep_ping.py | ${src_node} | ${args} +| | ... | timeout=${180} | Send ARP request and validate response | | [Arguments] | ${tg_node} | ${vpp_node} diff --git a/resources/libraries/robot/ipv6.robot b/resources/libraries/robot/ipv6.robot index ed4259cb73..c6bf2922cb 100644 --- a/resources/libraries/robot/ipv6.robot +++ b/resources/libraries/robot/ipv6.robot @@ -53,16 +53,19 @@ | | Compute Path | | ${src_port} | ${src_node}= | First Interface | | ${dst_port} | ${dst_node}= | Last Interface -| | ${src_ip}= | Get Node Port Ipv6 Address | ${src_node} | ${src_port} | ${nodes_addr} -| | ${dst_ip}= | Get Node Port Ipv6 Address | ${dst_node} | ${dst_port} | ${nodes_addr} +| | ${src_ip}= | Get Node Port Ipv6 Address | ${src_node} | ${src_port} +| | ... | ${nodes_addr} +| | ${dst_ip}= | Get Node Port Ipv6 Address | ${dst_node} | ${dst_port} +| | ... | ${nodes_addr} | | ${src_mac}= | Get Interface Mac | ${src_node} | ${src_port} | | ${dst_mac}= | Get Interface Mac | ${dst_node} | ${dst_port} | | ${src_port_name}= | Get interface name | ${src_node} | ${src_port} -| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} | ${src_mac} -| | | ... | ${dst_mac} | ${src_ip} | ${dst_ip} +| | ${args}= | Traffic Script Gen Arg | ${src_port_name} | ${src_port_name} +| | | ... | ${src_mac} | ${dst_mac} | ${src_ip} | ${dst_ip} | | ${args}= | Set Variable | | ... | ${args} --start_size ${start_size} --end_size ${end_size} --step ${step} | | Run Traffic Script On Node | ipv6_sweep_ping.py | ${src_node} | ${args} +| | ... | timeout=${180} | Ipv6 tg to dut1 egress | | [Documentation] | Send traffic from TG to first DUT egress interface |