Message ID | 20221011200539.1486809-18-lvivier@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | qapi: net: add unix socket type support to netdev backend | expand |
Laurent Vivier <lvivier@redhat.com> writes: > The netdev reports NETDEV_STREAM_CONNECTED event when the backend > is connected, and NETDEV_STREAM_EOC when it is disconnected. > > The NETDEV_STREAM_CONNECTED event includes the URI of the destination > address. > > Signed-off-by: Laurent Vivier <lvivier@redhat.com> > Acked-by: Michael S. Tsirkin <mst@redhat.com> > --- > net/stream.c | 11 +++++++++-- > qapi/net.json | 46 ++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 55 insertions(+), 2 deletions(-) > > diff --git a/net/stream.c b/net/stream.c > index 0293e38e5b57..821ae3265356 100644 > --- a/net/stream.c > +++ b/net/stream.c > @@ -38,6 +38,7 @@ > #include "io/channel.h" > #include "io/channel-socket.h" > #include "io/net-listener.h" > +#include "qapi/qapi-events-net.h" > > typedef struct NetStreamState { > NetClientState nc; > @@ -168,6 +169,8 @@ static gboolean net_stream_send(QIOChannel *ioc, > s->nc.link_down = true; > qemu_set_info_str(&s->nc, ""); > > + qapi_event_send_netdev_stream_eoc(s->nc.name); > + > return G_SOURCE_REMOVE; > } > buf = buf1; > @@ -243,9 +246,10 @@ static void net_stream_listen(QIONetListener *listener, > g_assert(addr != NULL); > uri = socket_uri(addr); > qemu_set_info_str(&s->nc, uri); > - g_free(uri); > qapi_free_SocketAddress(addr); > > + qapi_event_send_netdev_stream_connected(s->nc.name, uri); > + g_free(uri); > } > > static void net_stream_server_listening(QIOTask *task, gpointer opaque) > @@ -317,12 +321,12 @@ static void net_stream_client_connected(QIOTask *task, gpointer opaque) > g_assert(addr != NULL); > uri = socket_uri(addr); > qemu_set_info_str(&s->nc, uri); > - g_free(uri); > > ret = qemu_socket_try_set_nonblock(sioc->fd); > if (addr->type == SOCKET_ADDRESS_TYPE_FD && ret < 0) { > qemu_set_info_str(&s->nc, "can't use file descriptor %s (errno %d)", > addr->u.fd.str, -ret); > + g_free(uri); > qapi_free_SocketAddress(addr); > goto error; > } > @@ -338,6 +342,9 @@ static void net_stream_client_connected(QIOTask *task, gpointer opaque) > s, NULL); > s->nc.link_down = false; > > + qapi_event_send_netdev_stream_connected(s->nc.name, uri); > + g_free(uri); > + > return; > error: > object_unref(OBJECT(s->ioc)); > diff --git a/qapi/net.json b/qapi/net.json > index 6a1a49749294..69f83bceff3f 100644 > --- a/qapi/net.json > +++ b/qapi/net.json > @@ -895,3 +895,49 @@ > ## > { 'event': 'FAILOVER_NEGOTIATED', > 'data': {'device-id': 'str'} } > + > +## > +# @NETDEV_STREAM_CONNECTED: > +# > +# Emitted when the netdev stream backend is connected > +# > +# @netdev-id: QEMU netdev id that is connected > +# @uri: The Uniform Resource Identifier identifying the destination address Is an URI the appropriate representation here? It's not how we specify such addresses elsewhere in QAPI/QMP... > +# > +# Since: 7.2 > +# > +# Example: > +# > +# <- { 'event': 'NETDEV_STREAM_CONNECTED', > +# 'data': {'uri': 'tcp:::1:1234', 'netdev-id': 'netdev0'}, > +# 'timestamp': {'seconds': 1663330564, 'microseconds': 804317} } > +# > +# or > +# > +# <- { 'event': 'NETDEV_STREAM_CONNECTED', > +# 'data': {'uri': ''unix:/tmp/qemu0', 'netdev-id': 'netdev0'}, > +# 'timestamp': {'seconds': 1663330564, 'microseconds': 804317} } > +# > +## > +{ 'event': 'NETDEV_STREAM_CONNECTED', > + 'data': { 'netdev-id': 'str', > + 'uri': 'str' } } > + > +## > +# @NETDEV_STREAM_EOC: What does "EOC" mean? Could this be named NETDEV_STREAM_DISCONNECTED, for symmetry with NETDEV_STREAM_CONNECTED? > +# > +# Emitted when the netdev stream backend is disconnected > +# > +# @netdev-id: QEMU netdev id that is disconnected > +# > +# Since: 7.2 > +# > +# Example: > +# > +# <- { 'event': 'NETDEV_STREAM_EOC', > +# 'data': {'netdev-id': 'netdev0'}, > +# 'timestamp': {'seconds': 1663330937, 'microseconds': 526695} } > +# > +## > +{ 'event': 'NETDEV_STREAM_EOC', > + 'data': { 'netdev-id': 'str' } }
On 10/17/22 15:23, Markus Armbruster wrote: > Laurent Vivier <lvivier@redhat.com> writes: > >> The netdev reports NETDEV_STREAM_CONNECTED event when the backend >> is connected, and NETDEV_STREAM_EOC when it is disconnected. >> >> The NETDEV_STREAM_CONNECTED event includes the URI of the destination >> address. >> >> Signed-off-by: Laurent Vivier <lvivier@redhat.com> >> Acked-by: Michael S. Tsirkin <mst@redhat.com> >> --- >> net/stream.c | 11 +++++++++-- >> qapi/net.json | 46 ++++++++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 55 insertions(+), 2 deletions(-) >> >> diff --git a/net/stream.c b/net/stream.c >> index 0293e38e5b57..821ae3265356 100644 >> --- a/net/stream.c >> +++ b/net/stream.c >> @@ -38,6 +38,7 @@ >> #include "io/channel.h" >> #include "io/channel-socket.h" >> #include "io/net-listener.h" >> +#include "qapi/qapi-events-net.h" >> >> typedef struct NetStreamState { >> NetClientState nc; >> @@ -168,6 +169,8 @@ static gboolean net_stream_send(QIOChannel *ioc, >> s->nc.link_down = true; >> qemu_set_info_str(&s->nc, ""); >> >> + qapi_event_send_netdev_stream_eoc(s->nc.name); >> + >> return G_SOURCE_REMOVE; >> } >> buf = buf1; >> @@ -243,9 +246,10 @@ static void net_stream_listen(QIONetListener *listener, >> g_assert(addr != NULL); >> uri = socket_uri(addr); >> qemu_set_info_str(&s->nc, uri); >> - g_free(uri); >> qapi_free_SocketAddress(addr); >> >> + qapi_event_send_netdev_stream_connected(s->nc.name, uri); >> + g_free(uri); >> } >> >> static void net_stream_server_listening(QIOTask *task, gpointer opaque) >> @@ -317,12 +321,12 @@ static void net_stream_client_connected(QIOTask *task, gpointer opaque) >> g_assert(addr != NULL); >> uri = socket_uri(addr); >> qemu_set_info_str(&s->nc, uri); >> - g_free(uri); >> >> ret = qemu_socket_try_set_nonblock(sioc->fd); >> if (addr->type == SOCKET_ADDRESS_TYPE_FD && ret < 0) { >> qemu_set_info_str(&s->nc, "can't use file descriptor %s (errno %d)", >> addr->u.fd.str, -ret); >> + g_free(uri); >> qapi_free_SocketAddress(addr); >> goto error; >> } >> @@ -338,6 +342,9 @@ static void net_stream_client_connected(QIOTask *task, gpointer opaque) >> s, NULL); >> s->nc.link_down = false; >> >> + qapi_event_send_netdev_stream_connected(s->nc.name, uri); >> + g_free(uri); >> + >> return; >> error: >> object_unref(OBJECT(s->ioc)); >> diff --git a/qapi/net.json b/qapi/net.json >> index 6a1a49749294..69f83bceff3f 100644 >> --- a/qapi/net.json >> +++ b/qapi/net.json >> @@ -895,3 +895,49 @@ >> ## >> { 'event': 'FAILOVER_NEGOTIATED', >> 'data': {'device-id': 'str'} } >> + >> +## >> +# @NETDEV_STREAM_CONNECTED: >> +# >> +# Emitted when the netdev stream backend is connected >> +# >> +# @netdev-id: QEMU netdev id that is connected >> +# @uri: The Uniform Resource Identifier identifying the destination address > > Is an URI the appropriate representation here? It's not how we specify > such addresses elsewhere in QAPI/QMP... I put in the event the same information we have in info_str and displayed by the HMP command 'info network'. What would be a more appropriate reprensation? > >> +# >> +# Since: 7.2 >> +# >> +# Example: >> +# >> +# <- { 'event': 'NETDEV_STREAM_CONNECTED', >> +# 'data': {'uri': 'tcp:::1:1234', 'netdev-id': 'netdev0'}, >> +# 'timestamp': {'seconds': 1663330564, 'microseconds': 804317} } >> +# >> +# or >> +# >> +# <- { 'event': 'NETDEV_STREAM_CONNECTED', >> +# 'data': {'uri': ''unix:/tmp/qemu0', 'netdev-id': 'netdev0'}, >> +# 'timestamp': {'seconds': 1663330564, 'microseconds': 804317} } >> +# >> +## >> +{ 'event': 'NETDEV_STREAM_CONNECTED', >> + 'data': { 'netdev-id': 'str', >> + 'uri': 'str' } } >> + >> +## >> +# @NETDEV_STREAM_EOC: > > What does "EOC" mean? End-Of-Connection, this is the nomenclature used in the code when the socket is disconnected. > > Could this be named NETDEV_STREAM_DISCONNECTED, for symmetry with > NETDEV_STREAM_CONNECTED? Yes, it can. EOC is shorter, it's why I used it, but if you prefer "disconnected"... Thanks, Laurent > >> +# >> +# Emitted when the netdev stream backend is disconnected >> +# >> +# @netdev-id: QEMU netdev id that is disconnected >> +# >> +# Since: 7.2 >> +# >> +# Example: >> +# >> +# <- { 'event': 'NETDEV_STREAM_EOC', >> +# 'data': {'netdev-id': 'netdev0'}, >> +# 'timestamp': {'seconds': 1663330937, 'microseconds': 526695} } >> +# >> +## >> +{ 'event': 'NETDEV_STREAM_EOC', >> + 'data': { 'netdev-id': 'str' } } >
Sorry for the slow replay, too many distractions... Laurent Vivier <lvivier@redhat.com> writes: > On 10/17/22 15:23, Markus Armbruster wrote: >> Laurent Vivier <lvivier@redhat.com> writes: >> >>> The netdev reports NETDEV_STREAM_CONNECTED event when the backend >>> is connected, and NETDEV_STREAM_EOC when it is disconnected. >>> >>> The NETDEV_STREAM_CONNECTED event includes the URI of the destination >>> address. >>> >>> Signed-off-by: Laurent Vivier <lvivier@redhat.com> >>> Acked-by: Michael S. Tsirkin <mst@redhat.com> [...] >>> diff --git a/qapi/net.json b/qapi/net.json >>> index 6a1a49749294..69f83bceff3f 100644 >>> --- a/qapi/net.json >>> +++ b/qapi/net.json >>> @@ -895,3 +895,49 @@ >>> ## >>> { 'event': 'FAILOVER_NEGOTIATED', >>> 'data': {'device-id': 'str'} } >>> + >>> +## >>> +# @NETDEV_STREAM_CONNECTED: >>> +# >>> +# Emitted when the netdev stream backend is connected >>> +# >>> +# @netdev-id: QEMU netdev id that is connected >>> +# @uri: The Uniform Resource Identifier identifying the destination address >> >> Is an URI the appropriate representation here? It's not how we specify >> such addresses elsewhere in QAPI/QMP... > > I put in the event the same information we have in info_str and displayed by the HMP command 'info network'. What would be a more appropriate reprensation? SocketAddress? >>> +# >>> +# Since: 7.2 >>> +# >>> +# Example: >>> +# >>> +# <- { 'event': 'NETDEV_STREAM_CONNECTED', >>> +# 'data': {'uri': 'tcp:::1:1234', 'netdev-id': 'netdev0'}, >>> +# 'timestamp': {'seconds': 1663330564, 'microseconds': 804317} } >>> +# >>> +# or >>> +# >>> +# <- { 'event': 'NETDEV_STREAM_CONNECTED', >>> +# 'data': {'uri': ''unix:/tmp/qemu0', 'netdev-id': 'netdev0'}, >>> +# 'timestamp': {'seconds': 1663330564, 'microseconds': 804317} } >>> +# >>> +## >>> +{ 'event': 'NETDEV_STREAM_CONNECTED', >>> + 'data': { 'netdev-id': 'str', >>> + 'uri': 'str' } } >>> + >>> +## >>> +# @NETDEV_STREAM_EOC: >> >> What does "EOC" mean? > > End-Of-Connection, this is the nomenclature used in the code when the socket is disconnected. > >> Could this be named NETDEV_STREAM_DISCONNECTED, for symmetry with >> NETDEV_STREAM_CONNECTED? > > Yes, it can. EOC is shorter, it's why I used it, but if you prefer "disconnected"... For better or worse, we've always preferred longhand to abbreviations in QAPI schema names. Exceptions have crept in, of course. [...]
On 10/20/22 12:22, Markus Armbruster wrote: > Sorry for the slow replay, too many distractions... > > Laurent Vivier <lvivier@redhat.com> writes: > >> On 10/17/22 15:23, Markus Armbruster wrote: >>> Laurent Vivier <lvivier@redhat.com> writes: >>> >>>> The netdev reports NETDEV_STREAM_CONNECTED event when the backend >>>> is connected, and NETDEV_STREAM_EOC when it is disconnected. >>>> >>>> The NETDEV_STREAM_CONNECTED event includes the URI of the destination >>>> address. >>>> >>>> Signed-off-by: Laurent Vivier <lvivier@redhat.com> >>>> Acked-by: Michael S. Tsirkin <mst@redhat.com> > > [...] > >>>> diff --git a/qapi/net.json b/qapi/net.json >>>> index 6a1a49749294..69f83bceff3f 100644 >>>> --- a/qapi/net.json >>>> +++ b/qapi/net.json >>>> @@ -895,3 +895,49 @@ >>>> ## >>>> { 'event': 'FAILOVER_NEGOTIATED', >>>> 'data': {'device-id': 'str'} } >>>> + >>>> +## >>>> +# @NETDEV_STREAM_CONNECTED: >>>> +# >>>> +# Emitted when the netdev stream backend is connected >>>> +# >>>> +# @netdev-id: QEMU netdev id that is connected >>>> +# @uri: The Uniform Resource Identifier identifying the destination address >>> >>> Is an URI the appropriate representation here? It's not how we specify >>> such addresses elsewhere in QAPI/QMP... >> >> I put in the event the same information we have in info_str and displayed by the HMP command 'info network'. What would be a more appropriate reprensation? > > SocketAddress? > I agree SocketAddress looks better. Thanks, Laurent
diff --git a/net/stream.c b/net/stream.c index 0293e38e5b57..821ae3265356 100644 --- a/net/stream.c +++ b/net/stream.c @@ -38,6 +38,7 @@ #include "io/channel.h" #include "io/channel-socket.h" #include "io/net-listener.h" +#include "qapi/qapi-events-net.h" typedef struct NetStreamState { NetClientState nc; @@ -168,6 +169,8 @@ static gboolean net_stream_send(QIOChannel *ioc, s->nc.link_down = true; qemu_set_info_str(&s->nc, ""); + qapi_event_send_netdev_stream_eoc(s->nc.name); + return G_SOURCE_REMOVE; } buf = buf1; @@ -243,9 +246,10 @@ static void net_stream_listen(QIONetListener *listener, g_assert(addr != NULL); uri = socket_uri(addr); qemu_set_info_str(&s->nc, uri); - g_free(uri); qapi_free_SocketAddress(addr); + qapi_event_send_netdev_stream_connected(s->nc.name, uri); + g_free(uri); } static void net_stream_server_listening(QIOTask *task, gpointer opaque) @@ -317,12 +321,12 @@ static void net_stream_client_connected(QIOTask *task, gpointer opaque) g_assert(addr != NULL); uri = socket_uri(addr); qemu_set_info_str(&s->nc, uri); - g_free(uri); ret = qemu_socket_try_set_nonblock(sioc->fd); if (addr->type == SOCKET_ADDRESS_TYPE_FD && ret < 0) { qemu_set_info_str(&s->nc, "can't use file descriptor %s (errno %d)", addr->u.fd.str, -ret); + g_free(uri); qapi_free_SocketAddress(addr); goto error; } @@ -338,6 +342,9 @@ static void net_stream_client_connected(QIOTask *task, gpointer opaque) s, NULL); s->nc.link_down = false; + qapi_event_send_netdev_stream_connected(s->nc.name, uri); + g_free(uri); + return; error: object_unref(OBJECT(s->ioc)); diff --git a/qapi/net.json b/qapi/net.json index 6a1a49749294..69f83bceff3f 100644 --- a/qapi/net.json +++ b/qapi/net.json @@ -895,3 +895,49 @@ ## { 'event': 'FAILOVER_NEGOTIATED', 'data': {'device-id': 'str'} } + +## +# @NETDEV_STREAM_CONNECTED: +# +# Emitted when the netdev stream backend is connected +# +# @netdev-id: QEMU netdev id that is connected +# @uri: The Uniform Resource Identifier identifying the destination address +# +# Since: 7.2 +# +# Example: +# +# <- { 'event': 'NETDEV_STREAM_CONNECTED', +# 'data': {'uri': 'tcp:::1:1234', 'netdev-id': 'netdev0'}, +# 'timestamp': {'seconds': 1663330564, 'microseconds': 804317} } +# +# or +# +# <- { 'event': 'NETDEV_STREAM_CONNECTED', +# 'data': {'uri': ''unix:/tmp/qemu0', 'netdev-id': 'netdev0'}, +# 'timestamp': {'seconds': 1663330564, 'microseconds': 804317} } +# +## +{ 'event': 'NETDEV_STREAM_CONNECTED', + 'data': { 'netdev-id': 'str', + 'uri': 'str' } } + +## +# @NETDEV_STREAM_EOC: +# +# Emitted when the netdev stream backend is disconnected +# +# @netdev-id: QEMU netdev id that is disconnected +# +# Since: 7.2 +# +# Example: +# +# <- { 'event': 'NETDEV_STREAM_EOC', +# 'data': {'netdev-id': 'netdev0'}, +# 'timestamp': {'seconds': 1663330937, 'microseconds': 526695} } +# +## +{ 'event': 'NETDEV_STREAM_EOC', + 'data': { 'netdev-id': 'str' } }