GPL: Replace contribution from Lucian 78/29478/4
authorVratko Polak <vrpolak@cisco.com>
Fri, 16 Oct 2020 11:39:46 +0000 (13:39 +0200)
committerJan Gelety <jgelety@cisco.com>
Fri, 16 Oct 2020 12:31:48 +0000 (12:31 +0000)
We need to replace the contribution, because Lucian is not responding,
and thus preventing us to use the new license on his code [0].

See the chain leading to [1] on how this reverts
his contribution, and adds a new fix.
Unfortunately we cannot merge that chain one-by-one,
because Python version is different now,
so verify fails for intermediate changes.

This is the chain squashed into the single change,
so it can be verified and merged.

[0] https://gerrit.fd.io/r/c/csit/+/11530
[1] https://gerrit.fd.io/r/c/csit/+/29481/2

Change-Id: I00ab3786e1d9abc28fed778b36d814d293c49383
Signed-off-by: Vratko Polak <vrpolak@cisco.com>
GPL/traffic_scripts/PacketVerifier.py

index 9b21fea..e05084d 100644 (file)
@@ -208,7 +208,11 @@ class RxQueue(PacketVerifier):
 
         Returns scapy's Ether() object created from next packet in the queue.
         Queue is being filled in parallel in subprocess. If no packet
 
         Returns scapy's Ether() object created from next packet in the queue.
         Queue is being filled in parallel in subprocess. If no packet
-        arrives in given timeout queue.Empty exception will be risen.
+        arrives in given timeout None is returned.
+
+        If the list of packets to ignore is given, they are logged
+        but otherwise ignored upon arrival, not adding to the timeout.
+        Each time a packet is ignored, it is removed from the ignored list.
 
         :param timeout: How many seconds to wait for next packet.
         :param ignore: List of packets that should be ignored.
 
         :param timeout: How many seconds to wait for next packet.
         :param ignore: List of packets that should be ignored.
@@ -220,16 +224,19 @@ class RxQueue(PacketVerifier):
         :returns: Ether() initialized object from packet data.
         :rtype: scapy.Ether
         """
         :returns: Ether() initialized object from packet data.
         :rtype: scapy.Ether
         """
-        ignore_list = list()
-        if ignore is not None:
-            for ig_pkt in ignore:
-                # Auto pad all packets in ignore list
-                ignore_list.append(str(auto_pad(ig_pkt)))
-        while True:
-            rlist, _, _ = select.select([self._sock], [], [], timeout)
-            if self._sock not in rlist:
+        time_end = time.monotonic() + timeout
+        ignore = ignore if ignore else list()
+        # Auto pad all packets in ignore list
+        ignore = [str(auto_pad(ig_pkt)) for ig_pkt in ignore]
+        while 1:
+            time_now = time.monotonic()
+            if time_now >= time_end:
                 return None
                 return None
-
+            timedelta = time_end - time_now
+            rlist, _, _ = select.select([self._sock], [], [], timedelta)
+            if self._sock not in rlist:
+                # Might have been an interrupt.
+                continue
             pkt = self._sock.recv(0x7fff)
             pkt_pad = str(auto_pad(pkt))
             print(f"Received packet on {self._ifname} of len {len(pkt)}")
             pkt = self._sock.recv(0x7fff)
             pkt_pad = str(auto_pad(pkt))
             print(f"Received packet on {self._ifname} of len {len(pkt)}")
@@ -240,8 +247,8 @@ class RxQueue(PacketVerifier):
                     # Never happens in practice, but Pylint does not know that.
                     print(f"Unexpected instance: {pkt!r}")
                 print()
                     # Never happens in practice, but Pylint does not know that.
                     print(f"Unexpected instance: {pkt!r}")
                 print()
-            if pkt_pad in ignore_list:
-                ignore_list.remove(pkt_pad)
+            if pkt_pad in ignore:
+                ignore.remove(pkt_pad)
                 print(u"Received packet ignored.")
                 continue
             return pkt
                 print(u"Received packet ignored.")
                 continue
             return pkt