blob: 577cdca4b08831b74d2387d2c7ee864ef0cc9b7a [file] [log] [blame]
Naveen Sampath04696f72022-06-13 15:19:14 +05301/*
2* Copyright 2022-present Open Networking Foundation
3* Licensed under the Apache License, Version 2.0 (the "License");
4* you may not use this file except in compliance with the License.
5* You may obtain a copy of the License at
6*
7* http://www.apache.org/licenses/LICENSE-2.0
8*
9* Unless required by applicable law or agreed to in writing, software
10* distributed under the License is distributed on an "AS IS" BASIS,
11* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12* See the License for the specific language governing permissions and
13* limitations under the License.
14 */
15
16package application
17
18import (
Tinoj Joseph07cc5372022-07-18 22:53:51 +053019 "context"
20
Naveen Sampath04696f72022-06-13 15:19:14 +053021 infraerrorcode "voltha-go-controller/internal/pkg/errorcodes/service"
22
23 "voltha-go-controller/internal/pkg/intf"
Tinoj Joseph1d108322022-07-13 10:07:39 +053024 "voltha-go-controller/log"
Naveen Sampath04696f72022-06-13 15:19:14 +053025)
26
vinokuma926cb3e2023-03-29 11:41:06 +053027// Generic Framework to enabling all flow based event trigger and handling.
28// The eventMapper can be updated for dynamic func caller for future events
Naveen Sampath04696f72022-06-13 15:19:14 +053029
vinokuma926cb3e2023-03-29 11:41:06 +053030// FlowEventType - Type of event enumeration
Naveen Sampath04696f72022-06-13 15:19:14 +053031type FlowEventType string
32
vinokuma926cb3e2023-03-29 11:41:06 +053033// FlowEventHandler - Func prototype for flow event handling funcs
Tinoj Joseph07cc5372022-07-18 22:53:51 +053034type FlowEventHandler func(context.Context, *FlowEvent, intf.FlowStatus)
Naveen Sampath04696f72022-06-13 15:19:14 +053035
36var eventMapper map[FlowEventType]FlowEventHandler
37
38const (
vinokuma926cb3e2023-03-29 11:41:06 +053039 // EventTypeUsIgmpFlowAdded - Event type for IGMP US flow add
Naveen Sampath04696f72022-06-13 15:19:14 +053040 EventTypeUsIgmpFlowAdded FlowEventType = "USIgmpFlowAdded"
vinokuma926cb3e2023-03-29 11:41:06 +053041 // EventTypeServiceFlowAdded - Event type for Service flow add
Naveen Sampath04696f72022-06-13 15:19:14 +053042 EventTypeServiceFlowAdded FlowEventType = "ServiceFlowAdded"
vinokuma926cb3e2023-03-29 11:41:06 +053043 // EventTypeControlFlowAdded - Event type for Control flow add
Naveen Sampath04696f72022-06-13 15:19:14 +053044 EventTypeControlFlowAdded FlowEventType = "ControlFlowAdded"
45
vinokuma926cb3e2023-03-29 11:41:06 +053046 // EventTypeDeviceFlowRemoved - Event type for Device flow del
Naveen Sampath04696f72022-06-13 15:19:14 +053047 EventTypeDeviceFlowRemoved FlowEventType = "DeviceFlowRemoved"
vinokuma926cb3e2023-03-29 11:41:06 +053048 // EventTypeMcastFlowRemoved - Event type for Mcast flow del
Naveen Sampath04696f72022-06-13 15:19:14 +053049 EventTypeMcastFlowRemoved FlowEventType = "McastFlowRemoved"
50
vinokuma926cb3e2023-03-29 11:41:06 +053051 // EventTypeServiceFlowRemoved - Event type for Service flow del
Naveen Sampath04696f72022-06-13 15:19:14 +053052 EventTypeServiceFlowRemoved FlowEventType = "ServiceFlowRemoved"
vinokuma926cb3e2023-03-29 11:41:06 +053053 // EventTypeControlFlowRemoved - Event type for Control flow del
Naveen Sampath04696f72022-06-13 15:19:14 +053054 EventTypeControlFlowRemoved FlowEventType = "ControlFlowRemoved"
55)
56
vinokuma926cb3e2023-03-29 11:41:06 +053057// FlowEvent - Event info for Flow event processing
Naveen Sampath04696f72022-06-13 15:19:14 +053058type FlowEvent struct {
vinokuma926cb3e2023-03-29 11:41:06 +053059 eventData interface{}
Naveen Sampath04696f72022-06-13 15:19:14 +053060 device string
61 cookie string
vinokuma926cb3e2023-03-29 11:41:06 +053062 eType FlowEventType
Naveen Sampath04696f72022-06-13 15:19:14 +053063}
64
vinokuma926cb3e2023-03-29 11:41:06 +053065// InitEventFuncMapper - Initialization of flow event mapper
Naveen Sampath04696f72022-06-13 15:19:14 +053066func InitEventFuncMapper() {
67 eventMapper = map[FlowEventType]FlowEventHandler{
68 EventTypeUsIgmpFlowAdded: ProcessUsIgmpFlowAddEvent,
69 EventTypeControlFlowAdded: ProcessControlFlowAddEvent,
70 EventTypeServiceFlowAdded: ProcessServiceFlowAddEvent,
71 EventTypeControlFlowRemoved: ProcessControlFlowDelEvent,
72 EventTypeServiceFlowRemoved: ProcessServiceFlowDelEvent,
73 EventTypeDeviceFlowRemoved: ProcessDeviceFlowDelEvent,
74 EventTypeMcastFlowRemoved: ProcessMcastFlowDelEvent,
75 }
76}
77
vinokuma926cb3e2023-03-29 11:41:06 +053078// ExecuteFlowEvent - Process flow based event triggers
Tinoj Joseph07cc5372022-07-18 22:53:51 +053079func ExecuteFlowEvent(cntx context.Context, vd *VoltDevice, cookie string, flowStatus intf.FlowStatus) bool {
Hitesh Chhabra2b2347d2023-07-31 17:36:48 +053080 logger.Debugw(ctx, "Execute Flow event", log.Fields{"Cookie": cookie, "flowMod": flowStatus.FlowModType})
Naveen Sampath04696f72022-06-13 15:19:14 +053081 var event interface{}
82
83 flowEventMap, err := vd.GetFlowEventRegister(flowStatus.FlowModType)
84 if err != nil {
Hitesh Chhabra2b2347d2023-07-31 17:36:48 +053085 logger.Warnw(ctx, "Flow event map does not exists", log.Fields{"flowMod": flowStatus.FlowModType, "Error": err})
Naveen Sampath04696f72022-06-13 15:19:14 +053086 return false
87 }
88 flowEventMap.MapLock.Lock()
89
90 if event, _ = flowEventMap.Get(cookie); event == nil {
91 logger.Debugw(ctx, "Event already processed or event not registered for the cookie", log.Fields{"Cookie": cookie})
92 flowEventMap.MapLock.Unlock()
93 return false
94 }
95 flowEventMap.Remove(cookie)
96 flowEventMap.MapLock.Unlock()
97 flowEvent := event.(*FlowEvent)
Tinoj Joseph07cc5372022-07-18 22:53:51 +053098 eventMapper[flowEvent.eType](cntx, flowEvent, flowStatus)
Naveen Sampath04696f72022-06-13 15:19:14 +053099 return true
100}
101
vinokuma926cb3e2023-03-29 11:41:06 +0530102// ProcessUsIgmpFlowAddEvent - Process Us Igmp Flow event trigger
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530103func ProcessUsIgmpFlowAddEvent(cntx context.Context, event *FlowEvent, flowStatus intf.FlowStatus) {
Naveen Sampath04696f72022-06-13 15:19:14 +0530104 logger.Infow(ctx, "Processing Post Flow Add Event for US Igmp", log.Fields{"Cookie": event.cookie, "event": event})
105 vpv := event.eventData.(*VoltPortVnet)
106 if isFlowStatusSuccess(flowStatus.Status, true) {
107 vpv.services.Range(ReceiverUpInd)
108 } else {
109 vpv.IgmpFlowInstallFailure(event.cookie, flowStatus.Status, flowStatus.Reason)
110 }
111}
112
vinokuma926cb3e2023-03-29 11:41:06 +0530113// ProcessServiceFlowAddEvent - Process Service Flow event trigger
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530114func ProcessServiceFlowAddEvent(cntx context.Context, event *FlowEvent, flowStatus intf.FlowStatus) {
Naveen Sampath04696f72022-06-13 15:19:14 +0530115 logger.Infow(ctx, "Processing Post Flow Add Event for Service", log.Fields{"Cookie": event.cookie, "event": event})
116 vs := event.eventData.(*VoltService)
117 if isFlowStatusSuccess(flowStatus.Status, true) {
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530118 vs.FlowInstallSuccess(cntx, event.cookie, flowStatus.AdditionalData)
Naveen Sampath04696f72022-06-13 15:19:14 +0530119 } else {
120 vs.FlowInstallFailure(event.cookie, flowStatus.Status, flowStatus.Reason)
121 }
122}
123
vinokuma926cb3e2023-03-29 11:41:06 +0530124// ProcessControlFlowAddEvent - Process Control Flow event trigger
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530125func ProcessControlFlowAddEvent(cntx context.Context, event *FlowEvent, flowStatus intf.FlowStatus) {
Naveen Sampath04696f72022-06-13 15:19:14 +0530126 logger.Infow(ctx, "Processing Post Flow Add Event for VPV", log.Fields{"Cookie": event.cookie, "event": event})
127 vpv := event.eventData.(*VoltPortVnet)
128 if !isFlowStatusSuccess(flowStatus.Status, true) {
129 vpv.FlowInstallFailure(event.cookie, flowStatus.Status, flowStatus.Reason)
130 }
131}
132
vinokuma926cb3e2023-03-29 11:41:06 +0530133// ProcessServiceFlowDelEvent - Process Service Flow event trigger
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530134func ProcessServiceFlowDelEvent(cntx context.Context, event *FlowEvent, flowStatus intf.FlowStatus) {
Naveen Sampath04696f72022-06-13 15:19:14 +0530135 logger.Infow(ctx, "Processing Post Flow Remove Event for Service", log.Fields{"Cookie": event.cookie, "event": event})
136 vs := event.eventData.(*VoltService)
137 if isFlowStatusSuccess(flowStatus.Status, false) {
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530138 vs.FlowRemoveSuccess(cntx, event.cookie)
Naveen Sampath04696f72022-06-13 15:19:14 +0530139 } else {
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530140 vs.FlowRemoveFailure(cntx, event.cookie, flowStatus.Status, flowStatus.Reason)
Naveen Sampath04696f72022-06-13 15:19:14 +0530141 }
142}
143
vinokuma926cb3e2023-03-29 11:41:06 +0530144// ProcessControlFlowDelEvent - Process Control Flow event trigger
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530145func ProcessControlFlowDelEvent(cntx context.Context, event *FlowEvent, flowStatus intf.FlowStatus) {
Naveen Sampath04696f72022-06-13 15:19:14 +0530146 logger.Infow(ctx, "Processing Post Flow Remove Event for VPV", log.Fields{"Cookie": event.cookie, "event": event})
147 vpv := event.eventData.(*VoltPortVnet)
148 if isFlowStatusSuccess(flowStatus.Status, false) {
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530149 vpv.FlowRemoveSuccess(cntx, event.cookie, event.device)
Naveen Sampath04696f72022-06-13 15:19:14 +0530150 } else {
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530151 vpv.FlowRemoveFailure(cntx, event.cookie, event.device, flowStatus.Status, flowStatus.Reason)
Naveen Sampath04696f72022-06-13 15:19:14 +0530152 }
153}
154
vinokuma926cb3e2023-03-29 11:41:06 +0530155// ProcessMcastFlowDelEvent - Process Control Flow event trigger
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530156func ProcessMcastFlowDelEvent(cntx context.Context, event *FlowEvent, flowStatus intf.FlowStatus) {
Naveen Sampath04696f72022-06-13 15:19:14 +0530157 logger.Infow(ctx, "Processing Post Flow Remove Event for Mcast/Igmp", log.Fields{"Cookie": event.cookie, "event": event})
158 mvp := event.eventData.(*MvlanProfile)
159 if isFlowStatusSuccess(flowStatus.Status, false) {
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530160 mvp.FlowRemoveSuccess(cntx, event.cookie, event.device)
Naveen Sampath04696f72022-06-13 15:19:14 +0530161 } else {
162 mvp.FlowRemoveFailure(event.cookie, event.device, flowStatus.Status, flowStatus.Reason)
163 }
164}
165
vinokuma926cb3e2023-03-29 11:41:06 +0530166// ProcessDeviceFlowDelEvent - Process Control Flow event trigger
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530167func ProcessDeviceFlowDelEvent(cntx context.Context, event *FlowEvent, flowStatus intf.FlowStatus) {
Hitesh Chhabra2b2347d2023-07-31 17:36:48 +0530168 logger.Debugw(ctx, "Processing Post Flow Remove Event for VNET", log.Fields{"Cookie": event.cookie, "event": event})
Naveen Sampath04696f72022-06-13 15:19:14 +0530169 vnet := event.eventData.(*VoltVnet)
170 if isFlowStatusSuccess(flowStatus.Status, false) {
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530171 vnet.FlowRemoveSuccess(cntx, event.cookie, event.device)
Naveen Sampath04696f72022-06-13 15:19:14 +0530172 } else {
Tinoj Joseph07cc5372022-07-18 22:53:51 +0530173 vnet.FlowRemoveFailure(cntx, event.cookie, event.device, flowStatus.Status, flowStatus.Reason)
Naveen Sampath04696f72022-06-13 15:19:14 +0530174 }
175}
176
vinokuma926cb3e2023-03-29 11:41:06 +0530177// TODO: Update the func or flowStatus struct once all flow status are based on NB error code
Naveen Sampath04696f72022-06-13 15:19:14 +0530178func isFlowStatusSuccess(status uint32, flowAdd bool) bool {
Hitesh Chhabra2b2347d2023-07-31 17:36:48 +0530179 logger.Infow(ctx, "Processing isFlowStatusSuccess", log.Fields{"Status": status, "FlowAdd": flowAdd})
Naveen Sampath04696f72022-06-13 15:19:14 +0530180 result := false
181 errorCode := infraerrorcode.ErrorCode(status)
182
183 if errorCode == infraerrorcode.ErrOk {
184 result = true
185 } else if !flowAdd && errorCode == infraerrorcode.ErrNotExists {
186 result = true
187 }
188 return result
189}