[PATCH] mbimcli: report IP configuration on connect

Dan Williams dcbw at redhat.com
Mon May 4 14:26:01 PDT 2015


On Mon, 2015-05-04 at 22:50 +0200, Aleksander Morgado wrote:
> 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.

It turns out I never got around to requesting libmbim git repo access...
which I'll do; but if you want to merge it for me in the mean time go
ahead :)

Dan

> 
> > ---
> >  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
> 
> 
> 




More information about the libmbim-devel mailing list