CSIT-755: Presentation and analytics layer
[csit.git] / resources / traffic_scripts / ipfix_check.py
index 14b5a07..f5693cc 100755 (executable)
 """Traffic script - IPFIX listener."""
 
 import sys
-from ipaddress import IPv4Address, IPv6Address, AddressValueError
 
+from ipaddress import IPv4Address, IPv6Address, AddressValueError
 from scapy.layers.inet import IP, TCP, UDP
 from scapy.layers.inet6 import IPv6
 from scapy.layers.l2 import Ether
 
-from resources.libraries.python.IPFIXUtil import IPFIXHandler, IPFIXData
 from resources.libraries.python.PacketVerifier import RxQueue, TxQueue, auto_pad
 from resources.libraries.python.TrafficScriptArg import TrafficScriptArg
+from resources.libraries.python.telemetry.IPFIXUtil import IPFIXHandler
+from resources.libraries.python.telemetry.IPFIXUtil import IPFIXData
 
 
 def valid_ipv4(ip):
@@ -81,7 +82,6 @@ def main():
     rxq = RxQueue(tx_if)
 
     # generate simple packet based on arguments
-    ip_version = None
     if valid_ipv4(src_ip) and valid_ipv4(dst_ip):
         ip_version = IP
     elif valid_ipv6(src_ip) and valid_ipv6(dst_ip):
@@ -117,19 +117,17 @@ def main():
 
     # allow scapy to recognize IPFIX headers and templates
     ipfix = IPFIXHandler()
-
-    # clear receive buffer
-    while True:
-        pkt = rxq.recv(1, ignore=ignore, verbose=verbose)
-        if pkt is None:
-            break
-
     data = None
     # get IPFIX template and data
     while True:
-        pkt = rxq.recv(5)
+        pkt = rxq.recv(10, ignore=ignore, verbose=verbose)
         if pkt is None:
             raise RuntimeError("RX timeout")
+
+        if pkt.haslayer("ICMPv6ND_NS"):
+            # read another packet in the queue if the current one is ICMPv6ND_NS
+            continue
+
         if pkt.haslayer("IPFIXHeader"):
             if pkt.haslayer("IPFIXTemplate"):
                 # create or update template for IPFIX data packets
@@ -145,9 +143,9 @@ def main():
 
     # verify packet count
     if data["packetTotalCount"] != count:
-        raise RuntimeError(
-            "IPFIX reported wrong packet count. Count was {0},"
-            " but should be {1}".format(data["packetTotalCount"], count))
+        raise RuntimeError("IPFIX reported wrong packet count. Count was {0},"
+                           "but should be {1}".format(data["packetTotalCount"],
+                                                      count))
     # verify IP addresses
     keys = data.keys()
     err = "{0} mismatch. Packets used {1}, but were classified as {2}."
@@ -194,5 +192,4 @@ def main():
 
 
 if __name__ == "__main__":
-
     main()