MCPcopy Create free account
hub / github.com/F-Stack/f-stack / iflib_rxd_pkt_get

Function iflib_rxd_pkt_get

freebsd/net/iflib.c:2772–2812  ·  view source on GitHub ↗

* Process one software descriptor */

Source from the content-addressed store, hash-verified

2770 * Process one software descriptor
2771 */
2772static struct mbuf *
2773iflib_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)
2815static void

Callers 1

iflib_rxeofFunction · 0.85

Calls 4

rxd_frag_to_sdFunction · 0.85
assemble_segmentsFunction · 0.85
m_initFunction · 0.50
memcpyFunction · 0.50

Tested by

no test coverage detected