All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH for-2.8] net: fix sending of data with -net socket, listen backend
@ 2016-11-04 15:46 Daniel P. Berrange
  2016-11-07  1:46 ` Zhang Chen
  0 siblings, 1 reply; 2+ messages in thread
From: Daniel P. Berrange @ 2016-11-04 15:46 UTC (permalink / raw)
  To: qemu-devel; +Cc: Jason Wang, Zhang Chen, qemu-stable, Daniel P. Berrange

The use of -net socket,listen was broken in the following
commit

  commit 16a3df403b10c4ac347159e39005fd520b2648bb
  Author: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
  Date:   Fri May 13 15:35:19 2016 +0800

    net/net: Add SocketReadState for reuse codes

    This function is from net/socket.c, move it to net.c and net.h.
    Add SocketReadState to make others reuse net_fill_rstate().
    suggestion from jason.

This refactored the state out of NetSocketState into a
separate SocketReadState. This refactoring requires
that a callback is provided to be triggered upon
completion of a packet receive from the guest.

The patch only registered this callback in the codepaths
hit by -net socket,connect, not -net socket,listen. So
as a result packets sent by the guest in the latter case
get dropped on the floor.

This bug is hidden because net_fill_rstate() silently
does nothing if the callback is not set.

This patch adds in the middle callback registration
and also adds an assert so that QEMU aborts if there
are any other codepaths hit which are missing the
callback.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
---
 net/net.c    | 5 ++---
 net/socket.c | 1 +
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/net/net.c b/net/net.c
index ec984bf..939fe31 100644
--- a/net/net.c
+++ b/net/net.c
@@ -1653,9 +1653,8 @@ int net_fill_rstate(SocketReadState *rs, const uint8_t *buf, int size)
             if (rs->index >= rs->packet_len) {
                 rs->index = 0;
                 rs->state = 0;
-                if (rs->finalize) {
-                    rs->finalize(rs);
-                }
+                assert(rs->finalize);
+                rs->finalize(rs);
             }
             break;
         }
diff --git a/net/socket.c b/net/socket.c
index 982c8de..fe3547b 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -511,6 +511,7 @@ static int net_socket_listen_init(NetClientState *peer,
     s->fd = -1;
     s->listen_fd = ret;
     s->nc.link_down = true;
+    net_socket_rs_init(&s->rs, net_socket_rs_finalize);
 
     qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
     qapi_free_SocketAddress(saddr);
-- 
2.9.3

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [Qemu-devel] [PATCH for-2.8] net: fix sending of data with -net socket, listen backend
  2016-11-04 15:46 [Qemu-devel] [PATCH for-2.8] net: fix sending of data with -net socket, listen backend Daniel P. Berrange
@ 2016-11-07  1:46 ` Zhang Chen
  0 siblings, 0 replies; 2+ messages in thread
From: Zhang Chen @ 2016-11-07  1:46 UTC (permalink / raw)
  To: Daniel P. Berrange, qemu-devel; +Cc: Jason Wang, qemu-stable



On 11/04/2016 11:46 PM, Daniel P. Berrange wrote:
> The use of -net socket,listen was broken in the following
> commit
>
>    commit 16a3df403b10c4ac347159e39005fd520b2648bb
>    Author: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>
>    Date:   Fri May 13 15:35:19 2016 +0800
>
>      net/net: Add SocketReadState for reuse codes
>
>      This function is from net/socket.c, move it to net.c and net.h.
>      Add SocketReadState to make others reuse net_fill_rstate().
>      suggestion from jason.
>
> This refactored the state out of NetSocketState into a
> separate SocketReadState. This refactoring requires
> that a callback is provided to be triggered upon
> completion of a packet receive from the guest.
>
> The patch only registered this callback in the codepaths
> hit by -net socket,connect, not -net socket,listen. So
> as a result packets sent by the guest in the latter case
> get dropped on the floor.
>
> This bug is hidden because net_fill_rstate() silently
> does nothing if the callback is not set.
>
> This patch adds in the middle callback registration
> and also adds an assert so that QEMU aborts if there
> are any other codepaths hit which are missing the
> callback.
>
> Signed-off-by: Daniel P. Berrange <berrange@redhat.com>

Good catch!

Reviewed-by: Zhang Chen <zhangchen.fnst@cn.fujitsu.com>

Thanks
Zhang Chen

> ---
>   net/net.c    | 5 ++---
>   net/socket.c | 1 +
>   2 files changed, 3 insertions(+), 3 deletions(-)
>
> diff --git a/net/net.c b/net/net.c
> index ec984bf..939fe31 100644
> --- a/net/net.c
> +++ b/net/net.c
> @@ -1653,9 +1653,8 @@ int net_fill_rstate(SocketReadState *rs, const uint8_t *buf, int size)
>               if (rs->index >= rs->packet_len) {
>                   rs->index = 0;
>                   rs->state = 0;
> -                if (rs->finalize) {
> -                    rs->finalize(rs);
> -                }
> +                assert(rs->finalize);
> +                rs->finalize(rs);
>               }
>               break;
>           }
> diff --git a/net/socket.c b/net/socket.c
> index 982c8de..fe3547b 100644
> --- a/net/socket.c
> +++ b/net/socket.c
> @@ -511,6 +511,7 @@ static int net_socket_listen_init(NetClientState *peer,
>       s->fd = -1;
>       s->listen_fd = ret;
>       s->nc.link_down = true;
> +    net_socket_rs_init(&s->rs, net_socket_rs_finalize);
>   
>       qemu_set_fd_handler(s->listen_fd, net_socket_accept, NULL, s);
>       qapi_free_SocketAddress(saddr);

-- 
Thanks
zhangchen

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2016-11-07  1:47 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-11-04 15:46 [Qemu-devel] [PATCH for-2.8] net: fix sending of data with -net socket, listen backend Daniel P. Berrange
2016-11-07  1:46 ` Zhang Chen

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.