<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-remsim/+/16622">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">remsim_client: Move body of main() loop to separate function<br><br>I rally don't like the existing spaghetti-style code.<br><br>Change-Id: I85c166e8aa95bb3f2e5d60d14f60caa94f3116fb<br>---<br>M src/simtrace2-remsim_client.c<br>1 file changed, 115 insertions(+), 109 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-remsim refs/changes/22/16622/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/simtrace2-remsim_client.c b/src/simtrace2-remsim_client.c</span><br><span>index 077275a..ac78dd4 100644</span><br><span>--- a/src/simtrace2-remsim_client.c</span><br><span>+++ b/src/simtrace2-remsim_client.c</span><br><span>@@ -992,10 +992,120 @@</span><br><span> }</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void main_body(struct client_config *cfg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct st_transport *transp = ci->slot->transp;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct usb_interface_match _ifm, *ifm = &_ifm;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ifm->vendor = cfg->usb.vendor_id;</span><br><span style="color: hsl(120, 100%, 40%);">+ ifm->product = cfg->usb.product_id;</span><br><span style="color: hsl(120, 100%, 40%);">+ ifm->configuration = cfg->usb.config_id;</span><br><span style="color: hsl(120, 100%, 40%);">+ ifm->interface = cfg->usb.if_num;</span><br><span style="color: hsl(120, 100%, 40%);">+ ifm->altsetting = cfg->usb.altsetting;</span><br><span style="color: hsl(120, 100%, 40%);">+ ifm->addr = cfg->usb.addr;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (cfg->usb.path)</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_strlcpy(ifm->path, cfg->usb.path, sizeof(ifm->path));</span><br><span style="color: hsl(120, 100%, 40%);">+ transp->usb_devh = osmo_libusb_open_claim_interface(NULL, NULL, ifm);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!transp->usb_devh) {</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "can't open USB device\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = libusb_claim_interface(transp->usb_devh, cfg->usb.if_num);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "can't claim interface %d; rc=%d\n", cfg->usb.if_num, rc);</span><br><span style="color: hsl(120, 100%, 40%);">+ goto close_exit;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = osmo_libusb_get_ep_addrs(transp->usb_devh, cfg->usb.if_num, &transp->usb_ep.out,</span><br><span style="color: hsl(120, 100%, 40%);">+ &transp->usb_ep.in, &transp->usb_ep.irq_in);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "can't obtain EP addrs; rc=%d\n", rc);</span><br><span style="color: hsl(120, 100%, 40%);">+ goto close_exit;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ // switch modem SIM port to emulated SIM on OWHW</span><br><span style="color: hsl(120, 100%, 40%);">+ if (USB_VENDOR_OPENMOKO == ifm->vendor && USB_PRODUCT_OWHW_SAM3 == ifm->product) { // we are on the OWHW</span><br><span style="color: hsl(120, 100%, 40%);">+ int modem = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (ifm->interface) { // the USB interface indicates for which modem we want to emulate the SIM</span><br><span style="color: hsl(120, 100%, 40%);">+ case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+ modem = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 1:</span><br><span style="color: hsl(120, 100%, 40%);">+ modem = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "unknown GPIO for SIMtrace interface %d\n", ifm->interface);</span><br><span style="color: hsl(120, 100%, 40%);">+ goto close_exit;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ //</span><br><span style="color: hsl(120, 100%, 40%);">+ char gpio_path[PATH_MAX];</span><br><span style="color: hsl(120, 100%, 40%);">+ snprintf(gpio_path, sizeof(gpio_path), "/dev/gpio/connect_st_usim%d/value", modem);</span><br><span style="color: hsl(120, 100%, 40%);">+ int connec_st_usim = open(gpio_path, O_WRONLY);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (-1 == connec_st_usim) {</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "can't open GPIO %s to switch modem %d to emulated USIM\n", gpio_path, modem);</span><br><span style="color: hsl(120, 100%, 40%);">+ goto close_exit;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (1 != write(connec_st_usim, "1", 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "can't write GPIO %s to switch modem %d to emulated USIM\n", gpio_path, modem);</span><br><span style="color: hsl(120, 100%, 40%);">+ goto close_exit;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("switched modem %d to emulated USIM\n", modem);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ snprintf(gpio_path, sizeof(gpio_path), "/dev/gpio/mdm%d_rst/value", modem);</span><br><span style="color: hsl(120, 100%, 40%);">+ int mdm_rst = open(gpio_path, O_WRONLY);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (-1 == mdm_rst) {</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "can't open GPIO %s to reset modem %d\n", gpio_path, modem);</span><br><span style="color: hsl(120, 100%, 40%);">+ goto close_exit;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (1 != write(mdm_rst, "1", 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "can't write GPIO %s to reset modem %d\n", gpio_path, modem);</span><br><span style="color: hsl(120, 100%, 40%);">+ goto close_exit;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ sleep(1); // wait a bit to ensure reset is effective</span><br><span style="color: hsl(120, 100%, 40%);">+ if (1 != write(mdm_rst, "0", 1)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ fprintf(stderr, "can't write GPIO %s to reset modem %d\n", gpio_path, modem);</span><br><span style="color: hsl(120, 100%, 40%);">+ goto close_exit;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("modem %d reset\n", modem);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* request firmware to generate STATUS on IRQ endpoint */</span><br><span style="color: hsl(120, 100%, 40%);">+ cardem_request_config(ci, CEMU_FEAT_F_STATUS_IRQ);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* simulate card-insert to modem (owhw, not qmod) */</span><br><span style="color: hsl(120, 100%, 40%);">+ cardem_request_card_insert(ci, true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* select remote (forwarded) SIM */</span><br><span style="color: hsl(120, 100%, 40%);">+ st_modem_sim_select_remote(ci->slot);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* set the ATR */</span><br><span style="color: hsl(120, 100%, 40%);">+ //atr_update_csum(real_atr, sizeof(real_atr));</span><br><span style="color: hsl(120, 100%, 40%);">+ cardem_request_set_atr(ci, cfg->atr.data, cfg->atr.len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* select remote (forwarded) SIM */</span><br><span style="color: hsl(120, 100%, 40%);">+ st_modem_reset_pulse(ci->slot, 300);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Entering main loop\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ allocate_and_submit_irq(ci);</span><br><span style="color: hsl(120, 100%, 40%);">+ allocate_and_submit_in(ci);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_select_main(false);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ libusb_release_interface(transp->usb_devh, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+close_exit:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (transp->usb_devh)</span><br><span style="color: hsl(120, 100%, 40%);">+ libusb_close(transp-> usb_devh);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span> struct rspro_server_conn *srvc, *bankdc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct st_transport *transp = ci->slot->transp;</span><br><span> struct client_config *cfg;</span><br><span> int rc;</span><br><span> int ret = 1;</span><br><span>@@ -1082,116 +1192,12 @@</span><br><span> </span><br><span> // connect to SIMtrace2 cardem</span><br><span> do {</span><br><span style="color: hsl(0, 100%, 40%);">- struct usb_interface_match _ifm, *ifm = &_ifm;</span><br><span style="color: hsl(0, 100%, 40%);">- ifm->vendor = cfg->usb.vendor_id;</span><br><span style="color: hsl(0, 100%, 40%);">- ifm->product = cfg->usb.product_id;</span><br><span style="color: hsl(0, 100%, 40%);">- ifm->configuration = cfg->usb.config_id;</span><br><span style="color: hsl(0, 100%, 40%);">- ifm->interface = cfg->usb.if_num;</span><br><span style="color: hsl(0, 100%, 40%);">- ifm->altsetting = cfg->usb.altsetting;</span><br><span style="color: hsl(0, 100%, 40%);">- ifm->addr = cfg->usb.addr;</span><br><span style="color: hsl(0, 100%, 40%);">- if (cfg->usb.path)</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_strlcpy(ifm->path, cfg->usb.path, sizeof(ifm->path));</span><br><span style="color: hsl(0, 100%, 40%);">- transp->usb_devh = osmo_libusb_open_claim_interface(NULL, NULL, ifm);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!transp->usb_devh) {</span><br><span style="color: hsl(0, 100%, 40%);">- fprintf(stderr, "can't open USB device\n");</span><br><span style="color: hsl(0, 100%, 40%);">- goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = libusb_claim_interface(transp->usb_devh, cfg->usb.if_num);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- fprintf(stderr, "can't claim interface %d; rc=%d\n", cfg->usb.if_num, rc);</span><br><span style="color: hsl(0, 100%, 40%);">- goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = osmo_libusb_get_ep_addrs(transp->usb_devh, cfg->usb.if_num, &transp->usb_ep.out,</span><br><span style="color: hsl(0, 100%, 40%);">- &transp->usb_ep.in, &transp->usb_ep.irq_in);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- fprintf(stderr, "can't obtain EP addrs; rc=%d\n", rc);</span><br><span style="color: hsl(0, 100%, 40%);">- goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- // switch modem SIM port to emulated SIM on OWHW</span><br><span style="color: hsl(0, 100%, 40%);">- if (USB_VENDOR_OPENMOKO == ifm->vendor && USB_PRODUCT_OWHW_SAM3 == ifm->product) { // we are on the OWHW</span><br><span style="color: hsl(0, 100%, 40%);">- int modem = -1;</span><br><span style="color: hsl(0, 100%, 40%);">- switch (ifm->interface) { // the USB interface indicates for which modem we want to emulate the SIM</span><br><span style="color: hsl(0, 100%, 40%);">- case 0:</span><br><span style="color: hsl(0, 100%, 40%);">- modem = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 1:</span><br><span style="color: hsl(0, 100%, 40%);">- modem = 2;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- fprintf(stderr, "unknown GPIO for SIMtrace interface %d\n", ifm->interface);</span><br><span style="color: hsl(0, 100%, 40%);">- goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- //</span><br><span style="color: hsl(0, 100%, 40%);">- char gpio_path[PATH_MAX];</span><br><span style="color: hsl(0, 100%, 40%);">- snprintf(gpio_path, sizeof(gpio_path), "/dev/gpio/connect_st_usim%d/value", modem);</span><br><span style="color: hsl(0, 100%, 40%);">- int connec_st_usim = open(gpio_path, O_WRONLY);</span><br><span style="color: hsl(0, 100%, 40%);">- if (-1 == connec_st_usim) {</span><br><span style="color: hsl(0, 100%, 40%);">- fprintf(stderr, "can't open GPIO %s to switch modem %d to emulated USIM\n", gpio_path, modem);</span><br><span style="color: hsl(0, 100%, 40%);">- goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (1 != write(connec_st_usim, "1", 1)) {</span><br><span style="color: hsl(0, 100%, 40%);">- fprintf(stderr, "can't write GPIO %s to switch modem %d to emulated USIM\n", gpio_path, modem);</span><br><span style="color: hsl(0, 100%, 40%);">- goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- printf("switched modem %d to emulated USIM\n", modem);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- snprintf(gpio_path, sizeof(gpio_path), "/dev/gpio/mdm%d_rst/value", modem);</span><br><span style="color: hsl(0, 100%, 40%);">- int mdm_rst = open(gpio_path, O_WRONLY);</span><br><span style="color: hsl(0, 100%, 40%);">- if (-1 == mdm_rst) {</span><br><span style="color: hsl(0, 100%, 40%);">- fprintf(stderr, "can't open GPIO %s to reset modem %d\n", gpio_path, modem);</span><br><span style="color: hsl(0, 100%, 40%);">- goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (1 != write(mdm_rst, "1", 1)) {</span><br><span style="color: hsl(0, 100%, 40%);">- fprintf(stderr, "can't write GPIO %s to reset modem %d\n", gpio_path, modem);</span><br><span style="color: hsl(0, 100%, 40%);">- goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- sleep(1); // wait a bit to ensure reset is effective</span><br><span style="color: hsl(0, 100%, 40%);">- if (1 != write(mdm_rst, "0", 1)) {</span><br><span style="color: hsl(0, 100%, 40%);">- fprintf(stderr, "can't write GPIO %s to reset modem %d\n", gpio_path, modem);</span><br><span style="color: hsl(0, 100%, 40%);">- goto close_exit;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- printf("modem %d reset\n", modem);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* request firmware to generate STATUS on IRQ endpoint */</span><br><span style="color: hsl(0, 100%, 40%);">- cardem_request_config(ci, CEMU_FEAT_F_STATUS_IRQ);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* simulate card-insert to modem (owhw, not qmod) */</span><br><span style="color: hsl(0, 100%, 40%);">- cardem_request_card_insert(ci, true);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* select remote (forwarded) SIM */</span><br><span style="color: hsl(0, 100%, 40%);">- st_modem_sim_select_remote(ci->slot);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* set the ATR */</span><br><span style="color: hsl(0, 100%, 40%);">- //atr_update_csum(real_atr, sizeof(real_atr));</span><br><span style="color: hsl(0, 100%, 40%);">- cardem_request_set_atr(ci, cfg->atr.data, cfg->atr.len);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* select remote (forwarded) SIM */</span><br><span style="color: hsl(0, 100%, 40%);">- st_modem_reset_pulse(ci->slot, 300);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("Entering main loop\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- allocate_and_submit_irq(ci);</span><br><span style="color: hsl(0, 100%, 40%);">- allocate_and_submit_in(ci);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- while (1) {</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_select_main(false);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- ret = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- libusb_release_interface(transp->usb_devh, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-close_exit:</span><br><span style="color: hsl(0, 100%, 40%);">- if (transp->usb_devh)</span><br><span style="color: hsl(0, 100%, 40%);">- libusb_close(transp->usb_devh);</span><br><span style="color: hsl(0, 100%, 40%);">- if (cfg->keep_running)</span><br><span style="color: hsl(0, 100%, 40%);">- sleep(1);</span><br><span style="color: hsl(120, 100%, 40%);">+ main_body(cfg);</span><br><span style="color: hsl(120, 100%, 40%);">+ sleep(1);</span><br><span> } while (cfg->keep_running);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- libusb_exit(NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+close_exit:</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_libusb_exit(NULL);</span><br><span> do_exit:</span><br><span> return ret;</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-remsim/+/16622">change 16622</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-remsim/+/16622"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-remsim </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I85c166e8aa95bb3f2e5d60d14f60caa94f3116fb </div>
<div style="display:none"> Gerrit-Change-Number: 16622 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>