Re: [Qemu-devel] [PATCH v4] Support for UDP unicast network backend

2012-01-12 Thread Anthony Liguori

On 01/10/2012 06:20 PM, Benjamin wrote:

Signed-off-by: Benjamin MARSILImlspira...@gmail.com


Applied.  Thanks.

Regards,

Anthony Liguori


---
Added my last name. Check that localaddr= is supplied with udp=,
it crashed when misused...

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

diff --git a/net.c b/net.c
index f7bebf8..2b0f766 100644
--- a/net.c
+++ b/net.c
@@ -1000,7 +1000,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 c9d70d3..d4c2002 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -534,6 +534,57 @@ 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));
+closesocket(fd);
+return -1;
+}
+ret = bind(fd, (struct sockaddr *)laddr, sizeof(laddr));
+if (ret  0) {
+perror(bind);
+closesocket(fd);
+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,
@@ -606,10 +657,32 @@ 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 (localaddr == NULL) {
+error_report(localaddr= is mandatory with udp=);
+return -1;
+}
+
+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 7903e5c..6295cde 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1239,6 +1239,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 
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
--
1.7.6








[Qemu-devel] [PATCH v4] Support for UDP unicast network backend

2012-01-10 Thread Benjamin

Signed-off-by: Benjamin MARSILI mlspira...@gmail.com
---
Added my last name. Check that localaddr= is supplied with udp=,
it crashed when misused...

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

diff --git a/net.c b/net.c
index f7bebf8..2b0f766 100644
--- a/net.c
+++ b/net.c
@@ -1000,7 +1000,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 c9d70d3..d4c2002 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -534,6 +534,57 @@ 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));
+closesocket(fd);
+return -1;
+}
+ret = bind(fd, (struct sockaddr *)laddr, sizeof(laddr));
+if (ret  0) {
+perror(bind);
+closesocket(fd);
+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,
@@ -606,10 +657,32 @@ 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 (localaddr == NULL) {
+error_report(localaddr= is mandatory with udp=);
+return -1;
+}
+
+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 7903e5c..6295cde 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -1239,6 +1239,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 
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
--
1.7.6