Skip to content

Commit a2db6b1

Browse files
authored
u2o keep src flow should consider multi-vlan on the same provider (#5385)
Signed-off-by: clyi <clyi@alauda.io>
1 parent ea758a7 commit a2db6b1

File tree

2 files changed

+38
-14
lines changed

2 files changed

+38
-14
lines changed

pkg/daemon/controller_linux.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -792,7 +792,7 @@ func (c *Controller) GetProviderInfoFromSubnet(subnet *kubeovnv1.Subnet) (bridge
792792
return bridgeName, chassisMac, nil
793793
}
794794

795-
func HandleU2OForPod(ovsClient *ovsutil.Client, pod *v1.Pod, bridgeName, chassisMac string, isAdd bool) error {
795+
func HandleU2OForPod(ovsClient *ovsutil.Client, pod *v1.Pod, bridgeName, chassisMac, subnetName string, isAdd bool) error {
796796
if pod == nil {
797797
return errors.New("pod is nil")
798798
}
@@ -806,9 +806,9 @@ func HandleU2OForPod(ovsClient *ovsutil.Client, pod *v1.Pod, bridgeName, chassis
806806
for _, podIP := range podIPs {
807807
var err error
808808
if isAdd {
809-
err = ovs.AddOrUpdateU2OKeepSrcMac(ovsClient, bridgeName, podIP, podMac, chassisMac)
809+
err = ovs.AddOrUpdateU2OKeepSrcMac(ovsClient, bridgeName, podIP, podMac, chassisMac, subnetName)
810810
} else {
811-
err = ovs.DeleteU2OKeepSrcMac(ovsClient, bridgeName, podIP, chassisMac)
811+
err = ovs.DeleteU2OKeepSrcMac(ovsClient, bridgeName, podIP, chassisMac, subnetName)
812812
}
813813

814814
if err != nil {
@@ -841,7 +841,7 @@ func (c *Controller) HandleU2OForSubnet(subnet *kubeovnv1.Subnet, isAdd bool) er
841841
if pod.Annotations[util.LogicalSwitchAnnotation] != subnet.Name {
842842
continue
843843
}
844-
if err := HandleU2OForPod(c.ovsClient, pod, bridgeName, chassisMac, isAdd); err != nil {
844+
if err := HandleU2OForPod(c.ovsClient, pod, bridgeName, chassisMac, subnet.Name, isAdd); err != nil {
845845
klog.Error(err)
846846
return err
847847
}
@@ -899,7 +899,7 @@ func (c *Controller) handleUpdatePod(key string) error {
899899
klog.Error(err)
900900
return err
901901
}
902-
if err := HandleU2OForPod(c.ovsClient, pod, bridgeName, chassisMac, true); err != nil {
902+
if err := HandleU2OForPod(c.ovsClient, pod, bridgeName, chassisMac, subnet.Name, true); err != nil {
903903
klog.Error(err)
904904
return err
905905
}
@@ -1007,7 +1007,7 @@ func (c *Controller) handleDeletePod(key string) error {
10071007
return err
10081008
}
10091009

1010-
if err := HandleU2OForPod(c.ovsClient, pod, bridgeName, chassisMac, false); err != nil {
1010+
if err := HandleU2OForPod(c.ovsClient, pod, bridgeName, chassisMac, subnet.Name, false); err != nil {
10111011
klog.Error(err)
10121012
return err
10131013
}

pkg/ovs/ovs-ofctl.go

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package ovs
33
import (
44
"fmt"
55
"net"
6+
"strconv"
67

78
ovs "github.com/digitalocean/go-openvswitch/ovs"
89
v1 "k8s.io/api/core/v1"
@@ -12,6 +13,29 @@ import (
1213
"github.com/kubeovn/kube-ovn/pkg/util"
1314
)
1415

16+
func getOfportByPeer(peer string) (int, error) {
17+
// ovs-vsctl find interface options:peer="<peer>"
18+
ifaceNames, err := ovsFind("Interface", "name", fmt.Sprintf(`options:peer="%s"`, peer))
19+
if err != nil {
20+
return -1, fmt.Errorf("failed to find interface with peer %s: %w", peer, err)
21+
}
22+
if len(ifaceNames) == 0 {
23+
return -1, fmt.Errorf("no interface found with peer %s", peer)
24+
}
25+
if len(ifaceNames) > 1 {
26+
// This should not happen for patch ports
27+
klog.Warningf("multiple interfaces found with peer %s: %v", peer, ifaceNames)
28+
}
29+
ifaceName := ifaceNames[0]
30+
31+
ofportStr, err := ovsGet("Interface", ifaceName, "ofport", "")
32+
if err != nil {
33+
return -1, fmt.Errorf("failed to get ofport for interface %s: %w", ifaceName, err)
34+
}
35+
36+
return strconv.Atoi(ofportStr)
37+
}
38+
1539
func AddOrUpdateUnderlaySubnetSvcLocalOpenFlow(client *ovs.Client, bridgeName, lbServiceIP, protocol, dstMAC, underlayNic string, lbServicePort uint16) error {
1640
isIPv6 := util.CheckProtocol(lbServiceIP) == kubeovnv1.ProtocolIPv6
1741
var inPortID, outPortID int
@@ -143,20 +167,20 @@ func DeleteUnderlaySubnetSvcLocalOpenFlow(client *ovs.Client, bridgeName, lbServ
143167
return nil
144168
}
145169

146-
func AddOrUpdateU2OKeepSrcMac(client *ovs.Client, bridgeName, podIP, podMac, chassisMac string) error {
170+
func AddOrUpdateU2OKeepSrcMac(client *ovs.Client, bridgeName, podIP, podMac, chassisMac, subnetName string) error {
147171
var localnetPatchPortID int
148172
var podMacAddr net.HardwareAddr
149173
var err error
150174
var matchs []ovs.Match
151175
var protocolType ovs.Protocol
152176
isIPv6 := util.CheckProtocol(podIP) == kubeovnv1.ProtocolIPv6
153177

154-
portInfo, err := client.OpenFlow.DumpPort(bridgeName, "patch-localnet.")
178+
peer := fmt.Sprintf("patch-br-int-to-localnet.%s", subnetName)
179+
localnetPatchPortID, err = getOfportByPeer(peer)
155180
if err != nil {
156-
klog.Errorf("failed to dump bridge %s port %s: %v", bridgeName, "patch-localnet.", err)
181+
klog.Errorf("failed to get ofport for peer %s: %v", peer, err)
157182
return err
158183
}
159-
localnetPatchPortID = portInfo.PortID
160184

161185
podMacAddr, err = net.ParseMAC(podMac)
162186
if err != nil {
@@ -215,19 +239,19 @@ func AddOrUpdateU2OKeepSrcMac(client *ovs.Client, bridgeName, podIP, podMac, cha
215239
return client.OpenFlow.AddFlow(bridgeName, flow)
216240
}
217241

218-
func DeleteU2OKeepSrcMac(client *ovs.Client, bridgeName, podIP, chassisMac string) error {
242+
func DeleteU2OKeepSrcMac(client *ovs.Client, bridgeName, podIP, chassisMac, subnetName string) error {
219243
var localnetPatchPortID int
220244
var err error
221245
var matchs []ovs.Match
222246
var protocolType ovs.Protocol
223247
isIPv6 := util.CheckProtocol(podIP) == kubeovnv1.ProtocolIPv6
224248

225-
portInfo, err := client.OpenFlow.DumpPort(bridgeName, "patch-localnet.")
249+
peer := fmt.Sprintf("patch-br-int-to-localnet.%s", subnetName)
250+
localnetPatchPortID, err = getOfportByPeer(peer)
226251
if err != nil {
227-
klog.Errorf("failed to dump bridge %s port %s: %v", bridgeName, "patch-localnet.", err)
252+
klog.Errorf("failed to get ofport for peer %s: %v", peer, err)
228253
return err
229254
}
230-
localnetPatchPortID = portInfo.PortID
231255

232256
if isIPv6 {
233257
protocolType = ovs.ProtocolIPv6

0 commit comments

Comments
 (0)