@@ -608,11 +608,17 @@ func (i *Initializer) setupGatewayInterface() error {
608608 }
609609 gwPortUUID , err := i .ovsBridgeClient .CreateInternalPort (i .hostGateway , config .HostGatewayOFPort , externalIDs )
610610 if err != nil {
611- klog .Errorf ( "Failed to create gateway port %s on OVS bridge: %v" , i .hostGateway , err )
611+ klog .ErrorS ( err , "Failed to create gateway port on OVS bridge" , "port" , i .hostGateway )
612612 return err
613613 }
614+ gwPort , err := i .ovsBridgeClient .GetOFPort (i .hostGateway , false )
615+ if err != nil {
616+ klog .ErrorS (err , "Failed to get gateway ofport" , "port" , i .hostGateway )
617+ return err
618+ }
619+ klog .InfoS ("Allocated OpenFlow port for gateway interface" , "port" , i .hostGateway , "ofPort" , gwPort )
614620 gatewayIface = interfacestore .NewGatewayInterface (i .hostGateway )
615- gatewayIface .OVSPortConfig = & interfacestore.OVSPortConfig {PortUUID : gwPortUUID , OFPort : config . HostGatewayOFPort }
621+ gatewayIface .OVSPortConfig = & interfacestore.OVSPortConfig {PortUUID : gwPortUUID , OFPort : gwPort }
616622 i .ifaceStore .AddInterface (gatewayIface )
617623 } else {
618624 klog .V (2 ).Infof ("Gateway port %s already exists on OVS bridge" , i .hostGateway )
@@ -657,7 +663,7 @@ func (i *Initializer) configureGatewayInterface(gatewayIface *interfacestore.Int
657663 return err
658664 }
659665
660- i .nodeConfig .GatewayConfig = & config.GatewayConfig {Name : i .hostGateway , MAC : gwMAC }
666+ i .nodeConfig .GatewayConfig = & config.GatewayConfig {Name : i .hostGateway , MAC : gwMAC , OFPort : uint32 ( gatewayIface . OFPort ) }
661667 gatewayIface .MAC = gwMAC
662668 gatewayIface .IPs = []net.IP {}
663669 if i .networkConfig .TrafficEncapMode .IsNetworkPolicyOnly () {
@@ -728,6 +734,7 @@ func (i *Initializer) setupDefaultTunnelInterface() error {
728734 }
729735 tunnelIface .TunnelInterfaceConfig .Csum = true
730736 }
737+ i .nodeConfig .TunnelOFPort = uint32 (tunnelIface .OFPort )
731738 return nil
732739 }
733740
@@ -755,12 +762,19 @@ func (i *Initializer) setupDefaultTunnelInterface() error {
755762 }
756763 tunnelPortUUID , err := i .ovsBridgeClient .CreateTunnelPortExt (tunnelPortName , i .networkConfig .TunnelType , config .DefaultTunOFPort , shouldEnableCsum , localIPStr , "" , "" , "" , nil , externalIDs )
757764 if err != nil {
758- klog .Errorf ( "Failed to create tunnel port %s type %s on OVS bridge: %v" , tunnelPortName , i .networkConfig .TunnelType , err )
765+ klog .ErrorS ( err , "Failed to create tunnel port on OVS bridge" , "port" , tunnelPortName , "type" , i .networkConfig .TunnelType )
759766 return err
760767 }
768+ tunPort , err := i .ovsBridgeClient .GetOFPort (tunnelPortName , false )
769+ if err != nil {
770+ klog .ErrorS (err , "Failed to get tunnel ofport on OVS bridge" , "port" , tunnelPortName , "type" , i .networkConfig .TunnelType )
771+ return err
772+ }
773+ klog .InfoS ("Allocated OpenFlow port for tunnel interface" , "port" , tunnelPortName , "ofPort" , tunPort )
761774 tunnelIface = interfacestore .NewTunnelInterface (tunnelPortName , i .networkConfig .TunnelType , localIP , shouldEnableCsum )
762- tunnelIface .OVSPortConfig = & interfacestore.OVSPortConfig {PortUUID : tunnelPortUUID , OFPort : config . DefaultTunOFPort }
775+ tunnelIface .OVSPortConfig = & interfacestore.OVSPortConfig {PortUUID : tunnelPortUUID , OFPort : tunPort }
763776 i .ifaceStore .AddInterface (tunnelIface )
777+ i .nodeConfig .TunnelOFPort = uint32 (tunPort )
764778 }
765779 return nil
766780}
@@ -1126,3 +1140,24 @@ func (i *Initializer) patchNodeAnnotations(nodeName, key string, value interface
11261140func (i * Initializer ) getNodeInterfaceFromIP (nodeIPs * utilip.DualStackIPs ) (v4IPNet * net.IPNet , v6IPNet * net.IPNet , iface * net.Interface , err error ) {
11271141 return getIPNetDeviceFromIP (nodeIPs , sets .NewString (i .hostGateway ))
11281142}
1143+
1144+ // getFreeOFPort returns an OpenFlow port number which is not used by any existing OVS port. Note that, the returned port
1145+ // is not saved in OVSDB yet before the real port is created, so it might introduce an issue for the same return value
1146+ // if it is called multiple times before OVS port creation.
1147+ func (i * Initializer ) getFreeOFPort (startPort int ) (int32 , error ) {
1148+ existingOFPorts := sets .NewInt32 ()
1149+ ports , err := i .ovsBridgeClient .GetPortList ()
1150+ if err != nil {
1151+ return 0 , err
1152+ }
1153+ for _ , p := range ports {
1154+ existingOFPorts .Insert (p .OFPort )
1155+ }
1156+ port := int32 (startPort )
1157+ for ; ; port ++ {
1158+ if ! existingOFPorts .Has (port ) {
1159+ break
1160+ }
1161+ }
1162+ return port , nil
1163+ }
0 commit comments