[PATCH 2/2] broadband-modem-mbim: subscribe to MBIM_CID_PCO notifications

Aleksander Morgado aleksander at aleksander.es
Wed Aug 8 14:23:19 UTC 2018


On Wed, Aug 8, 2018 at 1:52 PM, Aleksander Morgado
<aleksander at aleksander.es> wrote:
> On Wed, Aug 8, 2018 at 12:16 AM, Ben Chan <benchan at chromium.org> wrote:
>> This patch changes MMBroadbandModem to subscribe to MBIM_CID_PCO
>> notifications if the modem supports that.
>> ---
>
> LGTM, please merge
>

Also merged this one myself to git master

>>  src/mm-broadband-modem-mbim.c | 76 ++++++++++++++++++++++++++++++++---
>>  1 file changed, 71 insertions(+), 5 deletions(-)
>>
>> diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
>> index eab833f6..79c2726f 100644
>> --- a/src/mm-broadband-modem-mbim.c
>> +++ b/src/mm-broadband-modem-mbim.c
>> @@ -65,6 +65,7 @@ typedef enum {
>>      PROCESS_NOTIFICATION_FLAG_CONNECT              = 1 << 3,
>>      PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO      = 1 << 4,
>>      PROCESS_NOTIFICATION_FLAG_PACKET_SERVICE       = 1 << 5,
>> +    PROCESS_NOTIFICATION_FLAG_PCO                  = 1 << 6,
>>  } ProcessNotificationFlag;
>>
>>  struct _MMBroadbandModemMbimPrivate {
>> @@ -2484,6 +2485,48 @@ sms_notification (MMBroadbandModemMbim *self,
>>      }
>>  }
>>
>> +static void
>> +basic_connect_extensions_notification_pco (MMBroadbandModemMbim *self,
>> +                                           MbimMessage *notification)
>> +{
>> +    MbimPcoValue *pco_value;
>> +    GError *error = NULL;
>> +    gchar *pco_data_hex;
>> +
>> +    if (!mbim_message_basic_connect_extensions_pco_notification_parse (
>> +            notification,
>> +            &pco_value,
>> +            &error)) {
>> +        mm_warn ("Couldn't parse PCO notification: %s", error->message);
>> +        g_error_free (error);
>> +        return;
>> +    }
>> +
>> +    pco_data_hex = mm_utils_bin2hexstr (pco_value->pco_data_buffer, pco_value->pco_data_size);
>> +    mm_dbg ("Received PCO: session ID=%u type=%s size=%u data=%s",
>> +             pco_value->session_id,
>> +             mbim_pco_type_get_string (pco_value->pco_data_type),
>> +             pco_value->pco_data_size,
>> +             pco_data_hex);
>> +    g_free (pco_data_hex);
>> +    mbim_pco_value_free (pco_value);
>> +}
>> +
>> +static void
>> +basic_connect_extensions_notification (MMBroadbandModemMbim *self,
>> +                                       MbimMessage *notification)
>> +{
>> +    switch (mbim_message_indicate_status_get_cid (notification)) {
>> +    case MBIM_CID_BASIC_CONNECT_EXTENSIONS_PCO:
>> +        if (self->priv->setup_flags & PROCESS_NOTIFICATION_FLAG_PCO)
>> +            basic_connect_extensions_notification_pco (self, notification);
>> +        break;
>> +    default:
>> +        /* Ignore */
>> +        break;
>> +    }
>> +}
>> +
>>  static void
>>  device_notification_cb (MbimDevice *device,
>>                          MbimMessage *notification,
>> @@ -2501,6 +2544,9 @@ device_notification_cb (MbimDevice *device,
>>      case MBIM_SERVICE_BASIC_CONNECT:
>>          basic_connect_notification (self, notification);
>>          break;
>> +    case MBIM_SERVICE_BASIC_CONNECT_EXTENSIONS:
>> +        basic_connect_extensions_notification (self, notification);
>> +        break;
>>      case MBIM_SERVICE_SMS:
>>          sms_notification (self, notification);
>>          break;
>> @@ -2518,13 +2564,14 @@ common_setup_cleanup_unsolicited_events_sync (MMBroadbandModemMbim *self,
>>      if (!device)
>>          return;
>>
>> -    mm_dbg ("Supported notifications: signal (%s), registration (%s), sms (%s), connect (%s), subscriber (%s), packet (%s)",
>> +    mm_dbg ("Supported notifications: signal (%s), registration (%s), sms (%s), connect (%s), subscriber (%s), packet (%s), pco (%s)",
>>              self->priv->setup_flags & PROCESS_NOTIFICATION_FLAG_SIGNAL_QUALITY ? "yes" : "no",
>>              self->priv->setup_flags & PROCESS_NOTIFICATION_FLAG_REGISTRATION_UPDATES ? "yes" : "no",
>>              self->priv->setup_flags & PROCESS_NOTIFICATION_FLAG_SMS_READ ? "yes" : "no",
>>              self->priv->setup_flags & PROCESS_NOTIFICATION_FLAG_CONNECT ? "yes" : "no",
>>              self->priv->setup_flags & PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO ? "yes" : "no",
>> -            self->priv->setup_flags & PROCESS_NOTIFICATION_FLAG_PACKET_SERVICE ? "yes" : "no");
>> +            self->priv->setup_flags & PROCESS_NOTIFICATION_FLAG_PACKET_SERVICE ? "yes" : "no",
>> +            self->priv->setup_flags & PROCESS_NOTIFICATION_FLAG_PCO ? "yes" : "no");
>>
>>      if (setup) {
>>          /* Don't re-enable it if already there */
>> @@ -2600,6 +2647,8 @@ cleanup_unsolicited_events_3gpp (MMIfaceModem3gpp *_self,
>>      if (is_sim_hot_swap_configured)
>>          self->priv->setup_flags &= ~PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO;
>>      self->priv->setup_flags &= ~PROCESS_NOTIFICATION_FLAG_PACKET_SERVICE;
>> +    if (self->priv->is_pco_supported)
>> +        self->priv->setup_flags &= ~PROCESS_NOTIFICATION_FLAG_PCO;
>>      common_setup_cleanup_unsolicited_events (self, FALSE, callback, user_data);
>>  }
>>
>> @@ -2614,6 +2663,8 @@ setup_unsolicited_events_3gpp (MMIfaceModem3gpp *_self,
>>      self->priv->setup_flags |= PROCESS_NOTIFICATION_FLAG_CONNECT;
>>      self->priv->setup_flags |= PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO;
>>      self->priv->setup_flags |= PROCESS_NOTIFICATION_FLAG_PACKET_SERVICE;
>> +    if (self->priv->is_pco_supported)
>> +        self->priv->setup_flags |= PROCESS_NOTIFICATION_FLAG_PCO;
>>      common_setup_cleanup_unsolicited_events (self, TRUE, callback, user_data);
>>  }
>>
>> @@ -2688,15 +2739,16 @@ common_enable_disable_unsolicited_events (MMBroadbandModemMbim *self,
>>      if (!peek_device (self, &device, callback, user_data))
>>          return;
>>
>> -    mm_dbg ("Enabled notifications: signal (%s), registration (%s), sms (%s), connect (%s), subscriber (%s), packet (%s)",
>> +    mm_dbg ("Enabled notifications: signal (%s), registration (%s), sms (%s), connect (%s), subscriber (%s), packet (%s), pco (%s)",
>>              self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_SIGNAL_QUALITY ? "yes" : "no",
>>              self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_REGISTRATION_UPDATES ? "yes" : "no",
>>              self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_SMS_READ ? "yes" : "no",
>>              self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_CONNECT ? "yes" : "no",
>>              self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO ? "yes" : "no",
>> -            self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_PACKET_SERVICE ? "yes" : "no");
>> +            self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_PACKET_SERVICE ? "yes" : "no",
>> +            self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_PCO ? "yes" : "no");
>>
>> -    entries = g_new0 (MbimEventEntry *, 3);
>> +    entries = g_new0 (MbimEventEntry *, 4);
>>
>>      /* Basic connect service */
>>      if (self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_SIGNAL_QUALITY ||
>> @@ -2721,6 +2773,16 @@ common_enable_disable_unsolicited_events (MMBroadbandModemMbim *self,
>>          n_entries++;
>>      }
>>
>> +    /* Basic connect extensions service */
>> +    if (self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_PCO) {
>> +        entries[n_entries] = g_new (MbimEventEntry, 1);
>> +        memcpy (&(entries[n_entries]->device_service_id), MBIM_UUID_BASIC_CONNECT_EXTENSIONS, sizeof (MbimUuid));
>> +        entries[n_entries]->cids_count = 1;
>> +        entries[n_entries]->cids = g_new0 (guint32, 1);
>> +        entries[n_entries]->cids[0] = MBIM_CID_BASIC_CONNECT_EXTENSIONS_PCO;
>> +        n_entries++;
>> +    }
>> +
>>      /* SMS service */
>>      if (self->priv->enable_flags & PROCESS_NOTIFICATION_FLAG_SMS_READ) {
>>          entries[n_entries] = g_new (MbimEventEntry, 1);
>> @@ -2882,6 +2944,8 @@ modem_3gpp_disable_unsolicited_events (MMIfaceModem3gpp *_self,
>>      if (is_sim_hot_swap_configured)
>>          self->priv->enable_flags &= ~PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO;
>>      self->priv->enable_flags &= ~PROCESS_NOTIFICATION_FLAG_PACKET_SERVICE;
>> +    if (self->priv->is_pco_supported)
>> +        self->priv->enable_flags &= ~PROCESS_NOTIFICATION_FLAG_PCO;
>>      common_enable_disable_unsolicited_events (self, callback, user_data);
>>  }
>>
>> @@ -2896,6 +2960,8 @@ modem_3gpp_enable_unsolicited_events (MMIfaceModem3gpp *_self,
>>      self->priv->enable_flags |= PROCESS_NOTIFICATION_FLAG_CONNECT;
>>      self->priv->enable_flags |= PROCESS_NOTIFICATION_FLAG_SUBSCRIBER_INFO;
>>      self->priv->enable_flags |= PROCESS_NOTIFICATION_FLAG_PACKET_SERVICE;
>> +    if (self->priv->is_pco_supported)
>> +        self->priv->enable_flags |= PROCESS_NOTIFICATION_FLAG_PCO;
>>      common_enable_disable_unsolicited_events (self, callback, user_data);
>>  }
>>
>> --
>> 2.18.0.597.ga71716f1ad-goog
>>
>
>
>
> --
> Aleksander
> https://aleksander.es



-- 
Aleksander
https://aleksander.es


More information about the ModemManager-devel mailing list