Patchwork [v2] Support for UDP unicast network backend

login
register
mail settings
Submitter Benjamin
Date Nov. 24, 2011, 1:02 a.m.
Message ID <4ECD979A.2050601@gmail.com>
Download mbox | patch
Permalink /patch/127336/
State New
Headers show

Comments

Benjamin - Nov. 24, 2011, 1:02 a.m.
Signed-off-by: Benjamin MARSILI <marsil_b@epitech.eu>
---
  net.c           |    6 ++++-
  net/socket.c    |   71 
+++++++++++++++++++++++++++++++++++++++++++++++++++++-
  qemu-options.hx |    2 +
  3 files changed, 76 insertions(+), 3 deletions(-)

tunnel\n"
  #ifdef CONFIG_VDE
      "-net 
vde[,vlan=n][,name=str][,sock=socketpath][,port=n][,group=groupname][,mode=octalmode]\n"
      "                connect the vlan 'n' to port 'n' of a vde switch 
running\n"
Stefan Hajnoczi - Nov. 24, 2011, 9:13 a.m.
On Thu, Nov 24, 2011 at 1:02 AM, Benjamin <mlspirat42@gmail.com> wrote:
>
> Signed-off-by: Benjamin MARSILI <marsil_b@epitech.eu>
> ---

This is the '---' that people typically add comments after.  Git will
not include anything from '---' to the next 'diff --git ...' line.

>  net.c           |    6 ++++-
>  net/socket.c    |   71
> +++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  qemu-options.hx |    2 +
>  3 files changed, 76 insertions(+), 3 deletions(-)

For example, this automatically inserted diffstat will not be part of
the git commit and it gets applied since it is after the '---'.

> diff --git a/net.c b/net.c
> index cb52050..8e957b2 100644
> --- a/net.c
> +++ b/net.c
> @@ -999,7 +999,11 @@ static const struct {
>             }, {
>                 .name = "localaddr",
>                 .type = QEMU_OPT_STRING,
> -                .help = "source address for multicast packets",
> +                .help = "source address and port for multicast and udp
> packets",
> +            }, {
> +                .name = "udp",
> +                .type = QEMU_OPT_STRING,
> +                .help = "UDP unicast address and port number",
>             },
>             { /* end of list */ }
>         },
> diff --git a/net/socket.c b/net/socket.c
> index e9ef128..ca183f2 100644
> --- a/net/socket.c
> +++ b/net/socket.c
> @@ -524,6 +524,55 @@ static int net_socket_mcast_init(VLANState *vlan,
>
>  }
>
> +static int net_socket_udp_init(VLANState *vlan,
> +                                 const char *model,
> +                                 const char *name,
> +                                 const char *rhost,
> +                                 const char *lhost)
> +{
> +    NetSocketState *s;
> +    int fd, val, ret;
> +    struct sockaddr_in laddr, raddr;
> +
> +    if (parse_host_port(&laddr, lhost) < 0) {
> +        return -1;
> +    }
> +
> +    if (parse_host_port(&raddr, rhost) < 0) {
> +        return -1;
> +    }
> +
> +    fd = qemu_socket(PF_INET, SOCK_DGRAM, 0);
> +    if (fd < 0) {
> +        perror("socket(PF_INET, SOCK_DGRAM)");
> +        return -1;
> +    }
> +    val = 1;
> +    ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
> +                   (const char *)&val, sizeof(val));
> +    if (ret < 0) {
> +        perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
> +        return -1;
> +    }
> +    ret = bind(fd, (struct sockaddr *)&laddr, sizeof(laddr));
> +    if (ret < 0) {
> +        perror("bind");
> +        return -1;
> +    }
> +
> +    s = net_socket_fd_init(vlan, model, name, fd, 0);
> +    if (!s) {
> +        return -1;
> +    }
> +
> +    s->dgram_dst = raddr;
> +
> +    snprintf(s->nc.info_str, sizeof(s->nc.info_str),
> +             "socket: udp=%s:%d",
> +             inet_ntoa(raddr.sin_addr), ntohs(raddr.sin_port));
> +    return 0;
> +}
> +
>  int net_init_socket(QemuOpts *opts,
>                     Monitor *mon,
>                     const char *name,
> @@ -597,10 +646,28 @@ int net_init_socket(QemuOpts *opts,
>         if (net_socket_mcast_init(vlan, "socket", name, mcast, localaddr) ==
> -1) {
>             return -1;
>         }
> +    } else if (qemu_opt_get(opts, "udp")) {
> +        const char *udp, *localaddr;
> +
> +        if (qemu_opt_get(opts, "fd") ||
> +            qemu_opt_get(opts, "connect") ||
> +            qemu_opt_get(opts, "listen") ||
> +            qemu_opt_get(opts, "mcast")) {
> +            error_report("fd=, connect=, listen=\
> +                         and mcast= is invalid with udp=");
> +            return -1;
> +        }
> +
> +        udp = qemu_opt_get(opts, "udp");
> +        localaddr = qemu_opt_get(opts, "localaddr");
> +
> +        if (net_socket_udp_init(vlan, "udp", name, udp, localaddr) == -1) {
> +            return -1;
> +        }
>     } else {
> -        error_report("-socket requires fd=, listen=, connect= or mcast=");
> +        error_report("-socket requires fd=, listen=, \
> +                     connect=, mcast= or udp=");
>         return -1;
>     }
> -
>     return 0;
>  }
> diff --git a/qemu-options.hx b/qemu-options.hx
> index 681eaf1..5495368 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -1217,6 +1217,8 @@ DEF("net", HAS_ARG, QEMU_OPTION_net,
>     "-net
> socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port[,localaddr=addr]]\n"
>     "                connect the vlan 'n' to multicast maddr and port\n"
>     "                use 'localaddr=addr' to specify the host address to
> send packets from\n"
> +    "-net
> socket[,vlan=n][,name=str][,fd=h][,udp=host:port][,localaddr=host:port]\n"

