|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v12 15/17] net: stream: move to QIO to enable additional parameters
On Thu, Oct 20, 2022 at 03:09:10PM +0200, Philippe Mathieu-Daudé wrote:
> On 20/10/22 11:16, Laurent Vivier wrote:
> > Use QIOChannel, QIOChannelSocket and QIONetListener.
> > This allows net/stream to use all the available parameters provided by
> > SocketAddress.
> >
> > Signed-off-by: Laurent Vivier <lvivier@xxxxxxxxxx>
> > Acked-by: Michael S. Tsirkin <mst@xxxxxxxxxx>
> > ---
> > meson | 2 +-
> > net/stream.c | 493 +++++++++++++++++-------------------------------
> > qemu-options.hx | 4 +-
> > 3 files changed, 180 insertions(+), 319 deletions(-)
>
> > static int net_stream_server_init(NetClientState *peer,
> > @@ -283,105 +287,61 @@ static int net_stream_server_init(NetClientState
> > *peer,
> > {
> > NetClientState *nc;
> > NetStreamState *s;
> > - int fd, ret;
> > -
> > - switch (addr->type) {
> > - case SOCKET_ADDRESS_TYPE_INET: {
> > - struct sockaddr_in saddr_in;
> > -
> > - if (convert_host_port(&saddr_in, addr->u.inet.host,
> > addr->u.inet.port,
> > - errp) < 0) {
> > - return -1;
> > - }
> > + QIOChannelSocket *listen_sioc = qio_channel_socket_new();
> > - fd = qemu_socket(PF_INET, SOCK_STREAM, 0);
> > - if (fd < 0) {
> > - error_setg_errno(errp, errno, "can't create stream socket");
> > - return -1;
> > - }
> > - qemu_socket_set_nonblock(fd);
> > + nc = qemu_new_net_client(&net_stream_info, peer, model, name);
> > + s = DO_UPCAST(NetStreamState, nc, nc);
> > - socket_set_fast_reuse(fd);
> > + s->listen_ioc = QIO_CHANNEL(listen_sioc);
> > + qio_channel_socket_listen_async(listen_sioc, addr, 0,
> > + net_stream_server_listening, s,
> > + NULL, NULL);
> > - ret = bind(fd, (struct sockaddr *)&saddr_in, sizeof(saddr_in));
> > - if (ret < 0) {
> > - error_setg_errno(errp, errno, "can't bind ip=%s to socket",
> > - inet_ntoa(saddr_in.sin_addr));
> > - closesocket(fd);
> > - return -1;
> > - }
> > - break;
> > - }
> > - case SOCKET_ADDRESS_TYPE_UNIX: {
> > - struct sockaddr_un saddr_un;
> > -
> > - ret = unlink(addr->u.q_unix.path);
> > - if (ret < 0 && errno != ENOENT) {
> > - error_setg_errno(errp, errno, "failed to unlink socket %s",
> > - addr->u.q_unix.path);
> > - return -1;
> > - }
> > + return 0;
> > +}
> > - saddr_un.sun_family = PF_UNIX;
> > - ret = snprintf(saddr_un.sun_path, sizeof(saddr_un.sun_path), "%s",
> > - addr->u.q_unix.path);
> > - if (ret < 0 || ret >= sizeof(saddr_un.sun_path)) {
> > - error_setg(errp, "UNIX socket path '%s' is too long",
> > - addr->u.q_unix.path);
> > - error_append_hint(errp, "Path must be less than %zu bytes\n",
> > - sizeof(saddr_un.sun_path));
> > - return -1;
> > - }
> > +static void net_stream_client_connected(QIOTask *task, gpointer opaque)
> > +{
> > + NetStreamState *s = opaque;
> > + QIOChannelSocket *sioc = QIO_CHANNEL_SOCKET(s->ioc);
> > + SocketAddress *addr;
> > + gchar *uri;
> > + int ret;
> > - fd = qemu_socket(PF_UNIX, SOCK_STREAM, 0);
> > - if (fd < 0) {
> > - error_setg_errno(errp, errno, "can't create stream socket");
> > - return -1;
> > - }
> > - qemu_socket_set_nonblock(fd);
> > -
> > - ret = bind(fd, (struct sockaddr *)&saddr_un, sizeof(saddr_un));
> > - if (ret < 0) {
> > - error_setg_errno(errp, errno, "can't create socket with path:
> > %s",
> > - saddr_un.sun_path);
> > - closesocket(fd);
> > - return -1;
> > - }
> > - break;
> > - }
> > - case SOCKET_ADDRESS_TYPE_FD:
> > - fd = monitor_fd_param(monitor_cur(), addr->u.fd.str, errp);
> > - if (fd == -1) {
> > - return -1;
> > - }
> > - ret = qemu_socket_try_set_nonblock(fd);
> > - if (ret < 0) {
> > - error_setg_errno(errp, -ret, "%s: Can't use file descriptor
> > %d",
> > - name, fd);
> > - return -1;
> > - }
> > - break;
> > - default:
> > - error_setg(errp, "only support inet or fd type");
> > - return -1;
> > + if (sioc->fd < 0) {
> > + qemu_set_info_str(&s->nc, "connection error");
> > + goto error;
> > }
> > - ret = listen(fd, 0);
> > - if (ret < 0) {
> > - error_setg_errno(errp, errno, "can't listen on socket");
> > - closesocket(fd);
> > - return -1;
> > + addr = qio_channel_socket_get_remote_address(sioc, NULL);
> > + g_assert(addr != NULL);
>
> Please use:
>
> addr = qio_channel_socket_get_remote_address(sioc, &error_fatal);
Just 'err' instead of '&error_fatal', and return - to the caller.
This is code where we need to propagate back to the caller, not
abort the running QEMU when hotplugging a NIC backend.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |