diff --git a/pkg/apis/compute/vpcs_ovn.go b/pkg/apis/compute/vpcs_ovn.go index cac44e9814..cf29532d10 100644 --- a/pkg/apis/compute/vpcs_ovn.go +++ b/pkg/apis/compute/vpcs_ovn.go @@ -18,6 +18,8 @@ import ( "yunion.io/x/pkg/util/netutils" ) +const VPC_OVN_ENCAP_COST = 58 + const ( VPC_EXTERNAL_ACCESS_MODE_DISTGW = "distgw" // distgw only VPC_EXTERNAL_ACCESS_MODE_EIP_DISTGW = "eip-distgw" // eip when available, distgw otherwise diff --git a/pkg/compute/models/guestnetworks.go b/pkg/compute/models/guestnetworks.go index 89a86f4d99..445a5d7097 100644 --- a/pkg/compute/models/guestnetworks.go +++ b/pkg/compute/models/guestnetworks.go @@ -576,7 +576,7 @@ func (self *SGuestnetwork) getJsonDesc(network *SNetwork) *jsonutils.JSONDict { desc.Add(jsonutils.NewString(self.Driver), "driver") desc.Add(jsonutils.NewInt(int64(network.VlanId)), "vlan") desc.Add(jsonutils.NewInt(int64(self.getBandwidth())), "bw") - desc.Add(jsonutils.NewInt(int64(self.getMtu())), "mtu") + desc.Add(jsonutils.NewInt(int64(self.getMtu(network))), "mtu") desc.Add(jsonutils.NewInt(int64(self.Index)), "index") vips := self.GetVirtualIPs() if len(vips) > 0 { @@ -812,15 +812,8 @@ func (self *SGuestnetwork) getBandwidth() int { } } -func (self *SGuestnetwork) getMtu() int { - net := self.GetNetwork() - if net != nil { - wire := net.GetWire() - if wire != nil { - return wire.Mtu - } - } - return options.Options.DefaultMtu +func (self *SGuestnetwork) getMtu(net *SNetwork) int { + return net.getMtu() } func (self *SGuestnetwork) IsAllocated() bool { diff --git a/pkg/compute/models/networks.go b/pkg/compute/models/networks.go index 588b2a134e..cd493193cb 100644 --- a/pkg/compute/models/networks.go +++ b/pkg/compute/models/networks.go @@ -134,6 +134,21 @@ func (manager *SNetworkManager) AllowCreateItem(ctx context.Context, userCred mc return db.IsAdminAllowCreate(userCred, manager) } +func (self *SNetwork) getMtu() int { + baseMtu := options.Options.DefaultMtu + + wire := self.GetWire() + if wire != nil { + baseMtu = wire.Mtu + if IsOneCloudVpcResource(wire) { + baseMtu -= api.VPC_OVN_ENCAP_COST + } + return baseMtu + } + + return baseMtu +} + func (self *SNetwork) GetNetworkInterfaces() ([]SNetworkInterface, error) { sq := NetworkinterfacenetworkManager.Query().SubQuery() q := NetworkInterfaceManager.Query() diff --git a/pkg/hostman/guestman/qemu-kvmhelper.go b/pkg/hostman/guestman/qemu-kvmhelper.go index a264630f3f..8f2a75d613 100644 --- a/pkg/hostman/guestman/qemu-kvmhelper.go +++ b/pkg/hostman/guestman/qemu-kvmhelper.go @@ -277,6 +277,7 @@ func (s *SKVMGuestInstance) getNicAddr(index int) int { } func (s *SKVMGuestInstance) getVnicDesc(nic jsonutils.JSONObject) string { + bridge, _ := nic.GetString("bridge") ifname, _ := nic.GetString("ifname") driver, _ := nic.GetString("driver") mac, _ := nic.GetString("mac") @@ -295,6 +296,9 @@ func (s *SKVMGuestInstance) getVnicDesc(nic jsonutils.JSONObject) string { cmd += fmt.Sprintf(",vectors=%d", vectors) } cmd += fmt.Sprintf("$(nic_speed %d)", bw) + if bridge == options.HostOptions.OvnIntegrationBridge { + cmd += fmt.Sprintf("$(nic_mtu %q)", bridge) + } } return cmd } @@ -401,21 +405,32 @@ func (s *SKVMGuestInstance) _generateStartScript(data *jsonutils.JSONDict) (stri // cmd += " fi\n" // cmd += "else\n" cmd += "QEMU_CMD=$DEFAULT_QEMU_CMD\n" - // cmd += "fi\n" - cmd += "function nic_speed() {\n" - cmd += " $QEMU_CMD " - if s.IsKvmSupport() { - cmd += "-enable-kvm" + cmd += "QEMU_CMD_KVM_ARG=-enable-kvm\n" } else { - cmd += "-no-kvm" + cmd += "QEMU_CMD_KVM_ARG=-no-kvm\n" } + // cmd += "fi\n" + cmd += ` +function nic_speed() { + $QEMU_CMD $QEMU_CMD_KVM_ARG -device virtio-net-pci,help 2>&1 | grep -q "\&1 | grep -q '\