--- tools/ipc-modem.c | 125 ++++++++++++++++++++++++++++++++++++---------- 1 file changed, 100 insertions(+), 25 deletions(-)
diff --git a/tools/ipc-modem.c b/tools/ipc-modem.c index 9314de6..9e3064c 100644 --- a/tools/ipc-modem.c +++ b/tools/ipc-modem.c @@ -377,35 +377,67 @@ void modem_response_handle(struct ipc_client *client, struct ipc_message *resp) } -int modem_read_loop(struct ipc_client *client) +int modem_poll_client(struct ipc_client *client, char const *variation) { struct ipc_message resp; - int rc; + int rc; + struct timeval timeout; memset(&resp, 0, sizeof(resp)); + timeout.tv_sec = 0; + timeout.tv_usec = 50000; + rc = ipc_client_poll(client, NULL, &timeout); + if (rc < 0) { + printf("[E] poll of %s client failed\n", variation); + return -1; + } + + if (rc == 0) { + /* timeout. */ + return 0; + } + + rc = ipc_client_recv(client, &resp); + if (rc < 0) { + printf("[E] " + "Can't RECV from modem %s: please run this again" + "\n", variation); + return -1; + } + + modem_response_handle(client, &resp); + + if (resp.data != NULL) + free(resp.data); + + return 1; +} + +void modem_read_loop(struct ipc_client *client_fmt, struct ipc_client *client_rfs) +{ while (1) { usleep(3000); - rc = ipc_client_poll(client, NULL, NULL); - if (rc < 0) - continue; - - rc = ipc_client_recv(client, &resp); - if (rc < 0) { - printf("[E] " - "Can't RECV from modem: please run this again" - "\n"); - break; - } - - modem_response_handle(client, &resp); - - if (resp.data != NULL) - free(resp.data); + switch (modem_poll_client(client_fmt, "FMT")) { + case -1: + return; + case 0: + if (client_rfs != NULL) { + switch (modem_poll_client(client_rfs, "RFS")) { + case -1: + return; + case 0: + break; + default: + break; + } + } + break; + default: + break; + } } - - return 0; } void modem_log_handler(__attribute__((unused)) void *user_data, @@ -476,20 +508,24 @@ void print_help(void) printf("\tpower-off power off the modem\n"); printf("arguments:\n"); printf("\t--debug enable debug messages\n"); + printf("\t--rfs enable RFS client in addition to FMT client\n"); printf("\t--pin=[PIN] provide SIM card PIN\n"); } int main(int argc, char *argv[]) { - struct ipc_client *client_fmt; + struct ipc_client *client_fmt = 0; + struct ipc_client *client_rfs = 0; int c = 0; int opt_i = 0; int rc = -1; int debug = 0; + int rfs = 0; struct option opt_l[] = { {"help", no_argument, 0, 0 }, {"debug", no_argument, 0, 0 }, + {"rfs", no_argument, 0, 0 }, {"pin", required_argument, 0, 0 }, {0, 0, 0, 0 } }; @@ -512,6 +548,9 @@ int main(int argc, char *argv[]) } else if (strcmp(opt_l[opt_i].name, "debug") == 0) { debug = 1; printf("[I] Debug enabled\n"); + } else if (strcmp(opt_l[opt_i].name, "rfs") == 0) { + rfs = 1; + printf("[I] RFS enabled\n"); } else if (strcmp(opt_l[opt_i].name, "pin") == 0) { if (optarg) { if (strlen(optarg) < 8) { @@ -536,12 +575,30 @@ int main(int argc, char *argv[]) goto modem_quit; } + if (rfs) { + client_rfs = ipc_client_create(IPC_CLIENT_TYPE_RFS); + if (client_rfs == 0) { + printf("[E] Could not create RFS client; aborting ...\n"); + goto modem_quit; + } + } else { + client_rfs = 0; + } + if (debug == 0) { ipc_client_log_callback_register(client_fmt, modem_log_handler_quiet, NULL); + if (rfs) { + ipc_client_log_callback_register(client_rfs, + modem_log_handler_quiet, NULL); + } } else { ipc_client_log_callback_register(client_fmt, modem_log_handler, NULL); + if (rfs) { + ipc_client_log_callback_register(client_rfs, modem_log_handler, + NULL); + } } while (optind < argc) { @@ -561,18 +618,34 @@ int main(int argc, char *argv[]) printf("[E] Something went wrong " "while bootstrapping modem\n"); } else if (strncmp(argv[optind], "start", 5) == 0) { - printf("[0] Starting modem on FMT client\n"); + printf("[0] Starting modem FMT client\n"); rc = modem_start(client_fmt); if (rc < 0) { - printf("[E] Something went wrong\n"); + printf("[E] Something went wrong starting FMT client\n"); modem_stop(client_fmt); return 1; } - printf("[1] Starting modem_read_loop on FMT client\n"); - modem_read_loop(client_fmt); + if (rfs) { + printf("[1] Starting modem RFS client\n"); + ipc_client_data_create(client_rfs); + rc = ipc_client_open(client_rfs); + if (rc < 0) { + printf("[E] Something went wrong starting RFS client\n"); + ipc_client_close(client_rfs); + modem_stop(client_fmt); + return 1; + } + } else { + printf("[1] Skipping modem RFS client start\n"); + } + + printf("[2] Starting modem_read_loop on FMT client\n"); + modem_read_loop(client_fmt, client_rfs); modem_stop(client_fmt); + if (client_rfs != 0) + ipc_client_close(client_rfs); } else { printf("[E] Unknown argument: '%s'\n", argv[optind]); print_help(); @@ -585,6 +658,8 @@ int main(int argc, char *argv[]) modem_quit: if (client_fmt != 0) ipc_client_destroy(client_fmt); + if (client_rfs != 0) + ipc_client_destroy(client_rfs); return 0; } -- 2.28.0 _______________________________________________ Replicant mailing list Replicant@osuosl.org https://lists.osuosl.org/mailman/listinfo/replicant