def _oldest_packet_find(self): # Find port with oldest packet min_time = 0 min_port = -1 for port_number in self.port_list.keys(): ptime = self.port_list[port_number].timestamp_head() if ptime: if (min_port == -1) or (ptime < min_time): min_time = ptime min_port = port_number oft_assert(min_port != -1, "Could not find port when pkts pending") return min_port
def poll(self, port_number=None, timeout=None): """ Poll one or all dataplane ports for a packet If port_number is given, get the oldest packet from that port. Otherwise, find the port with the oldest packet and return that packet. @param port_number If set, get packet from this port @param timeout If positive and no packet is available, block until a packet is received or for this many seconds @return The triple port_number, packet, pkt_time where packet is received from port_number at time pkt_time. If a timeout occurs, return None, None, None """ self.pkt_sync.acquire() # Check if requested specific port and it has a packet if port_number and len(self.port_list[port_number].packets) != 0: pkt, time = self.port_list[port_number].dequeue(use_lock=False) self.pkt_sync.release() oft_assert(pkt, "Poll: packet not found on port " + str(port_number)) return port_number, pkt, time # Check if requested any port and some packet pending if not port_number and self.packets_pending != 0: port = self._oldest_packet_find() pkt, time = self.port_list[port].dequeue(use_lock=False) self.pkt_sync.release() oft_assert(pkt, "Poll: oldest packet not found") return port, pkt, time # No packet pending; blocking call requested? if not timeout: self.pkt_sync.release() return None, None, None # Desired packet isn't available and timeout is specified # Already holding pkt_sync; wait on pkt_sync variable self.want_pkt = True self.want_pkt_port = port_number self.got_pkt_port = None self.pkt_sync.wait(timeout) self.want_pkt = False if self.got_pkt_port: pkt, time = \ self.port_list[self.got_pkt_port].dequeue(use_lock=False) self.pkt_sync.release() oft_assert( pkt, "Poll: pkt reported, but not found at " + str(self.got_pkt_port)) return self.got_pkt_port, pkt, time self.pkt_sync.release() self.logger.debug("Poll time out, no packet from " + str(port_number)) return None, None, None
def poll(self, port_number=None, timeout=None): """ Poll one or all dataplane ports for a packet If port_number is given, get the oldest packet from that port. Otherwise, find the port with the oldest packet and return that packet. @param port_number If set, get packet from this port @param timeout If positive and no packet is available, block until a packet is received or for this many seconds @return The triple port_number, packet, pkt_time where packet is received from port_number at time pkt_time. If a timeout occurs, return None, None, None """ self.pkt_sync.acquire() # Check if requested specific port and it has a packet if port_number and len(self.port_list[port_number].packets) != 0: pkt, time = self.port_list[port_number].dequeue(use_lock=False) self.pkt_sync.release() oft_assert(pkt, "Poll: packet not found on port " + str(port_number)) return port_number, pkt, time # Check if requested any port and some packet pending if not port_number and self.packets_pending != 0: port = self._oldest_packet_find() pkt, time = self.port_list[port].dequeue(use_lock=False) self.pkt_sync.release() oft_assert(pkt, "Poll: oldest packet not found") return port, pkt, time # No packet pending; blocking call requested? if not timeout: self.pkt_sync.release() return None, None, None # Desired packet isn't available and timeout is specified # Already holding pkt_sync; wait on pkt_sync variable self.want_pkt = True self.want_pkt_port = port_number self.got_pkt_port = None self.pkt_sync.wait(timeout) self.want_pkt = False if self.got_pkt_port: pkt, time = \ self.port_list[self.got_pkt_port].dequeue(use_lock=False) self.pkt_sync.release() oft_assert(pkt, "Poll: pkt reported, but not found at " + str(self.got_pkt_port)) return self.got_pkt_port, pkt, time self.pkt_sync.release() self.logger.debug("Poll time out, no packet from " + str(port_number)) return None, None, None
def _oldest_packet_find(self): # Find port with oldest packet oft_assert(min_port != -1, "Could not find port when pkts pending") return min_port