vdpa: Restore packet receive filtering state relative with _F_CTRL_RX_EXTRA feature
This patch refactors vhost_vdpa_net_load_rx() to restore the packet receive filtering state in relation to VIRTIO_NET_F_CTRL_RX_EXTRA feature at device's startup. Signed-off-by: Hawkins Jiawei <yin31149@gmail.com> Message-Id: <abddc477a476f756de6e3d24c0e9f7b21c99a4c1.1688797728.git.yin31149@gmail.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
ea6eec4979
commit
4fd180c7bb
@ -873,6 +873,94 @@ static int vhost_vdpa_net_load_rx(VhostVDPAState *s,
|
||||
}
|
||||
}
|
||||
|
||||
if (!virtio_vdev_has_feature(&n->parent_obj, VIRTIO_NET_F_CTRL_RX_EXTRA)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* According to virtio_net_reset(), device turns all-unicast mode
|
||||
* off by default.
|
||||
*
|
||||
* Therefore, QEMU should only send this CVQ command if the driver
|
||||
* sets all-unicast mode on, different from the device's defaults.
|
||||
*
|
||||
* Note that the device's defaults can mismatch the driver's
|
||||
* configuration only at live migration.
|
||||
*/
|
||||
if (n->alluni) {
|
||||
dev_written = vhost_vdpa_net_load_rx_mode(s,
|
||||
VIRTIO_NET_CTRL_RX_ALLUNI, 1);
|
||||
if (dev_written < 0) {
|
||||
return dev_written;
|
||||
}
|
||||
if (*s->status != VIRTIO_NET_OK) {
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* According to virtio_net_reset(), device turns non-multicast mode
|
||||
* off by default.
|
||||
*
|
||||
* Therefore, QEMU should only send this CVQ command if the driver
|
||||
* sets non-multicast mode on, different from the device's defaults.
|
||||
*
|
||||
* Note that the device's defaults can mismatch the driver's
|
||||
* configuration only at live migration.
|
||||
*/
|
||||
if (n->nomulti) {
|
||||
dev_written = vhost_vdpa_net_load_rx_mode(s,
|
||||
VIRTIO_NET_CTRL_RX_NOMULTI, 1);
|
||||
if (dev_written < 0) {
|
||||
return dev_written;
|
||||
}
|
||||
if (*s->status != VIRTIO_NET_OK) {
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* According to virtio_net_reset(), device turns non-unicast mode
|
||||
* off by default.
|
||||
*
|
||||
* Therefore, QEMU should only send this CVQ command if the driver
|
||||
* sets non-unicast mode on, different from the device's defaults.
|
||||
*
|
||||
* Note that the device's defaults can mismatch the driver's
|
||||
* configuration only at live migration.
|
||||
*/
|
||||
if (n->nouni) {
|
||||
dev_written = vhost_vdpa_net_load_rx_mode(s,
|
||||
VIRTIO_NET_CTRL_RX_NOUNI, 1);
|
||||
if (dev_written < 0) {
|
||||
return dev_written;
|
||||
}
|
||||
if (*s->status != VIRTIO_NET_OK) {
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* According to virtio_net_reset(), device turns non-broadcast mode
|
||||
* off by default.
|
||||
*
|
||||
* Therefore, QEMU should only send this CVQ command if the driver
|
||||
* sets non-broadcast mode on, different from the device's defaults.
|
||||
*
|
||||
* Note that the device's defaults can mismatch the driver's
|
||||
* configuration only at live migration.
|
||||
*/
|
||||
if (n->nobcast) {
|
||||
dev_written = vhost_vdpa_net_load_rx_mode(s,
|
||||
VIRTIO_NET_CTRL_RX_NOBCAST, 1);
|
||||
if (dev_written < 0) {
|
||||
return dev_written;
|
||||
}
|
||||
if (*s->status != VIRTIO_NET_OK) {
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user