@@ -32,6 +32,7 @@ type Gateway interface {
3232 Init (<- chan struct {}, * sync.WaitGroup ) error
3333 Start ()
3434 GetGatewayBridgeIface () string
35+ GetGatewayIface () string
3536 SetDefaultGatewayBridgeMAC (addr net.HardwareAddr )
3637 SetDefaultPodNetworkAdvertised (bool )
3738 Reconcile () error
@@ -456,6 +457,10 @@ func (g *gateway) GetGatewayBridgeIface() string {
456457 return g .openflowManager .getDefaultBridgeName ()
457458}
458459
460+ func (g * gateway ) GetGatewayIface () string {
461+ return g .openflowManager .defaultBridge .getGatewayIface ()
462+ }
463+
459464// getMaxFrameLength returns the maximum frame size (ignoring VLAN header) that a gateway can handle
460465func getMaxFrameLength () int {
461466 return config .Default .MTU + 14
@@ -537,6 +542,8 @@ type bridgeConfiguration struct {
537542 nodeName string
538543 bridgeName string
539544 uplinkName string
545+ gwIface string
546+ gwIfaceRep string
540547 ips []* net.IPNet
541548 interfaceID string
542549 macAddress net.HardwareAddr
@@ -546,11 +553,19 @@ type bridgeConfiguration struct {
546553 eipMarkIPs * markIPsCache
547554}
548555
556+ func (b * bridgeConfiguration ) getGatewayIface () string {
557+ // If gwIface is set, then accelerated GW interface is present and we use it. If else use external bridge instead.
558+ if b .gwIface != "" {
559+ return b .gwIface
560+ }
561+ return b .bridgeName
562+ }
563+
549564// updateInterfaceIPAddresses sets and returns the bridge's current ips
550565func (b * bridgeConfiguration ) updateInterfaceIPAddresses (node * corev1.Node ) ([]* net.IPNet , error ) {
551566 b .Lock ()
552567 defer b .Unlock ()
553- ifAddrs , err := getNetworkInterfaceIPAddresses (b .bridgeName )
568+ ifAddrs , err := getNetworkInterfaceIPAddresses (b .getGatewayIface () )
554569 if err != nil {
555570 return nil , err
556571 }
@@ -578,6 +593,11 @@ func (b *bridgeConfiguration) updateInterfaceIPAddresses(node *corev1.Node) ([]*
578593
579594func bridgeForInterface (intfName , nodeName , physicalNetworkName string , nodeSubnets , gwIPs []* net.IPNet ,
580595 advertised bool ) (* bridgeConfiguration , error ) {
596+ var intfRep string
597+ var err error
598+ isGWAcclInterface := false
599+ gwIntf := intfName
600+
581601 defaultNetConfig := & bridgeUDNConfiguration {
582602 masqCTMark : ctMarkOVN ,
583603 subnets : config .Default .ClusterSubnets ,
@@ -591,15 +611,47 @@ func bridgeForInterface(intfName, nodeName, physicalNetworkName string, nodeSubn
591611 eipMarkIPs : newMarkIPsCache (),
592612 }
593613 res .netConfig [types .DefaultNetworkName ].advertised .Store (advertised )
594- gwIntf := intfName
595614
596- if bridgeName , _ , err := util .RunOVSVsctl ("port-to-br" , intfName ); err == nil {
615+ if config .Gateway .GatewayAcceleratedInterface != "" {
616+ // Try to get representor for the specified gateway device.
617+ // If function succeeds, then it is either a valid switchdev VF or SF, and we can use this accelerated device
618+ // for node IP, Host Ofport for Openflow etc.
619+ // If failed - error for improper configuration option
620+ intfRep , err = getRepresentor (config .Gateway .GatewayAcceleratedInterface )
621+ if err != nil {
622+ return nil , fmt .Errorf ("gateway accelerated interface %s is not valid: %w" , config .Gateway .GatewayAcceleratedInterface , err )
623+ }
624+ isGWAcclInterface = true
625+ klog .Infof ("For gateway accelerated interface %s representor: %s" , config .Gateway .GatewayAcceleratedInterface , intfRep )
626+ }
627+
628+ if isGWAcclInterface {
629+ gatewayAcceleratedInterface := config .Gateway .GatewayAcceleratedInterface
630+ bridgeName , _ , err := util .RunOVSVsctl ("port-to-br" , intfRep )
631+ if err != nil {
632+ return nil , fmt .Errorf ("failed to find bridge that has port %s: %w" , intfRep , err )
633+ }
634+ link , err := util .GetNetLinkOps ().LinkByName (gatewayAcceleratedInterface )
635+ if err != nil {
636+ return nil , fmt .Errorf ("failed to get netdevice link for %s: %w" , gatewayAcceleratedInterface , err )
637+ }
638+ uplinkName , err := util .GetNicName (bridgeName )
639+ if err != nil {
640+ return nil , fmt .Errorf ("failed to find nic name for bridge %s: %w" , bridgeName , err )
641+ }
642+ res .bridgeName = bridgeName
643+ res .uplinkName = uplinkName
644+ res .gwIfaceRep = intfRep
645+ res .gwIface = gatewayAcceleratedInterface
646+ res .macAddress = link .Attrs ().HardwareAddr
647+ } else if bridgeName , _ , err := util .RunOVSVsctl ("port-to-br" , intfName ); err == nil {
597648 // This is an OVS bridge's internal port
598649 uplinkName , err := util .GetNicName (bridgeName )
599650 if err != nil {
600651 return nil , fmt .Errorf ("failed to find nic name for bridge %s: %w" , bridgeName , err )
601652 }
602653 res .bridgeName = bridgeName
654+ res .gwIface = bridgeName
603655 res .uplinkName = uplinkName
604656 gwIntf = bridgeName
605657 } else if _ , _ , err := util .RunOVSVsctl ("br-exists" , intfName ); err != nil {
@@ -610,6 +662,7 @@ func bridgeForInterface(intfName, nodeName, physicalNetworkName string, nodeSubn
610662 return nil , fmt .Errorf ("nicToBridge failed for %s: %w" , intfName , err )
611663 }
612664 res .bridgeName = bridgeName
665+ res .gwIface = bridgeName
613666 res .uplinkName = intfName
614667 gwIntf = bridgeName
615668 } else {
@@ -625,8 +678,8 @@ func bridgeForInterface(intfName, nodeName, physicalNetworkName string, nodeSubn
625678 res .uplinkName = uplinkName
626679 }
627680 res .bridgeName = intfName
681+ res .gwIface = intfName
628682 }
629- var err error
630683 // Now, we get IP addresses for the bridge
631684 if len (gwIPs ) > 0 {
632685 // use gwIPs if provided
@@ -640,9 +693,11 @@ func bridgeForInterface(intfName, nodeName, physicalNetworkName string, nodeSubn
640693 }
641694 }
642695
643- res .macAddress , err = util .GetOVSPortMACAddress (gwIntf )
644- if err != nil {
645- return nil , fmt .Errorf ("failed to get MAC address for ovs port %s: %w" , gwIntf , err )
696+ if ! isGWAcclInterface { // We do not have an accelerated device for Gateway interface
697+ res .macAddress , err = util .GetOVSPortMACAddress (gwIntf )
698+ if err != nil {
699+ return nil , fmt .Errorf ("failed to get MAC address for ovs port %s: %w" , gwIntf , err )
700+ }
646701 }
647702
648703 res .interfaceID , err = bridgedGatewayNodeSetup (nodeName , res .bridgeName , physicalNetworkName )
@@ -665,6 +720,14 @@ func bridgeForInterface(intfName, nodeName, physicalNetworkName string, nodeSubn
665720 return nil , err
666721 }
667722 }
668-
669723 return & res , nil
670724}
725+
726+ func getRepresentor (intfName string ) (string , error ) {
727+ deviceID , err := util .GetDeviceIDFromNetdevice (intfName )
728+ if err != nil {
729+ return "" , err
730+ }
731+
732+ return util .GetFunctionRepresentorName (deviceID )
733+ }
0 commit comments