Commit Graph

1062 Commits

Author SHA1 Message Date
Harald Welte
716fe6cefa firmware/sniffer: Group global variables in structs
This is a purely cosmetic change that groups PPS, TPDU and ATR related
global variables into structs.  The structs get g_ prefixes to indicate
a global variable.  This avoids confusion between very short/generic
variable names that might clash with local variables.

Change-Id: I3e02f6c6b063ebc860b7a2a54dfc6051f1ea584f
2022-11-19 09:02:23 +00:00
Harald Welte
432c7b5058 firmware/sniffer: Make all global variables 'static'
None of those variables are used outside sniffer.c, so they can all be
static.

Change-Id: I8946acb6189d5ade57214295f0ba87f0608bad92
2022-11-19 09:02:23 +00:00
Harald Welte
db1e37b93b firmware/sniffer: Fix programming error in PPS
process_byte_pps() would never enter the error path in which the
first byte would be != 0xff.  However, the caller already verified
this before calling process_byte_pps() so the error path should
never be hit anyway.

Change-Id: Ia74b6338219a6965e6bd35a6efcf369890e02d81
2022-11-19 09:02:23 +00:00
Harald Welte
cc295f6945 firmware/sniffer: Avoid extra call for rbuf_is_full
rbuf_write() will tell us in the return value if the buffer was full
(error) or not (success).  Let's use that return value rather than a
theoretically race-y call to rbuf_is_full() before.

It's theoretical as the write happens from IRQ context and the read from
normal process context, so the fill-level cannot really change while
we're in the USART interrupt.  So it doesn't fix a bug, just improves
coding style and also avoids an extra function call + irq-disable/re-enable.

Change-Id: Icf570d0aa48d67a19e63c6e2b6caa14438fe88e3
2022-11-19 09:02:23 +00:00
Harald Welte
4836f23fa3 firmware/sniffer: Log old and new state in ISO7816-3 state changes
Change-Id: Iddb460cc2ad02c11a74de10dab127bb14cee9605
2022-11-19 09:02:23 +00:00
Harald Welte
c343995b2d firmware/sniffer: refactor setting TPDU state
In low-level debugging it might be useful to trace the TPDU state
changes, so let's factor-out the state-setting as a function that
can be amended with printf() or GPIO toggles or the like.

No logical change is introduced here, just assignments replaced with
calling a function that does the assignment. compiler should inline
that.

Change-Id: Ie61321404f3686234c61c68a07d6cb9f5830ddc1
2022-11-19 09:02:23 +00:00
Harald Welte
0190e45305 firmware/sniffer: Log parity errors, just like overruns and framing errors
Reading of code + datasheet showed that we did enable parity checking
but never actually checked if the USART has the PARE bit in CSR set.

Let's change that.  Plus also avoid possible race conditions due to
multiple status resets via US_CR_RSTSTA.  Let's only reset that once
per interrupt handler.

TODO: actually do something useful at that point.  We currently don't
report those to the host, nor do we attempt to recover in any way.  The
data sheet also doesn't tell us what it actually does in such
situations; it appears the character is *not* returned from the USART,
so we're missing one byte in the stream at that point.

Change-Id: I5f012d86c61a2377d355396e7b95d078952bee7c
Related: OS#5464
2022-11-19 09:02:23 +00:00
Eric Wild
cfab7c00ce conrtrib/upload : upload elf files
Due to popular demand people want elf files that can be loaded to get
debug symbols, so publish the elf file, but not the stub-less bin file.

This elf file can ONLY be used to look up symbols, it should NOT be
"load"ed into flash, because the preceding crc stub has to match. Mixing
older crc stubs that are still in flash and newer elf files means the
device will end up in DFU mode upon reset.

