Skip to content

Commit

Permalink
ovs: fix mac learning in environments with hairpin enabled (#1943)
Browse files Browse the repository at this point in the history
  • Loading branch information
zhangzujian committed Oct 9, 2022
1 parent aa50a2e commit 903eff0
Show file tree
Hide file tree
Showing 5 changed files with 10 additions and 4 deletions.
2 changes: 2 additions & 0 deletions dist/images/Dockerfile.base
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ RUN cd /usr/src/ && \
curl -s https://github.com/kubeovn/ovs/commit/22ea22c40b46ee5adeae977ff6cfca81b3ff25d7.patch | git apply && \
# add fdb update logging
curl -s https://github.com/kubeovn/ovs/commit/7a7e8e2b5c17d8ae789599db861cf1eafc1c8ffd.patch | git apply && \
# fdb: fix mac learning in environments with hairpin enabled
curl -s https://github.com/kubeovn/ovs/commit/8d661ed4706a60d9bb96be6d9ca20117dde60bcc.patch | git apply && \
./boot.sh && \
rm -rf .git && \
CONFIGURE_OPTS='' && \
Expand Down
3 changes: 3 additions & 0 deletions pkg/daemon/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@ type Configuration struct {
NodeLocalDnsIP string
EncapChecksum bool
EnablePprof bool
MacLearningFallback bool
PprofPort int
NetworkType string
DefaultProviderName string
Expand All @@ -66,6 +67,7 @@ func ParseFlags(nicBridgeMappings map[string]string) (*Configuration, error) {
argEncapChecksum = pflag.Bool("encap-checksum", true, "Enable checksum")
argEnablePprof = pflag.Bool("enable-pprof", false, "Enable pprof")
argPprofPort = pflag.Int("pprof-port", 10665, "The port to get profiling data")
argMacLearningFallback = pflag.Bool("mac-learning-fallback", false, "Fallback to the legacy MAC learning mode")

argsNetworkType = pflag.String("network-type", "geneve", "The ovn network type")
argsDefaultProviderName = pflag.String("default-provider-name", "provider", "The vlan or vxlan type default provider interface name")
Expand Down Expand Up @@ -109,6 +111,7 @@ func ParseFlags(nicBridgeMappings map[string]string) (*Configuration, error) {
KubeConfigFile: *argKubeConfigFile,
EnablePprof: *argEnablePprof,
PprofPort: *argPprofPort,
MacLearningFallback: *argMacLearningFallback,
NodeName: nodeName,
ServiceClusterIPRange: *argServiceClusterIPRange,
NodeLocalDnsIP: *argNodeLocalDnsIP,
Expand Down
2 changes: 1 addition & 1 deletion pkg/daemon/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -291,7 +291,7 @@ func (c *Controller) initProviderNetwork(pn *kubeovnv1.ProviderNetwork, node *v1

var mtu int
var err error
if mtu, err = ovsInitProviderNetwork(pn.Name, nic, pn.Spec.ExchangeLinkName); err != nil {
if mtu, err = ovsInitProviderNetwork(pn.Name, nic, pn.Spec.ExchangeLinkName, c.config.MacLearningFallback); err != nil {
if oldLen := len(node.Labels); oldLen != 0 {
delete(node.Labels, fmt.Sprintf(util.ProviderNetworkReadyTemplate, pn.Name))
delete(node.Labels, fmt.Sprintf(util.ProviderNetworkInterfaceTemplate, pn.Name))
Expand Down
4 changes: 2 additions & 2 deletions pkg/daemon/init.go
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ func changeProvideNicName(current, target string) (bool, error) {
return true, nil
}

func ovsInitProviderNetwork(provider, nic string, exchangeLinkName bool) (int, error) {
func ovsInitProviderNetwork(provider, nic string, exchangeLinkName, macLearningFallback bool) (int, error) {
// create and configure external bridge
brName := util.ExternalBridgeName(provider)
if exchangeLinkName {
Expand All @@ -225,7 +225,7 @@ func ovsInitProviderNetwork(provider, nic string, exchangeLinkName bool) (int, e
}
}

if err := configExternalBridge(provider, brName, nic, exchangeLinkName); err != nil {
if err := configExternalBridge(provider, brName, nic, exchangeLinkName, macLearningFallback); err != nil {
errMsg := fmt.Errorf("failed to create and configure external bridge %s: %v", brName, err)
klog.Error(errMsg)
return 0, errMsg
Expand Down
3 changes: 2 additions & 1 deletion pkg/daemon/ovs.go
Original file line number Diff line number Diff line change
Expand Up @@ -510,12 +510,13 @@ func configureNic(link, ip string, macAddr net.HardwareAddr, mtu int) error {
return nil
}

func configExternalBridge(provider, bridge, nic string, exchangeLinkName bool) error {
func configExternalBridge(provider, bridge, nic string, exchangeLinkName, macLearningFallback bool) error {
brExists, err := ovs.BridgeExists(bridge)
if err != nil {
return fmt.Errorf("failed to check OVS bridge existence: %v", err)
}
output, err := ovs.Exec(ovs.MayExist, "add-br", bridge,
"--", "set", "bridge", bridge, fmt.Sprintf("other_config:mac-learning-fallback=%v", macLearningFallback),
"--", "set", "bridge", bridge, "external_ids:vendor="+util.CniTypeName,
"--", "set", "bridge", bridge, fmt.Sprintf("external_ids:exchange-link-name=%v", exchangeLinkName),
)
Expand Down

0 comments on commit 903eff0

Please sign in to comment.