<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>