diff --git a/drivers/virtio-net.cc b/drivers/virtio-net.cc
index cc5521b080079c2fd2fca49c9230f91a8bf41129..92e3d639f32bf1df9e807057e8b3d417c27659e0 100644
--- a/drivers/virtio-net.cc
+++ b/drivers/virtio-net.cc
@@ -393,7 +393,7 @@ void net::receiver()
 
         // use local header that we copy out of the mbuf since we're
         // truncating it.
-        struct net_hdr_mrg_rxbuf mhdr;
+        net_hdr_mrg_rxbuf* mhdr;
 
         while (m != nullptr) {
 
@@ -409,12 +409,12 @@ void net::receiver()
                 continue;
             }
 
-            memcpy(&mhdr, mtod(m, void*), _hdr_size);
+            mhdr = mtod(m, net_hdr_mrg_rxbuf*);
 
             if (!_mergeable_bufs) {
                 nbufs = 1;
             } else {
-                nbufs = mhdr.num_buffers;
+                nbufs = mhdr->num_buffers;
             }
 
             m->M_dat.MH.MH_pkthdr.len = len;
@@ -450,9 +450,9 @@ void net::receiver()
             m_adj(m_head, offset);
 
             if ((_ifn->if_capenable & IFCAP_RXCSUM) &&
-                (mhdr.hdr.flags &
+                (mhdr->hdr.flags &
                  net_hdr::VIRTIO_NET_HDR_F_NEEDS_CSUM)) {
-                if (bad_rx_csum(m_head, &mhdr.hdr))
+                if (bad_rx_csum(m_head, &mhdr->hdr))
                     csum_err++;
                 else
                     csum_ok++;