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