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

Re: [PATCH v12 10/17] net: dgram: make dgram_dst generic



On 20/10/22 11:16, Laurent Vivier wrote:
dgram_dst is a sockaddr_in structure. To be able to use it with
unix socket, use a pointer to a generic sockaddr structure.

Rename it dest_addr, and store socket length in dest_len.

Signed-off-by: Laurent Vivier <lvivier@xxxxxxxxxx>
Reviewed-by: Stefano Brivio <sbrivio@xxxxxxxxxx>
Acked-by: Michael S. Tsirkin <mst@xxxxxxxxxx>
---
  net/dgram.c | 82 ++++++++++++++++++++++++++++++++++-------------------
  1 file changed, 53 insertions(+), 29 deletions(-)

  static NetClientInfo net_dgram_socket_info = {
@@ -260,7 +263,7 @@ static NetDgramState *net_dgram_fd_init(NetClientState 
*peer,
                                          SocketAddress *mcast,
                                          Error **errp)
  {
-    struct sockaddr_in saddr;
+    struct sockaddr_in *saddr = NULL;

Preferrably g_autofree.

      int newfd;
      NetClientState *nc;
      NetDgramState *s;
@@ -275,31 +278,32 @@ static NetDgramState *net_dgram_fd_init(NetClientState 
*peer,
      qapi_free_SocketAddress(sa);
/*
-     * fd passed: multicast: "learn" dgram_dst address from bound address and
+     * fd passed: multicast: "learn" dest_addr address from bound address and
       * save it. Because this may be "shared" socket from a "master" process,
       * datagrams would be recv() by ONLY ONE process: we must "clone" this
       * dgram socket --jjo
       */
if (is_fd && mcast != NULL) {
-            if (convert_host_port(&saddr, mcast->u.inet.host,
-                                  mcast->u.inet.port, errp) < 0) {
+            saddr = g_new(struct sockaddr_in, 1);
+
+            if (convert_host_port(saddr, mcast->u.inet.host, 
mcast->u.inet.port,
+                                  errp) < 0) {
                  goto err;
              }
              /* must be bound */
-            if (saddr.sin_addr.s_addr == 0) {
+            if (saddr->sin_addr.s_addr == 0) {
                  error_setg(errp, "can't setup multicast destination address");
                  goto err;
              }
              /* clone dgram socket */
-            newfd = net_dgram_mcast_create(&saddr, NULL, errp);
+            newfd = net_dgram_mcast_create(saddr, NULL, errp);
              if (newfd < 0) {
                  goto err;
              }
              /* clone newfd to fd, close newfd */
              dup2(newfd, fd);
              close(newfd);
-
      }
nc = qemu_new_net_client(&net_dgram_socket_info, peer, model, name);
@@ -311,21 +315,20 @@ static NetDgramState *net_dgram_fd_init(NetClientState 
*peer,
      net_dgram_read_poll(s, true);
/* mcast: save bound address as dst */
-    if (is_fd && mcast != NULL) {
-        s->dgram_dst = saddr;
+    if (saddr) {
+        g_assert(s->dest_addr == NULL);
+        s->dest_addr = (struct sockaddr *)saddr;
+        s->dest_len = sizeof(*saddr);
          qemu_set_info_str(nc, "fd=%d (cloned mcast=%s:%d)", fd,
-                          inet_ntoa(saddr.sin_addr), ntohs(saddr.sin_port));
+                          inet_ntoa(saddr->sin_addr), ntohs(saddr->sin_port));
      } else {
-        if (sa_type == SOCKET_ADDRESS_TYPE_UNIX) {
-            s->dgram_dst.sin_family = AF_UNIX;
-        }
-
          qemu_set_info_str(nc, "fd=%d %s", fd, SocketAddressType_str(sa_type));
      }
return s; err:
+    g_free(saddr);
      closesocket(fd);
      return NULL;
  }
@@ -339,21 +342,24 @@ static int net_dgram_mcast_init(NetClientState *peer,
  {
      NetDgramState *s;
      int fd, ret;
-    struct sockaddr_in saddr;
+    struct sockaddr_in *saddr;

Preferrably:

  g_autofree struct sockaddr_in *saddr = NULL.

if (remote->type != SOCKET_ADDRESS_TYPE_INET) {
          error_setg(errp, "multicast only support inet type");
          return -1;
      }
- if (convert_host_port(&saddr, remote->u.inet.host, remote->u.inet.port,
+    saddr = g_new(struct sockaddr_in, 1);
+    if (convert_host_port(saddr, remote->u.inet.host, remote->u.inet.port,
                            errp) < 0) {
+        g_free(saddr);
          return -1;
      }
if (!local) {
-        fd = net_dgram_mcast_create(&saddr, NULL, errp);
+        fd = net_dgram_mcast_create(saddr, NULL, errp);
          if (fd < 0) {
+            g_free(saddr);
              return -1;
          }
      } else {
@@ -362,13 +368,15 @@ static int net_dgram_mcast_init(NetClientState *peer,
              struct in_addr localaddr;
if (inet_aton(local->u.inet.host, &localaddr) == 0) {
+                g_free(saddr);
                  error_setg(errp, "localaddr '%s' is not a valid IPv4 address",
                             local->u.inet.host);
                  return -1;
              }
- fd = net_dgram_mcast_create(&saddr, &localaddr, errp);
+            fd = net_dgram_mcast_create(saddr, &localaddr, errp);
              if (fd < 0) {
+                g_free(saddr);
                  return -1;
              }
              break;
@@ -376,16 +384,19 @@ static int net_dgram_mcast_init(NetClientState *peer,
          case SOCKET_ADDRESS_TYPE_FD:
              fd = monitor_fd_param(monitor_cur(), local->u.fd.str, errp);
              if (fd == -1) {
+                g_free(saddr);
                  return -1;
              }
              ret = qemu_socket_try_set_nonblock(fd);
              if (ret < 0) {
+                g_free(saddr);
                  error_setg_errno(errp, -ret, "%s: Can't use file descriptor 
%d",
                                   name, fd);
                  return -1;
              }
              break;
          default:
+            g_free(saddr);
              error_setg(errp, "only support inet or fd type for local");
              return -1;
          }
@@ -395,13 +406,17 @@ static int net_dgram_mcast_init(NetClientState *peer,
                            local->type == SOCKET_ADDRESS_TYPE_FD,
                            remote, errp);
      if (!s) {
+        g_free(saddr);
          return -1;
      }
- s->dgram_dst = saddr;
+    g_assert(s->dest_addr == NULL);
+    s->dest_addr = (struct sockaddr *)saddr;
+    s->dest_len = sizeof(*saddr);
+
+    qemu_set_info_str(&s->nc, "mcast=%s:%d", inet_ntoa(saddr->sin_addr),
+                      ntohs(saddr->sin_port));
- qemu_set_info_str(&s->nc, "mcast=%s:%d", inet_ntoa(saddr.sin_addr),
-                      ntohs(saddr.sin_port));
      return 0;
}
Reviewed-by: Philippe Mathieu-Daudé <philmd@xxxxxxxxxx>




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.