const struct netdev_tunnel_config *
(*get_tunnel_config)(const struct netdev *netdev);
- /* Sends the 'size'-byte packet in 'buffer' on 'netdev'. Returns 0 if
- * successful, otherwise a positive errno value. Returns EAGAIN without
- * blocking if the packet cannot be queued immediately. Returns EMSGSIZE
- * if a partial packet was transmitted or if the packet is too big or too
- * small to transmit on the device.
+ /* Sends the buffer on 'netdev'.
+ * Returns 0 if successful, otherwise a positive errno value. Returns
+ * EAGAIN without blocking if the packet cannot be queued immediately.
+ * Returns EMSGSIZE if a partial packet was transmitted or if the packet
+ * is too big or too small to transmit on the device.
*
- * The caller retains ownership of 'buffer' in all cases.
+ * To retain ownership of 'buffer' caller can set may_steal to false.
*
* The network device is expected to maintain a packet transmission queue,
* so that the caller does not ordinarily have to do additional queuing of
* network device from being usefully used by the netdev-based "userspace
* datapath". It will also prevent the OVS implementation of bonding from
* working properly over 'netdev'.) */
- int (*send)(struct netdev *netdev, const void *buffer, size_t size);
+ int (*send)(struct netdev *netdev, struct ofpbuf *buffer, bool may_steal);
/* Registers with the poll loop to wake up from the next call to
* poll_block() when the packet transmission queue for 'netdev' has
void (*rx_destruct)(struct netdev_rx *);
void (*rx_dealloc)(struct netdev_rx *);
- /* Attempts to receive a packet from 'rx' into the 'size' bytes in
- * 'buffer'. If successful, returns the number of bytes in the received
- * packet, otherwise a negative errno value. Returns -EAGAIN immediately
- * if no packet is ready to be received.
+ /* Attempts to receive batch of packets from 'rx' and place array of pointers
+ * into '*pkt'. 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.
*
- * Must return -EMSGSIZE, and discard the packet, if the received packet
- * is longer than 'size' bytes.
+ * 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. */
- int (*rx_recv)(struct netdev_rx *rx, void *buffer, size_t size);
+ int (*rx_recv)(struct netdev_rx *rx, struct ofpbuf **pkt, 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_rx_recv()