qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v2] net: add the support for -netdev socket, lis


From: Anthony Liguori
Subject: Re: [Qemu-devel] [PATCH v2] net: add the support for -netdev socket, listen
Date: Fri, 24 Feb 2012 09:05:52 -0600
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.23) Gecko/20110922 Lightning/1.0b2 Thunderbird/3.1.15

On 02/18/2012 03:19 AM, address@hidden wrote:
From: Zhi Yong Wu<address@hidden>

The -net socket,listen option does not work with the newer -netdev
syntax:
http://lists.gnu.org/archive/html/qemu-devel/2011-11/msg01508.html

This patch makes it work now.

Signed-off-by: Zhi Yong Wu<address@hidden>
---
  net.c        |   26 +++++++++++++++++++++
  net.h        |    2 +
  net/socket.c |   72 +++++++++++++++++++++++++++++++++++++++++++++-------------
  3 files changed, 84 insertions(+), 16 deletions(-)

diff --git a/net.c b/net.c
index c34474f..60e7b35 100644
--- a/net.c
+++ b/net.c
@@ -190,6 +190,32 @@ static ssize_t qemu_deliver_packet_iov(VLANClientState 
*sender,
                                         int iovcnt,
                                         void *opaque);

+VLANClientState *qemu_lookup_net_client(VLANState *vlan,
+                                        const char *name)
+{
+    VLANClientState *vc = NULL;
+
+    if (vlan) {
+        QTAILQ_FOREACH(vc,&vlan->clients, next) {
+            if (!strcmp(vc->name, name)) {
+                break;
+            }
+        }
+    } else {
+        QTAILQ_FOREACH(vc,&non_vlan_clients, next) {
+            if (!strcmp(vc->name, name)) {
+                break;
+            }
+        }
+    }
+
+    if (!vc) {
+        return NULL;
+    }
+
+    return vc;
+}
+
  VLANClientState *qemu_new_net_client(NetClientInfo *info,
                                       VLANState *vlan,
                                       VLANClientState *peer,
diff --git a/net.h b/net.h
index 75a8c15..7f73160 100644
--- a/net.h
+++ b/net.h
@@ -90,6 +90,8 @@ struct VLANState {

  VLANState *qemu_find_vlan(int id, int allocate);
  VLANClientState *qemu_find_netdev(const char *id);
+VLANClientState *qemu_lookup_net_client(VLANState *vlan,
+                                        const char *name);
  VLANClientState *qemu_new_net_client(NetClientInfo *info,
                                       VLANState *vlan,
                                       VLANClientState *peer,
diff --git a/net/socket.c b/net/socket.c
index d4c2002..3ecee59 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -43,6 +43,7 @@ typedef struct NetSocketState {
  } NetSocketState;

  typedef struct NetSocketListenState {
+    VLANClientState *nc;
      VLANState *vlan;
      char *model;
      char *name;
@@ -247,7 +248,8 @@ static NetClientInfo net_dgram_socket_info = {
  static NetSocketState *net_socket_fd_init_dgram(VLANState *vlan,
                                                  const char *model,
                                                  const char *name,
-                                                int fd, int is_connected)
+                                                int fd, int is_connected,
+                                                int is_listen)
  {
      struct sockaddr_in saddr;
      int newfd;
@@ -286,15 +288,28 @@ static NetSocketState *net_socket_fd_init_dgram(VLANState 
*vlan,
          }
      }

-    nc = qemu_new_net_client(&net_dgram_socket_info, vlan, NULL, model, name);
+
+    if (!is_listen || (is_listen&&  !is_connected)) {
+        nc = qemu_new_net_client(&net_dgram_socket_info,
+                                 vlan, NULL, model, name);
+    } else {
+        nc = qemu_lookup_net_client(vlan, name);
+        if (!nc) {
+            goto err;
+        }
+    }
+
+    s = DO_UPCAST(NetSocketState, nc, nc);
+
+    if (is_listen&&  !is_connected) {
+        return s;
+    }

      snprintf(nc->info_str, sizeof(nc->info_str),
              "socket: fd=%d (%s mcast=%s:%d)",
              fd, is_connected ? "cloned" : "",
              inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));

-    s = DO_UPCAST(NetSocketState, nc, nc);
-
      s->fd = fd;

      qemu_set_fd_handler(s->fd, net_socket_send_dgram, NULL, s);
@@ -325,16 +340,29 @@ static NetClientInfo net_socket_info = {
  static NetSocketState *net_socket_fd_init_stream(VLANState *vlan,
                                                   const char *model,
                                                   const char *name,
-                                                 int fd, int is_connected)
+                                                 int fd, int is_connected,
+                                                 int is_listen)
  {
      VLANClientState *nc;
      NetSocketState *s;

-    nc = qemu_new_net_client(&net_socket_info, vlan, NULL, model, name);
+    if (!is_listen || (is_listen&&  !is_connected)) {
+        nc = qemu_new_net_client(&net_socket_info, vlan, NULL, model, name);
+    } else {
+        nc = qemu_lookup_net_client(vlan, name);
+        if (!nc) {
+            return NULL;
+        }
+    }
+
+    s = DO_UPCAST(NetSocketState, nc, nc);
+
+    if (is_listen&&  !is_connected) {
+        return s;
+    }

      snprintf(nc->info_str, sizeof(nc->info_str), "socket: fd=%d", fd);

-    s = DO_UPCAST(NetSocketState, nc, nc);

      s->fd = fd;

@@ -348,7 +376,8 @@ static NetSocketState *net_socket_fd_init_stream(VLANState 
*vlan,

  static NetSocketState *net_socket_fd_init(VLANState *vlan,
                                            const char *model, const char *name,
-                                          int fd, int is_connected)
+                                          int fd, int is_connected,
+                                          int is_listen)
  {
      int so_type = -1, optlen=sizeof(so_type);

@@ -361,13 +390,16 @@ static NetSocketState *net_socket_fd_init(VLANState *vlan,
      }
      switch(so_type) {
      case SOCK_DGRAM:
-        return net_socket_fd_init_dgram(vlan, model, name, fd, is_connected);
+        return net_socket_fd_init_dgram(vlan, model,
+                                        name, fd, is_connected, is_listen);
      case SOCK_STREAM:
-        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
+        return net_socket_fd_init_stream(vlan, model,
+                                         name, fd, is_connected, is_listen);
      default:
          /* who knows ... this could be a eg. a pty, do warn and continue as 
stream */
          fprintf(stderr, "qemu: warning: socket type=%d for fd=%d is not SOCK_DGRAM 
or SOCK_STREAM\n", so_type, fd);
-        return net_socket_fd_init_stream(vlan, model, name, fd, is_connected);
+        return net_socket_fd_init_stream(vlan, model,
+                                         name, fd, is_connected, is_listen);
      }
      return NULL;
  }
@@ -389,14 +421,17 @@ static void net_socket_accept(void *opaque)
              break;
          }
      }
-    s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1);
+
+    s1 = net_socket_fd_init(s->vlan, s->model, s->name, fd, 1, 1);
      if (s1) {
          snprintf(s1->nc.info_str, sizeof(s1->nc.info_str),
                   "socket: connection from %s:%d",
                   inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
+        s1->nc.link_down = false;

I find this to be a little odd. Nothing else uses link_down link this. Why are you setting this flag?

Regards,

Anthony Liguori




reply via email to

[Prev in Thread] Current Thread [Next in Thread]