tap-linux: Open ipvtap and macvtap

ipvtap and macvtap create a file for each interface unlike tuntap, which
creates one file shared by all interfaces. Try to open a file dedicated
to the interface first for ipvtap and macvtap.

Signed-off-by: Akihiko Odaki <akihiko.odaki@daynix.com>
Signed-off-by: Jason Wang <jasowang@redhat.com>
This commit is contained in:
Akihiko Odaki 2024-10-08 15:52:06 +09:00 committed by Jason Wang
parent 2938c36937
commit ac2ff9b840

View file

@ -45,10 +45,21 @@ int tap_open(char *ifname, int ifname_size, int *vnet_hdr,
int len = sizeof(struct virtio_net_hdr);
unsigned int features;
fd = RETRY_ON_EINTR(open(PATH_NET_TUN, O_RDWR));
ret = if_nametoindex(ifname);
if (ret) {
g_autofree char *file = g_strdup_printf("/dev/tap%d", ret);
fd = open(file, O_RDWR);
} else {
fd = -1;
}
if (fd < 0) {
error_setg_errno(errp, errno, "could not open %s", PATH_NET_TUN);
return -1;
fd = RETRY_ON_EINTR(open(PATH_NET_TUN, O_RDWR));
if (fd < 0) {
error_setg_errno(errp, errno, "could not open %s", PATH_NET_TUN);
return -1;
}
}
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TAP | IFF_NO_PI;