From a86e6b73d82603f79552bffdb5d42ff29847b8a0 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Mon, 16 Dec 2019 16:51:34 +0100 Subject: [PATCH] remsim_client: Move body of main() loop to separate function I rally don't like the existing spaghetti-style code. Change-Id: I85c166e8aa95bb3f2e5d60d14f60caa94f3116fb --- src/simtrace2-remsim_client.c | 224 +++++++++++++++++----------------- 1 file changed, 115 insertions(+), 109 deletions(-) diff --git a/src/simtrace2-remsim_client.c b/src/simtrace2-remsim_client.c index 077275a..ac78dd4 100644 --- a/src/simtrace2-remsim_client.c +++ b/src/simtrace2-remsim_client.c @@ -992,10 +992,120 @@ static void handle_options(struct client_config *cfg, int argc, char **argv) } +static void main_body(struct client_config *cfg) +{ + struct st_transport *transp = ci->slot->transp; + struct usb_interface_match _ifm, *ifm = &_ifm; + int rc; + + ifm->vendor = cfg->usb.vendor_id; + ifm->product = cfg->usb.product_id; + ifm->configuration = cfg->usb.config_id; + ifm->interface = cfg->usb.if_num; + ifm->altsetting = cfg->usb.altsetting; + ifm->addr = cfg->usb.addr; + if (cfg->usb.path) + osmo_strlcpy(ifm->path, cfg->usb.path, sizeof(ifm->path)); + transp->usb_devh = osmo_libusb_open_claim_interface(NULL, NULL, ifm); + if (!transp->usb_devh) { + fprintf(stderr, "can't open USB device\n"); + return; + } + + rc = libusb_claim_interface(transp->usb_devh, cfg->usb.if_num); + if (rc < 0) { + fprintf(stderr, "can't claim interface %d; rc=%d\n", cfg->usb.if_num, rc); + goto close_exit; + } + + rc = osmo_libusb_get_ep_addrs(transp->usb_devh, cfg->usb.if_num, &transp->usb_ep.out, + &transp->usb_ep.in, &transp->usb_ep.irq_in); + if (rc < 0) { + fprintf(stderr, "can't obtain EP addrs; rc=%d\n", rc); + goto close_exit; + } + + // switch modem SIM port to emulated SIM on OWHW + if (USB_VENDOR_OPENMOKO == ifm->vendor && USB_PRODUCT_OWHW_SAM3 == ifm->product) { // we are on the OWHW + int modem = -1; + switch (ifm->interface) { // the USB interface indicates for which modem we want to emulate the SIM + case 0: + modem = 1; + break; + case 1: + modem = 2; + break; + default: + fprintf(stderr, "unknown GPIO for SIMtrace interface %d\n", ifm->interface); + goto close_exit; + } + // + char gpio_path[PATH_MAX]; + snprintf(gpio_path, sizeof(gpio_path), "/dev/gpio/connect_st_usim%d/value", modem); + int connec_st_usim = open(gpio_path, O_WRONLY); + if (-1 == connec_st_usim) { + fprintf(stderr, "can't open GPIO %s to switch modem %d to emulated USIM\n", gpio_path, modem); + goto close_exit; + } + if (1 != write(connec_st_usim, "1", 1)) { + fprintf(stderr, "can't write GPIO %s to switch modem %d to emulated USIM\n", gpio_path, modem); + goto close_exit; + } + printf("switched modem %d to emulated USIM\n", modem); + + snprintf(gpio_path, sizeof(gpio_path), "/dev/gpio/mdm%d_rst/value", modem); + int mdm_rst = open(gpio_path, O_WRONLY); + if (-1 == mdm_rst) { + fprintf(stderr, "can't open GPIO %s to reset modem %d\n", gpio_path, modem); + goto close_exit; + } + if (1 != write(mdm_rst, "1", 1)) { + fprintf(stderr, "can't write GPIO %s to reset modem %d\n", gpio_path, modem); + goto close_exit; + } + sleep(1); // wait a bit to ensure reset is effective + if (1 != write(mdm_rst, "0", 1)) { + fprintf(stderr, "can't write GPIO %s to reset modem %d\n", gpio_path, modem); + goto close_exit; + } + printf("modem %d reset\n", modem); + } + + /* request firmware to generate STATUS on IRQ endpoint */ + cardem_request_config(ci, CEMU_FEAT_F_STATUS_IRQ); + + /* simulate card-insert to modem (owhw, not qmod) */ + cardem_request_card_insert(ci, true); + + /* select remote (forwarded) SIM */ + st_modem_sim_select_remote(ci->slot); + + /* set the ATR */ + //atr_update_csum(real_atr, sizeof(real_atr)); + cardem_request_set_atr(ci, cfg->atr.data, cfg->atr.len); + + /* select remote (forwarded) SIM */ + st_modem_reset_pulse(ci->slot, 300); + + printf("Entering main loop\n"); + + allocate_and_submit_irq(ci); + allocate_and_submit_in(ci); + + while (1) { + osmo_select_main(false); + } + + libusb_release_interface(transp->usb_devh, 0); + +close_exit: + if (transp->usb_devh) + libusb_close(transp-> usb_devh); +} + int main(int argc, char **argv) { struct rspro_server_conn *srvc, *bankdc; - struct st_transport *transp = ci->slot->transp; struct client_config *cfg; int rc; int ret = 1; @@ -1082,116 +1192,12 @@ int main(int argc, char **argv) // connect to SIMtrace2 cardem do { - struct usb_interface_match _ifm, *ifm = &_ifm; - ifm->vendor = cfg->usb.vendor_id; - ifm->product = cfg->usb.product_id; - ifm->configuration = cfg->usb.config_id; - ifm->interface = cfg->usb.if_num; - ifm->altsetting = cfg->usb.altsetting; - ifm->addr = cfg->usb.addr; - if (cfg->usb.path) - osmo_strlcpy(ifm->path, cfg->usb.path, sizeof(ifm->path)); - transp->usb_devh = osmo_libusb_open_claim_interface(NULL, NULL, ifm); - if (!transp->usb_devh) { - fprintf(stderr, "can't open USB device\n"); - goto close_exit; - } - - rc = libusb_claim_interface(transp->usb_devh, cfg->usb.if_num); - if (rc < 0) { - fprintf(stderr, "can't claim interface %d; rc=%d\n", cfg->usb.if_num, rc); - goto close_exit; - } - - rc = osmo_libusb_get_ep_addrs(transp->usb_devh, cfg->usb.if_num, &transp->usb_ep.out, - &transp->usb_ep.in, &transp->usb_ep.irq_in); - if (rc < 0) { - fprintf(stderr, "can't obtain EP addrs; rc=%d\n", rc); - goto close_exit; - } - - // switch modem SIM port to emulated SIM on OWHW - if (USB_VENDOR_OPENMOKO == ifm->vendor && USB_PRODUCT_OWHW_SAM3 == ifm->product) { // we are on the OWHW - int modem = -1; - switch (ifm->interface) { // the USB interface indicates for which modem we want to emulate the SIM - case 0: - modem = 1; - break; - case 1: - modem = 2; - break; - default: - fprintf(stderr, "unknown GPIO for SIMtrace interface %d\n", ifm->interface); - goto close_exit; - } - // - char gpio_path[PATH_MAX]; - snprintf(gpio_path, sizeof(gpio_path), "/dev/gpio/connect_st_usim%d/value", modem); - int connec_st_usim = open(gpio_path, O_WRONLY); - if (-1 == connec_st_usim) { - fprintf(stderr, "can't open GPIO %s to switch modem %d to emulated USIM\n", gpio_path, modem); - goto close_exit; - } - if (1 != write(connec_st_usim, "1", 1)) { - fprintf(stderr, "can't write GPIO %s to switch modem %d to emulated USIM\n", gpio_path, modem); - goto close_exit; - } - printf("switched modem %d to emulated USIM\n", modem); - - snprintf(gpio_path, sizeof(gpio_path), "/dev/gpio/mdm%d_rst/value", modem); - int mdm_rst = open(gpio_path, O_WRONLY); - if (-1 == mdm_rst) { - fprintf(stderr, "can't open GPIO %s to reset modem %d\n", gpio_path, modem); - goto close_exit; - } - if (1 != write(mdm_rst, "1", 1)) { - fprintf(stderr, "can't write GPIO %s to reset modem %d\n", gpio_path, modem); - goto close_exit; - } - sleep(1); // wait a bit to ensure reset is effective - if (1 != write(mdm_rst, "0", 1)) { - fprintf(stderr, "can't write GPIO %s to reset modem %d\n", gpio_path, modem); - goto close_exit; - } - printf("modem %d reset\n", modem); - } - - /* request firmware to generate STATUS on IRQ endpoint */ - cardem_request_config(ci, CEMU_FEAT_F_STATUS_IRQ); - - /* simulate card-insert to modem (owhw, not qmod) */ - cardem_request_card_insert(ci, true); - - /* select remote (forwarded) SIM */ - st_modem_sim_select_remote(ci->slot); - - /* set the ATR */ - //atr_update_csum(real_atr, sizeof(real_atr)); - cardem_request_set_atr(ci, cfg->atr.data, cfg->atr.len); - - /* select remote (forwarded) SIM */ - st_modem_reset_pulse(ci->slot, 300); - - printf("Entering main loop\n"); - - allocate_and_submit_irq(ci); - allocate_and_submit_in(ci); - - while (1) { - osmo_select_main(false); - } - - ret = 0; - - libusb_release_interface(transp->usb_devh, 0); -close_exit: - if (transp->usb_devh) - libusb_close(transp->usb_devh); - if (cfg->keep_running) - sleep(1); + main_body(cfg); + sleep(1); } while (cfg->keep_running); - libusb_exit(NULL); +close_exit: + osmo_libusb_exit(NULL); do_exit: return ret; }