* [PATCH v5 0/1] qga/linux: Add new api 'guest-network-get-route'
@ 2024-06-12 10:31 Dehan Meng
2024-06-12 10:31 ` [PATCH v5 1/1] " Dehan Meng
0 siblings, 1 reply; 5+ messages in thread
From: Dehan Meng @ 2024-06-12 10:31 UTC (permalink / raw)
To: qemu-devel; +Cc: demeng, kkostiuk, michael.roth
v4 -> v5
- Remove useless struct
- Rename 'GuestNetworkRouteStat' to 'GuestNetworkRoute'.
v3 -> v4
- Fix some indentation issues
- Update 'Since 8.2' to 'Since 9.1'
- Remove useless enum and adjust this change.
v2 -> v3
- Remove this declaration and make the function 'hexToIPAddress' as static.
- Define 'IFNAMSIZ' from kernel instead of a hardcode
- Remove 'GUEST_NETWORK_ROUTE_TYPE_LINUX'
- Set flags 'has_xxx' for checking if a field exists or has a value set
v1 -> v2
- Replace snprintf() to g_strdup_printf() to avoid memory problems.
- Remove the parameter 'char ipAddress[16]' in function 'char *hexToIPAddress()'.
- Add a piece of logic to skip traversing the first line of the file
Dehan Meng (1):
qga/linux: Add new api 'guest-network-get-route'
qga/commands-posix.c | 81 ++++++++++++++++++++++++++++++++++++++++++++
qga/commands-win32.c | 6 ++++
qga/qapi-schema.json | 56 ++++++++++++++++++++++++++++++
3 files changed, 143 insertions(+)
--
2.40.1
^ permalink raw reply [flat|nested] 5+ messages in thread
* [PATCH v5 1/1] qga/linux: Add new api 'guest-network-get-route'
2024-06-12 10:31 [PATCH v5 0/1] qga/linux: Add new api 'guest-network-get-route' Dehan Meng
@ 2024-06-12 10:31 ` Dehan Meng
2024-06-12 12:48 ` Philippe Mathieu-Daudé
0 siblings, 1 reply; 5+ messages in thread
From: Dehan Meng @ 2024-06-12 10:31 UTC (permalink / raw)
To: qemu-devel; +Cc: demeng, kkostiuk, michael.roth
The Route information of the Linux VM needs to be used
by administrators and users when debugging network problems
and troubleshooting.
Signed-off-by: Dehan Meng <demeng@redhat.com>
---
qga/commands-posix.c | 81 ++++++++++++++++++++++++++++++++++++++++++++
qga/commands-win32.c | 6 ++++
qga/qapi-schema.json | 56 ++++++++++++++++++++++++++++++
3 files changed, 143 insertions(+)
diff --git a/qga/commands-posix.c b/qga/commands-posix.c
index 7f05996495..b1f65716e9 100644
--- a/qga/commands-posix.c
+++ b/qga/commands-posix.c
@@ -2708,6 +2708,81 @@ GuestCpuStatsList *qmp_guest_get_cpustats(Error **errp)
return head;
}
+static char *hexToIPAddress(unsigned int hexValue)
+{
+ unsigned int byte1 = (hexValue >> 24) & 0xFF;
+ unsigned int byte2 = (hexValue >> 16) & 0xFF;
+ unsigned int byte3 = (hexValue >> 8) & 0xFF;
+ unsigned int byte4 = hexValue & 0xFF;
+
+ return g_strdup_printf("%u.%u.%u.%u", byte4, byte3, byte2, byte1);
+}
+
+GuestNetworkRouteList *qmp_guest_network_get_route(Error **errp)
+{
+ GuestNetworkRouteList *head = NULL, **tail = &head;
+ const char *routeFile = "/proc/net/route";
+ FILE *fp;
+ size_t n;
+ char *line = NULL;
+ int firstLine = 1;
+
+ fp = fopen(routeFile, "r");
+ if (fp == NULL) {
+ error_setg_errno(errp, errno, "open(\"%s\")", routeFile);
+ free(line);
+ return NULL;
+ }
+
+ while (getline(&line, &n, fp) != -1) {
+ if (firstLine) {
+ firstLine = 0;
+ continue;
+ }
+ GuestNetworkRoute *route = NULL;
+ GuestNetworkRoute *networkroute;
+ int i;
+ char Iface[IFNAMSIZ];
+ unsigned int Destination, Gateway, Mask, Flags;
+ int RefCnt, Use, Metric, MTU, Window, IRTT;
+
+ /* Parse the line and extract the values */
+ i = (sscanf(line, "%s %X %X %x %d %d %d %X %d %d %d",
+ Iface, &Destination, &Gateway, &Flags, &RefCnt,
+ &Use, &Metric, &Mask, &MTU, &Window, &IRTT) == 11);
+ if (i == EOF) {
+ continue;
+ }
+
+ route = g_new0(GuestNetworkRoute, 1);
+
+ networkroute = route;
+ networkroute->iface = g_strdup(Iface);
+ networkroute->destination = hexToIPAddress(Destination);
+ networkroute->gateway = hexToIPAddress(Gateway);
+ networkroute->mask = hexToIPAddress(Mask);
+ networkroute->metric = Metric;
+ networkroute->has_flags = true;
+ networkroute->flags = Flags;
+ networkroute->has_refcnt = true;
+ networkroute->refcnt = RefCnt;
+ networkroute->has_use = true;
+ networkroute->use = Use;
+ networkroute->has_mtu = true;
+ networkroute->mtu = MTU;
+ networkroute->has_window = true;
+ networkroute->window = Window;
+ networkroute->has_irtt = true;
+ networkroute->irtt = IRTT;
+
+ QAPI_LIST_APPEND(tail, route);
+ }
+
+ free(line);
+ fclose(fp);
+ return head;
+}
+
#else /* defined(__linux__) */
void qmp_guest_suspend_disk(Error **errp)
@@ -3079,6 +3154,12 @@ GuestCpuStatsList *qmp_guest_get_cpustats(Error **errp)
return NULL;
}
+GuestNetworkRouteList *qmp_guest_network_get_route(Error **errp)
+{
+ error_setg(errp, QERR_UNSUPPORTED);
+ return NULL;
+}
+
#endif /* CONFIG_FSFREEZE */
#if !defined(CONFIG_FSTRIM)
diff --git a/qga/commands-win32.c b/qga/commands-win32.c
index 0d1b836e87..91289bc9ab 100644
--- a/qga/commands-win32.c
+++ b/qga/commands-win32.c
@@ -2517,3 +2517,9 @@ GuestCpuStatsList *qmp_guest_get_cpustats(Error **errp)
error_setg(errp, QERR_UNSUPPORTED);
return NULL;
}
+
+GuestNetworkRouteList *qmp_guest_network_get_route(Error **errp)
+{
+ error_setg(errp, QERR_UNSUPPORTED);
+ return NULL;
+}
diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
index b3de1fb6b3..58f51aecbb 100644
--- a/qga/qapi-schema.json
+++ b/qga/qapi-schema.json
@@ -1800,3 +1800,59 @@
{ 'command': 'guest-get-cpustats',
'returns': ['GuestCpuStats']
}
+
+##
+# @GuestNetworkRoute:
+#
+# Route information, currently, only linux supported.
+#
+# @iface: The destination network or host's egress network interface in the routing table
+#
+# @destination: The IP address of the target network or host, The final destination of the packet
+#
+# @gateway: The IP address of the next hop router
+#
+# @mask: Subnet Mask
+#
+# @metric: Route metric
+#
+# @flags: Route flags (not for windows)
+#
+# @irtt: Initial round-trip delay (not for windows)
+#
+# @refcnt: The route's reference count (not for windows)
+#
+# @use: Route usage count (not for windows)
+#
+# @window: TCP window size, used for flow control (not for windows)
+#
+# @mtu: Data link layer maximum packet size (not for windows)
+#
+# Since: 9.1
+
+##
+{ 'struct': 'GuestNetworkRoute',
+ 'data': {'iface': 'str',
+ 'destination': 'str',
+ 'gateway': 'str',
+ 'metric': 'int',
+ 'mask': 'str',
+ '*irtt': 'int',
+ '*flags': 'uint64',
+ '*refcnt': 'int',
+ '*use': 'int',
+ '*window': 'int',
+ '*mtu': 'int'
+ }}
+
+##
+# @guest-network-get-route:
+#
+# Retrieve information about route of network.
+# Returns: List of route info of guest.
+#
+# Since: 9.1
+##
+{ 'command': 'guest-network-get-route',
+ 'returns': ['GuestNetworkRoute']
+}
--
2.40.1
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v5 1/1] qga/linux: Add new api 'guest-network-get-route'
2024-06-12 10:31 ` [PATCH v5 1/1] " Dehan Meng
@ 2024-06-12 12:48 ` Philippe Mathieu-Daudé
2024-06-12 12:52 ` Daniel P. Berrangé
0 siblings, 1 reply; 5+ messages in thread
From: Philippe Mathieu-Daudé @ 2024-06-12 12:48 UTC (permalink / raw)
To: Dehan Meng, qemu-devel; +Cc: kkostiuk, michael.roth
Hi Dehan,
On 12/6/24 12:31, Dehan Meng wrote:
> The Route information of the Linux VM needs to be used
> by administrators and users when debugging network problems
> and troubleshooting.
>
> Signed-off-by: Dehan Meng <demeng@redhat.com>
> ---
> qga/commands-posix.c | 81 ++++++++++++++++++++++++++++++++++++++++++++
> qga/commands-win32.c | 6 ++++
> qga/qapi-schema.json | 56 ++++++++++++++++++++++++++++++
> 3 files changed, 143 insertions(+)
> diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
> index b3de1fb6b3..58f51aecbb 100644
> --- a/qga/qapi-schema.json
> +++ b/qga/qapi-schema.json
> @@ -1800,3 +1800,59 @@
> { 'command': 'guest-get-cpustats',
> 'returns': ['GuestCpuStats']
> }
> +
> +##
> +# @GuestNetworkRoute:
> +#
> +# Route information, currently, only linux supported.
> +#
> +# @iface: The destination network or host's egress network interface in the routing table
> +#
> +# @destination: The IP address of the target network or host, The final destination of the packet
Maybe clearer to start naming this @ipv4 in case you plan @ipv6
support later (see @NetdevUserOptions structure in qapi/net.json).
> +#
> +# @gateway: The IP address of the next hop router
> +#
> +# @mask: Subnet Mask
> +#
> +# @metric: Route metric
> +#
> +# @flags: Route flags (not for windows)
> +#
> +# @irtt: Initial round-trip delay (not for windows)
> +#
> +# @refcnt: The route's reference count (not for windows)
> +#
> +# @use: Route usage count (not for windows)
> +#
> +# @window: TCP window size, used for flow control (not for windows)
> +#
> +# @mtu: Data link layer maximum packet size (not for windows)
> +#
> +# Since: 9.1
> +
> +##
> +{ 'struct': 'GuestNetworkRoute',
> + 'data': {'iface': 'str',
> + 'destination': 'str',
> + 'gateway': 'str',
> + 'metric': 'int',
> + 'mask': 'str',
> + '*irtt': 'int',
> + '*flags': 'uint64',
> + '*refcnt': 'int',
> + '*use': 'int',
> + '*window': 'int',
> + '*mtu': 'int'
> + }}
> +
> +##
> +# @guest-network-get-route:
> +#
> +# Retrieve information about route of network.
> +# Returns: List of route info of guest.
> +#
> +# Since: 9.1
> +##
> +{ 'command': 'guest-network-get-route',
> + 'returns': ['GuestNetworkRoute']
> +}
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v5 1/1] qga/linux: Add new api 'guest-network-get-route'
2024-06-12 12:48 ` Philippe Mathieu-Daudé
@ 2024-06-12 12:52 ` Daniel P. Berrangé
2024-06-12 13:20 ` Konstantin Kostiuk
0 siblings, 1 reply; 5+ messages in thread
From: Daniel P. Berrangé @ 2024-06-12 12:52 UTC (permalink / raw)
To: Philippe Mathieu-Daudé
Cc: Dehan Meng, qemu-devel, kkostiuk, michael.roth
On Wed, Jun 12, 2024 at 02:48:24PM +0200, Philippe Mathieu-Daudé wrote:
> Hi Dehan,
>
> On 12/6/24 12:31, Dehan Meng wrote:
> > The Route information of the Linux VM needs to be used
> > by administrators and users when debugging network problems
> > and troubleshooting.
> >
> > Signed-off-by: Dehan Meng <demeng@redhat.com>
> > ---
> > qga/commands-posix.c | 81 ++++++++++++++++++++++++++++++++++++++++++++
> > qga/commands-win32.c | 6 ++++
> > qga/qapi-schema.json | 56 ++++++++++++++++++++++++++++++
> > 3 files changed, 143 insertions(+)
>
>
> > diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
> > index b3de1fb6b3..58f51aecbb 100644
> > --- a/qga/qapi-schema.json
> > +++ b/qga/qapi-schema.json
> > @@ -1800,3 +1800,59 @@
> > { 'command': 'guest-get-cpustats',
> > 'returns': ['GuestCpuStats']
> > }
> > +
> > +##
> > +# @GuestNetworkRoute:
> > +#
> > +# Route information, currently, only linux supported.
> > +#
> > +# @iface: The destination network or host's egress network interface in the routing table
> > +#
> > +# @destination: The IP address of the target network or host, The final destination of the packet
>
> Maybe clearer to start naming this @ipv4 in case you plan @ipv6
> support later (see @NetdevUserOptions structure in qapi/net.json).
IMHO IPv6 must be supported from the start - it really isn't acceptable
to write new IPv4 only code today.
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 :|
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v5 1/1] qga/linux: Add new api 'guest-network-get-route'
2024-06-12 12:52 ` Daniel P. Berrangé
@ 2024-06-12 13:20 ` Konstantin Kostiuk
0 siblings, 0 replies; 5+ messages in thread
From: Konstantin Kostiuk @ 2024-06-12 13:20 UTC (permalink / raw)
To: Daniel P. Berrangé, Philippe Mathieu-Daudé
Cc: Dehan Meng, qemu-devel, michael.roth
[-- Attachment #1: Type: text/plain, Size: 2127 bytes --]
Hi Daniel and Philippe
Is it ok to add the version filed to the GuestNetworkRoute struct
to indicate that this is an IPv4 or an IPv6 route or is it better to have
two
different structures?
Best Regards,
Konstantin Kostiuk.
On Wed, Jun 12, 2024 at 3:53 PM Daniel P. Berrangé <berrange@redhat.com>
wrote:
> On Wed, Jun 12, 2024 at 02:48:24PM +0200, Philippe Mathieu-Daudé wrote:
> > Hi Dehan,
> >
> > On 12/6/24 12:31, Dehan Meng wrote:
> > > The Route information of the Linux VM needs to be used
> > > by administrators and users when debugging network problems
> > > and troubleshooting.
> > >
> > > Signed-off-by: Dehan Meng <demeng@redhat.com>
> > > ---
> > > qga/commands-posix.c | 81
> ++++++++++++++++++++++++++++++++++++++++++++
> > > qga/commands-win32.c | 6 ++++
> > > qga/qapi-schema.json | 56 ++++++++++++++++++++++++++++++
> > > 3 files changed, 143 insertions(+)
> >
> >
> > > diff --git a/qga/qapi-schema.json b/qga/qapi-schema.json
> > > index b3de1fb6b3..58f51aecbb 100644
> > > --- a/qga/qapi-schema.json
> > > +++ b/qga/qapi-schema.json
> > > @@ -1800,3 +1800,59 @@
> > > { 'command': 'guest-get-cpustats',
> > > 'returns': ['GuestCpuStats']
> > > }
> > > +
> > > +##
> > > +# @GuestNetworkRoute:
> > > +#
> > > +# Route information, currently, only linux supported.
> > > +#
> > > +# @iface: The destination network or host's egress network interface
> in the routing table
> > > +#
> > > +# @destination: The IP address of the target network or host, The
> final destination of the packet
> >
> > Maybe clearer to start naming this @ipv4 in case you plan @ipv6
> > support later (see @NetdevUserOptions structure in qapi/net.json).
>
> IMHO IPv6 must be supported from the start - it really isn't acceptable
> to write new IPv4 only code today.
>
> 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 :|
>
>
[-- Attachment #2: Type: text/html, Size: 3488 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2024-06-12 13:21 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-06-12 10:31 [PATCH v5 0/1] qga/linux: Add new api 'guest-network-get-route' Dehan Meng
2024-06-12 10:31 ` [PATCH v5 1/1] " Dehan Meng
2024-06-12 12:48 ` Philippe Mathieu-Daudé
2024-06-12 12:52 ` Daniel P. Berrangé
2024-06-12 13:20 ` Konstantin Kostiuk
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).