The GMail web interface always wraps lines.  This breaks the patch and
it cannot be applied without manually fixing it up.  There is no way
to disable this in the GMail web interface but you can use SMTP to
send mails directly and they will not be touched.

Configuring git-send-email for GMail is described here:
http://morefedora.blogspot.com/2009/02/configuring-git-send-email-to-use-gmail.html

Also, please send a top-level mail and not a reply to the existing
thread.  This makes it easier for reviewers and maintainers to spot
your new patch revision.

Stefan

Patch

diff --git a/net.c b/net.c
index cb52050..8e957b2 100644
--- a/net.c
+++ b/net.c
@@ -999,7 +999,11 @@  static const struct {
              }, {
                  .name = "localaddr",
                  .type = QEMU_OPT_STRING,
-                .help = "source address for multicast packets",
+                .help = "source address and port for multicast and udp 
packets",
+            }, {
+                .name = "udp",
+                .type = QEMU_OPT_STRING,
+                .help = "UDP unicast address and port number",
              },
              { /* end of list */ }
          },
diff --git a/net/socket.c b/net/socket.c
index e9ef128..ca183f2 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -524,6 +524,55 @@  static int net_socket_mcast_init(VLANState *vlan,

  }

+static int net_socket_udp_init(VLANState *vlan,
+                                 const char *model,
+                                 const char *name,
+                                 const char *rhost,
+                                 const char *lhost)
+{
+    NetSocketState *s;
+    int fd, val, ret;
+    struct sockaddr_in laddr, raddr;
+
+    if (parse_host_port(&laddr, lhost) < 0) {
+        return -1;
+    }
+
+    if (parse_host_port(&raddr, rhost) < 0) {
+        return -1;
+    }
+
+    fd = qemu_socket(PF_INET, SOCK_DGRAM, 0);
+    if (fd < 0) {
+        perror("socket(PF_INET, SOCK_DGRAM)");
+        return -1;
+    }
+    val = 1;
+    ret = setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
+                   (const char *)&val, sizeof(val));
+    if (ret < 0) {
+        perror("setsockopt(SOL_SOCKET, SO_REUSEADDR)");
+        return -1;
+    }
+    ret = bind(fd, (struct sockaddr *)&laddr, sizeof(laddr));
+    if (ret < 0) {
+        perror("bind");
+        return -1;
+    }
+
+    s = net_socket_fd_init(vlan, model, name, fd, 0);
+    if (!s) {
+        return -1;
+    }
+
+    s->dgram_dst = raddr;
+
+    snprintf(s->nc.info_str, sizeof(s->nc.info_str),
+             "socket: udp=%s:%d",
+             inet_ntoa(raddr.sin_addr), ntohs(raddr.sin_port));
+    return 0;
+}
+
  int net_init_socket(QemuOpts *opts,
                      Monitor *mon,
                      const char *name,
@@ -597,10 +646,28 @@  int net_init_socket(QemuOpts *opts,
          if (net_socket_mcast_init(vlan, "socket", name, mcast, 
localaddr) == -1) {
              return -1;
          }
+    } else if (qemu_opt_get(opts, "udp")) {
+        const char *udp, *localaddr;
+
+        if (qemu_opt_get(opts, "fd") ||
+            qemu_opt_get(opts, "connect") ||
+            qemu_opt_get(opts, "listen") ||
+            qemu_opt_get(opts, "mcast")) {
+            error_report("fd=, connect=, listen=\
+                         and mcast= is invalid with udp=");
+            return -1;
+        }
+
+        udp = qemu_opt_get(opts, "udp");
+        localaddr = qemu_opt_get(opts, "localaddr");
+
+        if (net_socket_udp_init(vlan, "udp", name, udp, localaddr) == -1) {
+            return -1;
+        }
      } else {
-        error_report("-socket requires fd=, listen=, connect= or mcast=");
+        error_report("-socket requires fd=, listen=, \
+                     connect=, mcast= or udp=");
          return -1;
      }
-
      return 0;
  }
diff --git a/qemu-options.hx b/qemu-options.hx
index 681eaf1..5495368 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1217,6 +1217,8 @@  DEF("net", HAS_ARG, QEMU_OPTION_net,
      "-net 
socket[,vlan=n][,name=str][,fd=h][,mcast=maddr:port[,localaddr=addr]]\n"
      "                connect the vlan 'n' to multicast maddr and port\n"
      "                use 'localaddr=addr' to specify the host address 
to send packets from\n"
+    "-net 
socket[,vlan=n][,name=str][,fd=h][,udp=host:port][,localaddr=host:port]\n"
+    "                connect the vlan 'n' to another VLAN using an UDP