[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