Change-Id: Ifceb16d385388356ac1bf8b13f5df62c643bebf8
2022-11-16 10:48:29 +00:00
Harald Welte
5523faf61f firmware/sniffer: Fix copy+paste when logging invalid INS bytes
Change-Id: I2679415f1853d4b4a33fca33791fb0bfc6908a1b
2022-11-15 21:19:26 +01:00
James Tavares
5f651e510f Fix missing generation of waiting-time-extension in some situations
In the function set_tpdu_state(), there is a missing transition to
WAIT_TX state. This is fine if you are coming from the WAIT_PB state,
which has already restarted the waiting timer via
card_emu_uart_update_wt(), but if you are coming from the WAIT_RX
state, then card_emu_uart_update_wt() is never called and the USART
timer is never restarted.  (Because the transmitter is left enabled in
WAIT_RX, the response is still sent to the modem; it is just the
half-wait timeouts that are missing).

Change-Id: Ib4eb964c073192e8f067004625af818ba2caf003
2022-11-14 19:57:41 +00:00
James Tavares
6eb5e8b602 main: rotor: erase immediately after send
- improves trace diagnostic output by moving cursor back over the
the rotor before a diagnostic message has a chance to be printed.
there is still a race condition, but it is much better.

Change-Id: Iad7767f2a5dbbd67b0f33b9bfc2c3864ce308990
2022-11-13 22:07:48 -05:00
Harald Welte
2b175c9545 cosmetic: Fix compile-time #error message string typo
Change-Id: Ibf304751f8debe8567bed1614e62b60cf33ec092
2022-11-11 22:32:13 +01:00
Oliver Smith
139d517bc1 contrib/jenkins.sh: set USE_CLANG=1
As the bootloader goes beyond partition size in modern gcc, use clang
instead.

Depends: docker-playground Ib82a53fa7edc62d21e772efbb9b2c049d1b50c4d
Related: OS#5260
Change-Id: I2aa2e20e75e334560dbe1f6db9fd1491873ff91f
2022-10-13 13:03:20 +02:00
Harald Welte
a5d537973d cardem: reset the uC in case of USB disconnect
This fixes the firmware USB interface somehow getting stuck
after a USB disconnect/reconnect without power cycle.

Right now there are a number of things we only execute the first time we
reach USBD_STATE_CONFIGURED, but not at any subsequent such event.

It's also rather clear that this doesn't really show in simtrace2 as it
is bus-powered. And it doesn't show on OWHW as we don't have any USB
unplug situations of the USB between the on-board traces of USB host and
SAM3S.  So this really only is relevant to QMOD.

A cheap and dirty work-around is to simply reset the entire uC every
time a USB unplug happens.

Change-Id: I6678bb2192c1419ed388b46c4ae7aa1ce18dc7ee
Related: OS#5578
2022-07-25 20:00:54 +02:00
Vadim Yanitskiy
fdfb02418f host/cardem: fix integer overflow in process_do_rx_da()
osmo_apdu_segment_in() may return a negative number on receipt of
"unknown APDU case", and that would crash simtrace2-cardem-pcsc:

  msgb(0x55d2cf7aa8a0): Not enough tailroom msgb_put
    (allocated 920, head at 0, len 7, tailroom 1017 < want tailroom 65534)
  backtrace() returned 19 addresses

Whenever osmo_apdu_segment_in() fails to recognize an APDU, the
communication is broken, because we don't know if we should continue
transmitting or receiving.  Only a successful return value by would
allow us to know this.  Do not crash, exit() gracefully.

Change-Id: I9e97b955a28ec886a429d744f9316e7e71be4481
Related: OS#5600
2022-07-11 16:30:47 +07:00
Harald Welte
e4503232eb update git URLs (git -> https; gitea)
Change-Id: Ifcc942c265edc983214e4efc0bc93ee8bd1b55f4
2022-06-17 21:06:45 +00:00
Harald Welte
9088ca86ff simtrace2-cardem-pcsc.c: Send APDUs via GSMTAP
Previously, only simtrace2-sniff generated GSMTAP protocol traces.

Let's add the same functionality to simtrace2-cardem-pcsc.

