<p>Kévin Redon has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9879">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">sniffer: also send incomplete (e.g. timeout) data (PPS/ATR/TPDU)<br><br>Change-Id: Ib070aca181042b477f1ffec48d63dc56c1e4609a<br>---<br>M firmware/libcommon/source/sniffer.c<br>1 file changed, 39 insertions(+), 24 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/simtrace2 refs/changes/79/9879/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/firmware/libcommon/source/sniffer.c b/firmware/libcommon/source/sniffer.c</span><br><span>index 441df7d..c14a176 100644</span><br><span>--- a/firmware/libcommon/source/sniffer.c</span><br><span>+++ b/firmware/libcommon/source/sniffer.c</span><br><span>@@ -91,6 +91,7 @@</span><br><span>       PPS_S_WAIT_PPS2, /*!< second parameter byte */</span><br><span>    PPS_S_WAIT_PPS3, /*!< third parameter byte */</span><br><span>     PPS_S_WAIT_PCK, /*!< check byte */</span><br><span style="color: hsl(120, 100%, 40%);">+ PPS_S_WAIT_END, /*!< all done */</span><br><span> };</span><br><span> </span><br><span> /*! Transport Protocol Data Unit (TPDU) sub-states of ISO7816_S_IN_TPDU</span><br><span>@@ -232,9 +233,10 @@</span><br><span> }</span><br><span> </span><br><span> /*! Send current ATR over USB</span><br><span style="color: hsl(0, 100%, 40%);">- *  @note Also print the ATR over serial</span><br><span style="color: hsl(120, 100%, 40%);">+ *  @param[in] complete if the ATR is complete</span><br><span style="color: hsl(120, 100%, 40%);">+ *  @note Also print the ATR to debug console</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static void usb_send_atr(void)</span><br><span style="color: hsl(120, 100%, 40%);">+static void usb_send_atr(bool complete)</span><br><span> {</span><br><span>  /* Check state */</span><br><span>    if (ISO7816_S_IN_ATR!=iso_state) {</span><br><span>@@ -250,7 +252,7 @@</span><br><span>     led_blink(LED_GREEN, BLINK_2O_F);</span><br><span> </span><br><span>        /* Print ATR */</span><br><span style="color: hsl(0, 100%, 40%);">- printf("ATR: ");</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("ATR%s: ", complete ? "" : " (incomplete)");</span><br><span>    for (uint8_t i=0; i<atr_i; i++) {</span><br><span>                 printf("%02x ", atr[i]);</span><br><span>   }</span><br><span>@@ -270,7 +272,7 @@</span><br><span>      usb_msg->l2h = usb_msg->l1h + sizeof(*usb_msg_header);</span><br><span>         struct sniff_data *usb_sniff_data_atr;</span><br><span>       usb_sniff_data_atr = (struct sniff_data *) msgb_put(usb_msg, sizeof(*usb_sniff_data_atr));</span><br><span style="color: hsl(0, 100%, 40%);">-      usb_sniff_data_atr->complete = true;</span><br><span style="color: hsl(120, 100%, 40%);">+       usb_sniff_data_atr->complete = complete;</span><br><span>  usb_sniff_data_atr->length = atr_i;</span><br><span>       uint8_t *data = msgb_put(usb_msg, usb_sniff_data_atr->length);</span><br><span>    memcpy(data, atr, atr_i);</span><br><span>@@ -359,7 +361,7 @@</span><br><span>              }</span><br><span>    case ATR_S_WAIT_TCK:  /* see ISO/IEC 7816-3:2006 section 8.2.5 */</span><br><span>            /* we could verify the checksum, but we are just here to sniff */</span><br><span style="color: hsl(0, 100%, 40%);">-               usb_send_atr(); /* send ATR to host software using USB */</span><br><span style="color: hsl(120, 100%, 40%);">+             usb_send_atr(true); /* send ATR to host software using USB */</span><br><span>                change_state(ISO7816_S_WAIT_TPDU); /* go to next state */</span><br><span>            break;</span><br><span>       default:</span><br><span>@@ -368,9 +370,10 @@</span><br><span> }</span><br><span> </span><br><span> /*! Send current PPS over USB</span><br><span style="color: hsl(0, 100%, 40%);">- *  @note Also print the PPS over serial</span><br><span style="color: hsl(120, 100%, 40%);">+ *  @param[in] complete if the PPS is complete</span><br><span style="color: hsl(120, 100%, 40%);">+ *  @note Also print the PPS over the debug console</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static void usb_send_pps(void)</span><br><span style="color: hsl(120, 100%, 40%);">+static void usb_send_pps(bool complete)</span><br><span> {</span><br><span>    uint8_t *pps_cur; /* current PPS (request or response) */</span><br><span> </span><br><span>@@ -387,24 +390,30 @@</span><br><span>        /* Get only relevant data */</span><br><span>         uint8_t pps[6];</span><br><span>      uint8_t pps_i = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-      pps[pps_i++] = pps_cur[0];</span><br><span style="color: hsl(0, 100%, 40%);">-      pps[pps_i++] = pps_cur[1];</span><br><span style="color: hsl(0, 100%, 40%);">-      if (pps_cur[1]&0x10) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (pps_state>PPS_S_WAIT_PPSS) {</span><br><span style="color: hsl(120, 100%, 40%);">+           pps[pps_i++] = pps_cur[0];</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (pps_state>PPS_S_WAIT_PPS0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           pps[pps_i++] = pps_cur[1];</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (pps_state>PPS_S_WAIT_PPS1 && pps_cur[1]&0x10) {</span><br><span>           pps[pps_i++] = pps_cur[2];</span><br><span>   }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (pps_cur[1]&0x20) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (pps_state>PPS_S_WAIT_PPS2 && pps_cur[1]&0x20) {</span><br><span>           pps[pps_i++] = pps_cur[3];</span><br><span>   }</span><br><span style="color: hsl(0, 100%, 40%);">-       if (pps_cur[1]&0x40) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (pps_state>PPS_S_WAIT_PPS3 && pps_cur[1]&0x40) {</span><br><span>           pps[pps_i++] = pps_cur[4];</span><br><span>   }</span><br><span style="color: hsl(0, 100%, 40%);">-       pps[pps_i++] = pps_cur[5];</span><br><span style="color: hsl(120, 100%, 40%);">+    if (pps_state>PPS_S_WAIT_PCK) {</span><br><span style="color: hsl(120, 100%, 40%);">+            pps[pps_i++] = pps_cur[5];</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span>    </span><br><span>     /* Show activity on LED */</span><br><span>   led_blink(LED_GREEN, BLINK_2O_F);</span><br><span> </span><br><span>        /* Print PPS */</span><br><span style="color: hsl(0, 100%, 40%);">- printf("PPS: ");</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("PPS%s: ", complete ? "" : " (incomplete)");</span><br><span>    for (uint8_t i=0; i<pps_i; i++) {</span><br><span>                 printf("%02x ", pps[i]);</span><br><span>   }</span><br><span>@@ -424,7 +433,7 @@</span><br><span>      usb_msg->l2h = usb_msg->l1h + sizeof(*usb_msg_header);</span><br><span>         struct sniff_data *usb_sniff_data_pps;</span><br><span>       usb_sniff_data_pps = (struct sniff_data *) msgb_put(usb_msg, sizeof(*usb_sniff_data_pps));</span><br><span style="color: hsl(0, 100%, 40%);">-      usb_sniff_data_pps->complete = true;</span><br><span style="color: hsl(120, 100%, 40%);">+       usb_sniff_data_pps->complete = complete;</span><br><span>  usb_sniff_data_pps->length = pps_i;</span><br><span>       uint8_t *data = msgb_put(usb_msg, usb_sniff_data_pps->length);</span><br><span>    memcpy(data, pps, pps_i);</span><br><span>@@ -519,7 +528,8 @@</span><br><span>                      check ^= pps_cur[4];</span><br><span>                 }</span><br><span>            check ^= pps_cur[5];</span><br><span style="color: hsl(0, 100%, 40%);">-            usb_send_pps(); /* send PPS to host software using USB */</span><br><span style="color: hsl(120, 100%, 40%);">+             pps_state = PPS_S_WAIT_END;</span><br><span style="color: hsl(120, 100%, 40%);">+           usb_send_pps(true); /* send PPS to host software using USB */</span><br><span>                if (ISO7816_S_IN_PPS_REQ==iso_state) {</span><br><span>                       if (0==check) { /* checksum is valid */</span><br><span>                              change_state(ISO7816_S_WAIT_PPS_RSP); /* go to next state */</span><br><span>@@ -545,15 +555,20 @@</span><br><span>                         change_state(ISO7816_S_WAIT_TPDU); /* go to next state */</span><br><span>            }</span><br><span>            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case PPS_S_WAIT_END:</span><br><span style="color: hsl(120, 100%, 40%);">+          TRACE_WARNING("Unexpected PPS received %u\n\r", pps_state);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                TRACE_INFO("Unknown PPS state %u\n\r", pps_state);</span><br><span style="color: hsl(120, 100%, 40%);">+          TRACE_WARNING("Unknown PPS state %u\n\r", pps_state);</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span>       }</span><br><span> }</span><br><span> </span><br><span> /*! Send current TPDU over USB</span><br><span style="color: hsl(0, 100%, 40%);">- *  @note Also print the TPDU over serial</span><br><span style="color: hsl(120, 100%, 40%);">+ *  @param[in] complete if the TPDU is complete</span><br><span style="color: hsl(120, 100%, 40%);">+ *  @note Also print the TPDU over the debug console</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static void usb_send_tpdu(void)</span><br><span style="color: hsl(120, 100%, 40%);">+static void usb_send_tpdu(bool complete)</span><br><span> {</span><br><span>    /* Check state */</span><br><span>    if (ISO7816_S_IN_TPDU!=iso_state) {</span><br><span>@@ -565,8 +580,8 @@</span><br><span>    led_blink(LED_GREEN, BLINK_2O_F);</span><br><span> </span><br><span>        /* Print TPDU */</span><br><span style="color: hsl(0, 100%, 40%);">-        printf("TPDU: ");</span><br><span style="color: hsl(0, 100%, 40%);">-     for (uint8_t i=0; i<tpdu_packet_i && i<ARRAY_SIZE(tpdu_packet); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("TPDU%s: ", complete ? "" : " (incomplete)");</span><br><span style="color: hsl(120, 100%, 40%);">+    for (uint16_t i=0; i<tpdu_packet_i && i<ARRAY_SIZE(tpdu_packet); i++) {</span><br><span>                printf("%02x ", tpdu_packet[i]);</span><br><span>   }</span><br><span>    printf("\n\r");</span><br><span>@@ -581,11 +596,11 @@</span><br><span>    usb_msg_header = (struct simtrace_msg_hdr *) usb_msg->l1h;</span><br><span>        memset(usb_msg_header, 0, sizeof(*usb_msg_header));</span><br><span>  usb_msg_header->msg_class = SIMTRACE_MSGC_SNIFF;</span><br><span style="color: hsl(0, 100%, 40%);">-     usb_msg_header->msg_type = SIMTRACE_MSGT_SNIFF_ATR;</span><br><span style="color: hsl(120, 100%, 40%);">+        usb_msg_header->msg_type = SIMTRACE_MSGT_SNIFF_TPDU;</span><br><span>      usb_msg->l2h = usb_msg->l1h + sizeof(*usb_msg_header);</span><br><span>         struct sniff_data *usb_sniff_data_tpdu;</span><br><span>      usb_sniff_data_tpdu = (struct sniff_data *) msgb_put(usb_msg, sizeof(*usb_sniff_data_tpdu));</span><br><span style="color: hsl(0, 100%, 40%);">-    usb_sniff_data_tpdu->complete = true;</span><br><span style="color: hsl(120, 100%, 40%);">+      usb_sniff_data_tpdu->complete = complete;</span><br><span>         usb_sniff_data_tpdu->length = tpdu_packet_i;</span><br><span>      uint8_t *data = msgb_put(usb_msg, usb_sniff_data_tpdu->length);</span><br><span>   memcpy(data, tpdu_packet, tpdu_packet_i);</span><br><span>@@ -656,7 +671,7 @@</span><br><span>              break;</span><br><span>       case TPDU_S_SW2:</span><br><span>             tpdu_packet[tpdu_packet_i++] = byte;</span><br><span style="color: hsl(0, 100%, 40%);">-            usb_send_tpdu(); /* send TPDU to host software using USB */</span><br><span style="color: hsl(120, 100%, 40%);">+           usb_send_tpdu(true); /* send TPDU to host software using USB */</span><br><span>              change_state(ISO7816_S_WAIT_TPDU); /* this is the end of the TPDU */</span><br><span>                 break;</span><br><span>       case TPDU_S_DATA_SINGLE:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9879">change 9879</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/9879"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: simtrace2 </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ib070aca181042b477f1ffec48d63dc56c1e4609a </div>
<div style="display:none"> Gerrit-Change-Number: 9879 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Kévin Redon <kredon@sysmocom.de> </div>