Support for UDP unicast network backend
Subsystems (2)
PATCH v4 1/1 Support for UDP unicast network backend
Signed-off-by Benjamin MARSILI <[email protected]>
---
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(-)
net.c +5 -1
@@ -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 */ } },
net/socket.c +75 -2
91 lines not on this page · raw message
qemu-options.hx +2 -0
@@ -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
Anthony Liguori
AppliedQuoted 1 line · Benjamin
Signed-off-by Benjamin MARSILI<[email protected]>
Applied. Thanks.
Regards,
Anthony Liguori
Quoted 141 lines
---
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(-)net.c +5
-1@@ -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 */ } },net/socket.c +75
-2@@ -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 ; }qemu-options.hx +2
-1@@ -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