From: Dehan Meng <demeng@redhat.com>
To: qemu-devel@nongnu.org
Cc: demeng@redhat.com, kkostiuk@redhat.com, michael.roth@amd.com
Subject: [PATCH v5 1/1] qga/linux: Add new api 'guest-network-get-route'
Date: Wed, 12 Jun 2024 18:31:05 +0800 [thread overview]
Message-ID: <20240612103105.301456-2-demeng@redhat.com> (raw)
In-Reply-To: <20240612103105.301456-1-demeng@redhat.com>
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
next prev parent reply other threads:[~2024-06-12 10:32 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
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 [this message]
2024-06-12 12:48 ` [PATCH v5 1/1] " Philippe Mathieu-Daudé
2024-06-12 12:52 ` Daniel P. Berrangé
2024-06-12 13:20 ` Konstantin Kostiuk
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=20240612103105.301456-2-demeng@redhat.com \
--to=demeng@redhat.com \
--cc=kkostiuk@redhat.com \
--cc=michael.roth@amd.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.