On Wed, 23 Nov 2016, Rafael Zalamena wrote: > > Maybe something like this is enough already (untested): > > I tried your diff without Mike's if_vio diff and it doesn't panic anymore, > however it doesn't work. > > vioX can send packets to host, host receives them and reply, but vioX > doesn't see any packets back. I don't even need to touch the interface > up/down status to see this happening. Also when the interface comes > up after being shutdown it sends a bunch of packets to host.
Sorry, device_status is a bitmask, not a plain value. Try the patch below. The first hunk is to fix the 'sends a bunch of packets'. If it causes any problems, leave it out. diff --git usr.sbin/vmd/virtio.c usr.sbin/vmd/virtio.c index 93def73..6436e6a 100644 --- usr.sbin/vmd/virtio.c +++ usr.sbin/vmd/virtio.c @@ -703,6 +703,13 @@ virtio_net_io(int dir, uint16_t reg, uint32_t *data, uint8_t *intr, break; case VIRTIO_CONFIG_DEVICE_STATUS: dev->cfg.device_status = *data; + if (*data == 0) { + dev->vq[0].last_avail = 0; + dev->vq[0].notified_avail = 0; + dev->vq[1].last_avail = 0; + dev->vq[1].notified_avail = 0; + /* XXX do proper reset */ + } break; default: break; @@ -796,6 +803,9 @@ vionet_enq_rx(struct vionet_dev *dev, char *pkt, ssize_t sz, int *spc) ret = 0; + if (!(dev->cfg.device_status & VIRTIO_CONFIG_DEVICE_STATUS_DRIVER_OK)) + return ret; + vr_sz = vring_size(VIONET_QUEUE_SIZE); q_gpa = dev->vq[0].qa; q_gpa = q_gpa * VIRTIO_PAGE_SIZE;