[PATCH] nas: Implement vendor specific "Swi Get Status"

Dan Williams dcbw at redhat.com
Wed Aug 21 21:54:12 UTC 2019


On Wed, 2019-08-21 at 16:29 -0500, Dan Williams wrote:
> On Tue, 2019-08-20 at 12:19 +0200, Bjørn Mork wrote:
> > This Sierra Wireless (swi) specific request returns some of the
> > system
> > info known from the swi specific AT command "!GSTATUS?".
> 
> Thanks, submitted as an MR here:
> 
> https://gitlab.freedesktop.org/mobile-broadband/libqmi/merge_requests/62

Merged.

Dan

> Dan
> 
> > [/dev/cdc-wdm0] Successfully got status:
> > Common Info:
> >         Temperature: '32'
> >         Modem mode: 'online'
> >         System mode: 'lte'
> >         IMS registration state: 'no-srv'
> >         Packet service state: 'attached'
> > LTE info:
> >         Band: 'bc-3'
> >         Bandwidth: '20'
> >         RX channel: '1450'
> >         TX channel: '19450'
> >         EMM state: 'registered'
> >         EMM sub state: '0'
> >         EMM connection state: 'rrc-connecting'
> > 
> > Signed-off-by: Bjørn Mork <bjorn at mork.no>
> > ---
> >  data/qmi-service-nas.json       |  56 ++++++++++++-
> >  src/libqmi-glib/qmi-enums-nas.h | 138
> > ++++++++++++++++++++++++++++++++
> >  src/qmicli/qmicli-nas.c         | 110 +++++++++++++++++++++++++
> >  3 files changed, 303 insertions(+), 1 deletion(-)
> > 
> > diff --git a/data/qmi-service-nas.json b/data/qmi-service-nas.json
> > index 1c5ab545a5e2..07763a16d4bc 100644
> > --- a/data/qmi-service-nas.json
> > +++ b/data/qmi-service-nas.json
> > @@ -3579,5 +3579,59 @@
> >                                                                  "p
> > ub
> > lic-format" : "QmiNasScellState" },
> >  				                              {
> > "name"          : "Cell Index",
> >                                                                  "f
> > or
> > mat"        : "guint8" } ] },
> > -                     "prerequisites"      : [ { "common-ref" :
> > "Success" } ] } ] }
> > +                     "prerequisites"      : [ { "common-ref" :
> > "Success" } ] } ] },
> > +
> > +  //
> > *******************************************************************
> > **
> > ************
> > +  {  "name"    : "Swi Get Status",
> > +     "type"    : "Message",
> > +     "service" : "NAS",
> > +     "id"      : "0x5556",
> > +     "vendor"  : "0x1199",
> > +     "since"   : "1.20",
> > +     "output"  : [ { "common-ref" : "Operation Result" },
> > +                   { "name"       : "Common Info",
> > +                     "id"         : "0x01",
> > +                     "type"       : "TLV",
> > +                     "since"      : "1.20",
> > +                     "format"     : "sequence",
> > +                     "contents"   : [ { "name"   : "Temperature",
> > +                                        "format" : "guint8"},
> > +                                      { "name"          : "Modem
> > Mode",
> > +                                        "format"        :
> > "guint8",
> > +				        "public-format" :
> > "QmiNasSwiModemMode"},
> > +                                      { "name"          : "System
> > Mode",
> > +                                        "format"        :
> > "guint8",
> > +				        "public-format" :
> > "QmiNasSwiSystemMode"},
> > +                                      { "name"          : "IMS
> > Registration State",
> > +                                        "format"        :
> > "guint8",
> > +				        "public-format" :
> > "QmiNasSwiImsRegState"},
> > +                                      { "name"          : "Packet
> > Service State",
> > +                                        "format"        :
> > "guint8",
> > +				        "public-format" :
> > "QmiNasSwiPsState" } ],
> > +                     "prerequisites" : [ { "common-ref" :
> > "Success"
> > } ] },
> > +                   { "name"       : "LTE Info",
> > +                     "id"         : "0x10",
> > +                     "type"       : "TLV",
> > +                     "since"      : "1.20",
> > +                     "format"     : "sequence",
> > +                     "contents"   : [ { "name"          : "Band",
> > +                                        "format"        :
> > "guint8",
> > +                                        "public-format" :
> > "QmiNasActiveBand" },
> > +                                      { "name"          :
> > "Bandwidth",
> > +                                        "format"        :
> > "guint8",
> > +				        "public-format" :
> > "QmiNasDLBandwidth"},
> > +                                      { "name"          : "RX
> > Channel",
> > +                                        "format"        :
> > "guint16"
> > },
> > +                                      { "name"          : "TX
> > Channel",
> > +                                        "format"        :
> > "guint16"
> > },
> > +                                      { "name"          : "EMM
> > State",
> > +                                        "format"        :
> > "guint8",
> > +				        "public-format" :
> > "QmiNasSwiEmmState"},
> > +                                      { "name"          : "EMM Sub
> > State",
> > +                                        "format"        : "guint8"
> > },
> > +                                      { "name"          : "EMM
> > Connection State",
> > +                                        "format"        :
> > "guint8",
> > +				        "public-format" :
> > "QmiNasSwiEmmConnectionState" } ],
> > +                     "prerequisites" : [ { "common-ref" :
> > "Success"
> > } ] } ] }
> > +
> >  ]
> > diff --git a/src/libqmi-glib/qmi-enums-nas.h b/src/libqmi-glib/qmi-
> > enums-nas.h
> > index 4f7f2544e8ca..b30e2efb8827 100644
> > --- a/src/libqmi-glib/qmi-enums-nas.h
> > +++ b/src/libqmi-glib/qmi-enums-nas.h
> > @@ -1525,4 +1525,142 @@ typedef enum {
> >      QMI_NAS_USAGE_PREFERENCE_DATA_CENTRIC  = 0x02
> >  } QmiNasUsagePreference;
> >  
> > +/**
> > + * QmiNasSwiModemMode:
> > + * @QMI_NAS_SWI_MODEM_MODE_POWERING_OFF: Powering off
> > + * @QMI_NAS_SWI_MODEM_MODE_FACTORY_TEST: Factory test
> > + * @QMI_NAS_SWI_MODEM_MODE_OFFLINE: Offline
> > + * @QMI_NAS_SWI_MODEM_MODE_OFFLINE_AMPS: Offline AMPS
> > + * @QMI_NAS_SWI_MODEM_MODE_OFFLINE_CDMA: Offline CDMA
> > + * @QMI_NAS_SWI_MODEM_MODE_ONLINE: Online
> > + * @QMI_NAS_SWI_MODEM_MODE_LOW_POWER: Low power
> > + * @QMI_NAS_SWI_MODEM_MODE_RESETTING: Resetting
> > + * @QMI_NAS_SWI_MODEM_MODE_NETWORK_TEST: Network test
> > + * @QMI_NAS_SWI_MODEM_MODE_OFFLINE_REQUEST: Offline request
> > + * @QMI_NAS_SWI_MODEM_MODE_PSEUDO_ONLINE: Pseudo online
> > + * @QMI_NAS_SWI_MODEM_MODE_RESETTING_MODEM: Resetting modem
> > + * @QMI_NAS_SWI_MODEM_MODE_UNKNOWN: Unknown
> > + *
> > + * Since: 1.20
> > + */
> > +typedef enum {
> > +    QMI_NAS_SWI_MODEM_MODE_POWERING_OFF    = 0x00,
> > +    QMI_NAS_SWI_MODEM_MODE_FACTORY_TEST    = 0x01,
> > +    QMI_NAS_SWI_MODEM_MODE_OFFLINE         = 0x02,
> > +    QMI_NAS_SWI_MODEM_MODE_OFFLINE_AMPS    = 0x03,
> > +    QMI_NAS_SWI_MODEM_MODE_OFFLINE_CDMA    = 0x04,
> > +    QMI_NAS_SWI_MODEM_MODE_ONLINE          = 0x05,
> > +    QMI_NAS_SWI_MODEM_MODE_LOW_POWER       = 0x06,
> > +    QMI_NAS_SWI_MODEM_MODE_RESETTING       = 0x07,
> > +    QMI_NAS_SWI_MODEM_MODE_NETWORK_TEST    = 0x08,
> > +    QMI_NAS_SWI_MODEM_MODE_OFFLINE_REQUEST = 0x09,
> > +    QMI_NAS_SWI_MODEM_MODE_PSEUDO_ONLINE   = 0x0a,
> > +    QMI_NAS_SWI_MODEM_MODE_RESETTING_MODEM = 0x0b,
> > +    QMI_NAS_SWI_MODEM_MODE_UNKNOWN         = 0xff
> > +} QmiNasSwiModemMode;
> > +
> > +/**
> > + * QmiNasSwiSystemMode:
> > + * @QMI_NAS_SWI_SYSTEM_MODE_NO_SERVICE: No service
> > + * @QMI_NAS_SWI_SYSTEM_MODE_AMPS: AMPS
> > + * @QMI_NAS_SWI_SYSTEM_MODE_CDMA: CDMA
> > + * @QMI_NAS_SWI_SYSTEM_MODE_GSM: GSM
> > + * @QMI_NAS_SWI_SYSTEM_MODE_HDR: HDR
> > + * @QMI_NAS_SWI_SYSTEM_MODE_WCDMA: WCDMA
> > + * @QMI_NAS_SWI_SYSTEM_MODE_GPS: GPS
> > + * @QMI_NAS_SWI_SYSTEM_MODE_WLAN: WLAN
> > + * @QMI_NAS_SWI_SYSTEM_MODE_LTE: LTE
> > + * @QMI_NAS_SWI_SYSTEM_MODE_UNKNOWN: Unknown
> > + *
> > + * Since: 1.20
> > + */
> > +typedef enum {
> > +    QMI_NAS_SWI_SYSTEM_MODE_NO_SERVICE = 0x00,
> > +    QMI_NAS_SWI_SYSTEM_MODE_AMPS       = 0x01,
> > +    QMI_NAS_SWI_SYSTEM_MODE_CDMA       = 0x02,
> > +    QMI_NAS_SWI_SYSTEM_MODE_GSM        = 0x03,
> > +    QMI_NAS_SWI_SYSTEM_MODE_HDR        = 0x04,
> > +    QMI_NAS_SWI_SYSTEM_MODE_WCDMA      = 0x05,
> > +    QMI_NAS_SWI_SYSTEM_MODE_GPS        = 0x06,
> > +    QMI_NAS_SWI_SYSTEM_MODE_WLAN       = 0x08,
> > +    QMI_NAS_SWI_SYSTEM_MODE_LTE        = 0x09,
> > +    QMI_NAS_SWI_SYSTEM_MODE_UNKNOWN    = 0xff
> > +} QmiNasSwiSystemMode;
> > +
> > +/**
> > + * QmiNasSwiImsRegState:
> > + * @QMI_NAS_SWI_IMS_REG_NO_SRV: No service
> > + * @QMI_NAS_SWI_IMS_REG_IN_PROG: In prog
> > + * @QMI_NAS_SWI_IMS_REG_FAILED: Failed
> > + * @QMI_NAS_SWI_IMS_REG_LIMITED: Limited
> > + * @QMI_NAS_SWI_IMS_REG_FULL_SRV: Full service
> > + * @QMI_NAS_SWI_IMS_REG__UNKNOWN: Unknown
> > + *
> > + * Since: 1.20
> > + */
> > +typedef enum {
> > +    QMI_NAS_SWI_IMS_REG_NO_SRV   = 0x00,
> > +    QMI_NAS_SWI_IMS_REG_IN_PROG  = 0x01,
> > +    QMI_NAS_SWI_IMS_REG_FAILED   = 0x02,
> > +    QMI_NAS_SWI_IMS_REG_LIMITED  = 0x03,
> > +    QMI_NAS_SWI_IMS_REG_FULL_SRV = 0x04,
> > +    QMI_NAS_SWI_IMS_REG__UNKNOWN = 0xff
> > +} QmiNasSwiImsRegState;
> > +
> > +/**
> > + * QmiNasSwiPsState:
> > + * @QMI_NAS_SWI_PS_STATE_ATTACHED: Attached
> > + * @QMI_NAS_SWI_PS_STATE_DETACHED: Detached
> > + * @QMI_NAS_SWI_PS_STATE_UNKNOWN: Unknown
> > + *
> > + * Since: 1.20
> > + */
> > +typedef enum {
> > +    QMI_NAS_SWI_PS_STATE_ATTACHED = 0x00,
> > +    QMI_NAS_SWI_PS_STATE_DETACHED = 0x01,
> > +    QMI_NAS_SWI_PS_STATE_UNKNOWN  = 0xff
> > +} QmiNasSwiPsState;
> > +
> > +/**
> > + * QmiNasSwiEmmState:
> > + * @QMI_NAS_SWI_EMM_STATE_DEREGISTERED: Deregistered
> > + * @QMI_NAS_SWI_EMM_STATE_REG_INITIATED: Registration initiated
> > + * @QMI_NAS_SWI_EMM_STATE_REGISTERED: Registered
> > + * @QMI_NAS_SWI_EMM_STATE_TAU_INITIATED: TAU initiated
> > + * @QMI_NAS_SWI_EMM_STATE_SR_INITIATED: SR initiated
> > + * @QMI_NAS_SWI_EMM_STATE_DEREG_INITIATED: Deregistration
> > initiated
> > + * @QMI_NAS_SWI_EMM_STATE_INVALID: Invalid
> > + * @QMI_NAS_SWI_EMM_STATE_UNKNOWN: Unknown
> > + *
> > + * Since: 1.20
> > + */
> > +typedef enum {
> > +    QMI_NAS_SWI_EMM_STATE_DEREGISTERED    = 0x00,
> > +    QMI_NAS_SWI_EMM_STATE_REG_INITIATED   = 0x01,
> > +    QMI_NAS_SWI_EMM_STATE_REGISTERED      = 0x02,
> > +    QMI_NAS_SWI_EMM_STATE_TAU_INITIATED   = 0x03,
> > +    QMI_NAS_SWI_EMM_STATE_SR_INITIATED    = 0x04,
> > +    QMI_NAS_SWI_EMM_STATE_DEREG_INITIATED = 0x05,
> > +    QMI_NAS_SWI_EMM_STATE_INVALID         = 0x06,
> > +    QMI_NAS_SWI_EMM_STATE_UNKNOWN         = 0xff
> > +} QmiNasSwiEmmState;
> > +
> > +/**
> > + * QmiNasSwiEmmConnectionState:
> > + * @QMI_NAS_SWI_EMM_CONN_STATE_RRC_IDLE: RRC idle
> > + * @QMI_NAS_SWI_EMM_CONN_STATE_WAITING_RRC_CFM: Waiting RRC Cfm
> > + * @QMI_NAS_SWI_EMM_CONN_STATE_RRC_CONNECTING: RRC connecting
> > + * @QMI_NAS_SWI_EMM_CONN_STATE_RRC_RELEASING: RRC releasing
> > + * @QMI_NAS_SWI_EMM_CONN_STATE_UNKNOWN: Unknown
> > + *
> > + * Since: 1.20
> > + */
> > +typedef enum {
> > +    QMI_NAS_SWI_EMM_CONN_STATE_RRC_IDLE        = 0x00,
> > +    QMI_NAS_SWI_EMM_CONN_STATE_WAITING_RRC_CFM = 0x01,
> > +    QMI_NAS_SWI_EMM_CONN_STATE_RRC_CONNECTING  = 0x02,
> > +    QMI_NAS_SWI_EMM_CONN_STATE_RRC_RELEASING   = 0x03,
> > +    QMI_NAS_SWI_EMM_CONN_STATE_UNKNOWN  = 0xff
> > +} QmiNasSwiEmmConnectionState;
> > +
> >  #endif /* _LIBQMI_GLIB_QMI_ENUMS_NAS_H_ */
> > diff --git a/src/qmicli/qmicli-nas.c b/src/qmicli/qmicli-nas.c
> > index caf5609050a9..527f327f066f 100644
> > --- a/src/qmicli/qmicli-nas.c
> > +++ b/src/qmicli/qmicli-nas.c
> > @@ -59,6 +59,7 @@ static gboolean get_operator_name_flag;
> >  static gboolean get_lte_cphy_ca_info_flag;
> >  static gboolean get_rf_band_info_flag;
> >  static gboolean get_supported_messages_flag;
> > +static gboolean swi_get_status_flag;
> >  static gboolean reset_flag;
> >  static gboolean noop_flag;
> >  
> > @@ -127,6 +128,10 @@ static GOptionEntry entries[] = {
> >        "Get supported messages",
> >        NULL
> >      },
> > +    { "nas-swi-get-status", 0, 0, G_OPTION_ARG_NONE,
> > &swi_get_status_flag,
> > +      "Get status ((Sierra Wireless specific)",
> > +      NULL
> > +    },
> >      { "nas-reset", 0, 0, G_OPTION_ARG_NONE, &reset_flag,
> >        "Reset the service state",
> >        NULL
> > @@ -178,6 +183,7 @@ qmicli_nas_options_enabled (void)
> >                   get_lte_cphy_ca_info_flag +
> >                   get_rf_band_info_flag +
> >                   get_supported_messages_flag +
> > +                 swi_get_status_flag +
> >                   reset_flag +
> >                   noop_flag);
> >  
> > @@ -3377,6 +3383,98 @@ get_supported_messages_ready (QmiClientNas
> > *client,
> >      operation_shutdown (TRUE);
> >  }
> >  
> > +static void
> > +swi_get_status_ready (QmiClientNas *client,
> > +                              GAsyncResult *res)
> > +{
> > +    QmiMessageNasSwiGetStatusOutput *output;
> > +    GError *error = NULL;
> > +
> > +    guint8 temperature;
> > +    QmiNasSwiModemMode modem_mode;
> > +    QmiNasSwiSystemMode system_mode;
> > +    QmiNasSwiImsRegState ims_reg_state;
> > +    QmiNasSwiPsState ps_state;
> > +
> > +    QmiNasActiveBand band;
> > +    QmiNasDLBandwidth bandwidth;
> > +    guint16 rx_channel;
> > +    guint16 tx_channel;
> > +    QmiNasSwiEmmState emm_state;
> > +    guint8 emm_sub_state;
> > +    QmiNasSwiEmmConnectionState emm_conn_state;
> > +
> > +    output = qmi_client_nas_swi_get_status_finish (client, res,
> > &error);
> > +    if (!output) {
> > +        g_printerr ("error: operation failed: %s\n", error-
> > > message);
> > +        g_error_free (error);
> > +        operation_shutdown (FALSE);
> > +        return;
> > +    }
> > +
> > +    if (!qmi_message_nas_swi_get_status_output_get_result (output,
> > &error)) {
> > +        g_printerr ("error: couldn't get status: %s\n", error-
> > > message);
> > +        g_error_free (error);
> > +        qmi_message_nas_swi_get_status_output_unref (output);
> > +        operation_shutdown (FALSE);
> > +        return;
> > +    }
> > +
> > +    g_print ("[%s] Successfully got status:\n",
> > +             qmi_device_get_path_display (ctx->device));
> > +
> > +    if (qmi_message_nas_swi_get_status_output_get_common_info (
> > +            output,
> > +            &temperature,
> > +            &modem_mode,
> > +            &system_mode,
> > +            &ims_reg_state,
> > +            &ps_state,
> > +            NULL)) {
> > +        g_print ("Common Info:\n"
> > +                "\tTemperature: '%u'\n"
> > +                "\tModem mode: '%s'\n"
> > +                "\tSystem mode: '%s'\n"
> > +                "\tIMS registration state: '%s'\n"
> > +                "\tPacket service state: '%s'\n",
> > +                temperature,
> > +                qmi_nas_swi_modem_mode_get_string (modem_mode),
> > +                qmi_nas_swi_system_mode_get_string (system_mode),
> > +                qmi_nas_swi_ims_reg_state_get_string
> > (ims_reg_state),
> > +                qmi_nas_swi_ps_state_get_string (ps_state));
> > +    }
> > +
> > +    if (qmi_message_nas_swi_get_status_output_get_lte_info (
> > +            output,
> > +            &band,
> > +            &bandwidth,
> > +            &rx_channel,
> > +            &tx_channel,
> > +            &emm_state,
> > +            &emm_sub_state,
> > +            &emm_conn_state,
> > +            NULL)) {
> > +        g_print ("LTE info:\n"
> > +                "\tBand: '%s'\n"
> > +                "\tBandwidth: '%s'\n"
> > +                "\tRX channel: '%" G_GUINT16_FORMAT"'\n"
> > +                "\tTX channel: '%" G_GUINT16_FORMAT"'\n"
> > +                "\tEMM state: '%s'\n"
> > +                "\tEMM sub state: '%u'\n"
> > +                "\tEMM connection state: '%s'\n",
> > +                qmi_nas_active_band_get_string (band),
> > +                qmi_nas_dl_bandwidth_get_string (bandwidth),
> > +                rx_channel,
> > +                tx_channel,
> > +                qmi_nas_swi_emm_state_get_string (emm_state),
> > +                emm_sub_state,
> > +                qmi_nas_swi_emm_connection_state_get_string
> > (emm_conn_state));
> > +    }
> > +
> > +    qmi_message_nas_swi_get_status_output_unref (output);
> > +    operation_shutdown (TRUE);
> > +}
> > +
> >  static void
> >  reset_ready (QmiClientNas *client,
> >               GAsyncResult *res)
> > @@ -3642,6 +3740,18 @@ qmicli_nas_run (QmiDevice *device,
> >          return;
> >      }
> >  
> > +    /* Request to get status */
> > +    if (swi_get_status_flag) {
> > +        g_debug ("Asynchronously getting status (Sierra Wireless
> > specific)...");
> > +        qmi_client_nas_swi_get_status (ctx->client,
> > +                                       NULL,
> > +                                       10,
> > +                                       ctx->cancellable,
> > +                                       (GAsyncReadyCallback)swi_ge
> > t_
> > status_ready,
> > +                                       NULL);
> > +        return;
> > +    }
> > +
> >      /* Request to reset NAS service? */
> >      if (reset_flag) {
> >          g_debug ("Asynchronously resetting NAS service...");
> 
> _______________________________________________
> libqmi-devel mailing list
> libqmi-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/libqmi-devel



More information about the libqmi-devel mailing list