From 84c45de446b69f83df919a91bc684da910824d6f Mon Sep 17 00:00:00 2001 From: Stefan Kobza Date: Sat, 13 Feb 2016 00:25:23 +0100 Subject: [PATCH] Remove multiprocessing from PacketVerifier, tune tests. Change-Id: I37b171c50bad97255a42d6f9426f749055357380 Signed-off-by: Stefan Kobza --- resources/libraries/python/PacketVerifier.py | 43 ++++++++++------------- resources/traffic_scripts/icmpv6_echo.py | 6 ---- resources/traffic_scripts/icmpv6_echo_req_resp.py | 26 -------------- resources/traffic_scripts/ipv4_sweep_ping.py | 7 ---- resources/traffic_scripts/ipv6_ns.py | 8 ----- resources/traffic_scripts/ipv6_sweep_ping.py | 6 ---- resources/traffic_scripts/send_ip_icmp.py | 6 +--- 7 files changed, 20 insertions(+), 82 deletions(-) diff --git a/resources/libraries/python/PacketVerifier.py b/resources/libraries/python/PacketVerifier.py index 54f719fa9a..5c304dcc76 100644 --- a/resources/libraries/python/PacketVerifier.py +++ b/resources/libraries/python/PacketVerifier.py @@ -60,11 +60,11 @@ seq = 0x0 ###[ Padding ]### load = 'RT\x00\xca]\x0b\xaa\xbb\xcc\xdd\xee\xff\x08\x06\x00\x01\x08\x00' - >>> rxq._proc.terminate() """ import socket +import select import os import time from multiprocessing import Queue, Process @@ -186,18 +186,9 @@ def packet_reader(interface_name, queue): sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, ETH_P_ALL) sock.bind((interface_name, ETH_P_ALL)) - buf = "" while True: - recvd = sock.recv(1514) - buf = buf + recvd - - pkt = extract_one_packet(buf) - while pkt is not None: - if pkt is None: - break - queue.put(pkt) - buf = buf[len(pkt):] - pkt = extract_one_packet(buf) + pkt = sock.recv(0x7fff) + queue.put(pkt) class RxQueue(PacketVerifier): @@ -213,12 +204,12 @@ class RxQueue(PacketVerifier): def __init__(self, interface_name): PacketVerifier.__init__(self, interface_name) - self._queue = Queue() - self._proc = Process(target=packet_reader, args=(interface_name, - self._queue)) - self._proc.daemon = True - self._proc.start() - time.sleep(2) + #self._queue = Queue() + #self._proc = Process(target=packet_reader, args=(interface_name, + # self._queue)) + #self._proc.daemon = True + #self._proc.start() + #time.sleep(2) def recv(self, timeout=3, ignore=None): """Read next received packet. @@ -234,7 +225,12 @@ class RxQueue(PacketVerifier): :rtype: scapy.Ether """ - pkt = self._queue.get(True, timeout=timeout) + #pkt = self._queue.get(True, timeout=timeout) + (rlist, _, _) = select.select([self._sock], [], [], timeout) + if self._sock not in rlist: + return None + + pkt = self._sock.recv(0x7fff) if ignore is not None: for i, ig_pkt in enumerate(ignore): @@ -267,9 +263,7 @@ class TxQueue(PacketVerifier): :param pkt: Packet to send. :type pkt: string or scapy Packet derivative. """ - if isinstance(pkt, Packet): - pkt = str(pkt) - pkt = auto_pad(pkt) + pkt = auto_pad(str(pkt)) self._sock.send(pkt) @@ -277,8 +271,8 @@ class Interface(object): def __init__(self, if_name): self.if_name = if_name self.sent_packets = [] - self.txq = TxQueue(if_name) self.rxq = RxQueue(if_name) + self.txq = TxQueue(if_name) def send_pkt(self, pkt): self.sent_packets.append(pkt) @@ -288,7 +282,8 @@ class Interface(object): return self.rxq.recv(timeout, self.sent_packets) def close(self): - self.rxq._proc.terminate() + #self.rxq._proc.terminate() + pass def create_gratuitous_arp_request(src_mac, src_ip): diff --git a/resources/traffic_scripts/icmpv6_echo.py b/resources/traffic_scripts/icmpv6_echo.py index c3c8d5a381..9e9a952d58 100755 --- a/resources/traffic_scripts/icmpv6_echo.py +++ b/resources/traffic_scripts/icmpv6_echo.py @@ -58,18 +58,15 @@ def main(): # receive ICMPv6 echo reply ether = rxq.recv(2, sent_packets) if ether is None: - rxq._proc.terminate() raise RuntimeError('ICMPv6 echo reply Rx timeout') if not ether.haslayer(IPv6): - rxq._proc.terminate() raise RuntimeError('Unexpected packet with no IPv6 received {0}'.format( ether.__repr__())) ipv6 = ether['IPv6'] if not ipv6.haslayer(ICMPv6EchoReply): - rxq._proc.terminate() raise RuntimeError( 'Unexpected packet with no IPv6 ICMP received {0}'.format( ipv6.__repr__())) @@ -78,7 +75,6 @@ def main(): # check identifier and sequence number if icmpv6.id != echo_id or icmpv6.seq != echo_seq: - rxq._proc.terminate() raise RuntimeError( 'Invalid ICMPv6 echo reply received ID {0} seq {1} should be ' + 'ID {2} seq {3}'.format(icmpv6.id, icmpv6.seq, echo_id, echo_seq)) @@ -88,11 +84,9 @@ def main(): del icmpv6.cksum tmp = ICMPv6EchoReply(str(icmpv6)) if tmp.cksum != cksum: - rxq._proc.terminate() raise RuntimeError( 'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum)) - rxq._proc.terminate() sys.exit(0) if __name__ == "__main__": diff --git a/resources/traffic_scripts/icmpv6_echo_req_resp.py b/resources/traffic_scripts/icmpv6_echo_req_resp.py index 24f4faa3f4..48cbda22ae 100755 --- a/resources/traffic_scripts/icmpv6_echo_req_resp.py +++ b/resources/traffic_scripts/icmpv6_echo_req_resp.py @@ -73,13 +73,9 @@ def main(): # receive ICMPv6 echo request on second TG interface ether = dst_rxq.recv(2, dst_sent_packets) if ether is None: - src_rxq._proc.terminate() - dst_rxq._proc.terminate() raise RuntimeError('ICMPv6 echo reply Rx timeout') if not ether.haslayer(IPv6): - src_rxq._proc.terminate() - dst_rxq._proc.terminate() raise RuntimeError('Unexpected packet with no IPv6 received {0}'.format( ether.__repr__())) @@ -87,15 +83,11 @@ def main(): # verify hop limit processing if ipv6.hlim != (hop_limit - hop_num): - src_rxq._proc.terminate() - dst_rxq._proc.terminate() raise RuntimeError( 'Invalid hop limit {0} should be {1}'.format(ipv6.hlim, hop_limit - hop_num)) if not ipv6.haslayer(ICMPv6EchoRequest): - src_rxq._proc.terminate() - dst_rxq._proc.terminate() raise RuntimeError( 'Unexpected packet with no IPv6 ICMP received {0}'.format( ipv6.__repr__())) @@ -104,8 +96,6 @@ def main(): # check identifier and sequence number if icmpv6.id != echo_id or icmpv6.seq != echo_seq: - src_rxq._proc.terminate() - dst_rxq._proc.terminate() raise RuntimeError( 'Invalid ICMPv6 echo reply received ID {0} seq {1} should be ' + 'ID {2} seq {3}'.format(icmpv6.id, icmpv6.seq, echo_id, echo_seq)) @@ -115,8 +105,6 @@ def main(): del icmpv6.cksum tmp = ICMPv6EchoRequest(str(icmpv6)) if tmp.cksum != cksum: - src_rxq._proc.terminate() - dst_rxq._proc.terminate() raise RuntimeError( 'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum)) @@ -130,13 +118,9 @@ def main(): # receive ICMPv6 echo reply on first TG interface ether = src_rxq.recv(2, src_sent_packets) if ether is None: - src_rxq._proc.terminate() - dst_rxq._proc.terminate() raise RuntimeError('ICMPv6 echo reply Rx timeout') if not ether.haslayer(IPv6): - src_rxq._proc.terminate() - dst_rxq._proc.terminate() raise RuntimeError('Unexpected packet with no IPv6 received {0}'.format( ether.__repr__())) @@ -144,15 +128,11 @@ def main(): # verify hop limit processing if ipv6.hlim != (hop_limit - hop_num): - src_rxq._proc.terminate() - dst_rxq._proc.terminate() raise RuntimeError( 'Invalid hop limit {0} should be {1}'.format(ipv6.hlim, hop_limit - hop_num)) if not ipv6.haslayer(ICMPv6EchoReply): - src_rxq._proc.terminate() - dst_rxq._proc.terminate() raise RuntimeError( 'Unexpected packet with no IPv6 ICMP received {0}'.format( ipv6.__repr__())) @@ -161,8 +141,6 @@ def main(): # check identifier and sequence number if icmpv6.id != echo_id or icmpv6.seq != echo_seq: - src_rxq._proc.terminate() - dst_rxq._proc.terminate() raise RuntimeError( 'Invalid ICMPv6 echo reply received ID {0} seq {1} should be ' + 'ID {2} seq {3}'.format(icmpv6.id, icmpv6.seq, echo_id, echo_seq)) @@ -172,13 +150,9 @@ def main(): del icmpv6.cksum tmp = ICMPv6EchoReply(str(icmpv6)) if tmp.cksum != cksum: - src_rxq._proc.terminate() - dst_rxq._proc.terminate() raise RuntimeError( 'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum)) - src_rxq._proc.terminate() - dst_rxq._proc.terminate() sys.exit(0) if __name__ == "__main__": diff --git a/resources/traffic_scripts/ipv4_sweep_ping.py b/resources/traffic_scripts/ipv4_sweep_ping.py index 4b82a9b03e..5005345250 100755 --- a/resources/traffic_scripts/ipv4_sweep_ping.py +++ b/resources/traffic_scripts/ipv4_sweep_ping.py @@ -64,12 +64,10 @@ def main(): ether = rxq.recv(ignore=sent_packets) if ether is None: - rxq._proc.terminate() raise RuntimeError( 'ICMP echo reply seq {0} Rx timeout'.format(echo_seq)) if not ether.haslayer(IP): - rxq._proc.terminate() raise RuntimeError( 'Unexpected packet with no IPv4 received {0}'.format( ether.__repr__())) @@ -77,7 +75,6 @@ def main(): ipv4 = ether['IP'] if not ipv4.haslayer(ICMP): - rxq._proc.terminate() raise RuntimeError( 'Unexpected packet with no ICMP received {0}'.format( ipv4.__repr__())) @@ -85,7 +82,6 @@ def main(): icmpv4 = ipv4['ICMP'] if icmpv4.id != echo_id or icmpv4.seq != echo_seq: - rxq._proc.terminate() raise RuntimeError( 'Invalid ICMP echo reply received ID {0} seq {1} should be ' + 'ID {2} seq {3}, {0}'.format(icmpv4.id, icmpv4.seq, echo_id, @@ -95,17 +91,14 @@ def main(): del icmpv4.chksum tmp = ICMP(str(icmpv4)) if tmp.chksum != chksum: - rxq._proc.terminate() raise RuntimeError( 'Invalid checksum {0} should be {1}'.format(chksum, tmp.chksum)) recv_payload_len = ipv4.len - 20 - 8 load = tmp['Raw'].load[0:recv_payload_len] if load != data[0:echo_seq]: - rxq._proc.terminate() raise RuntimeError( 'Received ICMP payload does not match sent payload') - rxq._proc.terminate() sys.exit(0) if __name__ == "__main__": diff --git a/resources/traffic_scripts/ipv6_ns.py b/resources/traffic_scripts/ipv6_ns.py index dd1adad39e..cfdca41ec9 100755 --- a/resources/traffic_scripts/ipv6_ns.py +++ b/resources/traffic_scripts/ipv6_ns.py @@ -49,18 +49,15 @@ def main(): # receive ICMPv6 neighbor advertisement message ether = rxq.recv(2, sent_packets) if ether is None: - rxq._proc.terminate() raise RuntimeError('ICMPv6 echo reply Rx timeout') if not ether.haslayer(IPv6): - rxq._proc.terminate() raise RuntimeError('Unexpected packet with no IPv6 received {0}'.format( ether.__repr__())) ipv6 = ether['IPv6'] if not ipv6.haslayer(ICMPv6ND_NA): - rxq._proc.terminate() raise RuntimeError( 'Unexpected packet with no ICMPv6 ND-NA received {0}'.format( ipv6.__repr__())) @@ -69,12 +66,10 @@ def main(): # verify target address if icmpv6_na.tgt != dst_ip: - rxq._proc.terminate() raise RuntimeError('Invalid target address {0} should be {1}'.format( icmpv6_na.tgt, dst_ip)) if not icmpv6_na.haslayer(ICMPv6NDOptDstLLAddr): - rxq._proc.terminate() raise RuntimeError( 'Missing Destination Link-Layer Address option in ICMPv6 ' + 'Neighbor Advertisement {0}'.format(icmpv6_na.__repr__())) @@ -84,7 +79,6 @@ def main(): # verify destination link-layer address field if dst_ll_addr.lladdr != dst_mac: - rxq._proc.terminate() raise RuntimeError('Invalid lladdr {0} should be {1}'.format( dst_ll_addr.lladdr, dst_mac)) @@ -93,11 +87,9 @@ def main(): del icmpv6_na.cksum tmp = ICMPv6ND_NA(str(icmpv6_na)) if tmp.cksum != cksum: - rxq._proc.terminate() raise RuntimeError( 'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum)) - rxq._proc.terminate() sys.exit(0) if __name__ == "__main__": diff --git a/resources/traffic_scripts/ipv6_sweep_ping.py b/resources/traffic_scripts/ipv6_sweep_ping.py index c79b74d760..c1fe7d3f70 100755 --- a/resources/traffic_scripts/ipv6_sweep_ping.py +++ b/resources/traffic_scripts/ipv6_sweep_ping.py @@ -68,12 +68,10 @@ def main(): ether = rxq.recv(ignore=sent_packets) if ether is None: - rxq._proc.terminate() raise RuntimeError( 'ICMPv6 echo reply seq {0} Rx timeout'.format(echo_seq)) if not ether.haslayer(IPv6): - rxq._proc.terminate() raise RuntimeError( 'Unexpected packet with no IPv6 received {0}'.format( ether.__repr__())) @@ -81,7 +79,6 @@ def main(): ipv6 = ether['IPv6'] if not ipv6.haslayer(ICMPv6EchoReply): - rxq._proc.terminate() raise RuntimeError( 'Unexpected packet with no IPv6 ICMP received {0}'.format( ipv6.__repr__())) @@ -89,7 +86,6 @@ def main(): icmpv6 = ipv6['ICMPv6 Echo Reply'] if icmpv6.id != echo_id or icmpv6.seq != echo_seq: - rxq._proc.terminate() raise RuntimeError( 'Invalid ICMPv6 echo reply received ID {0} seq {1} should be ' + 'ID {2} seq {3}, {0}'.format(icmpv6.id, icmpv6.seq, echo_id, @@ -99,11 +95,9 @@ def main(): del icmpv6.cksum tmp = ICMPv6EchoReply(str(icmpv6)) if tmp.cksum != cksum: - rxq._proc.terminate() raise RuntimeError( 'Invalid checksum {0} should be {1}'.format(cksum, tmp.cksum)) - rxq._proc.terminate() sys.exit(0) if __name__ == "__main__": diff --git a/resources/traffic_scripts/send_ip_icmp.py b/resources/traffic_scripts/send_ip_icmp.py index fd15376fb1..5e365ebc38 100755 --- a/resources/traffic_scripts/send_ip_icmp.py +++ b/resources/traffic_scripts/send_ip_icmp.py @@ -47,24 +47,20 @@ def main(): sent_packets.append(pkt_raw) txq.send(pkt_raw) - ether = rxq.recv(1) + ether = rxq.recv(10) # Check whether received packet contains layers Ether, IP and ICMP if ether is None: - rxq._proc.terminate() raise RuntimeError('ICMPv6 echo reply Rx timeout') if not ether.haslayer(IP): - rxq._proc.terminate() raise RuntimeError( 'Not an IP packet received {0}'.format(ether.__repr__())) if not ether.haslayer(ICMP): - rxq._proc.terminate() raise RuntimeError( 'Not an ICMP packet received {0}'.format(ether.__repr__())) - rxq._proc.terminate() sys.exit(0) if __name__ == "__main__": -- 2.16.6