From 4d0f8e123f20cf5aeddcb760d43a28a56c9bff80 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Tue, 11 Dec 2012 00:41:40 -0600 Subject: core: add GetIP6Config D-Bus method --- .../org.freedesktop.ModemManager.Modem.xml | 18 ++++ src/mm-modem.c | 95 ++++++++++++++++++++++ src/mm-modem.h | 16 ++++ 3 files changed, 129 insertions(+) diff --git a/introspection/org.freedesktop.ModemManager.Modem.xml b/introspection/org.freedesktop.ModemManager.Modem.xml index 9d06f97c..d59f41c8 100644 --- a/introspection/org.freedesktop.ModemManager.Modem.xml +++ b/introspection/org.freedesktop.ModemManager.Modem.xml @@ -69,6 +69,24 @@ + + + Request the IPv6 configuration from the device. Supported for all + modes (DHCP, static, PPP). + + + + + IP configuration method to be used. + + + Dictionary of IPv6 configuration details, including "address", + "prefix", "gateway", "dns1", "dns2", etc. All IP addresses given + as strings; "prefix" given as a unsigned integer value. Most values + are only relevant for the MM_MODEM_IP_METHOD_STATIC IPMethod. + + + Get the card information (manufacturer, modem, version). diff --git a/src/mm-modem.c b/src/mm-modem.c index 8f23b8d6..af77ad0c 100644 --- a/src/mm-modem.c +++ b/src/mm-modem.c @@ -31,6 +31,7 @@ static void impl_modem_connect (MMModem *modem, const char *number, DBusGMethodI static void impl_modem_disconnect (MMModem *modem, DBusGMethodInvocation *context); static void impl_modem_get_ip4_config (MMModem *modem, DBusGMethodInvocation *context); static void impl_modem_get_ip4_config_ex (MMModem *modem, DBusGMethodInvocation *context); +static void impl_modem_get_ip6_config (MMModem *modem, DBusGMethodInvocation *context); static void impl_modem_get_info (MMModem *modem, DBusGMethodInvocation *context); static void impl_modem_reset (MMModem *modem, DBusGMethodInvocation *context); static void impl_modem_factory_reset (MMModem *modem, const char *code, DBusGMethodInvocation *context); @@ -285,6 +286,43 @@ mm_modem_get_ip4_config (MMModem *self, } } +static void +get_ip6_invoke (MMCallbackInfo *info) +{ + MMModemIp6Fn callback = (MMModemIp6Fn) info->callback; + + callback (info->modem, + (const char *) mm_callback_info_get_data (info, "ip6-address"), + GPOINTER_TO_UINT (mm_callback_info_get_data (info, "ip6-prefix")), + (const char *) mm_callback_info_get_data (info, "ip6-gateway"), + (GPtrArray *) mm_callback_info_get_data (info, "ip6-dns"), + info->error, info->user_data); +} + +void +mm_modem_get_ip6_config (MMModem *self, + MMModemIp6Fn callback, + gpointer user_data) +{ + g_return_if_fail (MM_IS_MODEM (self)); + g_return_if_fail (callback != NULL); + + if (MM_MODEM_GET_INTERFACE (self)->get_ip6_config) + MM_MODEM_GET_INTERFACE (self)->get_ip6_config (self, callback, user_data); + else { + MMCallbackInfo *info; + + info = mm_callback_info_new_full (self, + get_ip6_invoke, + G_CALLBACK (callback), + user_data); + + info->error = g_error_new_literal (MM_MODEM_ERROR, MM_MODEM_ERROR_OPERATION_NOT_SUPPORTED, + "Operation not supported"); + mm_callback_info_schedule (info); + } +} + static void value_array_add_uint (GValueArray *array, guint32 i) { @@ -447,6 +485,63 @@ impl_modem_get_ip4_config_ex (MMModem *modem, mm_modem_get_ip4_config (modem, get_ip4_ex_done, context); } +static void +get_ip6_done (MMModem *modem, + const char *address, + guint32 prefix, + const char *gateway, + GPtrArray *dns, + GError *error, + gpointer user_data) +{ + DBusGMethodInvocation *context = (DBusGMethodInvocation *) user_data; + GHashTable *props; + MMModemIpMethod method = MM_MODEM_IP_METHOD_PPP; + const char *s; + + if (error) { + dbus_g_method_return_error (context, error); + return; + } + + props = value_hash_new (); + g_object_get (G_OBJECT (modem), MM_MODEM_IP_METHOD, &method, NULL); + value_hash_add_uint (props, "method", method); + + if (method == MM_MODEM_IP_METHOD_STATIC) { + g_assert (address); + g_assert (prefix); + + value_hash_add_string (props, "address", address); + value_hash_add_uint (props, "prefix", prefix); + + if (gateway) + value_hash_add_string (props, "gateway", gateway); + + if (dns->len >= 1) { + s = g_ptr_array_index (dns, 0); + if (s) + value_hash_add_string (props, "dns1", s); + } + + if (dns->len >= 2) { + s = g_ptr_array_index (dns, 1); + if (s) + value_hash_add_string (props, "dns2", s); + } + } + + dbus_g_method_return (context, props); + g_hash_table_unref (props); +} + +static void +impl_modem_get_ip6_config (MMModem *modem, + DBusGMethodInvocation *context) +{ + mm_modem_get_ip6_config (modem, get_ip6_done, context); +} + void mm_modem_disconnect (MMModem *self, MMModemStateReason reason, diff --git a/src/mm-modem.h b/src/mm-modem.h index 5fda70af..a5e6030b 100644 --- a/src/mm-modem.h +++ b/src/mm-modem.h @@ -103,6 +103,14 @@ typedef void (*MMModemIp4Fn) (MMModem *modem, GError *error, gpointer user_data); +typedef void (*MMModemIp6Fn) (MMModem *modem, + const char *address, + guint32 prefix, + const char *gateway, + GPtrArray *dns, + GError *error, + gpointer user_data); + typedef void (*MMModemInfoFn) (MMModem *modem, const char *manufacturer, const char *model, @@ -161,6 +169,10 @@ struct _MMModem { MMModemIp4Fn callback, gpointer user_data); + void (*get_ip6_config) (MMModem *self, + MMModemIp6Fn callback, + gpointer user_data); + void (*disconnect) (MMModem *self, MMModemStateReason reason, MMModemFn callback, @@ -249,6 +261,10 @@ void mm_modem_get_ip4_config (MMModem *self, MMModemIp4Fn callback, gpointer user_data); +void mm_modem_get_ip6_config (MMModem *self, + MMModemIp6Fn callback, + gpointer user_data); + void mm_modem_disconnect (MMModem *self, MMModemStateReason reason, MMModemFn callback, -- cgit v1.2.3