docs: def recv_packet(self, timeout=None):
          '''
          Receive packets from any device on which one is available.
          Blocks until it receives a packet, unless a timeout value >=0
          is given.  Raises Shutdown exception when device(s) are shut 
          down (i.e., on a SIGINT to the process).  Raises NoPackets when 
          there are no packets that can be read.
  
          Returns a ReceivedPacket named tuple (timestamp, input_port, packet)
          '''
          while True:
              try:
                  dev,dlt,pktinfo = self._pktqueue.get(timeout=timeout)
                  if not LLNetReal.running:
                      break
  
                  decoder = _dlt_to_decoder.get(dlt, None)
                  if decoder is None:
                      log_warn("Received packet with unparseable encapsulation {}".format(dlt))
                      continue
  
                  pkt = decoder(pktinfo.raw) 
                  return ReceivedPacket(timestamp=pktinfo.timestamp, 
                      input_port=dev, packet=pkt)
              except Empty:
                  if not LLNetReal.running:
                      raise Shutdown()
                  raise NoPackets()
          raise Shutdown()