X-Git-Url: https://gerrit.fd.io/r/gitweb?p=csit.git;a=blobdiff_plain;f=resources%2Ftraffic_scripts%2Fipv6_sweep_ping.py;h=28d23a16ef9d94723b2dd54231a0491b50d1b99e;hp=c79b74d76067f6a9ba5de39852b459a5f2a06f9f;hb=eecad36d7d2275fa47fbcab40dbcf56108ab0a51;hpb=b92a827b1c7f48da4214e992e5503ebe1c182416 diff --git a/resources/traffic_scripts/ipv6_sweep_ping.py b/resources/traffic_scripts/ipv6_sweep_ping.py index c79b74d760..28d23a16ef 100755 --- a/resources/traffic_scripts/ipv6_sweep_ping.py +++ b/resources/traffic_scripts/ipv6_sweep_ping.py @@ -15,15 +15,22 @@ """Traffic script for IPv6 sweep ping.""" -import sys import logging import os +import sys + +# pylint: disable=no-name-in-module +# pylint: disable=import-error logging.getLogger("scapy.runtime").setLevel(logging.ERROR) + +from scapy.all import Ether +from scapy.layers.inet6 import IPv6, ICMPv6ND_NA, ICMPv6ND_NS +from scapy.layers.inet6 import ICMPv6NDOptDstLLAddr +from scapy.layers.inet6 import ICMPv6EchoRequest, ICMPv6EchoReply + from resources.libraries.python.PacketVerifier import RxQueue, TxQueue +from resources.libraries.python.PacketVerifier import checksum_equal from resources.libraries.python.TrafficScriptArg import TrafficScriptArg -from scapy.layers.inet6 import IPv6, ICMPv6ND_NA, ICMPv6NDOptDstLLAddr -from scapy.layers.inet6 import ICMPv6EchoRequest, ICMPv6EchoReply -from scapy.all import Ether def main(): @@ -50,61 +57,64 @@ def main(): # send ICMPv6 neighbor advertisement message sent_packets = [] pkt_send = (Ether(src=src_mac, dst=dst_mac) / - IPv6(src=src_ip, dst=dst_ip) / - ICMPv6ND_NA(tgt=src_ip, R=0) / - ICMPv6NDOptDstLLAddr(lladdr=src_mac)) + IPv6(src=src_ip, dst=dst_ip) / + ICMPv6ND_NA(tgt=src_ip, R=0) / + ICMPv6NDOptDstLLAddr(lladdr=src_mac)) sent_packets.append(pkt_send) txq.send(pkt_send) # send ICMPv6 echo request with incremented data length and receive ICMPv6 # echo reply - for echo_seq in range(start_size, end_size+1, step): + for echo_seq in range(start_size, end_size + 1, step): pkt_send = (Ether(src=src_mac, dst=dst_mac) / - IPv6(src=src_ip, dst=dst_ip) / - ICMPv6EchoRequest(id=echo_id, seq=echo_seq, - data=data[0:echo_seq])) + IPv6(src=src_ip, dst=dst_ip) / + ICMPv6EchoRequest(id=echo_id, seq=echo_seq, + data=data[0:echo_seq])) sent_packets.append(pkt_send) txq.send(pkt_send) - 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)) + while True: + ether = rxq.recv(ignore=sent_packets) + if ether is None: + raise RuntimeError('ICMPv6 echo reply seq {0} ' + 'Rx timeout'.format(echo_seq)) + + if ether.haslayer(ICMPv6ND_NS): + # read another packet in the queue in case of ICMPv6ND_NS packet + continue + else: + # otherwise process the current packet + break if not ether.haslayer(IPv6): - rxq._proc.terminate() - raise RuntimeError( - 'Unexpected packet with no IPv6 received {0}'.format( - ether.__repr__())) + raise RuntimeError('Unexpected packet with no IPv6 layer ' + 'received: {0}'.format(ether.__repr__())) - ipv6 = ether['IPv6'] + ipv6 = ether[IPv6] if not ipv6.haslayer(ICMPv6EchoReply): - rxq._proc.terminate() - raise RuntimeError( - 'Unexpected packet with no IPv6 ICMP received {0}'.format( - ipv6.__repr__())) + raise RuntimeError('Unexpected packet with no ICMPv6 echo reply ' + 'layer received: {0}'.format(ipv6.__repr__())) - icmpv6 = ipv6['ICMPv6 Echo Reply'] + icmpv6 = ipv6[ICMPv6EchoReply] 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, - echo_seq)) + raise RuntimeError('ICMPv6 echo reply with invalid data received: ' + 'ID {0} seq {1} should be ID {2} seq {3}, {0}'. + format(icmpv6.id, icmpv6.seq, echo_id, + echo_seq)) cksum = icmpv6.cksum 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)) + if not checksum_equal(tmp.cksum, cksum): + raise RuntimeError('Invalid checksum: {0} should be {1}'. + format(cksum, tmp.cksum)) + + sent_packets.remove(pkt_send) - rxq._proc.terminate() sys.exit(0) + if __name__ == "__main__": main()