aboutsummaryrefslogtreecommitdiff
path: root/src/mm-port-net.c
diff options
context:
space:
mode:
authorDan Williams <dan@ioncontrol.co>2024-12-02 09:39:21 -0600
committerDan Williams <dan@bigw.org>2025-02-18 21:06:19 +0000
commit0a94b0138de65ae88e783143d2c4cab930303844 (patch)
treef2bcc5f229691ad72f48fdb7aa32c27dc4b2d25c /src/mm-port-net.c
parent029a8cd11a0d181403b600af9a9979ef5e1eea13 (diff)
netlink: add RTM_GETLINK support to read MAC address
Since we're also now reading responses we need to check sender credentials to make sure we're talking to the kernel, and not some other process spoofing netlink. Signed-off-by: Dan Williams <dan@ioncontrol.co>
Diffstat (limited to 'src/mm-port-net.c')
-rw-r--r--src/mm-port-net.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/src/mm-port-net.c b/src/mm-port-net.c
index f1122ef6..a1fb4372 100644
--- a/src/mm-port-net.c
+++ b/src/mm-port-net.c
@@ -97,6 +97,59 @@ mm_port_net_link_setup (MMPortNet *self,
/*****************************************************************************/
+GByteArray *
+mm_port_net_get_hwaddress_finish (MMPortNet *self,
+ GAsyncResult *res,
+ GError **error)
+{
+ return g_task_propagate_pointer (G_TASK (res), error);
+}
+
+static void
+netlink_get_hwaddress_ready (MMNetlink *netlink,
+ GAsyncResult *res,
+ GTask *task)
+{
+ GError *error = NULL;
+ GByteArray *hwaddr;
+
+ hwaddr = mm_netlink_get_hwaddr_finish (netlink, res, &error);
+ if (!hwaddr) {
+ g_prefix_error (&error, "netlink operation failed: ");
+ g_task_return_error (task, error);
+ } else
+ g_task_return_pointer (task, hwaddr, (GDestroyNotify) g_byte_array_unref);
+ g_object_unref (task);
+}
+
+void
+mm_port_net_get_hwaddress (MMPortNet *self,
+ GCancellable *cancellable,
+ GAsyncReadyCallback callback,
+ gpointer user_data)
+{
+ GTask *task;
+
+ task = g_task_new (self, cancellable, callback, user_data);
+
+ ensure_ifindex (self);
+ if (!self->priv->ifindex) {
+ g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
+ "no valid interface index found for %s",
+ mm_port_get_device (MM_PORT (self)));
+ g_object_unref (task);
+ return;
+ }
+
+ mm_netlink_get_hwaddr (mm_netlink_get (), /* singleton */
+ self->priv->ifindex,
+ cancellable,
+ (GAsyncReadyCallback) netlink_get_hwaddress_ready,
+ task);
+}
+
+/*****************************************************************************/
+
MMPortNet *
mm_port_net_new (const gchar *name)
{