umbim: fix invalid mbim message string encoding
[project/umbim.git] / cli.c
diff --git a/cli.c b/cli.c
index e00b6d4911c6c84a5ff4930ae0840dfa1af0bd81..3a845d463d843040e19325de2098831ca47fb014 100644 (file)
--- a/cli.c
+++ b/cli.c
@@ -42,7 +42,7 @@ static int _argc;
 static char **_argv;
 
 static int
-mbim_device_caps_response(void *buffer, int len)
+mbim_device_caps_response(void *buffer, size_t len)
 {
        struct mbim_basic_connect_device_caps_r *caps = (struct mbim_basic_connect_device_caps_r *) buffer;
        char *deviceid, *firmwareinfo, *hardwareinfo;
@@ -74,7 +74,7 @@ mbim_device_caps_response(void *buffer, int len)
 }
 
 static int
-mbim_pin_state_response(void *buffer, int len)
+mbim_pin_state_response(void *buffer, size_t len)
 {
        struct mbim_basic_connect_pin_r *pin = (struct mbim_basic_connect_pin_r *) buffer;
 
@@ -96,7 +96,33 @@ mbim_pin_state_response(void *buffer, int len)
 }
 
 static int
-mbim_registration_response(void *buffer, int len)
+mbim_home_provider_response(void *buffer, size_t len)
+{
+       struct mbim_basic_connect_home_provider_r *state = (struct mbim_basic_connect_home_provider_r *) buffer;
+       struct mbimprovider *provider;
+       char *provider_id, *provider_name;
+
+       if (len < sizeof(struct mbim_basic_connect_home_provider_r)) {
+               fprintf(stderr, "message not long enough\n");
+               return -1;
+       }
+
+       provider = &state->provider;
+       provider_id = mbim_get_string(&provider->providerid, buffer);
+       provider_name = mbim_get_string(&provider->providername, buffer);
+
+       printf("  provider_id: %s\n", provider_id);
+       printf("  provider_name: %s\n", provider_name);
+       printf("  cellularclass: %04X - %s\n", le32toh(provider->cellularclass),
+               mbim_enum_string(mbim_cellular_class_values, le32toh(provider->cellularclass)));
+       printf("  rssi: %04X\n", le32toh(provider->rssi));
+       printf("  errorrate: %04X\n", le32toh(provider->errorrate));
+
+       return 0;
+}
+
+static int
+mbim_registration_response(void *buffer, size_t len)
 {
        struct mbim_basic_connect_register_state_r *state = (struct mbim_basic_connect_register_state_r *) buffer;
        char *provider_id, *provider_name, *roamingtext;
@@ -131,11 +157,11 @@ mbim_registration_response(void *buffer, int len)
 }
 
 static int
