[ovs-dev] [PATCH v2 1/2] netdev_class: Pass a struct ofpbuf * to rx_recv()
Jarno Rajahalme
jrajahalme at nicira.com
Thu Dec 12 16:11:47 UTC 2013
IMO this patch could go a bit further and have the rx_recv also update the but size to reflect the number of bytes placed in the buffer and maybe change the return value to a normal error code.
Jarno
On Dec 12, 2013, at 12:38 AM, Simon Horman <horms at verge.net.au> wrote:
> Update the netdev_class so that struct ofpbuf * is passed to rx_recv()
> to provide both the data and size of the data to read a packet into.
>
> This patch should not have any behavioural changes.
>
> This patch is in preparation for the netdev-linux variant of rx_recv()
> making use of headroom in the struct ofpbuf * parameter to push a VLAN tag
> obtained from auxdata.
>
> Signed-off-by: Simon Horman <horms at verge.net.au>
>
> ---
> v2
> * First post
> ---
> lib/netdev-dummy.c | 6 +++---
> lib/netdev-linux.c | 7 ++++---
> lib/netdev-provider.h | 2 +-
> lib/netdev.c | 3 +--
> 4 files changed, 9 insertions(+), 9 deletions(-)
>
> diff --git a/lib/netdev-dummy.c b/lib/netdev-dummy.c
> index fd30454..5b363fa 100644
> --- a/lib/netdev-dummy.c
> +++ b/lib/netdev-dummy.c
> @@ -447,7 +447,7 @@ netdev_dummy_rx_dealloc(struct netdev_rx *rx_)
> }
>
> static int
> -netdev_dummy_rx_recv(struct netdev_rx *rx_, void *buffer, size_t size)
> +netdev_dummy_rx_recv(struct netdev_rx *rx_, struct ofpbuf *buffer)
> {
> struct netdev_rx_dummy *rx = netdev_rx_dummy_cast(rx_);
> struct netdev_dummy *netdev = netdev_dummy_cast(rx->up.netdev);
> @@ -467,8 +467,8 @@ netdev_dummy_rx_recv(struct netdev_rx *rx_, void *buffer, size_t size)
> return -EAGAIN;
> }
>
> - if (packet->size <= size) {
> - memcpy(buffer, packet->data, packet->size);
> + if (packet->size <= ofpbuf_tailroom(buffer)) {
> + memcpy(buffer->data, packet->data, packet->size);
> retval = packet->size;
>
> ovs_mutex_lock(&netdev->mutex);
> diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c
> index 3e0da48..a997a77 100644
> --- a/lib/netdev-linux.c
> +++ b/lib/netdev-linux.c
> @@ -852,15 +852,16 @@ netdev_linux_rx_dealloc(struct netdev_rx *rx_)
> }
>
> static int
> -netdev_linux_rx_recv(struct netdev_rx *rx_, void *data, size_t size)
> +netdev_linux_rx_recv(struct netdev_rx *rx_, struct ofpbuf *buffer)
> {
> struct netdev_rx_linux *rx = netdev_rx_linux_cast(rx_);
> ssize_t retval;
> + size_t size = ofpbuf_tailroom(buffer);
>
> do {
> retval = (rx->is_tap
> - ? read(rx->fd, data, size)
> - : recv(rx->fd, data, size, MSG_TRUNC));
> + ? read(rx->fd, buffer->data, size)
> + : recv(rx->fd, buffer->data, size, MSG_TRUNC));
> } while (retval < 0 && errno == EINTR);
>
> if (retval >= 0) {
> diff --git a/lib/netdev-provider.h b/lib/netdev-provider.h
> index 9ab58fb..db24ac5 100644
> --- a/lib/netdev-provider.h
> +++ b/lib/netdev-provider.h
> @@ -643,7 +643,7 @@ struct netdev_class {
> * is longer than 'size' bytes.
> *
> * Specify NULL if this */
> - int (*rx_recv)(struct netdev_rx *rx, void *buffer, size_t size);
> + int (*rx_recv)(struct netdev_rx *rx, struct ofpbuf *buffer);
>
> /* 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()
> diff --git a/lib/netdev.c b/lib/netdev.c
> index 9aa6d27..d5b0d78 100644
> --- a/lib/netdev.c
> +++ b/lib/netdev.c
> @@ -547,8 +547,7 @@ netdev_rx_recv(struct netdev_rx *rx, struct ofpbuf *buffer)
> ovs_assert(buffer->size == 0);
> ovs_assert(ofpbuf_tailroom(buffer) >= ETH_TOTAL_MIN);
>
> - retval = rx->netdev->netdev_class->rx_recv(rx, buffer->data,
> - ofpbuf_tailroom(buffer));
> + retval = rx->netdev->netdev_class->rx_recv(rx, buffer);
> if (retval >= 0) {
> COVERAGE_INC(netdev_received);
> buffer->size += retval;
> --
> 1.8.4
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev
More information about the dev
mailing list