* Process one software descriptor */
| 2770 | * Process one software descriptor |
| 2771 | */ |
| 2772 | static struct mbuf * |
| 2773 | iflib_rxd_pkt_get(iflib_rxq_t rxq, if_rxd_info_t ri) |
| 2774 | { |
| 2775 | struct if_rxsd sd; |
| 2776 | struct mbuf *m; |
| 2777 | int pf_rv; |
| 2778 | |
| 2779 | /* should I merge this back in now that the two paths are basically duplicated? */ |
| 2780 | if (ri->iri_nfrags == 1 && |
| 2781 | ri->iri_frags[0].irf_len != 0 && |
| 2782 | ri->iri_frags[0].irf_len <= MIN(IFLIB_RX_COPY_THRESH, MHLEN)) { |
| 2783 | m = rxd_frag_to_sd(rxq, &ri->iri_frags[0], false, &sd, |
| 2784 | &pf_rv, ri); |
| 2785 | if (pf_rv != PFIL_PASS && pf_rv != PFIL_REALLOCED) |
| 2786 | return (m); |
| 2787 | if (pf_rv == PFIL_PASS) { |
| 2788 | m_init(m, M_NOWAIT, MT_DATA, M_PKTHDR); |
| 2789 | #ifndef __NO_STRICT_ALIGNMENT |
| 2790 | if (!IP_ALIGNED(m)) |
| 2791 | m->m_data += 2; |
| 2792 | #endif |
| 2793 | memcpy(m->m_data, *sd.ifsd_cl, ri->iri_len); |
| 2794 | m->m_len = ri->iri_frags[0].irf_len; |
| 2795 | } |
| 2796 | } else { |
| 2797 | m = assemble_segments(rxq, ri, &sd, &pf_rv); |
| 2798 | if (m == NULL) |
| 2799 | return (NULL); |
| 2800 | if (pf_rv != PFIL_PASS && pf_rv != PFIL_REALLOCED) |
| 2801 | return (m); |
| 2802 | } |
| 2803 | m->m_pkthdr.len = ri->iri_len; |
| 2804 | m->m_pkthdr.rcvif = ri->iri_ifp; |
| 2805 | m->m_flags |= ri->iri_flags; |
| 2806 | m->m_pkthdr.ether_vtag = ri->iri_vtag; |
| 2807 | m->m_pkthdr.flowid = ri->iri_flowid; |
| 2808 | M_HASHTYPE_SET(m, ri->iri_rsstype); |
| 2809 | m->m_pkthdr.csum_flags = ri->iri_csum_flags; |
| 2810 | m->m_pkthdr.csum_data = ri->iri_csum_data; |
| 2811 | return (m); |
| 2812 | } |
| 2813 | |
| 2814 | #if defined(INET6) || defined(INET) |
| 2815 | static void |
no test coverage detected