Change-Id: Iba6adf41b480d127bf11ee361c66d80fe8296313
Closes: OS#5494
2022-04-05 17:29:20 +00:00
James Tavares
ff434e4f12 firmware: bugfix: disable cardemu comms in local SIM mode
This change prevents contention on the ISO7816 bus by disabling the card emulation state machine when the SIM switch is in the local mode. Without this change, the card emulation firmware can clobber ISO7816 communications and cause contention with certain (but not all) SIM cards.

Changes:
- Add 'enabled' flag to cardemu instance that is set/cleared by usb_command_sim_select() (the only place where sim switch occurs).
- Flag is initialized as false (disabled) by default, to match local SIM mode default.
- When card emulation is disabled, force SIM VCC to be "OFF",  SIM RESET as "not in RESET", and drop bytes bytes received on the ISO7816 interface (but do service buffers).

Change-Id: I4010f988712eac4a6af8568ccd60062f9de62449
2022-03-11 18:36:06 +00:00
Alexander Couzens
2ceba0fdc4 firmware: usb: call USBD_HAL_DISCONNECT while usb init to recover from resets
The firmware doesn't recover from a OSMO_ASSERT() which direct reset the board.
After the reset the firmware will waits forever for the USBD state USBD_STATE_CONFIGURED.
By adding the explicit USBD_HAL_DISCONNECT the board always recovers.

Fixes: OS#5478
Related: SYS#5752
Change-Id: I600a26025166d20b6b27c191f24e4023efdaadf6
2022-03-09 07:21:01 +00:00
Harald Welte
755387ee31 Reduce bInterval of interrupt endpoints to avoid interrupt misses
Particularly the VCC/RST/CLK changes can happen quite frequent, and
we were seeing quite a number of overflows of the usb_buf queue for EP06
(interrupt endpoint) in cardem.

I first tried increasing the maximum queue size to up to 10, but that
still didn't resolve those EP06 overflow error log messages.

Reducing the bInterval from 16 to 1 made them go away in all my
tests.

Change-Id: I5c272c31983de7201cfbd445c4484f6832d878ab
2022-03-03 19:06:09 +01:00
Harald Welte
c3f366b55e contrib/simtrace.lua: Add Flag bits + Data to COL_INFO
this provides an esy way to understand more without looking at the
detailed decode for each packet.

Change-Id: I0aa3d68172022907fbe8371aaca6538df0649dfe
2022-03-03 18:04:45 +00:00
Harald Welte
b01dc91c0b simtrace2-cardem-pcsc: continue in case of LIBUSB_TRANSFER_ERROR
Sometimes I get LIBUSB_TRANSFER_ERROR particularly when the USB bus
is very busy.  We shouldn't terminate the program, but simply resubmit
it.  That's what we have multiple transfers for...

Change-Id: I77d7bc636c21171fcff7e70e87c0109cbaee9b51
2022-03-03 17:48:14 +01:00
Harald Welte
5cc3add0b0 simtrace2-cardem-pcsc: Fix copy+paste error in log message
Change-Id: I98e4356900a22f69d0ff262cb112194b1e11d4af
2022-03-03 17:48:14 +01:00
Harald Welte
ca62121c19 host: Don't pass -1 (converted to 255) as address
We initialize a local variable to -1, and if the user specifies
no address from the command line, we use this in the interface match
struct, which uses a uint8_t.  This means 255 ends up in there, and
as a result no usb interface ever matches unless the user explicitly
specifies the -A command line argument.

With this patch any absent -A argument will result in ifm.addr == 0,
which means "don't match on address", and which is what we want here.

Change-Id: Iffb5fa406ddef00c7c15570ffca2c109b98d7a2d
2022-03-03 17:48:14 +01:00
Harald Welte
8b52b44f1b simtrace2-cardem-pcsc: Detect card power-up without RESET
In some readers (at least CardMan 3121), the simtrace2-cardem firmware
claims there are power-up sequences where RESET is released before VCC
becomes active.  Let's detect such spec-incompliant power-up sequences
and use them to trigger a cold reset of the card.

