<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/9920">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">USB: add flags for sniff data and centralise transfer<br><br>Also fix issue in usb_msg_alloc_hdr and add cosmetic spaces around<br>operations.<br><br>Change-Id: I768a0ad639aa5e648a630af72d01f7b68082b6b6<br>---<br>M firmware/libcommon/include/simtrace_prot.h<br>M firmware/libcommon/source/sniffer.c<br>M host/simtrace2-sniff.c<br>3 files changed, 140 insertions(+), 142 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/firmware/libcommon/include/simtrace_prot.h b/firmware/libcommon/include/simtrace_prot.h</span><br><span>index 1e9d72f..f1f736b 100644</span><br><span>--- a/firmware/libcommon/include/simtrace_prot.h</span><br><span>+++ b/firmware/libcommon/include/simtrace_prot.h</span><br><span>@@ -294,6 +294,9 @@</span><br><span> #define SNIFF_CHANGE_FLAG_RESET_HOLD (1<<2)</span><br><span> #define SNIFF_CHANGE_FLAG_RESET_RELEASE (1<<3)</span><br><span> #define SNIFF_CHANGE_FLAG_TIMEOUT_WT (1<<4)</span><br><span style="color: hsl(120, 100%, 40%);">+/* SIMTRACE_MSGT_SNIFF_ATR, SIMTRACE_MSGT_SNIFF_PPS, SIMTRACE_MSGT_SNIFF_TPDU flags */</span><br><span style="color: hsl(120, 100%, 40%);">+#define SNIFF_DATA_FLAG_ERROR_INCOMPLETE (1<<5)</span><br><span style="color: hsl(120, 100%, 40%);">+#define SNIFF_DATA_FLAG_ERROR_MALFORMED (1<<6)</span><br><span> </span><br><span> /* SIMTRACE_MSGT_SNIFF_CHANGE */</span><br><span> struct sniff_change {</span><br><span>@@ -309,8 +312,8 @@</span><br><span> </span><br><span> /* SIMTRACE_MSGT_SNIFF_ATR, SIMTRACE_MSGT_SNIFF_PPS, SIMTRACE_MSGT_SNIFF_TPDU */</span><br><span> struct sniff_data {</span><br><span style="color: hsl(0, 100%, 40%);">-     /* if the data is complete (an error might have occurred during transmission */</span><br><span style="color: hsl(0, 100%, 40%);">- bool complete;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* data flags */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t flags;</span><br><span>      /* data length */</span><br><span>    uint16_t length;</span><br><span>     /* data */</span><br><span>diff --git a/firmware/libcommon/source/sniffer.c b/firmware/libcommon/source/sniffer.c</span><br><span>index 81a6712..4ec56d9 100644</span><br><span>--- a/firmware/libcommon/source/sniffer.c</span><br><span>+++ b/firmware/libcommon/source/sniffer.c</span><br><span>@@ -234,8 +234,8 @@</span><br><span>    usb_msg->l1h = msgb_put(usb_msg, sizeof(*usb_msg_header));</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 style="color: hsl(0, 100%, 40%);">-     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_CHANGE;</span><br><span style="color: hsl(120, 100%, 40%);">+     usb_msg_header->msg_class = msg_class;</span><br><span style="color: hsl(120, 100%, 40%);">+     usb_msg_header->msg_type = msg_type;</span><br><span>      usb_msg->l2h = usb_msg->l1h + sizeof(*usb_msg_header);</span><br><span> </span><br><span>     return usb_msg;</span><br><span>@@ -296,11 +296,74 @@</span><br><span>      //TRACE_INFO("Changed to ISO 7816-3 state %u\n\r", iso_state); /* don't print since this is function is also called by ISRs */</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void usb_send_data(enum simtrace_msg_type_sniff type, const uint8_t* data, uint16_t length, uint32_t flags)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Sanity check */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (type != SIMTRACE_MSGT_SNIFF_ATR && type != SIMTRACE_MSGT_SNIFF_PPS && type != SIMTRACE_MSGT_SNIFF_TPDU) {</span><br><span style="color: hsl(120, 100%, 40%);">+         return;</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%);">+   /* Show activity on LED */</span><br><span style="color: hsl(120, 100%, 40%);">+    led_blink(LED_GREEN, BLINK_2O_F);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Send data over USB */</span><br><span style="color: hsl(120, 100%, 40%);">+      struct msgb *usb_msg = usb_msg_alloc_hdr(SIMTRACE_USB_EP_CARD_DATAIN, SIMTRACE_MSGC_SNIFF, type);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!usb_msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+               return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+     struct sniff_data *usb_sniff_data = (struct sniff_data *) msgb_put(usb_msg, sizeof(*usb_sniff_data));</span><br><span style="color: hsl(120, 100%, 40%);">+ usb_sniff_data->flags = flags;</span><br><span style="color: hsl(120, 100%, 40%);">+     usb_sniff_data->length = length;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t *sniff_data = msgb_put(usb_msg, usb_sniff_data->length);</span><br><span style="color: hsl(120, 100%, 40%);">+   memcpy(sniff_data, data, length);</span><br><span style="color: hsl(120, 100%, 40%);">+     usb_msg_upd_len_and_submit(usb_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Print message */</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (type) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case SIMTRACE_MSGT_SNIFF_ATR:</span><br><span style="color: hsl(120, 100%, 40%);">+         printf("ATR");</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SIMTRACE_MSGT_SNIFF_PPS:</span><br><span style="color: hsl(120, 100%, 40%);">+         printf("PPS");</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SIMTRACE_MSGT_SNIFF_TPDU:</span><br><span style="color: hsl(120, 100%, 40%);">+                printf("TPDU");</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              printf("???");</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (flags) {</span><br><span style="color: hsl(120, 100%, 40%);">+          printf(" (");</span><br><span style="color: hsl(120, 100%, 40%);">+               if (flags & SNIFF_DATA_FLAG_ERROR_INCOMPLETE) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   printf("incomplete");</span><br><span style="color: hsl(120, 100%, 40%);">+                       flags &= ~SNIFF_DATA_FLAG_ERROR_INCOMPLETE;</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (flags) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          printf(", ");</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%);">+             if (flags & SNIFF_DATA_FLAG_ERROR_MALFORMED) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    printf("malformed");</span><br><span style="color: hsl(120, 100%, 40%);">+                        flags &= ~SNIFF_DATA_FLAG_ERROR_MALFORMED;</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (flags) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          printf(", ");</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%);">+             printf(")");</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     printf(": ");</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t i;</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < length; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             printf("%02x ", data[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("\n\r");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Send current ATR over USB</span><br><span style="color: hsl(0, 100%, 40%);">- *  @param[in] complete if the ATR is complete</span><br><span style="color: hsl(120, 100%, 40%);">+ *  @param[in] flags SNIFF_DATA_FLAG_ data flags </span><br><span>  *  @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(bool complete)</span><br><span style="color: hsl(120, 100%, 40%);">+static void usb_send_atr(uint32_t flags)</span><br><span> {</span><br><span>       /* Check state */</span><br><span>    if (ISO7816_S_IN_ATR != iso_state) {</span><br><span>@@ -312,28 +375,8 @@</span><br><span>          return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Show activity on LED */</span><br><span style="color: hsl(0, 100%, 40%);">-      led_blink(LED_GREEN, BLINK_2O_F);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Print ATR */</span><br><span style="color: hsl(0, 100%, 40%);">- printf("ATR%s: ", complete ? "" : " (incomplete)");</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t i;</span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0; i < atr_i; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                printf("%02x ", atr[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       printf("\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    /* Send ATR over USB */</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *usb_msg = usb_msg_alloc_hdr(SIMTRACE_USB_EP_CARD_DATAIN, SIMTRACE_MSGC_SNIFF, SIMTRACE_MSGT_SNIFF_ATR);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!usb_msg) {</span><br><span style="color: hsl(0, 100%, 40%);">-         return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-       struct sniff_data *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 = complete;</span><br><span style="color: hsl(0, 100%, 40%);">-     usb_sniff_data_atr->length = atr_i;</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t *data = msgb_put(usb_msg, usb_sniff_data_atr->length);</span><br><span style="color: hsl(0, 100%, 40%);">-       memcpy(data, atr, atr_i);</span><br><span style="color: hsl(0, 100%, 40%);">-       usb_msg_upd_len_and_submit(usb_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+  usb_send_data(SIMTRACE_MSGT_SNIFF_ATR, atr, atr_i, flags);</span><br><span> }</span><br><span> </span><br><span> /*! Process ATR byte</span><br><span>@@ -428,7 +471,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(true); /* send ATR to host software using USB */</span><br><span style="color: hsl(120, 100%, 40%);">+         usb_send_atr(0); /* 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>@@ -437,10 +480,10 @@</span><br><span> }</span><br><span> </span><br><span> /*! Send current PPS over USB</span><br><span style="color: hsl(0, 100%, 40%);">- *  @param[in] complete if the PPS is complete</span><br><span style="color: hsl(120, 100%, 40%);">+ *  @param[in] flags SNIFF_DATA_FLAG_ data flags</span><br><span>  *  @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(bool complete)</span><br><span style="color: hsl(120, 100%, 40%);">+static void usb_send_pps(uint32_t flags)</span><br><span> {</span><br><span>       uint8_t *pps_cur; /* current PPS (request or response) */</span><br><span> </span><br><span>@@ -475,29 +518,9 @@</span><br><span>         if (pps_state > PPS_S_WAIT_PCK) {</span><br><span>                 pps[pps_i++] = pps_cur[5];</span><br><span>   }</span><br><span style="color: hsl(0, 100%, 40%);">-       </span><br><span style="color: hsl(0, 100%, 40%);">-        /* Show activity on LED */</span><br><span style="color: hsl(0, 100%, 40%);">-      led_blink(LED_GREEN, BLINK_2O_F);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Print PPS */</span><br><span style="color: hsl(0, 100%, 40%);">- printf("PPS%s: ", complete ? "" : " (incomplete)");</span><br><span style="color: hsl(0, 100%, 40%);">-       uint8_t i;</span><br><span style="color: hsl(0, 100%, 40%);">-      for (i = 0;  i < pps_i; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-               printf("%02x ", pps[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       printf("\n\r");</span><br><span> </span><br><span>        /* Send message over USB */</span><br><span style="color: hsl(0, 100%, 40%);">-     struct msgb *usb_msg = usb_msg_alloc_hdr(SIMTRACE_USB_EP_CARD_DATAIN, SIMTRACE_MSGC_SNIFF, SIMTRACE_MSGT_SNIFF_PPS);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (!usb_msg) {</span><br><span style="color: hsl(0, 100%, 40%);">-         return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-       struct sniff_data *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 = complete;</span><br><span style="color: hsl(0, 100%, 40%);">-     usb_sniff_data_pps->length = pps_i;</span><br><span style="color: hsl(0, 100%, 40%);">-  uint8_t *data = msgb_put(usb_msg, usb_sniff_data_pps->length);</span><br><span style="color: hsl(0, 100%, 40%);">-       memcpy(data, pps, pps_i);</span><br><span style="color: hsl(0, 100%, 40%);">-       usb_msg_upd_len_and_submit(usb_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+  usb_send_data(SIMTRACE_MSGT_SNIFF_PPS, pps, pps_i, flags);</span><br><span> }</span><br><span> </span><br><span> /*! Send Fi/Di change over USB</span><br><span>@@ -579,7 +602,7 @@</span><br><span>          }</span><br><span>            check ^= pps_cur[5];</span><br><span>                 pps_state = PPS_S_WAIT_END;</span><br><span style="color: hsl(0, 100%, 40%);">-             usb_send_pps(true); /* send PPS to host software using USB */</span><br><span style="color: hsl(120, 100%, 40%);">+         usb_send_pps(0); /* 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>@@ -616,10 +639,10 @@</span><br><span> }</span><br><span> </span><br><span> /*! Send current TPDU over USB</span><br><span style="color: hsl(0, 100%, 40%);">- *  @param[in] complete if the TPDU is complete</span><br><span style="color: hsl(120, 100%, 40%);">+ *  @param[in] flags SNIFF_DATA_FLAG_ data flags</span><br><span>  *  @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(bool complete)</span><br><span style="color: hsl(120, 100%, 40%);">+static void usb_send_tpdu(uint32_t flags)</span><br><span> {</span><br><span>      /* Check state */</span><br><span>    if (ISO7816_S_IN_TPDU != iso_state) {</span><br><span>@@ -627,28 +650,8 @@</span><br><span>                 return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Show activity on LED */</span><br><span style="color: hsl(0, 100%, 40%);">-      led_blink(LED_GREEN, BLINK_2O_F);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Print TPDU */</span><br><span style="color: hsl(0, 100%, 40%);">-        printf("TPDU%s: ", complete ? "" : " (incomplete)");</span><br><span style="color: hsl(0, 100%, 40%);">-      uint16_t i;</span><br><span style="color: hsl(0, 100%, 40%);">-     for (i = 0; i < tpdu_packet_i && i < ARRAY_SIZE(tpdu_packet); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-              printf("%02x ", tpdu_packet[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       printf("\n\r");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    /* Send ATR over USB */</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *usb_msg = usb_msg_alloc_hdr(SIMTRACE_USB_EP_CARD_DATAIN, SIMTRACE_MSGC_SNIFF, SIMTRACE_MSGT_SNIFF_TPDU);</span><br><span style="color: hsl(0, 100%, 40%);">-   if (!usb_msg) {</span><br><span style="color: hsl(0, 100%, 40%);">-         return;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-       struct sniff_data *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 = complete;</span><br><span style="color: hsl(0, 100%, 40%);">-    usb_sniff_data_tpdu->length = tpdu_packet_i;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t *data = msgb_put(usb_msg, usb_sniff_data_tpdu->length);</span><br><span style="color: hsl(0, 100%, 40%);">-      memcpy(data, tpdu_packet, tpdu_packet_i);</span><br><span style="color: hsl(0, 100%, 40%);">-       usb_msg_upd_len_and_submit(usb_msg);</span><br><span style="color: hsl(120, 100%, 40%);">+  usb_send_data(SIMTRACE_MSGT_SNIFF_TPDU, tpdu_packet, tpdu_packet_i, flags);</span><br><span> }</span><br><span> </span><br><span> static void process_byte_tpdu(uint8_t byte)</span><br><span>@@ -722,7 +725,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(true); /* send TPDU to host software using USB */</span><br><span style="color: hsl(120, 100%, 40%);">+               usb_send_tpdu(0); /* 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>@@ -993,16 +996,16 @@</span><br><span>                     /* Use timeout to detect interrupted data transmission */</span><br><span>                    switch (iso_state) {</span><br><span>                         case ISO7816_S_IN_ATR:</span><br><span style="color: hsl(0, 100%, 40%);">-                          usb_send_atr(false); /* send incomplete ATR to host software using USB */</span><br><span style="color: hsl(120, 100%, 40%);">+                             usb_send_atr(SNIFF_DATA_FLAG_ERROR_INCOMPLETE); /* send incomplete ATR to host software using USB */</span><br><span>                                 change_state(ISO7816_S_WAIT_ATR);</span><br><span>                            break;</span><br><span>                       case ISO7816_S_IN_TPDU:</span><br><span style="color: hsl(0, 100%, 40%);">-                         usb_send_tpdu(false); /* send incomplete PPS to host software using USB */</span><br><span style="color: hsl(120, 100%, 40%);">+                            usb_send_tpdu(SNIFF_DATA_FLAG_ERROR_INCOMPLETE); /* send incomplete PPS to host software using USB */</span><br><span>                                change_state(ISO7816_S_WAIT_TPDU);</span><br><span>                           break;</span><br><span>                       case ISO7816_S_IN_PPS_REQ:</span><br><span>                   case ISO7816_S_IN_PPS_RSP:</span><br><span style="color: hsl(0, 100%, 40%);">-                              usb_send_pps(false); /* send incomplete TPDU to host software using USB */</span><br><span style="color: hsl(120, 100%, 40%);">+                            usb_send_pps(SNIFF_DATA_FLAG_ERROR_INCOMPLETE); /* send incomplete TPDU to host software using USB */</span><br><span>                                change_state(ISO7816_S_WAIT_TPDU);</span><br><span>                           break;</span><br><span>                       default:</span><br><span>diff --git a/host/simtrace2-sniff.c b/host/simtrace2-sniff.c</span><br><span>index b61b7d0..eb547b0 100644</span><br><span>--- a/host/simtrace2-sniff.c</span><br><span>+++ b/host/simtrace2-sniff.c</span><br><span>@@ -97,7 +97,7 @@</span><br><span> static int process_change(const uint8_t *buf, int len)</span><br><span> {</span><br><span>     /* check if there is enough data for the structure */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (len<sizeof(struct sniff_change)) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (len < sizeof(struct sniff_change)) {</span><br><span>          return -1;</span><br><span>   }</span><br><span>    struct sniff_change *change = (struct sniff_change *)buf;</span><br><span>@@ -141,73 +141,69 @@</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int process_atr(const uint8_t *buf, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+static int process_data(enum simtrace_msg_type_sniff type, const uint8_t *buf, int len)</span><br><span> {</span><br><span>  /* check if there is enough data for the structure */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (len<sizeof(struct sniff_data)) {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (len < sizeof(struct sniff_data)) {</span><br><span>            return -1;</span><br><span>   }</span><br><span style="color: hsl(0, 100%, 40%);">-       struct sniff_data *atr = (struct sniff_data *)buf;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct sniff_data *data = (struct sniff_data *)buf;</span><br><span> </span><br><span>      /* check if the data is available */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (len<sizeof(struct sniff_data)+atr->length) {</span><br><span style="color: hsl(120, 100%, 40%);">+        if (len < sizeof(struct sniff_data) + data->length) {</span><br><span>          return -2;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   printf("ATR%s: ", atr->complete ? "" : " (incomplete)");</span><br><span style="color: hsl(120, 100%, 40%);">+     /* check type */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (type != SIMTRACE_MSGT_SNIFF_ATR && type != SIMTRACE_MSGT_SNIFF_PPS && type != SIMTRACE_MSGT_SNIFF_TPDU) {</span><br><span style="color: hsl(120, 100%, 40%);">+         return -3;</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%);">+   /* Print message */</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (type) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case SIMTRACE_MSGT_SNIFF_ATR:</span><br><span style="color: hsl(120, 100%, 40%);">+         printf("ATR");</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SIMTRACE_MSGT_SNIFF_PPS:</span><br><span style="color: hsl(120, 100%, 40%);">+         printf("PPS");</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SIMTRACE_MSGT_SNIFF_TPDU:</span><br><span style="color: hsl(120, 100%, 40%);">+                printf("TPDU");</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              printf("???");</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (data->flags) {</span><br><span style="color: hsl(120, 100%, 40%);">+         printf(" (");</span><br><span style="color: hsl(120, 100%, 40%);">+               if (data->flags & SNIFF_DATA_FLAG_ERROR_INCOMPLETE) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  printf("incomplete");</span><br><span style="color: hsl(120, 100%, 40%);">+                       data->flags &= ~SNIFF_DATA_FLAG_ERROR_INCOMPLETE;</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (data->flags) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         printf(", ");</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%);">+             if (data->flags & SNIFF_DATA_FLAG_ERROR_MALFORMED) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   printf("malformed");</span><br><span style="color: hsl(120, 100%, 40%);">+                        data->flags &= ~SNIFF_DATA_FLAG_ERROR_MALFORMED;</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (data->flags) {</span><br><span style="color: hsl(120, 100%, 40%);">+                         printf(", ");</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%);">+             printf(")");</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     printf(": ");</span><br><span>      uint16_t i;</span><br><span style="color: hsl(0, 100%, 40%);">-     for (i = 0; i < atr->length; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-               printf("%02x ", atr->data[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-       printf("\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int process_pps(const uint8_t *buf, int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  /* check if there is enough data for the structure */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (len<sizeof(struct sniff_data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       struct sniff_data *pps = (struct sniff_data *)buf;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* check if the data is available */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (len<sizeof(struct sniff_data)+pps->length) {</span><br><span style="color: hsl(0, 100%, 40%);">-          return -2;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       printf("PPS%s: ", pps->complete ? "" : " (incomplete) ");</span><br><span style="color: hsl(0, 100%, 40%);">-      uint16_t i;</span><br><span style="color: hsl(0, 100%, 40%);">-     for (i = 0; i < pps->length; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-               printf("%02x ", pps->data[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-       printf("\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int process_tpdu(const uint8_t *buf, int len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* check if there is enough data for the structure */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (len<sizeof(struct sniff_data)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-       struct sniff_data *tpdu = (struct sniff_data *)buf;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* check if the data is available */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (len<sizeof(struct sniff_data)+tpdu->length) {</span><br><span style="color: hsl(0, 100%, 40%);">-         return -2;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* print TPDU */</span><br><span style="color: hsl(0, 100%, 40%);">-        printf("TPDU%s: ", tpdu->complete ? "" : " (incomplete)");</span><br><span style="color: hsl(0, 100%, 40%);">-     uint16_t i;</span><br><span style="color: hsl(0, 100%, 40%);">-     for (i = 0; i < tpdu->length; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-              printf("%02x ", tpdu->data[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+  for (i = 0; i < data->length; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+            printf("%02x ", data->data[i]);</span><br><span>         }</span><br><span>    printf("\n");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     /* send TPDU (now considered as APDU) to GSMTAP */</span><br><span style="color: hsl(0, 100%, 40%);">-      gsmtap_send_sim(tpdu->data, tpdu->length);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (SIMTRACE_MSGT_SNIFF_TPDU == type) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /* send TPDU (now considered as APDU) to GSMTAP */</span><br><span style="color: hsl(120, 100%, 40%);">+            gsmtap_send_sim(data->data, data->length);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -215,19 +211,19 @@</span><br><span> static int process_usb_msg(const uint8_t *buf, int len)</span><br><span> {</span><br><span>   /* check if enough data for the header is present */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (len<sizeof(struct simtrace_msg_hdr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (len < sizeof(struct simtrace_msg_hdr)) {</span><br><span>              return 0;</span><br><span>    }</span><br><span> </span><br><span>        /* check if message is complete */</span><br><span>   struct simtrace_msg_hdr *msg_hdr = (struct simtrace_msg_hdr *)buf;</span><br><span style="color: hsl(0, 100%, 40%);">-      if (len<msg_hdr->msg_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+     if (len < msg_hdr->msg_len) {</span><br><span>          return 0;</span><br><span>    }</span><br><span>    //printf("msg: %s\n", osmo_hexdump(buf, msg_hdr->msg_len));</span><br><span> </span><br><span>         /* check for message class */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (SIMTRACE_MSGC_SNIFF!=msg_hdr->msg_class) { /* we only care about sniffing messages */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (SIMTRACE_MSGC_SNIFF != msg_hdr->msg_class) { /* we only care about sniffing messages */</span><br><span>               return msg_hdr->msg_len; /* discard non-sniffing messaged */</span><br><span>      }</span><br><span> </span><br><span>@@ -242,13 +238,9 @@</span><br><span>                 process_fidi(buf, len);</span><br><span>              break;</span><br><span>       case SIMTRACE_MSGT_SNIFF_ATR:</span><br><span style="color: hsl(0, 100%, 40%);">-           process_atr(buf, len);</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span>       case SIMTRACE_MSGT_SNIFF_PPS:</span><br><span style="color: hsl(0, 100%, 40%);">-           process_pps(buf, len);</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span>       case SIMTRACE_MSGT_SNIFF_TPDU:</span><br><span style="color: hsl(0, 100%, 40%);">-          process_tpdu(buf, len);</span><br><span style="color: hsl(120, 100%, 40%);">+               process_data(msg_hdr->msg_type, buf, len);</span><br><span>                break;</span><br><span>       default:</span><br><span>             printf("unknown SIMtrace msg type 0x%02x\n", msg_hdr->msg_type);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9920">change 9920</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/9920"/><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: merged </div>
<div style="display:none"> Gerrit-Change-Id: I768a0ad639aa5e648a630af72d01f7b68082b6b6 </div>
<div style="display:none"> Gerrit-Change-Number: 9920 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: Kévin Redon <kredon@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>