void (*rxq_destruct)(struct netdev_rxq *);
void (*rxq_dealloc)(struct netdev_rxq *);
- /* Attempts to receive batch of packets from 'rx' and place array of
- * pointers into '*pkts'. netdev is responsible for allocating buffers.
- * '*cnt' points to packet count for given batch. Once packets are returned
- * to caller, netdev should give up ownership of ofpbuf data.
- *
- * Implementations should allocate buffer with DP_NETDEV_HEADROOM headroom
- * and add a VLAN header which is obtained out-of-band to the packet.
- *
- * Caller is expected to pass array of size MAX_RX_BATCH.
- * This function may be set to null if it would always return EOPNOTSUPP
- * anyhow. */
+ /* Attempts to receive a batch of packets from 'rx'. The caller supplies
+ * 'pkts' as the pointer to the beginning of an array of MAX_RX_BATCH
+ * pointers to dp_packet. If successful, the implementation stores
+ * pointers to up to MAX_RX_BATCH dp_packets into the array, transferring
+ * ownership of the packets to the caller, stores the number of received
+ * packets into '*cnt', and returns 0.
+ *
+ * The implementation does not necessarily initialize any non-data members
+ * of 'pkts'. That is, the caller must initialize layer pointers and
+ * metadata itself, if desired, e.g. with pkt_metadata_init() and
+ * miniflow_extract().
+ *
+ * Implementations should allocate buffers with DP_NETDEV_HEADROOM bytes of
+ * headroom.
+ *
+ * Returns EAGAIN immediately if no packet is ready to be received or
+ * another positive errno value if an error was encountered. */
int (*rxq_recv)(struct netdev_rxq *rx, struct dp_packet **pkts,
int *cnt);
/* Registers with the poll loop to wake up from the next call to
- * poll_block() when a packet is ready to be received with netdev_rxq_recv()
- * on 'rx'. */
+ * poll_block() when a packet is ready to be received with
+ * netdev_rxq_recv() on 'rx'. */
void (*rxq_wait)(struct netdev_rxq *rx);
/* Discards all packets waiting to be received from 'rx'. */