From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Het Gala <het.gala@nutanix.com>, qemu-devel@nongnu.org
Subject: Re: [PATCH 3/4] Establishing connection between any non-default source and destination pair
Date: Wed, 20 Jul 2022 07:52:14 +0100 [thread overview]
Message-ID: <Ytel3tvt6b+YJhii@redhat.com> (raw)
In-Reply-To: <de0646c1-75d7-5f9d-32db-07c498c45715@nutanix.com>
Re-adding the mailing list, please don't drop the list in
replies to discussions.
On Wed, Jul 20, 2022 at 02:08:23AM +0530, Het Gala wrote:
>
> On 13/07/22 3:10 pm, Het Gala wrote:
> >
> > On 16/06/22 11:09 pm, Daniel P. Berrangé wrote:
> > > On Thu, Jun 09, 2022 at 07:33:04AM +0000, Het Gala wrote:
> > > > i) Binding of the socket to source ip address and port on the
> > > > non-default
> > > > interface has been implemented for multi-FD connection,
> > > > which was not
> > > > necessary earlier because the binding was on the default
> > > > interface itself.
> > > >
> > > > ii) Created an end to end connection between all multi-FD source and
> > > > destination pairs.
> > > >
> > > > Suggested-by: Manish Mishra <manish.mishra@nutanix.com>
> > > > Signed-off-by: Het Gala <het.gala@nutanix.com>
> > > > ---
> > > > chardev/char-socket.c | 4 +-
> > > > include/io/channel-socket.h | 26 ++++++-----
> > > > include/qemu/sockets.h | 6 ++-
> > > > io/channel-socket.c | 50 ++++++++++++++------
> > > > migration/socket.c | 15 +++---
> > > > nbd/client-connection.c | 2 +-
> > > > qemu-nbd.c | 4 +-
> > > > scsi/pr-manager-helper.c | 1 +
> > > > tests/unit/test-char.c | 8 ++--
> > > > tests/unit/test-io-channel-socket.c | 4 +-
> > > > tests/unit/test-util-sockets.c | 16 +++----
> > > > ui/input-barrier.c | 2 +-
> > > > ui/vnc.c | 3 +-
> > > > util/qemu-sockets.c | 71
> > > > ++++++++++++++++++++---------
> > > > 14 files changed, 135 insertions(+), 77 deletions(-)
> > > >
> > > > diff --git a/chardev/char-socket.c b/chardev/char-socket.c
> > > > index dc4e218eeb..f3725238c5 100644
> > > > --- a/chardev/char-socket.c
> > > > +++ b/chardev/char-socket.c
> > > > @@ -932,7 +932,7 @@ static int
> > > > tcp_chr_connect_client_sync(Chardev *chr, Error **errp)
> > > > QIOChannelSocket *sioc = qio_channel_socket_new();
> > > > tcp_chr_change_state(s, TCP_CHARDEV_STATE_CONNECTING);
> > > > tcp_chr_set_client_ioc_name(chr, sioc);
> > > > - if (qio_channel_socket_connect_sync(sioc, s->addr, errp) < 0) {
> > > > + if (qio_channel_socket_connect_sync(sioc, s->addr, NULL,
> > > > errp) < 0) {
> > > > tcp_chr_change_state(s, TCP_CHARDEV_STATE_DISCONNECTED);
> > > > object_unref(OBJECT(sioc));
> > > > return -1;
> > > > @@ -1120,7 +1120,7 @@ static void
> > > > tcp_chr_connect_client_task(QIOTask *task,
> > > > SocketAddress *addr = opaque;
> > > > Error *err = NULL;
> > > > - qio_channel_socket_connect_sync(ioc, addr, &err);
> > > > + qio_channel_socket_connect_sync(ioc, addr, NULL, &err);
> > > > qio_task_set_error(task, err);
> > > > }
> > > > diff --git a/include/io/channel-socket.h b/include/io/channel-socket.h
> > > > index 513c428fe4..59d5b1b349 100644
> > > > --- a/include/io/channel-socket.h
> > > > +++ b/include/io/channel-socket.h
> > > > @@ -83,41 +83,45 @@ qio_channel_socket_new_fd(int fd,
> > > > /**
> > > > * qio_channel_socket_connect_sync:
> > > > * @ioc: the socket channel object
> > > > - * @addr: the address to connect to
> > > > + * @dst_addr: the destination address to connect to
> > > > + * @src_addr: the source address to be connected
> > > > * @errp: pointer to a NULL-initialized error object
> > > > *
> > > > - * Attempt to connect to the address @addr. This method
> > > > - * will run in the foreground so the caller will not regain
> > > > - * execution control until the connection is established or
> > > > + * Attempt to connect to the address @dst_addr with @src_addr.
> > > > + * This method will run in the foreground so the caller will not
> > > > + * regain execution control until the connection is established or
> > > > * an error occurs.
> > > > */
> > > > int qio_channel_socket_connect_sync(QIOChannelSocket *ioc,
> > > > - SocketAddress *addr,
> > > > + SocketAddress *dst_addr,
> > > > + SocketAddress *src_addr,
> > > > Error **errp);
> > > > /**
> > > > * qio_channel_socket_connect_async:
> > > > * @ioc: the socket channel object
> > > > - * @addr: the address to connect to
> > > > + * @dst_addr: the destination address to connect to
> > > > * @callback: the function to invoke on completion
> > > > * @opaque: user data to pass to @callback
> > > > * @destroy: the function to free @opaque
> > > > * @context: the context to run the async task. If %NULL, the default
> > > > * context will be used.
> > > > + * @src_addr: the source address to be connected
> > > > *
> > > > - * Attempt to connect to the address @addr. This method
> > > > - * will run in the background so the caller will regain
> > > > + * Attempt to connect to the address @dst_addr with the @src_addr.
> > > > + * This method will run in the background so the caller will regain
> > > > * execution control immediately. The function @callback
> > > > - * will be invoked on completion or failure. The @addr
> > > > + * will be invoked on completion or failure. The @dst_addr
> > > > * parameter will be copied, so may be freed as soon
> > > > * as this function returns without waiting for completion.
> > > > */
> > > > void qio_channel_socket_connect_async(QIOChannelSocket *ioc,
> > > > - SocketAddress *addr,
> > > > + SocketAddress *dst_addr,
> > > > QIOTaskFunc callback,
> > > > gpointer opaque,
> > > > GDestroyNotify destroy,
> > > > - GMainContext *context);
> > > > + GMainContext *context,
> > > > + SocketAddress *src_addr);
> > > Lets avoid modifying these two methods, and thus avoid
> > > updating countless callers.
> > >
> > > In common with typical pattern in QIO code, lets add
> > > a second variant
> > >
> > > qio_channel_socket_connect_full
> > > qio_channel_socket_connect_full_async
> > >
> > > which has the extra parameters, then make the existing
> > > simpler methods call the new ones.
> > >
> > > ie qio_channel_socket_connect should call
> > > qio_channel_socket_connect_full, pasing NULL for the
> > > src_addr.
> > >
> > > Thanks for the suggestion Daniel. Will modify the same structure as
> >
> > suggested above in the v2 patchset.
>
> > Hi Daniel. I agree with your suggestion here, but I have couple of doubts
> in implementing this type.
>
> 1. You meant to say qio_channel_socket_connect_async calls ->
> qio_channel_socket_connect_all_async and the later function would have a
> extra parameter for src_addr as NULL right. But if you see this approach
> works well for connecting non-multifd channels where source uri is passed as
> NULL, but for multifd channels, as you see the function
> socket_send_channel_create also calls qio_channel_socket_connect_async, but
> this time instead of NULL, it should actually pass a src_addr parameter. So
> in my opion, whatever function multifd function is calling it should have
> extra parameter to pass src_addr.
>
> 2. Same goes for qio_channel_socket_connect_sync func, for multifd path, it
> should be passed with src_addr instead of NULL.
>
> 3. I agree, modifying these methods would lead to updating endless callers
> from test cases. But I don't see a better way that this at the moment. And
> out of the two methods, one method is called only for single unit test case
> in qemu.
>
> We would love to have suggestions from your side Daniel.
Do not modify this existing method signature at all:
int qio_channel_socket_connect_sync(QIOChannelSocket *ioc,
SocketAddress *addr,
Error **errp);
Only add a new method:
int qio_channel_socket_connect_full_sync(QIOChannelSocket *ioc,
SocketAddress *dst_addr,
SocketAddress *src_addr,
Error **errp);
Internally the former method calls the latter, assing NULL for
src_addr.
Externally, only the migration code needs to use the new method,
all the rest of QEMU code must remain unchanged calling the simpler
method.
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 :|
next prev parent reply other threads:[~2022-07-20 6:54 UTC|newest]
Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-09 7:33 [PATCH 0/4] Multiple interface support on top of Multi-FD Het Gala
2022-06-09 7:33 ` [PATCH 1/4] Modifying ‘migrate’ qmp command to add multi-FD socket on particular source and destination pair Het Gala
2022-06-16 17:26 ` Dr. David Alan Gilbert
2022-07-13 8:08 ` Het Gala
2022-07-15 8:07 ` Het Gala
2022-07-13 12:54 ` Claudio Fontana
2022-07-18 8:35 ` Markus Armbruster
2022-07-18 13:33 ` Het Gala
2022-07-18 14:33 ` Markus Armbruster
2022-07-18 15:17 ` Het Gala
2022-07-19 7:06 ` Markus Armbruster
2022-07-19 7:51 ` Het Gala
2022-07-19 9:48 ` Markus Armbruster
2022-07-19 10:40 ` Het Gala
2022-06-09 7:33 ` [PATCH 2/4] Adding multi-interface support for multi-FD on destination side Het Gala
2022-06-16 18:40 ` Dr. David Alan Gilbert
2022-07-13 14:36 ` Het Gala
2022-06-09 7:33 ` [PATCH 3/4] Establishing connection between any non-default source and destination pair Het Gala
2022-06-16 17:39 ` Daniel P. Berrangé
2022-06-21 16:09 ` manish.mishra
[not found] ` <54ca00c7-a108-11e3-1c8d-8771798aed6a@nutanix.com>
[not found] ` <de0646c1-75d7-5f9d-32db-07c498c45715@nutanix.com>
2022-07-20 6:52 ` Daniel P. Berrangé [this message]
2022-06-09 7:33 ` [PATCH 4/4] Adding support for multi-FD connections dynamically Het Gala
2022-06-16 18:47 ` Dr. David Alan Gilbert
2022-06-21 16:12 ` manish.mishra
2022-06-09 15:47 ` [PATCH 0/4] Multiple interface support on top of Multi-FD Daniel P. Berrangé
2022-06-10 12:28 ` manish.mishra
2022-06-15 16:43 ` Daniel P. Berrangé
2022-06-15 19:14 ` Dr. David Alan Gilbert
2022-06-16 8:16 ` Daniel P. Berrangé
2022-06-16 10:14 ` manish.mishra
2022-06-16 17:32 ` Daniel P. Berrangé
2022-06-16 8:27 ` Daniel P. Berrangé
2022-06-16 15:50 ` Dr. David Alan Gilbert
2022-06-21 16:16 ` manish.mishra
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Ytel3tvt6b+YJhii@redhat.com \
--to=berrange@redhat.com \
--cc=het.gala@nutanix.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).