[PATCH v2 3/3] mbimcli: new '--query-ip-packet-filters' action
Aleksander Morgado
aleksander at aleksander.es
Fri Jul 28 07:51:44 UTC 2017
On 28/07/17 04:45, Ben Chan wrote:
> This patch adds a new '--query-ip-packet-filters' action to mbimcli for
> querying the IP packet filters currently set up on a MBIM device.
> ---
> src/mbimcli/Makefile.am | 2 +
> src/mbimcli/mbimcli-basic-connect.c | 116 +++++++++++++++++++++++++++++++++++-
> 2 files changed, 117 insertions(+), 1 deletion(-)
>
Pushed to git master, thanks.
> diff --git a/src/mbimcli/Makefile.am b/src/mbimcli/Makefile.am
> index 8e41a8a..0c38ad3 100644
> --- a/src/mbimcli/Makefile.am
> +++ b/src/mbimcli/Makefile.am
> @@ -4,6 +4,7 @@ bin_PROGRAMS = mbimcli
> mbimcli_CPPFLAGS = \
> $(MBIMCLI_CFLAGS) \
> -I$(top_srcdir) \
> + -I$(top_srcdir)/src/common \
> -I$(top_srcdir)/src/libmbim-glib \
> -I$(top_builddir)/src/libmbim-glib \
> -I$(top_srcdir)/src/libmbim-glib/generated \
> @@ -21,6 +22,7 @@ mbimcli_SOURCES = \
>
> mbimcli_LDADD = \
> $(MBIMCLI_LIBS) \
> + $(top_builddir)/src/common/libmbim-common.la \
> $(top_builddir)/src/libmbim-glib/libmbim-glib.la
>
>
> diff --git a/src/mbimcli/mbimcli-basic-connect.c b/src/mbimcli/mbimcli-basic-connect.c
> index 8c0e512..0e78719 100644
> --- a/src/mbimcli/mbimcli-basic-connect.c
> +++ b/src/mbimcli/mbimcli-basic-connect.c
> @@ -31,6 +31,7 @@
>
> #include <libmbim-glib.h>
>
> +#include "mbim-common.h"
> #include "mbimcli.h"
> #include "mbimcli-helpers.h"
>
> @@ -67,6 +68,7 @@ static gchar *set_connect_activate_str;
> static gchar *query_ip_configuration_str;
> static gchar *set_connect_deactivate_str;
> static gboolean query_packet_statistics_flag;
> +static gchar *query_ip_packet_filters_str;
>
> static gboolean query_connection_state_arg_parse (const char *option_name,
> const char *value,
> @@ -83,6 +85,11 @@ static gboolean disconnect_arg_parse (const char *option_name,
> gpointer user_data,
> GError **error);
>
> +static gboolean query_ip_packet_filters_arg_parse (const char *option_name,
> + const char *value,
> + gpointer user_data,
> + GError **error);
> +
> static GOptionEntry entries[] = {
> { "query-device-caps", 0, 0, G_OPTION_ARG_NONE, &query_device_caps_flag,
> "Query device capabilities",
> @@ -184,6 +191,10 @@ static GOptionEntry entries[] = {
> "Query packet statistics",
> NULL
> },
> + { "query-ip-packet-filters", 0, G_OPTION_FLAG_OPTIONAL_ARG, G_OPTION_ARG_CALLBACK, G_CALLBACK (query_ip_packet_filters_arg_parse),
> + "Query IP packet filters (SessionID is optional, defaults to 0)",
> + "[SessionID]"
> + },
> { NULL }
> };
>
> @@ -232,6 +243,16 @@ disconnect_arg_parse (const char *option_name,
> return TRUE;
> }
>
> +static gboolean
> +query_ip_packet_filters_arg_parse (const char *option_name,
> + const char *value,
> + gpointer user_data,
> + GError **error)
> +{
> + query_ip_packet_filters_str = g_strdup (value ? value : "0");
> + return TRUE;
> +}
> +
> gboolean
> mbimcli_basic_connect_options_enabled (void)
> {
> @@ -265,7 +286,8 @@ mbimcli_basic_connect_options_enabled (void)
> !!set_connect_activate_str +
> !!query_ip_configuration_str +
> !!set_connect_deactivate_str +
> - query_packet_statistics_flag);
> + query_packet_statistics_flag +
> + !!query_ip_packet_filters_str);
>
> if (n_actions > 1) {
> g_printerr ("error: too many Basic Connect actions requested\n");
> @@ -857,6 +879,63 @@ connect_ready (MbimDevice *device,
> shutdown (TRUE);
> }
>
> +static void
> +ip_packet_filters_ready (MbimDevice *device,
> + GAsyncResult *res,
> + gpointer unused)
> +{
> + MbimMessage *response;
> + GError *error = NULL;
> + MbimPacketFilter **filters;
> + guint32 filters_count, i;
> +
> + 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: operation failed: %s\n", error->message);
> + g_error_free (error);
> + if (response)
> + mbim_message_unref (response);
> + shutdown (FALSE);
> + return;
> + }
> +
> + if (!mbim_message_ip_packet_filters_response_parse (
> + response,
> + NULL, /* sessionid */
> + &filters_count,
> + &filters,
> + &error)) {
> + g_printerr ("error: couldn't parse response message: %s\n", error->message);
> + g_error_free (error);
> + mbim_message_unref (response);
> + shutdown (FALSE);
> + return;
> + }
> +
> + g_print ("\n[%s] IP packet filters: (%u)\n", mbim_device_get_path_display (device), filters_count);
> +
> + for (i = 0; i < filters_count; i++) {
> + gchar *bytes;
> +
> + g_print ("\n");
> + g_print ("\tFilter size: %u\n", filters[i]->filter_size);
> +
> + bytes = mbim_common_str_hex (filters[i]->packet_filter, filters[i]->filter_size, ' ');
> + g_print ("\tPacket filter: %s\n", VALIDATE_UNKNOWN (bytes));
> + g_free (bytes);
> +
> + bytes = mbim_common_str_hex (filters[i]->packet_mask, filters[i]->filter_size, ' ');
> + g_print ("\tPacket mask: %s\n", VALIDATE_UNKNOWN (bytes));
> + g_free (bytes);
> + }
> +
> + mbim_packet_filter_array_free (filters);
> +
> + mbim_message_unref (response);
> + shutdown (TRUE);
> +}
> +
> static gboolean
> mbim_auth_protocol_from_string (const gchar *str,
> MbimAuthProtocol *auth_protocol)
> @@ -2057,5 +2136,40 @@ mbimcli_basic_connect_run (MbimDevice *device,
> return;
> }
>
> + /* Query IP packet filters? */
> + if (query_ip_packet_filters_str) {
> + MbimMessage *request;
> + GError *error = NULL;
> + guint32 session_id = 0;
> +
> + if (!connect_session_id_parse (query_ip_packet_filters_str, TRUE, &session_id, &error)) {
> + g_printerr ("error: couldn't parse session ID: %s\n", error->message);
> + g_error_free (error);
> + shutdown (FALSE);
> + return;
> + }
> +
> + request = (mbim_message_ip_packet_filters_query_new (
> + session_id,
> + 0, /* packet_filters_count */
> + NULL, /* packet_filters */
> + &error));
> + if (!request) {
> + g_printerr ("error: couldn't create IP packet filters request: %s\n", error->message);
> + g_error_free (error);
> + shutdown (FALSE);
> + return;
> + }
> +
> + mbim_device_command (ctx->device,
> + request,
> + 10,
> + ctx->cancellable,
> + (GAsyncReadyCallback)ip_packet_filters_ready,
> + NULL);
> + mbim_message_unref (request);
> + return;
> + }
> +
> g_warn_if_reached ();
> }
>
--
Aleksander
https://aleksander.es
More information about the libmbim-devel
mailing list