- devc->buflen += len;
-
- /* Now look for packets in that data. */
- offset = 0;
- while ((devc->buflen - offset) >= dmm->packet_size) {
- if (dmm->packet_valid(devc->buf + offset)) {
- handle_packet(devc->buf + offset, sdi, info);
- offset += dmm->packet_size;
-
- /* Request next packet, if required. */
- if (!dmm->packet_request)
+ devc->buflen += ret;
+
+ /*
+ * Process packets when their reception has completed, or keep
+ * trying to synchronize to the stream of input data.
+ */
+ check_pos = 0;
+ while (check_pos < devc->buflen) {
+ /* Got the (minimum) amount of receive data for a packet? */
+ check_len = devc->buflen - check_pos;
+ if (check_len < dmm->packet_size)
+ break;
+ sr_dbg("Checking: pos %zu, len %zu.", check_pos, check_len);
+
+ /* Is it a valid packet? */
+ check_ptr = &devc->buf[check_pos];
+ if (dmm->packet_valid_len) {
+ ret = dmm->packet_valid_len(dmm->dmm_state,
+ check_ptr, check_len, &pkt_size);
+ if (ret == SR_PACKET_NEED_RX) {
+ sr_dbg("Need more RX data.");