Loading net.c +5 −1 Original line number Diff line number Diff line Loading @@ -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 */ } }, Loading net/socket.c +75 −2 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -606,10 +657,32 @@ int net_init_socket(QemuOpts *opts, if (net_socket_mcast_init(vlan, "socket", name, mcast, localaddr) == -1) { return -1; } } else { error_report("-socket requires fd=, listen=, connect= or mcast="); } 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=, mcast= or udp="); return -1; } return 0; } qemu-options.hx +2 −0 Original line number Diff line number Diff line Loading @@ -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" Loading Loading
net.c +5 −1 Original line number Diff line number Diff line Loading @@ -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 */ } }, Loading
net/socket.c +75 −2 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -606,10 +657,32 @@ int net_init_socket(QemuOpts *opts, if (net_socket_mcast_init(vlan, "socket", name, mcast, localaddr) == -1) { return -1; } } else { error_report("-socket requires fd=, listen=, connect= or mcast="); } 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=, mcast= or udp="); return -1; } return 0; }
qemu-options.hx +2 −0 Original line number Diff line number Diff line Loading @@ -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" Loading