Change-Id: I682ac3d0c2b98749a6ed44f9a73e4b39354a4284
Closes: OS#5421
2022-03-03 15:27:35 +01:00
Harald Welte
71ac54d7bf simtrace2-cardem-pcsc: Move all logging into libosmocore
* drop log statements that are already in libosmo-simtrace2
* don't printf directly, but go via LOGCI
* make LOGCI use libosmocore logging
* configure libosmocore logging in a 'convenient' way

Change-Id: I6fa0da966e6d8e723c187404c17e90cfb3f3dd9f
2022-03-03 15:27:34 +01:00
Harald Welte
ab5b2ffe1d simtrace2-cardem-pcsc: rename 'flags' to 'status_flags'
there are other flags in the simtrace/cardem protocol...

Change-Id: I6362936c642e7abf4c501b4526a1654a25afedfe
2022-03-03 15:27:15 +01:00
Harald Welte
ee9ddb8da1 host: Always initialize libosmocore logging before using it
This avoids related ASSERTs or error messages in case any of the
libosmocore / libosmousb API functions internally tries to log
something.

Change-Id: I611c435516856c5c8928d7810fd9a9b831adc199
2022-03-03 15:27:13 +01:00
Harald Welte
039680a8d4 cardem: set more reasonable interrupt priorities
the ISO7816 UARTs have highest priority, while console has lowest.

remaining sources (USB, ADC, GPIO) are in between.

Change-Id: Ie6c97d61d8da3990b6e44144f36cb6d37d194307
2022-02-21 23:24:20 +01:00
Harald Welte
8680677256 card_emu_uart_interrupt: ASSERT if we get called with wrong uart_chan
This is what we do in all other functions, not sure why this one
wants to silently ignore any such programming errors.

Change-Id: I022eee86a5a3b5077abe59897161578ed960f1b1
2022-02-14 10:18:45 +00:00
Harald Welte
20bc014b82 cardem: Report the VCC voltage (if supported)
The SIMtrace2 protocol alwasy contained a field for the VCC voltage,
the cardem firmware just never populated that field, even on those
boards that use the ADC to determine its voltage.

Change-Id: Idcecad553fb36380e916378e1420488acbbfa8e3
2022-02-14 10:18:39 +00:00
Eric Wild
3a6f1adc2e lua dissector: adjust usage instructions
...as originally described in the first commit that added the file.

Change-Id: I67918f0f62b1619786324ae84276a46d7c64eee5
2022-02-02 11:48:05 +01:00
Harald Welte
70e60aa1de contrib/simtrace.lua: Register for "decode as..."
This allows to manually decode traces that don't contain the vid/pid information

Change-Id: Idd605f63f01f005f07a4c329847d08331bfdc9e8
2022-01-26 16:10:27 +01:00
Harald Welte
4775a94959 contrib/simtrace.lua: Dissect some more cardem related message types
Change-Id: I1892c1e154130d8048e99fd1d8f8809f00366e80
2022-01-26 16:10:27 +01:00
Harald Welte
d3b9d95b34 contrib/simtrace.lua: Don't print SIMTRACE_MSGT_ in every COL_INFO
this is redundant.  We care about *which* message type, and not about
wasting horizontal screen real-estate.

Change-Id: I98f90561b39401f1c2339f79a3cb40574bb03b2d
2022-01-26 16:10:27 +01:00
Harald Welte
408889d8b2 contrib/simtrace.lua: print length + slot-number in decimal only
Change-Id: Ia9a969b88170c49f8bb1cb0cda6918d6a894d3ba
2022-01-26 15:06:06 +00:00
Harald Welte
7b160b5ed7 contrib/simtrace.lua: Add header with author/description/usage
Change-Id: I56574741cd77436f9f452420677c00d8049a50cc
2022-01-26 15:06:02 +00:00
Harald Welte
15a3ef25a2 cosmetic: contrib/simtrace.lua: more consistent formatting
Change-Id: If842dd95c7244ebe33579ed104247c66682ed4d4
2022-01-26 15:05:17 +00:00
Harald Welte
5820eacf57 contrib/simtrace.lua: Add VID/PID of all currentl simtrace2 devices
Change-Id: Ie425f8dbd3a02c6bdcdaeaafaf0d5b4fb351ec4d
2022-01-26 15:04:52 +00:00
Harald Welte
94cc319b8e host: properly zero-initialize interface match structures
This can lead to some fields not properly zero-initialized, fooling
our matching code into the application having requested certain
fields to match ('0' is usually assumed to be unspecified).

