* from rx->pcap.
*/
static int
-netdev_rx_bsd_recv_pcap(struct netdev_rx_bsd *rx, void *data, size_t size)
+netdev_rx_bsd_recv_pcap(struct netdev_rx_bsd *rx, struct ofpbuf *buffer)
{
struct pcap_arg arg;
int ret;
/* prepare the pcap argument to store the packet */
- arg.size = size;
- arg.data = data;
+ arg.size = ofpbuf_tailroom(buffer);
+ arg.data = buffer->data;
for (;;) {
ret = pcap_dispatch(rx->pcap_handle, 1, proc_pkt, (u_char *) &arg);
if (ret > 0) {
- return arg.retval; /* arg.retval < 0 is handled in the caller */
+ buffer->size += arg.retval;
+ return 0;
}
if (ret == -1) {
if (errno == EINTR) {
}
}
- return -EAGAIN;
+ return EAGAIN;
}
}
* 'rx->fd' is initialized with the tap file descriptor.
*/
static int
-netdev_rx_bsd_recv_tap(struct netdev_rx_bsd *rx, void *data, size_t size)
+netdev_rx_bsd_recv_tap(struct netdev_rx_bsd *rx, struct ofpbuf *buffer)
{
+ size_t size = ofpbuf_tailroom(buffer);
+
for (;;) {
- ssize_t retval = read(rx->fd, data, size);
+ ssize_t retval = read(rx->fd, buffer->data, size);
if (retval >= 0) {
- return retval;
+ buffer->size += retval;
+ return 0;
} else if (errno != EINTR) {
if (errno != EAGAIN) {
VLOG_WARN_RL(&rl, "error receiving Ethernet packet on %s: %s",
ovs_strerror(errno), netdev_rx_get_name(&rx->up));
}
- return -errno;
+ return errno;
}
}
}
static int
-netdev_bsd_rx_recv(struct netdev_rx *rx_, void *data, size_t size)
+netdev_bsd_rx_recv(struct netdev_rx *rx_, struct ofpbuf *buffer)
{
struct netdev_rx_bsd *rx = netdev_rx_bsd_cast(rx_);
return (rx->pcap_handle
- ? netdev_rx_bsd_recv_pcap(rx, data, size)
- : netdev_rx_bsd_recv_tap(rx, data, size));
+ ? netdev_rx_bsd_recv_pcap(rx, buffer)
+ : netdev_rx_bsd_recv_tap(rx, buffer));
}
/*
netdev_bsd_update_flags(struct netdev *netdev_, enum netdev_flags off,
enum netdev_flags on, enum netdev_flags *old_flagsp)
{
- struct netdev_bsd *netdev = netdev_bsd_cast(netdev_);
int old_flags, new_flags;
int error;
return error;
}
+/* Linux has also different GET_STATS, SET_STATS,
+ * GET_STATUS)
+ */
+#define NETDEV_BSD_CLASS(NAME, CONSTRUCT, \
+ GET_FEATURES) \
+{ \
+ NAME, \
+ \
+ NULL, /* init */ \
+ netdev_bsd_run, \
+ netdev_bsd_wait, \
+ netdev_bsd_alloc, \
+ CONSTRUCT, \
+ netdev_bsd_destruct, \
+ netdev_bsd_dealloc, \
+ NULL, /* get_config */ \
+ NULL, /* set_config */ \
+ NULL, /* get_tunnel_config */ \
+ \
+ netdev_bsd_send, \
+ netdev_bsd_send_wait, \
+ \
+ netdev_bsd_set_etheraddr, \
+ netdev_bsd_get_etheraddr, \
+ netdev_bsd_get_mtu, \
+ NULL, /* set_mtu */ \
+ netdev_bsd_get_ifindex, \
+ netdev_bsd_get_carrier, \
+ NULL, /* get_carrier_resets */ \
+ NULL, /* set_miimon_interval */ \
+ netdev_bsd_get_stats, \
+ NULL, /* set_stats */ \
+ \
+ GET_FEATURES, \
+ NULL, /* set_advertisement */ \
+ NULL, /* set_policing */ \
+ NULL, /* get_qos_type */ \
+ NULL, /* get_qos_capabilities */ \
+ NULL, /* get_qos */ \
+ NULL, /* set_qos */ \
+ NULL, /* get_queue */ \
+ NULL, /* set_queue */ \
+ NULL, /* delete_queue */ \
+ NULL, /* get_queue_stats */ \
+ NULL, /* queue_dump_start */ \
+ NULL, /* queue_dump_next */ \
+ NULL, /* queue_dump_done */ \
+ NULL, /* dump_queue_stats */ \
+ \
+ netdev_bsd_get_in4, \
+ netdev_bsd_set_in4, \
+ netdev_bsd_get_in6, \
+ NULL, /* add_router */ \
+ netdev_bsd_get_next_hop, \
+ NULL, /* get_status */ \
+ netdev_bsd_arp_lookup, /* arp_lookup */ \
+ \
+ netdev_bsd_update_flags, \
+ \
+ netdev_bsd_rx_alloc, \
+ netdev_bsd_rx_construct, \
+ netdev_bsd_rx_destruct, \
+ netdev_bsd_rx_dealloc, \
+ netdev_bsd_rx_recv, \
+ netdev_bsd_rx_wait, \
+ netdev_bsd_rx_drain, \
+}
-const struct netdev_class netdev_bsd_class = {
- "system",
-
- NULL, /* init */
- netdev_bsd_run,
- netdev_bsd_wait,
- netdev_bsd_alloc,
- netdev_bsd_construct_system,
- netdev_bsd_destruct,
- netdev_bsd_dealloc,
- NULL, /* get_config */
- NULL, /* set_config */
- NULL, /* get_tunnel_config */
-
- netdev_bsd_send,
- netdev_bsd_send_wait,
-
- netdev_bsd_set_etheraddr,
- netdev_bsd_get_etheraddr,
- netdev_bsd_get_mtu,
- NULL, /* set_mtu */
- netdev_bsd_get_ifindex,
- netdev_bsd_get_carrier,
- NULL, /* get_carrier_resets */
- NULL, /* set_miimon_interval */
- netdev_bsd_get_stats,
- NULL, /* set_stats */
-
- netdev_bsd_get_features,
- NULL, /* set_advertisement */
- NULL, /* set_policing */
- NULL, /* get_qos_type */
- NULL, /* get_qos_capabilities */
- NULL, /* get_qos */
- NULL, /* set_qos */
- NULL, /* get_queue */
- NULL, /* set_queue */
- NULL, /* delete_queue */
- NULL, /* get_queue_stats */
- NULL, /* queue_dump_start */
- NULL, /* queue_dump_next */
- NULL, /* queue_dump_done */
- NULL, /* dump_queue_stats */
-
- netdev_bsd_get_in4,
- netdev_bsd_set_in4,
- netdev_bsd_get_in6,
- NULL, /* add_router */
- netdev_bsd_get_next_hop,
- NULL, /* get_status */
- netdev_bsd_arp_lookup, /* arp_lookup */
-
- netdev_bsd_update_flags,
-
- netdev_bsd_rx_alloc,
- netdev_bsd_rx_construct,
- netdev_bsd_rx_destruct,
- netdev_bsd_rx_dealloc,
- netdev_bsd_rx_recv,
- netdev_bsd_rx_wait,
- netdev_bsd_rx_drain,
-};
-
-const struct netdev_class netdev_tap_class = {
- "tap",
-
- NULL, /* init */
- netdev_bsd_run,
- netdev_bsd_wait,
- netdev_bsd_alloc,
- netdev_bsd_construct_tap,
- netdev_bsd_destruct,
- netdev_bsd_dealloc,
- NULL, /* get_config */
- NULL, /* set_config */
- NULL, /* get_tunnel_config */
-
- netdev_bsd_send,
- netdev_bsd_send_wait,
-
- netdev_bsd_set_etheraddr,
- netdev_bsd_get_etheraddr,
- netdev_bsd_get_mtu,
- NULL, /* set_mtu */
- netdev_bsd_get_ifindex,
- netdev_bsd_get_carrier,
- NULL, /* get_carrier_resets */
- NULL, /* set_miimon_interval */
- netdev_bsd_get_stats,
- NULL, /* set_stats */
-
- netdev_bsd_get_features,
- NULL, /* set_advertisement */
- NULL, /* set_policing */
- NULL, /* get_qos_type */
- NULL, /* get_qos_capabilities */
- NULL, /* get_qos */
- NULL, /* set_qos */
- NULL, /* get_queue */
- NULL, /* set_queue */
- NULL, /* delete_queue */
- NULL, /* get_queue_stats */
- NULL, /* queue_dump_start */
- NULL, /* queue_dump_next */
- NULL, /* queue_dump_done */
- NULL, /* dump_queue_stats */
-
- netdev_bsd_get_in4,
- netdev_bsd_set_in4,
- netdev_bsd_get_in6,
- NULL, /* add_router */
- netdev_bsd_get_next_hop,
- NULL, /* get_status */
- netdev_bsd_arp_lookup, /* arp_lookup */
-
- netdev_bsd_update_flags,
-
- netdev_bsd_rx_alloc,
- netdev_bsd_rx_construct,
- netdev_bsd_rx_destruct,
- netdev_bsd_rx_dealloc,
- netdev_bsd_rx_recv,
- netdev_bsd_rx_wait,
- netdev_bsd_rx_drain,
-};
+const struct netdev_class netdev_bsd_class =
+ NETDEV_BSD_CLASS(
+ "system",
+ netdev_bsd_construct_system,
+ netdev_bsd_get_features);
+
+const struct netdev_class netdev_tap_class =
+ NETDEV_BSD_CLASS(
+ "tap",
+ netdev_bsd_construct_tap,
+ netdev_bsd_get_features);
\f
static void