diff --git a/internal/daemon/vendor-specific-plugins/marvell/debug-dp/debugdp.go b/internal/daemon/vendor-specific-plugins/marvell/debug-dp/debugdp.go index 03ce2c56b..6050c429c 100644 --- a/internal/daemon/vendor-specific-plugins/marvell/debug-dp/debugdp.go +++ b/internal/daemon/vendor-specific-plugins/marvell/debug-dp/debugdp.go @@ -26,7 +26,7 @@ func (debugDP *DebugDP) DeletePortFromDataPlane(bridgeName string, portName stri } -func (debugDP *DebugDP) InitDataPlane(bridgeName string) error { +func (debugDP *DebugDP) InitDataPlane(bridgeName string, isMacLearning bool) error { debugDP.log.Info("Init Data plane", "bridgeName", bridgeName) return nil } diff --git a/internal/daemon/vendor-specific-plugins/marvell/main.go b/internal/daemon/vendor-specific-plugins/marvell/main.go index 039e460cb..bfd098a4e 100644 --- a/internal/daemon/vendor-specific-plugins/marvell/main.go +++ b/internal/daemon/vendor-specific-plugins/marvell/main.go @@ -48,13 +48,14 @@ const ( DpuRpmDeviceID string = "a063" NfName string = "mrvl-nf1" isNf bool = false + isMacLearning bool = true ) // multiple dataplane can be added using mrvldp interface functions type mrvldp interface { AddPortToDataPlane(bridgeName string, portName string, vfPCIAddres string, isDPDK bool) error DeletePortFromDataPlane(bridgeName string, portName string) error - InitDataPlane(bridgeName string) error + InitDataPlane(bridgeName string, isMacLearning bool) error ReadAllPortFromDataPlane(bridgeName string) (string, error) DeleteDataplane(bridgeName string) error AddFlowRuleToDataPlane(bridgeName string, inPort string, outPort string, dstMac string) error @@ -292,7 +293,7 @@ func (vsp *mrvlVspServer) doInit(dpuMode bool) (*pb.IpPort, error) { } // Initialize Marvell Data Path vsp.bridgeName = "br-mrv0" // TODO: example name discuss on it - if err := vsp.mrvlDP.InitDataPlane(vsp.bridgeName); err != nil { + if err := vsp.mrvlDP.InitDataPlane(vsp.bridgeName, isMacLearning); err != nil { klog.Errorf("Error occurred in initializing Data Path: %v", err) vsp.Stop() return nil, err @@ -319,6 +320,8 @@ func (vsp *mrvlVspServer) doInit(dpuMode bool) (*pb.IpPort, error) { // It will return the IpPort and error func (vsp *mrvlVspServer) Init(ctx context.Context, in *pb.InitRequest) (*pb.IpPort, error) { klog.Infof("Received Init() request: DpuMode: %v", in.DpuMode) + // To set the isMacLearning variable from the InitRequest + // vsp.isMacLearning = in.IsMacLearning result, err := vsp.doInit(in.DpuMode) klog.Infof("Received Init() request done: DpuMode: %v, IpPort: %v, err: %v", in.DpuMode, result, err) return result, err diff --git a/internal/daemon/vendor-specific-plugins/marvell/ovs-dp/ovsdp.go b/internal/daemon/vendor-specific-plugins/marvell/ovs-dp/ovsdp.go index b9d907b5c..82b5fe9ce 100644 --- a/internal/daemon/vendor-specific-plugins/marvell/ovs-dp/ovsdp.go +++ b/internal/daemon/vendor-specific-plugins/marvell/ovs-dp/ovsdp.go @@ -83,7 +83,7 @@ func createBridge(bridgeName string) error { } // InitDataPlane initializes the data path in this case it creates an ovs bridge -func (ovsdp *OvsDP) InitDataPlane(bridgeName string) error { +func (ovsdp *OvsDP) InitDataPlane(bridgeName string, isMacLearning bool) error { ovsdp.log.Info("Initializing OVS-DPDK Data Plane") ovsdp.bridgeName = bridgeName // "br0" For Testing Purpose @@ -93,6 +93,24 @@ func (ovsdp *OvsDP) InitDataPlane(bridgeName string) error { } ovsdp.log.Info("OVS-DPDK Bridge Created Successfully", "BridgeName", bridgeName) + + // Modify the default NORMAL flow to have highest priority + if isMacLearning { + ovsdp.log.Info("Modifying NORMAL flow to highest priority") + // First delete the existing NORMAL flow + cmd := exec.Command("chroot", "/host", "ovs-ofctl", "del-flows", bridgeName) + if err := cmd.Run(); err != nil { + ovsdp.log.Error(err, "Error occurred in deleting default NORMAL flow") + return err + } + // Add high priority NORMAL flow + cmd = exec.Command("chroot", "/host", "ovs-ofctl", "add-flow", bridgeName, "priority=65535,actions=NORMAL") + if err := cmd.Run(); err != nil { + ovsdp.log.Error(err, "Error occurred in adding high priority NORMAL flow") + return err + } + ovsdp.log.Info("NORMAL flow priority updated successfully", "Priority", 65535) + } // Get the name of interface from device id with device id as "a063" // a063 is the device id of RPM interface portName, err := mrvlutils.GetNameByDeviceID(deviceId)