From 67182dc49b0420e4b77dffbe5131d0ead03387d5 Mon Sep 17 00:00:00 2001 From: Wei Zhou <57355700+weizhouapache@users.noreply.github.com> Date: Wed, 16 Jun 2021 05:22:31 +0200 Subject: [PATCH] vxlan: arp does not work between hosts as multicast group is communicated over physical nic instead of linux bridge (#5078) * 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 ``` * vxlan: fix issue if kvm network label is not set --- .../com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java | 4 ++-- .../java/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java | 2 +- 2 files changed, 3 insertions(+), 3 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 8ff265e9b54..d6ee85fba51 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 class BridgeVifDriver extends VifDriverBase { 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 { @@ -291,7 +291,7 @@ public class BridgeVifDriver extends VifDriverBase { 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 5f7066a7a40..7c0ed968951 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 @@ public class IvsVifDriver extends VifDriverBase { 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()) {