[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