- n_read = svm_fifo_segments (rx_fifo, (svm_fifo_seg_t *) ds, n_segments,
- max_bytes);
+ n_read = svm_fifo_segments (rx_fifo, s->rx_bytes_pending,
+ (svm_fifo_seg_t *) ds, n_segments, max_bytes);
+ if (n_read < 0)
+ return VPPCOM_EAGAIN;
+
+ if (svm_fifo_max_dequeue_cons (rx_fifo) == n_read)
+ {
+ svm_fifo_unset_event (s->rx_fifo);
+ if (svm_fifo_max_dequeue_cons (rx_fifo) != n_read
+ && svm_fifo_set_event (s->rx_fifo)
+ && VCL_SESS_ATTR_TEST (s->attr, VCL_SESS_ATTR_NONBLOCK))
+ {
+ session_event_t *e;
+ vec_add2 (wrk->unhandled_evts_vector, e, 1);
+ e->event_type = SESSION_IO_EVT_RX;
+ e->session_index = s->session_index;
+ }
+ }
+
+ s->rx_bytes_pending += n_read;