From f46a156a84261491740658b3cb468b3e9ecdc1ad Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Mon, 7 Jun 2021 09:18:38 +0200 Subject: [PATCH 1/2] vxlan: arp does not work between hosts as multicast group is communicated over physical nic instead of linux bridge when linux bridge is setup (refer to http://docs.cloudstack.apache.org/projects/archived-cloudstack-getting-started/en/latest/networking/vxlan.html#configure-product-to-use-vxlan-plugin) and used as the kvm traffic label of physical networks, the vms on different hosts cannot reach each other. (1) does not work: ``` /usr/share/cloudstack-common/scripts/vm/network/vnet/modifyvxlan.sh -v 1001 -p eth1 -b brvx-1001 -o add ``` "bridge fdb" shows ``` 00:00:00:00:00:00 dev vxlan1001 dst 239.0.3.233 via eth1 self permanent ``` (2) this works: ``` /usr/share/cloudstack-common/scripts/vm/network/vnet/modifyvxlan.sh -v 1001 -p cloudbr1 -b brvx-1001 -o add ``` "bridge fdb" shows ``` 00:00:00:00:00:00 dev vxlan1001 dst 239.0.3.233 via cloudbr1 self permanent ``` --- .../java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java | 2 +- .../java/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java index 8ff265e9b541..e3e1da75637c 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java @@ -291,7 +291,7 @@ private String generateVxnetBrName(String pifName, String vnetId) { private String createVnetBr(String vNetId, String pifKey, String protocol) throws InternalErrorException { String nic = _pifs.get(pifKey); - if (nic == null) { + if (nic == null || protocol.equals(Networks.BroadcastDomainType.Vxlan.scheme())) { // if not found in bridge map, maybe traffic label refers to pif already? File pif = new File("/sys/class/net/" + pifKey); if (pif.isDirectory()) { diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java index 5f7066a7a40d..7c0ed968951c 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java @@ -161,7 +161,7 @@ private void createControlNetwork() throws LibvirtException { private String createVnetBr(String vNetId, String pifKey, String protocol) throws InternalErrorException { String nic = _pifs.get(pifKey); - if (nic == null) { + if (nic == null || protocol.equals(Networks.BroadcastDomainType.Vxlan.scheme())) { // if not found in bridge map, maybe traffic label refers to pif already? File pif = new File("/sys/class/net/" + pifKey); if (pif.isDirectory()) { From 405a84321968fb2de80fc4050623fde992db7a3e Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Mon, 14 Jun 2021 13:03:59 +0000 Subject: [PATCH 2/2] vxlan: fix issue if kvm network label is not set --- .../java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java index e3e1da75637c..d6ee85fba51c 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java @@ -224,7 +224,7 @@ public LibvirtVMDef.InterfaceDef plug(NicTO nic, String guestOsType, String nicA String brName = createVnetBr(vNetId, trafficLabel, protocol); intf.defBridgeNet(brName, null, nic.getMac(), getGuestNicModel(guestOsType, nicAdapter), networkRateKBps); } else { - String brName = createVnetBr(vNetId, "private", protocol); + String brName = createVnetBr(vNetId, _bridges.get("private"), protocol); intf.defBridgeNet(brName, null, nic.getMac(), getGuestNicModel(guestOsType, nicAdapter), networkRateKBps); } } else {