Change-Id: I304d55b584e37d9dccb75b24057bb682f799beb2
2022-01-25 16:40:27 +01:00
Harald Welte
7a450041bf cosmetic: Fix indent of printf() statement
Change-Id: I9f5c9f7720b3bc3c8d5df9750b031d8bcf2dd435
2022-01-25 16:39:46 +01:00
Harald Welte
3f0d92f282 host: Print strerror(errno) in case of problems opening the USB device
Change-Id: If446bf08655739281f616df952714751fe9a3b18
2022-01-25 16:09:55 +01:00
James Tavares
ea9a91f5ce gitignore: add missing entries binaries
Add missing entries for simtrace2-tool, crctool, and host/tests

Change-Id: I23f4b387f220146bccf7d723cc773a72d8e17a65
2022-01-11 17:09:38 +00:00
James Tavares
91a93bc5de firmware: add definition for main osc bypass when using external osc
Add new board.h definition BOARD_MAINOSC_BYPASS to configure the clock module to use an external oscillator rather than a crystal. The qmod board is one such board.
Change-Id: If62f55cd4c8b0cf758534f09d25a9bcb028814a7
2022-01-11 13:10:34 +00:00
James Tavares
aeaf12853e simtrace2-tool: add "modem sim-card (insert|remove)" command
Add a new command to request that the simtrace2 firmware manipulate the
card detect signal, causing the downstream cellular modem to believe
that the SIM card has been inserted or removed, respectfully.

Change-Id: I8c79eb29379a789d9d0d21495e30d66ddbdfb022
2022-01-10 18:06:45 -05:00
Eric Wild
7fde63b7c6 wireshark lua dissector: dissect more
Change-Id: If81812b6330205a65c1c9b7d4240094b71f3c757
2021-12-15 14:10:19 +00:00
Eric Wild
cb655f9774 firmware: add crc stub to all dfu apps to ensure reliable loading
DFU flashing of apps sometimes aborts, and although rare this leads to
broken devices if no boot button or serial/jtag access exists, because
the bootloader will keep trying to start a half-flashed app that then
crashes at some point.

The easiest fix that works with existing bootloaders is to prepend a
small 512 byte stub that calculcates the crc and compares it with the
crc calculated at build time, and then either starts the actual app, or
sets the dfu flag and resets. This ensures we either have a working,
running app, or end up in the bootloader, ready to flash again.

For obvious reasons this only applies to dfu apps, and not to flash
targets like the actual bootloader itself.

Change-Id: Id6df0486c8b779889d21800dc2441b3aa9af8a5f
2021-12-15 14:04:20 +00:00
Oliver Smith
f721e69bc1 treewide: remove FSF address
Remove the paragraph about writing to the Free Software Foundation's
mailing address. The FSF has changed addresses in the past, and may do
so again. In 2021 this is not useful, let's rather have a bit less
boilerplate at the start of source files.

Change-Id: Ie0a3b2273383adbb3303faffd6ff96be7f4cae99
2021-12-14 11:47:21 +01:00
Oliver Smith
8dada9b454 host/contrib/simtrace2.spec.in: update
Apply various improvements from Martin Hauke, thanks!

* Put sover into a variable
* Sync BuildRequires with configure.ac
* Update libosmo-simtrace2 summary
* Use %make_build instead of make %{?_smp_mflags}

Change-Id: I35ce3865702f72365b38b0eaa8b28f332dabcd1f
2021-12-10 14:50:18 +01:00
Oliver Smith
afd23660b3 Bump version: 0.8.0.1-8281 → 0.8.1
Change-Id: I6bcc798db9f4ab2b91711daebeba98abebd55e92
0.8.1
2021-12-10 10:04:28 +01:00