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
 """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 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.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):
 
 
 def valid_ipv4(ip):
@@ -81,7 +82,6 @@ def main():
     rxq = RxQueue(tx_if)
 
     # generate simple packet based on arguments
     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):
     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()
 
     # 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:
     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 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
         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:
 
     # 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}."
     # 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__":
 
 
 if __name__ == "__main__":
-
     main()
     main()