<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/21113">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ccid/7816 fsm: better pps error handling<br><br>Change-Id: Id138a600dbe2dd1b8d153b764f73d65e2fd444dd<br>---<br>M ccid_common/ccid_slot_fsm.c<br>M ccid_common/iso7816_fsm.c<br>M ccid_common/iso7816_fsm.h<br>3 files changed, 13 insertions(+), 36 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ccid-firmware refs/changes/13/21113/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/ccid_common/ccid_slot_fsm.c b/ccid_common/ccid_slot_fsm.c</span><br><span>index 5fc74e0..a8c4e54 100644</span><br><span>--- a/ccid_common/ccid_slot_fsm.c</span><br><span>+++ b/ccid_common/ccid_slot_fsm.c</span><br><span>@@ -265,19 +265,12 @@</span><br><span> cs->event = 0;</span><br><span> break;</span><br><span> case ISO7816_E_PPS_UNSUPPORTED_IND:</span><br><span style="color: hsl(0, 100%, 40%);">- tpdu = data;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* perform deactivation */</span><br><span style="color: hsl(0, 100%, 40%);">- card_uart_ctrl(ss->cuart, CUART_CTL_RST, true);</span><br><span style="color: hsl(0, 100%, 40%);">- card_uart_ctrl(ss->cuart, CUART_CTL_POWER_5V0, false);</span><br><span style="color: hsl(0, 100%, 40%);">- cs->icc_powered = false;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* failed comand */</span><br><span style="color: hsl(0, 100%, 40%);">- resp = ccid_gen_parameters_t0(cs, ss->seq, CCID_CMD_STATUS_FAILED, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- ccid_slot_send_unbusy(cs, resp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- cs->event = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* unsupported means no response, failed means request/response mismatch</span><br><span style="color: hsl(120, 100%, 40%);">+ * yet both lead to a deactivation, and the host always gets a fi/di error</span><br><span style="color: hsl(120, 100%, 40%);">+ * 10 "FI - DI pair invalid or not supported" since that part of the</span><br><span style="color: hsl(120, 100%, 40%);">+ * ccid setparameters is handled by the pps exchange</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* fall-through */</span><br><span> case ISO7816_E_PPS_FAILED_IND:</span><br><span> tpdu = data;</span><br><span> </span><br><span>@@ -389,7 +382,7 @@</span><br><span> LOGPCS(cs, LOGL_DEBUG, "scheduling PPS transfer, PPS1: %2x\n", PPS1);</span><br><span> </span><br><span> /* pass PPS1 instead of msgb */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_XCEIVE_PPS_CMD, PPS1);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(ss->fi, ISO7816_E_XCEIVE_PPS_CMD, (void*)PPS1);</span><br><span> /* continues in iso_fsm_clot_user_cb once response/error/timeout is received */</span><br><span> return 0;</span><br><span> }</span><br><span>diff --git a/ccid_common/iso7816_fsm.c b/ccid_common/iso7816_fsm.c</span><br><span>index 66250d5..e819e64 100644</span><br><span>--- a/ccid_common/iso7816_fsm.c</span><br><span>+++ b/ccid_common/iso7816_fsm.c</span><br><span>@@ -311,17 +311,6 @@</span><br><span> break;</span><br><span> case ISO7816_E_POWER_UP_IND:</span><br><span> break;</span><br><span style="color: hsl(0, 100%, 40%);">- case ISO7816_E_PPS_UNSUPPORTED_IND:</span><br><span style="color: hsl(0, 100%, 40%);">- case ISO7816_E_PPS_FAILED_IND:</span><br><span style="color: hsl(0, 100%, 40%);">- msg = data;</span><br><span style="color: hsl(0, 100%, 40%);">- /* notify user about PPS result */</span><br><span style="color: hsl(0, 100%, 40%);">- ip->user_cb(fi, event, 0, msg);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case ISO7816_E_TPDU_FAILED_IND:</span><br><span style="color: hsl(0, 100%, 40%);">- msg = data;</span><br><span style="color: hsl(0, 100%, 40%);">- /* hand finished TPDU to user */</span><br><span style="color: hsl(0, 100%, 40%);">- ip->user_cb(fi, event, 0, msg);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span> default:</span><br><span> OSMO_ASSERT(0);</span><br><span> }</span><br><span>@@ -441,7 +430,7 @@</span><br><span> ip->user_cb(fi, ISO7816_E_ATR_ERR_IND, 0, atp->atr);</span><br><span> </span><br><span> if(fi->state == ISO7816_S_WAIT_PPS_RSP || fi->state == ISO7816_S_IN_PPS_RSP)</span><br><span style="color: hsl(0, 100%, 40%);">- ip->user_cb(fi, ISO7816_E_PPS_FAILED_IND, 0, ppp->tx_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ ip->user_cb(fi, ISO7816_E_PPS_UNSUPPORTED_IND, 0, ppp->tx_cmd);</span><br><span> </span><br><span> if(fi->state == ISO7816_S_WAIT_TPDU || fi->state == ISO7816_S_IN_TPDU)</span><br><span> ip->user_cb(fi, ISO7816_E_TPDU_FAILED_IND, 0, tpdup->tpdu);</span><br><span>@@ -462,7 +451,7 @@</span><br><span> break;</span><br><span> }</span><br><span> if(fi->state == ISO7816_S_WAIT_PPS_RSP || fi->state == ISO7816_S_IN_PPS_RSP)</span><br><span style="color: hsl(0, 100%, 40%);">- ip->user_cb(fi, ISO7816_E_PPS_FAILED_IND, 0, ppp->tx_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ ip->user_cb(fi, ISO7816_E_PPS_UNSUPPORTED_IND, 0, ppp->tx_cmd);</span><br><span> </span><br><span> if(fi->state == ISO7816_S_WAIT_TPDU || fi->state == ISO7816_S_IN_TPDU)</span><br><span> ip->user_cb(fi, ISO7816_E_TPDU_FAILED_IND, 0, tpdup->tpdu);</span><br><span>@@ -516,7 +505,6 @@</span><br><span> /* notify user about PPS result */</span><br><span> ip->user_cb(fi, event, 0, ppsrsp);</span><br><span> break;</span><br><span style="color: hsl(0, 100%, 40%);">- case ISO7816_E_PPS_UNSUPPORTED_IND:</span><br><span> case ISO7816_E_PPS_FAILED_IND:</span><br><span> case ISO7816_E_RX_ERR_IND:</span><br><span> /* error cases lead to slot reset */</span><br><span>@@ -533,10 +521,7 @@</span><br><span> [ISO7816_S_RESET] = {</span><br><span> .name = "RESET",</span><br><span> .in_event_mask = S(ISO7816_E_RESET_REL_IND) |</span><br><span style="color: hsl(0, 100%, 40%);">- S(ISO7816_E_POWER_UP_IND) |</span><br><span style="color: hsl(0, 100%, 40%);">- S(ISO7816_E_PPS_FAILED_IND)|</span><br><span style="color: hsl(0, 100%, 40%);">- S(ISO7816_E_PPS_UNSUPPORTED_IND)|</span><br><span style="color: hsl(0, 100%, 40%);">- S(ISO7816_E_TPDU_FAILED_IND),</span><br><span style="color: hsl(120, 100%, 40%);">+ S(ISO7816_E_POWER_UP_IND),</span><br><span> .out_state_mask = S(ISO7816_S_WAIT_ATR) |</span><br><span> S(ISO7816_S_RESET),</span><br><span> .action = iso7816_3_reset_action,</span><br><span>@@ -600,8 +585,7 @@</span><br><span> S(ISO7816_E_RX_COMPL) |</span><br><span> S(ISO7816_E_RX_ERR_IND) |</span><br><span> S(ISO7816_E_PPS_DONE_IND) |</span><br><span style="color: hsl(0, 100%, 40%);">- S(ISO7816_E_PPS_FAILED_IND) |</span><br><span style="color: hsl(0, 100%, 40%);">- S(ISO7816_E_PPS_UNSUPPORTED_IND),</span><br><span style="color: hsl(120, 100%, 40%);">+ S(ISO7816_E_PPS_FAILED_IND),</span><br><span> .out_state_mask = S(ISO7816_S_RESET) |</span><br><span> S(ISO7816_S_WAIT_TPDU) |</span><br><span> S(ISO7816_S_IN_PPS_RSP),</span><br><span>diff --git a/ccid_common/iso7816_fsm.h b/ccid_common/iso7816_fsm.h</span><br><span>index fcba87b..fb37396 100644</span><br><span>--- a/ccid_common/iso7816_fsm.h</span><br><span>+++ b/ccid_common/iso7816_fsm.h</span><br><span>@@ -41,8 +41,8 @@</span><br><span> /* TODO: PPS request */</span><br><span> ISO7816_E_XCEIVE_PPS_CMD,</span><br><span> ISO7816_E_PPS_DONE_IND,</span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_E_PPS_FAILED_IND,</span><br><span style="color: hsl(0, 100%, 40%);">- ISO7816_E_PPS_UNSUPPORTED_IND,</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_E_PPS_FAILED_IND, /*!< card disagrees with parameters, but responds */</span><br><span style="color: hsl(120, 100%, 40%);">+ ISO7816_E_PPS_UNSUPPORTED_IND, /*!< card does not respond to PPS */</span><br><span> /* TODO: Clock stop request */</span><br><span> /* TODO: Rx FIFO overrun */</span><br><span> /* TODO: Rx buffer overrun */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/21113">change 21113</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-ccid-firmware/+/21113"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-ccid-firmware </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Id138a600dbe2dd1b8d153b764f73d65e2fd444dd </div>
<div style="display:none"> Gerrit-Change-Number: 21113 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>