aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2021-04-06 01:27:47 +0200
committerlaforge <laforge@osmocom.org>2021-04-08 21:28:37 +0000
commit7b681981ea5d7771df51f58e2f90f74cdeed70c2 (patch)
tree12337d2436d8521d3f73e1b7ad53d0798357a8a2
parente410842d8ec27252b4429e0484e4a7f6d87dfe7d (diff)
card_emu: Fix computation of waiting time
As we store the waiting time (WT) in 'etu', we must adjust the formula from ISO 7816-3. The 'Fi' component in the formula only exists to compute clock cycles from the etu, which we don't need here. Without this patch, the waiting time would be way too large (by a factor of 372 in the default case). Change-Id: Ia21bc7303f9b38834b5b1753983ed2a99bfc7d95 Related: OS#1704
-rw-r--r--firmware/libcommon/source/card_emu.c7
-rw-r--r--firmware/libcommon/source/mode_cardemu.c1
2 files changed, 5 insertions, 3 deletions
diff --git a/firmware/libcommon/source/card_emu.c b/firmware/libcommon/source/card_emu.c
index cefc957..bcd5fd6 100644
--- a/firmware/libcommon/source/card_emu.c
+++ b/firmware/libcommon/source/card_emu.c
@@ -505,8 +505,11 @@ static int tx_byte_atr(struct card_handle *ch)
}
}
}
- /* update waiting time (see ISO 7816-3 10.2) */
- ch->waiting_time = ch->wi * 960 * iso7816_3_fi_table[ch->F_index];
+ /* update waiting time (see ISO 7816-3 10.2). We can drop the Fi
+ * multiplier as we store the waiting time in units of 'etu', and
+ * don't really care what the number of clock cycles or the absolute
+ * wall clock time is */
+ ch->waiting_time = ch->wi * 960;
/* go to next state */
card_set_state(ch, ISO_S_WAIT_TPDU);
return 0;
diff --git a/firmware/libcommon/source/mode_cardemu.c b/firmware/libcommon/source/mode_cardemu.c
index 14f62a6..127556c 100644
--- a/firmware/libcommon/source/mode_cardemu.c
+++ b/firmware/libcommon/source/mode_cardemu.c
@@ -225,7 +225,6 @@ static uint16_t compute_next_timeout(struct cardem_inst *ci)
want_to_expire = ci->wt.remaining - (ci->wt.total / 2);
} else
want_to_expire = ci->wt.remaining;
- TRACE_INFO("want_to_expire=%u (total=%u, remaining=%u)\r\n", want_to_expire, ci->wt.total, ci->wt.remaining);
/* if value exceeds the USART TO range, use the maximum possible value for one round */
return OSMO_MIN(want_to_expire, 0xffff);
}