int odp_eth_rx_burst(pktio_entry_t *pktio_entry, odp_packet_t *rx_pkts, unsigned int nb_pkts) { int nb_rx; struct odp_eth_dev *dev; uint8_t port_id = pktio_entry->s.pkt_odp.portid; uint16_t queue_id = pktio_entry->s.pkt_odp.queueid; dev = &odp_eth_devices[port_id]; if (pktio_cls_enabled(pktio_entry, queue_id)) { odp_packet_t tmpbuf[64]; odp_packet_t onepkt; odp_packet_hdr_t *pkt_hdr; odp_pktio_t id; int i, j; if (nb_pkts > 64) nb_pkts = 64; nb_rx = (*dev->rx_pkt_burst)(dev->data->rx_queues[queue_id], (void **)tmpbuf, nb_pkts); if (odp_unlikely(nb_rx <= 0)) return nb_rx; id = pktio_entry->s.handle; for (i = 0, j = 0; i < nb_rx; i++) { onepkt = tmpbuf[i]; pkt_hdr = odp_packet_hdr(onepkt); pkt_hdr->input = id; packet_parse_reset(pkt_hdr); packet_parse_l2(pkt_hdr); if (0 > _odp_packet_classifier(pktio_entry, queue_id, onepkt)) { rx_pkts[j++] = onepkt; } } nb_rx = j; } else { nb_rx = (*dev->rx_pkt_burst)(dev->data->rx_queues[queue_id], (void **)rx_pkts, nb_pkts); } #ifdef ODP_ETHDEV_RXTX_CALLBACKS struct odp_eth_rxtx_callback *cb = dev->post_rx_burst_cbs[queue_id]; if (odp_unlikely(cb)) { do { nb_rx = cb->fn.rx(port_id, queue_id, (void **)rx_pkts, nb_rx, nb_pkts, cb->param); cb = cb->next; } while (cb); } #endif return nb_rx; }
static int loopback_recv(pktio_entry_t *pktio_entry, odp_packet_t pkts[], unsigned len) { int nbr, i, j; odp_buffer_hdr_t *hdr_tbl[QUEUE_MULTI_MAX]; queue_entry_t *qentry; odp_packet_hdr_t *pkt_hdr; odp_packet_t pkt; nbr = 0; qentry = queue_to_qentry(pktio_entry->s.pkt_loop.loopq); nbr = queue_deq_multi(qentry, hdr_tbl, len); if (pktio_cls_enabled(pktio_entry)) { for (i = 0, j = 0; i < nbr; i++) { pkt = _odp_packet_from_buffer(odp_hdr_to_buf (hdr_tbl[i])); pkt_hdr = odp_packet_hdr(pkt); packet_parse_reset(pkt_hdr); packet_parse_l2(pkt_hdr); if (0 > _odp_packet_classifier(pktio_entry, pkt)) pkts[j++] = pkt; } nbr = j; } else { for (i = 0; i < nbr; ++i) { pkts[i] = _odp_packet_from_buffer(odp_hdr_to_buf (hdr_tbl[i])); pkt_hdr = odp_packet_hdr(pkts[i]); packet_parse_reset(pkt_hdr); packet_parse_l2(pkt_hdr); } } return nbr; }