[PATCH] mbimcli: report IP configuration on connect
Aleksander Morgado
aleksander at aleksander.es
Mon May 4 13:50:52 PDT 2015
On Mon, May 4, 2015 at 7:16 PM, Dan Williams <dcbw at redhat.com> wrote:
> If we have it, report it.
>
Yeah, we should do this. Go merge it to git master.
> ---
> src/mbimcli/mbimcli-basic-connect.c | 65 ++++++++++++++++-
> src/mbimcli/mbimcli-dss.c | 94 +++++++++++++++++++-----
> src/mbimcli/mbimcli-helpers.c | 142 ++++++++++++++++++++++++++++++++++++
> src/mbimcli/mbimcli-helpers.h | 4 +
> 4 files changed, 284 insertions(+), 21 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;
> }
> -
> - switch (GPOINTER_TO_UINT (user_data)) {
> - case CONNECT:
> - g_print ("[%s] Successfully connected\n",
> - mbim_device_get_path_display (device));
> - break;
> - case DISCONNECT:
> - g_print ("[%s] Successfully disconnected\n",
> - mbim_device_get_path_display (device));
> - break;
> - default:
> - g_assert_not_reached ();
> - break;
> - }
> -
> mbim_message_unref (response);
> - shutdown (TRUE);
> +
> + if (GPOINTER_TO_UINT (user_data) == DISCONNECT) {
> + g_print ("[%s] Successfully disconnected\n",
> + mbim_device_get_path_display (device));
> + shutdown (TRUE);
> + return;
> + }
> +
> + 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__ */
> --
> 2.1.0
>
>
> _______________________________________________
> libmbim-devel mailing list
> libmbim-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/libmbim-devel
--
Aleksander
https://aleksander.es
More information about the libmbim-devel
mailing list