diff options
author | Dan Williams <dcbw@redhat.com> | 2015-05-04 11:23:00 -0500 |
---|---|---|
committer | Dan Williams <dcbw@redhat.com> | 2015-05-06 11:54:17 -0500 |
commit | d939587ef7fff0195a45fb8418d2911dfbb52c99 (patch) | |
tree | 47470143ed24022ba398c562b4c3f32068cd10f3 | |
parent | 0ad5f9ce6269b73e6bc8d0d5821ed7059f17b2ff (diff) | |
download | libmbim-d939587ef7fff0195a45fb8418d2911dfbb52c99.tar.gz |
mbimcli: report IP configuration on connect
-rw-r--r-- | src/mbimcli/mbimcli-basic-connect.c | 65 | ||||
-rw-r--r-- | src/mbimcli/mbimcli-dss.c | 86 | ||||
-rw-r--r-- | src/mbimcli/mbimcli-helpers.c | 142 | ||||
-rw-r--r-- | src/mbimcli/mbimcli-helpers.h | 4 |
4 files changed, 280 insertions, 17 deletions
diff --git a/src/mbimcli/mbimcli-basic-connect.c b/src/mbimcli/mbimcli-basic-connect.c index 088d5db..f093c3b 100644 --- a/src/mbimcli/mbimcli-basic-connect.c +++ b/src/mbimcli/mbimcli-basic-connect.c @@ -31,6 +31,7 @@ #include <libmbim-glib.h> #include "mbimcli.h" +#include "mbimcli-helpers.h" /* Context */ typedef struct { @@ -657,6 +658,31 @@ enum { }; static void +ip_configuration_query_ready (MbimDevice *device, + GAsyncResult *res, + gpointer unused) +{ + GError *error = NULL; + MbimMessage *response; + gboolean success = FALSE; + + response = mbim_device_command_finish (device, res, &error); + if (!response || + !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) { + g_printerr ("error: couldn't get IP configuration response message: %s\n", error->message); + } else { + success = mbimcli_print_ip_config (device, response, &error); + if (!success) + g_printerr ("error: couldn't parse IP configuration response message: %s\n", error->message); + } + + g_clear_error (&error); + if (response) + mbim_message_unref (response); + shutdown (success); +} + +static void connect_ready (MbimDevice *device, GAsyncResult *res, gpointer user_data) @@ -694,6 +720,7 @@ connect_ready (MbimDevice *device, shutdown (FALSE); return; } + mbim_message_unref (response); switch (GPOINTER_TO_UINT (user_data)) { case CONNECT: @@ -723,7 +750,43 @@ connect_ready (MbimDevice *device, VALIDATE_UNKNOWN (mbim_context_type_get_string (mbim_uuid_to_context_type (context_type))), VALIDATE_UNKNOWN (mbim_nw_error_get_string (nw_error))); - mbim_message_unref (response); + if (GPOINTER_TO_UINT (user_data) == CONNECT) { + MbimMessage *message; + + message = (mbim_message_ip_configuration_query_new ( + session_id, + MBIM_IP_CONFIGURATION_AVAILABLE_FLAG_NONE, /* ipv4configurationavailable */ + MBIM_IP_CONFIGURATION_AVAILABLE_FLAG_NONE, /* ipv6configurationavailable */ + 0, /* ipv4addresscount */ + NULL, /* ipv4address */ + 0, /* ipv6addresscount */ + NULL, /* ipv6address */ + NULL, /* ipv4gateway */ + NULL, /* ipv6gateway */ + 0, /* ipv4dnsservercount */ + NULL, /* ipv4dnsserver */ + 0, /* ipv6dnsservercount */ + NULL, /* ipv6dnsserver */ + 0, /* ipv4mtu */ + 0, /* ipv6mtu */ + &error)); + if (message) { + mbim_device_command (device, + message, + 60, + NULL, + (GAsyncReadyCallback)ip_configuration_query_ready, + NULL); + mbim_message_unref (message); + } else { + g_printerr ("error: couldn't create IP config request: %s\n", error->message); + g_error_free (error); + mbim_message_unref (message); + shutdown (FALSE); + } + return; + } + shutdown (TRUE); } diff --git a/src/mbimcli/mbimcli-dss.c b/src/mbimcli/mbimcli-dss.c index 8144b0b..c7424e6 100644 --- a/src/mbimcli/mbimcli-dss.c +++ b/src/mbimcli/mbimcli-dss.c @@ -38,6 +38,7 @@ typedef struct { MbimDevice *device; GCancellable *cancellable; + guint32 session_id; } Context; static Context *ctx; @@ -120,11 +121,36 @@ enum { }; static void +ip_configuration_query_ready (MbimDevice *device, + GAsyncResult *res, + gpointer unused) +{ + GError *error = NULL; + MbimMessage *response; + gboolean success = FALSE; + + response = mbim_device_command_finish (device, res, &error); + if (!response || + !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) { + g_printerr ("error: couldn't get IP configuration response message: %s\n", error->message); + } else { + success = mbimcli_print_ip_config (device, response, &error); + if (!success) + g_printerr ("error: couldn't parse IP configuration response message: %s\n", error->message); + } + + g_clear_error (&error); + if (response) + mbim_message_unref (response); + shutdown (success); +} + +static void set_dss_ready (MbimDevice *device, GAsyncResult *res, gpointer user_data) { - MbimMessage *response; + MbimMessage *response, *message; GError *error = NULL; response = mbim_device_command_finish (device, res, &error); @@ -142,23 +168,52 @@ set_dss_ready (MbimDevice *device, shutdown (FALSE); return; } + mbim_message_unref (response); - switch (GPOINTER_TO_UINT (user_data)) { - case CONNECT: - g_print ("[%s] Successfully connected\n", - mbim_device_get_path_display (device)); - break; - case DISCONNECT: + if (GPOINTER_TO_UINT (user_data) == DISCONNECT) { g_print ("[%s] Successfully disconnected\n", mbim_device_get_path_display (device)); - break; - default: - g_assert_not_reached (); - break; + shutdown (TRUE); + return; } - mbim_message_unref (response); - shutdown (TRUE); + g_assert (GPOINTER_TO_UINT (user_data) == CONNECT); + + g_print ("[%s] Successfully connected\n", + mbim_device_get_path_display (device)); + + message = (mbim_message_ip_configuration_query_new ( + ctx->session_id, + MBIM_IP_CONFIGURATION_AVAILABLE_FLAG_NONE, /* ipv4configurationavailable */ + MBIM_IP_CONFIGURATION_AVAILABLE_FLAG_NONE, /* ipv6configurationavailable */ + 0, /* ipv4addresscount */ + NULL, /* ipv4address */ + 0, /* ipv6addresscount */ + NULL, /* ipv6address */ + NULL, /* ipv4gateway */ + NULL, /* ipv6gateway */ + 0, /* ipv4dnsservercount */ + NULL, /* ipv4dnsserver */ + 0, /* ipv6dnsservercount */ + NULL, /* ipv6dnsserver */ + 0, /* ipv4mtu */ + 0, /* ipv6mtu */ + &error)); + if (!message) { + g_printerr ("error: couldn't create IP config request: %s\n", error->message); + g_error_free (error); + mbim_message_unref (message); + shutdown (FALSE); + return; + } + + mbim_device_command (device, + message, + 60, + NULL, + (GAsyncReadyCallback)ip_configuration_query_ready, + NULL); + mbim_message_unref (message); } static gboolean @@ -208,15 +263,14 @@ mbimcli_dss_run (MbimDevice *device, /* Connect? */ if (connect_str) { MbimUuid service_id; - guint32 session_id; - if (!common_parse (connect_str, &service_id, &session_id)) { + if (!common_parse (connect_str, &service_id, &ctx->session_id)) { shutdown (FALSE); return; } request = mbim_message_dss_connect_set_new (&service_id, - session_id, + ctx->session_id, MBIM_DSS_LINK_STATE_ACTIVATE, &error); diff --git a/src/mbimcli/mbimcli-helpers.c b/src/mbimcli/mbimcli-helpers.c index aa37d5a..21aea9b 100644 --- a/src/mbimcli/mbimcli-helpers.c +++ b/src/mbimcli/mbimcli-helpers.c @@ -47,3 +47,145 @@ mbimcli_read_uint_from_string (const gchar *str, } return FALSE; } + + +gboolean +mbimcli_print_ip_config (MbimDevice *device, + MbimMessage *response, + GError **error) +{ + MbimIPConfigurationAvailableFlag ipv4configurationavailable; + MbimIPConfigurationAvailableFlag ipv6configurationavailable; + guint32 ipv4addresscount; + MbimIPv4Element **ipv4address; + guint32 ipv6addresscount; + MbimIPv6Element **ipv6address; + const MbimIPv4 *ipv4gateway; + const MbimIPv6 *ipv6gateway; + guint32 ipv4dnsservercount; + MbimIPv4 *ipv4dnsserver; + guint32 ipv6dnsservercount; + MbimIPv6 *ipv6dnsserver; + guint32 ipv4mtu; + guint32 ipv6mtu; + gchar *str; + GInetAddress *addr; + + if (!mbim_message_ip_configuration_response_parse ( + response, + NULL, /* sessionid */ + &ipv4configurationavailable, + &ipv6configurationavailable, + &ipv4addresscount, + &ipv4address, + &ipv6addresscount, + &ipv6address, + &ipv4gateway, + &ipv6gateway, + &ipv4dnsservercount, + &ipv4dnsserver, + &ipv6dnsservercount, + &ipv6dnsserver, + &ipv4mtu, + &ipv6mtu, + error)) + return FALSE; + + /* IPv4 info */ + + str = mbim_ip_configuration_available_flag_build_string_from_mask (ipv4configurationavailable); + g_print ("\n[%s] IPv4 configuration available: '%s'\n", mbim_device_get_path_display (device), str); + g_free (str); + + if (ipv4configurationavailable & MBIM_IP_CONFIGURATION_AVAILABLE_FLAG_ADDRESS) { + guint i; + + for (i = 0; i < ipv4addresscount; i++) { + addr = g_inet_address_new_from_bytes ((guint8 *)&ipv4address[i]->ipv4_address, G_SOCKET_FAMILY_IPV4); + str = g_inet_address_to_string (addr); + g_print (" IP [%u]: '%s/%u'\n", + i, + str, + ipv4address[i]->on_link_prefix_length); + g_free (str); + g_object_unref (addr); + } + } + + if (ipv4configurationavailable & MBIM_IP_CONFIGURATION_AVAILABLE_FLAG_GATEWAY) { + addr = g_inet_address_new_from_bytes ((guint8 *)ipv4gateway, G_SOCKET_FAMILY_IPV4); + str = g_inet_address_to_string (addr); + g_print (" Gateway: '%s'\n", str); + g_free (str); + g_object_unref (addr); + } + + if (ipv4configurationavailable & MBIM_IP_CONFIGURATION_AVAILABLE_FLAG_DNS) { + guint i; + + for (i = 0; i < ipv4dnsservercount; i++) { + addr = g_inet_address_new_from_bytes ((guint8 *)&ipv4dnsserver[i], G_SOCKET_FAMILY_IPV4); + if (!g_inet_address_get_is_any (addr)) { + str = g_inet_address_to_string (addr); + g_print (" DNS [%u]: '%s'\n", i, str); + g_free (str); + } + g_object_unref (addr); + } + } + + if (ipv4configurationavailable & MBIM_IP_CONFIGURATION_AVAILABLE_FLAG_MTU) + g_print (" MTU: '%u'\n", ipv4mtu); + + /* IPv6 info */ + str = mbim_ip_configuration_available_flag_build_string_from_mask (ipv6configurationavailable); + g_print ("\n[%s] IPv6 configuration available: '%s'\n", mbim_device_get_path_display (device), str); + g_free (str); + + if (ipv6configurationavailable & MBIM_IP_CONFIGURATION_AVAILABLE_FLAG_ADDRESS) { + guint i; + + for (i = 0; i < ipv6addresscount; i++) { + addr = g_inet_address_new_from_bytes ((guint8 *)&ipv6address[i]->ipv6_address, G_SOCKET_FAMILY_IPV6); + str = g_inet_address_to_string (addr); + g_print (" IP [%u]: '%s/%u'\n", + i, + str, + ipv6address[i]->on_link_prefix_length); + g_free (str); + g_object_unref (addr); + } + } + + if (ipv6configurationavailable & MBIM_IP_CONFIGURATION_AVAILABLE_FLAG_GATEWAY) { + addr = g_inet_address_new_from_bytes ((guint8 *)ipv6gateway, G_SOCKET_FAMILY_IPV6); + str = g_inet_address_to_string (addr); + g_print (" Gateway: '%s'\n", str); + g_free (str); + g_object_unref (addr); + } + + if (ipv6configurationavailable & MBIM_IP_CONFIGURATION_AVAILABLE_FLAG_DNS) { + guint i; + + for (i = 0; i < ipv6dnsservercount; i++) { + addr = g_inet_address_new_from_bytes ((guint8 *)&ipv6dnsserver[i], G_SOCKET_FAMILY_IPV6); + if (!g_inet_address_get_is_any (addr)) { + str = g_inet_address_to_string (addr); + g_print (" DNS [%u]: '%s'\n", i, str); + g_free (str); + } + g_object_unref (addr); + } + } + + if (ipv6configurationavailable & MBIM_IP_CONFIGURATION_AVAILABLE_FLAG_MTU) + g_print (" MTU: '%u'\n", ipv6mtu); + + mbim_ipv4_element_array_free (ipv4address); + mbim_ipv6_element_array_free (ipv6address); + g_free (ipv4dnsserver); + g_free (ipv6dnsserver); + return TRUE; +} + diff --git a/src/mbimcli/mbimcli-helpers.h b/src/mbimcli/mbimcli-helpers.h index d7dabdc..969f416 100644 --- a/src/mbimcli/mbimcli-helpers.h +++ b/src/mbimcli/mbimcli-helpers.h @@ -28,4 +28,8 @@ gboolean mbimcli_read_uint_from_string (const gchar *str, guint *out); +gboolean mbimcli_print_ip_config (MbimDevice *device, + MbimMessage *response, + GError **error); + #endif /* __MBIMCLI_H__ */ |