提交 b91a3363 编写于 作者: L Laine Stump

util: use new virNetDev*NetConfig() functions for macvtap setup/teardown

This patch modifies the macvtap passthrough setup to use
virNetDevSaveNetConfig()+virNetDevSetConfig() instead of
virNetDevReplaceNetConfig() or virNetDevReplaceMacAddress(), and the
teardown to use virNetDevReadNetConfig()+virNetDevSetConfig() instead
of virNetDevRestoreNetConfig() or virNetDevRestoreMacAddress().

Since the older functions only saved/restored the admin MAC and vlan
tag (which is incorrect) and the new functions save/restore the VF's
own MAC address and vlan tag (correct), this actually fixes a bug
(which was introduced by commit cb3fe38c, which was itself supposed
to be a fix for https://bugzilla.redhat.com/1113474 ).

The downside to this patch is that it causes an *apparent* regression
in that bug (because there will once again be an error reported if the
interface had previously been used for VFIO device assignment), but in
reality, the code hasn't been working for *any* case before this
current patch (at least not with any recent kernel). Anyway, that
"regression" will be fixed with an upcoming patch that fixes it the
*right* way.
上级 26694daf
...@@ -1010,20 +1010,22 @@ virNetDevMacVLanCreateWithVPortProfile(const char *ifnameRequested, ...@@ -1010,20 +1010,22 @@ virNetDevMacVLanCreateWithVPortProfile(const char *ifnameRequested,
*/ */
if (mode == VIR_NETDEV_MACVLAN_MODE_PASSTHRU) { if (mode == VIR_NETDEV_MACVLAN_MODE_PASSTHRU) {
bool setVlan = true;
if (virtPortProfile && if (virtPortProfile &&
virtPortProfile->virtPortType == VIR_NETDEV_VPORT_PROFILE_8021QBH) { virtPortProfile->virtPortType == VIR_NETDEV_VPORT_PROFILE_8021QBH) {
/* The Cisco enic driver (the only card that uses /* The Cisco enic driver (the only SRIOV-capable card that
* 802.1Qbh) doesn't support IFLA_VFINFO_LIST, which is * uses 802.1Qbh) doesn't support IFLA_VFINFO_LIST, which
* required for virNetDevReplaceNetConfig(), so we must * is required to get/set the vlan tag of a VF.
* use this function (which uses ioctl(SIOCGIFHWADDR)
* instead or virNetDevReplaceNetConfig()
*/ */
if (virNetDevReplaceMacAddress(linkdev, macaddress, stateDir) < 0) setVlan = false;
return -1;
} else {
if (virNetDevReplaceNetConfig(linkdev, -1, macaddress, vlan, stateDir) < 0)
return -1;
} }
if (virNetDevSaveNetConfig(linkdev, -1, stateDir, setVlan) < 0)
return -1;
if (virNetDevSetNetConfig(linkdev, -1, NULL, vlan, macaddress, setVlan) < 0)
return -1;
} }
if (ifnameRequested) { if (ifnameRequested) {
...@@ -1194,11 +1196,19 @@ int virNetDevMacVLanDeleteWithVPortProfile(const char *ifname, ...@@ -1194,11 +1196,19 @@ int virNetDevMacVLanDeleteWithVPortProfile(const char *ifname,
} }
if (mode == VIR_NETDEV_MACVLAN_MODE_PASSTHRU) { if (mode == VIR_NETDEV_MACVLAN_MODE_PASSTHRU) {
if (virtPortProfile && virMacAddrPtr MAC = NULL;
virtPortProfile->virtPortType == VIR_NETDEV_VPORT_PROFILE_8021QBH) virMacAddrPtr adminMAC = NULL;
ignore_value(virNetDevRestoreMacAddress(linkdev, stateDir)); virNetDevVlanPtr vlan = NULL;
else
ignore_value(virNetDevRestoreNetConfig(linkdev, -1, stateDir)); if (virNetDevReadNetConfig(linkdev, -1, stateDir,
&adminMAC, &vlan, &MAC) == 0) {
ignore_value(virNetDevSetNetConfig(linkdev, -1,
adminMAC, vlan, MAC, !!vlan));
VIR_FREE(MAC);
VIR_FREE(adminMAC);
virNetDevVlanFree(vlan);
}
} }
virNetlinkEventRemoveClient(0, macaddr, NETLINK_ROUTE); virNetlinkEventRemoveClient(0, macaddr, NETLINK_ROUTE);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册