<p>Hoernchen has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/19468">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">handle card ejection during poweron/wait for ATR<br><br>Change-Id: Ied51af8f37ddad32e3d1464134c22ee4929c5f4e<br>---<br>M ccid_common/iso7816_fsm.c<br>1 file changed, 26 insertions(+), 12 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/68/19468/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 c76d97d..d5220fc 100644</span><br><span>--- a/ccid_common/iso7816_fsm.c</span><br><span>+++ b/ccid_common/iso7816_fsm.c</span><br><span>@@ -128,6 +128,17 @@</span><br><span>       0xf0, 0x70, 0xb0, 0x30, 0xd0, 0x50, 0x90, 0x10, 0xe0, 0x60, 0xa0, 0x20, 0xc0, 0x40, 0x80, 0x00,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct atr_fsm_priv {</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t hist_len;       /*!< store the number of expected historical bytes */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t y;              /*!< last mask of the upcoming TA, TB, TC, TD interface bytes */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t i;              /*!< interface byte subgroup number */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct msgb *atr;       /*!< ATR data */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t computed_checksum;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint16_t protocol_support;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct atr_fsm_priv *get_atr_fsm_priv(struct osmo_fsm_inst *fi);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /***********************************************************************</span><br><span>  * ISO7816-3 Main FSM</span><br><span>  ***********************************************************************/</span><br><span>@@ -376,11 +387,15 @@</span><br><span> static void iso7816_3_allstate_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span>    OSMO_ASSERT(fi->fsm == &iso7816_3_fsm);</span><br><span style="color: hsl(120, 100%, 40%);">+        struct iso7816_3_priv *ip = get_iso7816_3_priv(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct atr_fsm_priv *atp = get_atr_fsm_priv(ip->atr_fi);</span><br><span> </span><br><span>      switch (event) {</span><br><span>     case ISO7816_E_HW_ERR_IND:</span><br><span>   case ISO7816_E_CARD_REMOVAL:</span><br><span>                 /* FIXME: power off? */</span><br><span style="color: hsl(120, 100%, 40%);">+               if(fi->state == ISO7816_S_WAIT_ATR || fi->state == ISO7816_S_IN_ATR)</span><br><span style="color: hsl(120, 100%, 40%);">+                    ip->user_cb(fi, ISO7816_E_ATR_ERR_IND, 0, atp->atr);</span><br><span>           osmo_fsm_inst_state_chg(fi, ISO7816_S_RESET, 0, 0);</span><br><span>          break;</span><br><span>       case ISO7816_E_POWER_DN_IND:</span><br><span>@@ -541,14 +556,13 @@</span><br><span>  * ATR FSM</span><br><span>  ***********************************************************************/</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct atr_fsm_priv {</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t hist_len;       /*!< store the number of expected historical bytes */</span><br><span style="color: hsl(0, 100%, 40%);">-        uint8_t y;              /*!< last mask of the upcoming TA, TB, TC, TD interface bytes */</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t i;              /*!< interface byte subgroup number */</span><br><span style="color: hsl(0, 100%, 40%);">-       struct msgb *atr;       /*!< ATR data */</span><br><span style="color: hsl(0, 100%, 40%);">-     uint8_t computed_checksum;</span><br><span style="color: hsl(0, 100%, 40%);">-      uint16_t protocol_support;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+/* type-safe method to obtain atr_fsm_priv from fi */</span><br><span style="color: hsl(120, 100%, 40%);">+static struct atr_fsm_priv *get_atr_fsm_priv(struct osmo_fsm_inst *fi)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(fi->fsm == &atr_fsm);</span><br><span style="color: hsl(120, 100%, 40%);">+      return (struct atr_fsm_priv *) fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /* obtain the [software] guard time in milli-seconds from the atr fsm_inst */</span><br><span> static uint32_t atr_fi_gt_ms(struct osmo_fsm_inst *fi)</span><br><span>@@ -579,7 +593,7 @@</span><br><span> /* append a single byte to the ATR */</span><br><span> static int atr_append_byte(struct osmo_fsm_inst *fi, uint8_t byte)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct atr_fsm_priv *atp = fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct atr_fsm_priv *atp = get_atr_fsm_priv(fi);</span><br><span> </span><br><span>         if (!msgb_tailroom(atp->atr)) {</span><br><span>           LOGPFSML(fi, LOGL_ERROR, "ATR overflow !?!");</span><br><span>@@ -592,7 +606,7 @@</span><br><span> </span><br><span> static void atr_wait_ts_onenter(struct osmo_fsm_inst *fi, uint32_t old_state)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct atr_fsm_priv *atp = fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct atr_fsm_priv *atp = get_atr_fsm_priv(fi);</span><br><span> </span><br><span>         /* reset state to its initial value */</span><br><span>       atp->hist_len = 0;</span><br><span>@@ -608,7 +622,7 @@</span><br><span> </span><br><span> static void atr_wait_ts_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct atr_fsm_priv *atp = fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct atr_fsm_priv *atp = get_atr_fsm_priv(fi);</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>@@ -654,7 +668,7 @@</span><br><span> </span><br><span> static void atr_wait_tX_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    struct atr_fsm_priv *atp = fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct atr_fsm_priv *atp = get_atr_fsm_priv(fi);</span><br><span>     uint32_t guard_time_ms = atr_fi_gt_ms(fi);</span><br><span>   uint8_t byte;</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ccid-firmware/+/19468">change 19468</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/+/19468"/><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: Ied51af8f37ddad32e3d1464134c22ee4929c5f4e </div>
<div style="display:none"> Gerrit-Change-Number: 19468 </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>