version 1.69, 2016/12/15 09:28:04 |
version 1.69.2.1, 2017/04/21 16:53:39 |
|
|
MCLAIM(m, &sc->sc_ethercom.ec_rx_mowner); |
MCLAIM(m, &sc->sc_ethercom.ec_rx_mowner); |
|
|
m_set_rcvif(m, ifp); |
m_set_rcvif(m, ifp); |
req->rxreq_va = (vaddr_t)pool_cache_get_paddr( |
if (rx->status <= MHLEN) { |
if_xennetrxbuf_cache, PR_NOWAIT, &req->rxreq_pa); |
/* small packet; copy to mbuf data area */ |
if (__predict_false(req->rxreq_va == 0)) { |
m_copyback(m, 0, rx->status, pktp); |
printf("%s: rx no buf\n", ifp->if_xname); |
KASSERT(m->m_pkthdr.len == rx->status); |
ifp->if_ierrors++; |
KASSERT(m->m_len == rx->status); |
req->rxreq_va = va; |
} else { |
req->rxreq_pa = pa; |
/* large packet; attach buffer to mbuf */ |
xennet_rx_free_req(req); |
req->rxreq_va = (vaddr_t)pool_cache_get_paddr( |
m_freem(m); |
if_xennetrxbuf_cache, PR_NOWAIT, &req->rxreq_pa); |
continue; |
if (__predict_false(req->rxreq_va == 0)) { |
|
printf("%s: rx no buf\n", ifp->if_xname); |
|
ifp->if_ierrors++; |
|
req->rxreq_va = va; |
|
req->rxreq_pa = pa; |
|
xennet_rx_free_req(req); |
|
m_freem(m); |
|
continue; |
|
} |
|
m->m_len = m->m_pkthdr.len = rx->status; |
|
MEXTADD(m, pktp, rx->status, |
|
M_DEVBUF, xennet_rx_mbuf_free, NULL); |
|
m->m_ext.ext_paddr = pa; |
|
m->m_flags |= M_EXT_RW; /* we own the buffer */ |
} |
} |
m->m_len = m->m_pkthdr.len = rx->status; |
|
MEXTADD(m, pktp, rx->status, |
|
M_DEVBUF, xennet_rx_mbuf_free, NULL); |
|
m->m_flags |= M_EXT_RW; /* we own the buffer */ |
|
m->m_ext.ext_paddr = pa; |
|
if ((rx->flags & NETRXF_csum_blank) != 0) { |
if ((rx->flags & NETRXF_csum_blank) != 0) { |
xennet_checksum_fill(&m); |
xennet_checksum_fill(&m); |
if (m == NULL) { |
if (m == NULL) { |
ifp->if_ierrors++; |
ifp->if_ierrors++; |
|
xennet_rx_free_req(req); |
continue; |
continue; |
} |
} |
} |
} |