diff options
-rw-r--r-- | introspection/org.freedesktop.ModemManager.Modem.xml | 18 | ||||
-rw-r--r-- | src/mm-modem.c | 95 | ||||
-rw-r--r-- | src/mm-modem.h | 16 |
3 files changed, 129 insertions, 0 deletions
diff --git a/introspection/org.freedesktop.ModemManager.Modem.xml b/introspection/org.freedesktop.ModemManager.Modem.xml index 9d06f97cb..d59f41c86 100644 --- a/introspection/org.freedesktop.ModemManager.Modem.xml +++ b/introspection/org.freedesktop.ModemManager.Modem.xml @@ -69,6 +69,24 @@ </arg> </method> + <method name="GetIP6Config"> + <tp:docstring> + Request the IPv6 configuration from the device. Supported for all + modes (DHCP, static, PPP). + </tp:docstring> + <annotation name="org.freedesktop.DBus.GLib.Async" value=""/> + <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="impl_modem_get_ip6_config"/> + <arg name="method" type="u" direction="out" tp:type="MM_MODEM_IP_METHOD"> + IP configuration method to be used. + </arg> + <arg name="properties" type="a{sv}" direction="out"> + 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. + </arg> + </method> + <method name="GetInfo"> <tp:docstring> Get the card information (manufacturer, modem, version). diff --git a/src/mm-modem.c b/src/mm-modem.c index 8f23b8d6d..af77ad0c4 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); @@ -286,6 +287,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) { GValue value = { 0, }; @@ -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 5fda70af7..a5e6030b8 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, |