<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/20063">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ccid fsm: handle special 0 == 256 byte value<br><br>Outgoing (=from the card) transfers have a special 0 == 256 byte<br>meaning.<br><br>Change-Id: Ifb960b3e0f221962e977083f7ddea14dd0c8f29b<br>---<br>M ccid_common/iso7816_fsm.c<br>1 file changed, 11 insertions(+), 6 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/63/20063/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/ccid_common/iso7816_fsm.c b/ccid_common/iso7816_fsm.c</span><br><span>index 3e78fc8..6e39142 100644</span><br><span>--- a/ccid_common/iso7816_fsm.c</span><br><span>+++ b/ccid_common/iso7816_fsm.c</span><br><span>@@ -1246,6 +1246,8 @@</span><br><span>     struct osmo_fsm_inst *parent_fi = fi->proc.parent;</span><br><span>        struct iso7816_3_priv *ip = get_iso7816_3_priv(parent_fi);</span><br><span>   uint8_t byte;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 7816-3 10.3.2 special case outgoing transfer 0 means 256 */</span><br><span style="color: hsl(120, 100%, 40%);">+        int special_rx_val = tpduh->p3 == 0 ? 256 : tpduh->p3;</span><br><span> </span><br><span>     switch (event) {</span><br><span>     case ISO7816_E_RX_SINGLE:</span><br><span>@@ -1276,11 +1278,11 @@</span><br><span>                          card_uart_tx(ip->uart, msgb_l2(tfp->tpdu), msgb_l2len(tfp->tpdu), true);</span><br><span>                            osmo_fsm_inst_state_chg(fi, TPDU_S_TX_REMAINING, 0, 0);</span><br><span>                      } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                                card_uart_set_rx_threshold(ip->uart, tpduh->p3);</span><br><span style="color: hsl(0, 100%, 40%);">-                          card_uart_ctrl(ip->uart, CUART_CTL_RX_TIMER_HINT, tpduh->p3);</span><br><span style="color: hsl(120, 100%, 40%);">+                           card_uart_set_rx_threshold(ip->uart, special_rx_val);</span><br><span style="color: hsl(120, 100%, 40%);">+                              card_uart_ctrl(ip->uart, CUART_CTL_RX_TIMER_HINT, special_rx_val);</span><br><span>                                /* if the expected length is only one byte, cuart will issue</span><br><span>                                  * TPDU_S_RX_SINGLE instead of TPDU_S_RX_REMAINING (OS#4741) */</span><br><span style="color: hsl(0, 100%, 40%);">-                         if (tpduh->p3 == 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                                if (special_rx_val == 1)</span><br><span>                                     osmo_fsm_inst_state_chg(fi, TPDU_S_RX_SINGLE, 0, 0);</span><br><span>                                 else</span><br><span>                                         osmo_fsm_inst_state_chg(fi, TPDU_S_RX_REMAINING, 0, 0);</span><br><span>@@ -1357,14 +1359,17 @@</span><br><span>    struct iso7816_3_priv *ip = get_iso7816_3_priv(parent_fi);</span><br><span>   int rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   /* 7816-3 10.3.2 special case outgoing transfer 0 means 256 */</span><br><span style="color: hsl(120, 100%, 40%);">+        int special_rx_val = tpduh->p3 == 0 ? 256 : tpduh->p3;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       switch (event) {</span><br><span>     case ISO7816_E_RX_COMPL:</span><br><span>             /* retrieve pending byte(s) */</span><br><span style="color: hsl(0, 100%, 40%);">-          rc = card_uart_rx(ip->uart, msgb_l2(tfp->tpdu), tpduh->p3);</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = card_uart_rx(ip->uart, msgb_l2(tfp->tpdu), special_rx_val);</span><br><span>               OSMO_ASSERT(rc > 0);</span><br><span>              msgb_put(tfp->tpdu, rc);</span><br><span style="color: hsl(0, 100%, 40%);">-             if (msgb_l2len(tfp->tpdu) != tpduh->p3) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 LOGPFSML(fi, LOGL_ERROR, "expected %u bytes; read %d\n", tpduh->p3,</span><br><span style="color: hsl(120, 100%, 40%);">+              if (msgb_l2len(tfp->tpdu) != special_rx_val) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGPFSML(fi, LOGL_ERROR, "expected %u bytes; read %d\n", special_rx_val,</span><br><span>                            msgb_l2len(tfp->tpdu));</span><br><span>          }</span><br><span>            card_uart_set_rx_threshold(ip->uart, 1);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/20063">change 20063</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/+/20063"/><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: Ifb960b3e0f221962e977083f7ddea14dd0c8f29b </div>
<div style="display:none"> Gerrit-Change-Number: 20063 </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>