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()