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>
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.
: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:
+ 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)}")
# 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