@@ -3,6 +3,7 @@ package ovs
33import (
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+
1539func 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