diff --git a/drivers/vmxnet3.cc b/drivers/vmxnet3.cc index a97daf99bd10303e7587cc5b6d07a15fdc499d4a..eab0679a7c9b1d170b4f97269a352f3fff75d1d5 100644 --- a/drivers/vmxnet3.cc +++ b/drivers/vmxnet3.cc @@ -740,7 +740,6 @@ void vmxnet3::txq_gc(vmxnet3_txqueue &txq) void vmxnet3::rxq_eof(vmxnet3_rxqueue &rxq) { auto &rxc = rxq.comp_ring; - struct mbuf *m_head = NULL, *m_tail = NULL; while(1) { auto rxcd = rxc.get_desc(rxc.next); @@ -774,7 +773,7 @@ void vmxnet3::rxq_eof(vmxnet3_rxqueue &rxq) if (rxcd->layout->sop) { assert(rxd->layout->btype == VMXNET3_BTYPE_HEAD); assert((idx % 1) == 0); - assert(m_head == NULL); + assert(rxq.m_currpkt_head == nullptr); if (length == 0) { rxq.discard(rid, idx); @@ -792,30 +791,30 @@ void vmxnet3::rxq_eof(vmxnet3_rxqueue &rxq) m->M_dat.MH.MH_pkthdr.rcvif = _ifn; m->M_dat.MH.MH_pkthdr.csum_flags = 0; m->m_hdr.mh_len = length; - m_head = m_tail = m; + rxq.m_currpkt_head = rxq.m_currpkt_tail = m; } else { assert(rxd->layout->btype == VMXNET3_BTYPE_BODY); - assert(m_head != NULL); + assert(rxq.m_currpkt_head != nullptr); if (rxq.newbuf(rid) != 0) { rxq.discard(rid, idx); if (!rxcd->layout->eop) rxq.discard_chain(rid); - m_freem(m_head); + m_freem(rxq.m_currpkt_head); _rxq_stats.rx_drops++; - m_head = m_tail = NULL; + rxq.m_currpkt_head = rxq.m_currpkt_tail = nullptr; goto next; } m->m_hdr.mh_len = length; - m_head->M_dat.MH.MH_pkthdr.len += length; - m_tail->m_hdr.mh_next = m; - m_tail = m; + rxq.m_currpkt_head->M_dat.MH.MH_pkthdr.len += length; + rxq.m_currpkt_tail->m_hdr.mh_next = m; + rxq.m_currpkt_tail = m; } if (rxcd->layout->eop) { - rxq_input(rxq, rxcd, m_head); - m_head = m_tail = NULL; + rxq_input(rxq, rxcd, rxq.m_currpkt_head); + rxq.m_currpkt_head = rxq.m_currpkt_tail = nullptr; } next: diff --git a/drivers/vmxnet3.hh b/drivers/vmxnet3.hh index 82ca112a3b8ecfc451bce44503abdccccc239a1b..e37b0f792b9d0c056b474cf510c3860819a8d73c 100644 --- a/drivers/vmxnet3.hh +++ b/drivers/vmxnet3.hh @@ -76,6 +76,9 @@ public: cmdRingT cmd_rings[VMXNET3_RXRINGS_PERQ]; compRingT comp_ring; struct mbuf *buf[VMXNET3_RXRINGS_PERQ][VMXNET3_MAX_RX_NDESC]; + + struct mbuf *m_currpkt_head = nullptr; + struct mbuf *m_currpkt_tail = nullptr; }; class vmxnet3 : public hw_driver {