-mbim_subscriber_response(void *buffer, int len)
+mbim_subscriber_response(void *buffer, size_t len)
 {
        struct mbim_basic_connect_subscriber_ready_status_r *state = (struct mbim_basic_connect_subscriber_ready_status_r *) buffer;
        char *subscriberid, *simiccid;
-       int nr;
+       unsigned int nr;
 
        if (len < sizeof(struct mbim_basic_connect_subscriber_ready_status_r)) {
                fprintf(stderr, "message not long enough\n");
@@ -164,7 +190,7 @@ mbim_subscriber_response(void *buffer, int len)
 }
 
 static int
-mbim_attach_response(void *buffer, int len)
+mbim_attach_response(void *buffer, size_t len)
 {
        struct mbim_basic_connect_packet_service_r *ps = (struct mbim_basic_connect_packet_service_r *) buffer;
 
@@ -187,7 +213,7 @@ mbim_attach_response(void *buffer, int len)
 }
 
 static int
-mbim_connect_response(void *buffer, int len)
+mbim_connect_response(void *buffer, size_t len)
 {
        struct mbim_basic_connect_connect_r *c = (struct mbim_basic_connect_connect_r *) buffer;
 
@@ -213,11 +239,11 @@ mbim_connect_response(void *buffer, int len)
 }
 
 static int
-mbim_config_response(void *buffer, int len)
+mbim_config_response(void *buffer, size_t len)
 {
        struct mbim_basic_connect_ip_configuration_r *ip = (struct mbim_basic_connect_ip_configuration_r *) buffer;
        char out[40];
-       int i;
+       unsigned int i;
        uint32_t offset;
 
        if (len < sizeof(struct mbim_basic_connect_ip_configuration_r)) {
@@ -265,7 +291,7 @@ mbim_config_response(void *buffer, int len)
 }
 
 static int
-mbim_radio_response(void *buffer, int len)
+mbim_radio_response(void *buffer, size_t len)
 {
        struct mbim_basic_connect_radio_state_r *r = (struct mbim_basic_connect_radio_state_r *) buffer;
 
@@ -294,6 +320,14 @@ mbim_pin_state_request(void)
        return mbim_send_command_msg();
 }
 
+static int
+mbim_home_provider_request(void)
+{
+       mbim_setup_command_msg(basic_connect, MBIM_MESSAGE_COMMAND_TYPE_QUERY, MBIM_CID_BASIC_CONNECT_HOME_PROVIDER, 0);
+
+       return mbim_send_command_msg();
+}
+
 static int
 mbim_registration_request(void)
 {
@@ -478,6 +512,7 @@ static struct mbim_handler handlers[] = {
        { "caps", 0, mbim_device_caps_request, mbim_device_caps_response },
        { "pinstate", 0, mbim_pin_state_request, mbim_pin_state_response },
        { "unlock", 1, mbim_pin_unlock_request, mbim_pin_state_response },
+       { "home", 0, mbim_home_provider_request, mbim_home_provider_response },
        { "registration", 0, mbim_registration_request, mbim_registration_response },
        { "subscriber", 0, mbim_subscriber_request, mbim_subscriber_response },
        { "attach", 0, mbim_attach_request, mbim_attach_response },
@@ -491,8 +526,11 @@ static struct mbim_handler handlers[] = {
 static int
 usage(void)
 {
-       fprintf(stderr, "Usage: umbim <caps|pinstate|unlock|registration|subscriber|attach|detach|connect|disconnect|config|radio> [options]\n"
+       fprintf(stderr, "Usage: umbim <caps|pinstate|unlock|home|registration|subscriber|attach|detach|connect|disconnect|config|radio> [options]\n"
                "Options:\n"
+#ifdef LIBQMI_MBIM_PROXY
+               "    -p                 use mbim-proxy\n"
+#endif
                "    -d <device>        the device (/dev/cdc-wdmX)\n"
                "    -t <transaction>   the transaction id\n"
                "    -n                 no close\n\n"
@@ -504,9 +542,13 @@ int
 main(int argc, char **argv)
 {
        char *cmd, *device = NULL;
-       int no_open = 0, ch, i;
+       int no_open = 0, ch;
+       unsigned int i;
+#ifdef LIBQMI_MBIM_PROXY
+       int proxy = 0;
+#endif
 
-       while ((ch = getopt(argc, argv, "nvd:t:")) != -1) {
+       while ((ch = getopt(argc, argv, "pnvd:t:")) != -1) {
                switch (ch) {
                case 'v':
                        verbose = 1;
@@ -521,6 +563,11 @@ main(int argc, char **argv)
                        no_open = 1;
                        transaction_id = atoi(optarg);
                        break;
+#ifdef LIBQMI_MBIM_PROXY
+               case 'p':
+                       proxy = 1;
+                       break;
+#endif
                default:
                        return usage();
                }
@@ -544,6 +591,11 @@ main(int argc, char **argv)
 
        uloop_init();
 
+#ifdef LIBQMI_MBIM_PROXY
+       if (proxy)
+               mbim_proxy_open(device);
+       else
+#endif
        mbim_open(device);
        if (!no_open)
                mbim_send_open_msg();