On Thu, Dec 12, 2013 at 08:11:47AM -0800, Jarno Rajahalme wrote:
> 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.

Hi,

I would not be opposed to that, though I do not that the size is never
updated (or used?) by the caller, so I don't think it will have much effect
either way.

Ben, what are your feelings on this?

> 
>   Jarno
> 
> On Dec 12, 2013, at 12:38 AM, Simon Horman <ho...@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 <ho...@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@openvswitch.org
> > http://openvswitch.org/mailman/listinfo/dev
> 
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to