vdpa: Restore vlan filtering state
This patch introduces vhost_vdpa_net_load_single_vlan() and vhost_vdpa_net_load_vlan() to restore the vlan filtering state at device's startup. Co-developed-by: Eugenio Pérez <eperezma@redhat.com> Signed-off-by: Eugenio Pérez <eperezma@redhat.com> Signed-off-by: Hawkins Jiawei <yin31149@gmail.com> Message-Id: <e76a29f77bb3f386e4a643c8af94b77b775d1752.1690106284.git.yin31149@gmail.com> Tested-by: Lei Yang <leiyang@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
e19751a32f
commit
8f7e996748
@ -968,6 +968,50 @@ static int vhost_vdpa_net_load_rx(VhostVDPAState *s,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vhost_vdpa_net_load_single_vlan(VhostVDPAState *s,
|
||||||
|
const VirtIONet *n,
|
||||||
|
uint16_t vid)
|
||||||
|
{
|
||||||
|
const struct iovec data = {
|
||||||
|
.iov_base = &vid,
|
||||||
|
.iov_len = sizeof(vid),
|
||||||
|
};
|
||||||
|
ssize_t dev_written = vhost_vdpa_net_load_cmd(s, VIRTIO_NET_CTRL_VLAN,
|
||||||
|
VIRTIO_NET_CTRL_VLAN_ADD,
|
||||||
|
&data, 1);
|
||||||
|
if (unlikely(dev_written < 0)) {
|
||||||
|
return dev_written;
|
||||||
|
}
|
||||||
|
if (unlikely(*s->status != VIRTIO_NET_OK)) {
|
||||||
|
return -EIO;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int vhost_vdpa_net_load_vlan(VhostVDPAState *s,
|
||||||
|
const VirtIONet *n)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if (!virtio_vdev_has_feature(&n->parent_obj, VIRTIO_NET_F_CTRL_VLAN)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = 0; i < MAX_VLAN >> 5; i++) {
|
||||||
|
for (int j = 0; n->vlans[i] && j <= 0x1f; j++) {
|
||||||
|
if (n->vlans[i] & (1U << j)) {
|
||||||
|
r = vhost_vdpa_net_load_single_vlan(s, n, (i << 5) + j);
|
||||||
|
if (unlikely(r != 0)) {
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int vhost_vdpa_net_load(NetClientState *nc)
|
static int vhost_vdpa_net_load(NetClientState *nc)
|
||||||
{
|
{
|
||||||
VhostVDPAState *s = DO_UPCAST(VhostVDPAState, nc, nc);
|
VhostVDPAState *s = DO_UPCAST(VhostVDPAState, nc, nc);
|
||||||
@ -998,6 +1042,10 @@ static int vhost_vdpa_net_load(NetClientState *nc)
|
|||||||
if (unlikely(r)) {
|
if (unlikely(r)) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
r = vhost_vdpa_net_load_vlan(s, n);
|
||||||
|
if (unlikely(r)) {
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user