aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dcbw@redhat.com>2012-12-11 00:41:40 -0600
committerDan Williams <dcbw@redhat.com>2012-12-13 10:36:18 -0600
commit4d0f8e123f20cf5aeddcb760d43a28a56c9bff80 (patch)
tree3da2f4d371a6fcc9cd41828fa9132ec025aed3df
parentbf887ddaffd38c09583eaa4ee0b1e1034f1d121d (diff)
core: add GetIP6Config D-Bus method06-ip6
-rw-r--r--introspection/org.freedesktop.ModemManager.Modem.xml18
-rw-r--r--src/mm-modem.c95
-rw-r--r--src/mm-modem.h16
3 files changed, 129 insertions, 0 deletions
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 @@
</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 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);
@@ -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 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,