blob: 5005e0cb593d10c41759b81afdd26102ed46b01a [file] [log] [blame]
khenaidoob9203542018-09-17 22:56:37 -04001/*
2 * Copyright 2018-present Open Networking Foundation
3
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7
8 * http://www.apache.org/licenses/LICENSE-2.0
9
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
npujar1d86a522019-11-14 17:11:16 +053016
Kent Hagerman2b216042020-04-03 18:28:56 -040017package device
khenaidoob9203542018-09-17 22:56:37 -040018
19import (
20 "context"
21 "errors"
Kent Hagerman2b216042020-04-03 18:28:56 -040022 "github.com/opencord/voltha-go/rw_core/utils"
David Bainbridged1afd662020-03-26 18:27:41 -070023 "strings"
24 "sync"
25 "time"
26
sbarbari17d7e222019-11-05 10:02:29 -050027 "github.com/opencord/voltha-go/db/model"
serkant.uluderya2ae470f2020-01-21 11:13:09 -080028 "github.com/opencord/voltha-lib-go/v3/pkg/kafka"
29 "github.com/opencord/voltha-lib-go/v3/pkg/log"
30 "github.com/opencord/voltha-lib-go/v3/pkg/probe"
31 "github.com/opencord/voltha-protos/v3/go/openflow_13"
32 "github.com/opencord/voltha-protos/v3/go/voltha"
khenaidoob9203542018-09-17 22:56:37 -040033 "google.golang.org/grpc/codes"
34 "google.golang.org/grpc/status"
khenaidoob9203542018-09-17 22:56:37 -040035)
36
Kent Hagerman2b216042020-04-03 18:28:56 -040037// LogicalManager represent logical device manager attributes
38type LogicalManager struct {
khenaidoo4c9e5592019-09-09 16:20:41 -040039 logicalDeviceAgents sync.Map
Kent Hagerman2b216042020-04-03 18:28:56 -040040 deviceMgr *Manager
41 eventCallbacks EventCallbacks
npujar467fe752020-01-16 20:17:45 +053042 kafkaICProxy kafka.InterContainerProxy
khenaidoo4c9e5592019-09-09 16:20:41 -040043 clusterDataProxy *model.Proxy
44 exitChannel chan int
khenaidoo442e7c72020-03-10 16:13:48 -040045 defaultTimeout time.Duration
khenaidoo4c9e5592019-09-09 16:20:41 -040046 logicalDevicesLoadingLock sync.RWMutex
47 logicalDeviceLoadingInProgress map[string][]chan int
khenaidoob9203542018-09-17 22:56:37 -040048}
49
Kent Hagerman2b216042020-04-03 18:28:56 -040050type EventCallbacks interface {
51 SendChangeEvent(deviceID string, portStatus *openflow_13.OfpPortStatus)
52 SendPacketIn(deviceID string, transactionID string, packet *openflow_13.OfpPacketIn)
khenaidoob9203542018-09-17 22:56:37 -040053}
54
Kent Hagerman2b216042020-04-03 18:28:56 -040055func (ldMgr *LogicalManager) SetEventCallbacks(callbacks EventCallbacks) {
56 ldMgr.eventCallbacks = callbacks
Richard Jankowskidbab94a2018-12-06 16:20:25 -050057}
58
Kent Hagerman2b216042020-04-03 18:28:56 -040059func (ldMgr *LogicalManager) Start(ctx context.Context) {
Girish Kumarf56a4682020-03-20 20:07:46 +000060 logger.Info("starting-logical-device-manager")
David K. Bainbridgeb4a9ab02019-09-20 15:12:16 -070061 probe.UpdateStatusFromContext(ctx, "logical-device-manager", probe.ServiceStatusRunning)
Girish Kumarf56a4682020-03-20 20:07:46 +000062 logger.Info("logical-device-manager-started")
khenaidoob9203542018-09-17 22:56:37 -040063}
64
Kent Hagerman2b216042020-04-03 18:28:56 -040065func (ldMgr *LogicalManager) Stop(ctx context.Context) {
Girish Kumarf56a4682020-03-20 20:07:46 +000066 logger.Info("stopping-logical-device-manager")
khenaidoob9203542018-09-17 22:56:37 -040067 ldMgr.exitChannel <- 1
David K. Bainbridgeb4a9ab02019-09-20 15:12:16 -070068 probe.UpdateStatusFromContext(ctx, "logical-device-manager", probe.ServiceStatusStopped)
Girish Kumarf56a4682020-03-20 20:07:46 +000069 logger.Info("logical-device-manager-stopped")
khenaidoob9203542018-09-17 22:56:37 -040070}
71
khenaidoo19d7b632018-10-30 10:49:50 -040072func sendAPIResponse(ctx context.Context, ch chan interface{}, result interface{}) {
73 if ctx.Err() == nil {
74 // Returned response only of the ctx has not been cancelled/timeout/etc
75 // Channel is automatically closed when a context is Done
76 ch <- result
Girish Kumarf56a4682020-03-20 20:07:46 +000077 logger.Debugw("sendResponse", log.Fields{"result": result})
khenaidoo19d7b632018-10-30 10:49:50 -040078 } else {
79 // Should the transaction be reverted back?
Girish Kumarf56a4682020-03-20 20:07:46 +000080 logger.Debugw("sendResponse-context-error", log.Fields{"context-error": ctx.Err()})
khenaidoo19d7b632018-10-30 10:49:50 -040081 }
82}
83
Kent Hagerman2b216042020-04-03 18:28:56 -040084func (ldMgr *LogicalManager) addLogicalDeviceAgentToMap(agent *LogicalAgent) {
npujar1d86a522019-11-14 17:11:16 +053085 if _, exist := ldMgr.logicalDeviceAgents.Load(agent.logicalDeviceID); !exist {
86 ldMgr.logicalDeviceAgents.Store(agent.logicalDeviceID, agent)
khenaidoob9203542018-09-17 22:56:37 -040087 }
88}
89
khenaidoo8c3303d2019-02-13 14:59:39 -050090// getLogicalDeviceAgent returns the logical device agent. If the device is not in memory then the device will
91// be loaded from dB and a logical device agent created to managed it.
Kent Hagerman2b216042020-04-03 18:28:56 -040092func (ldMgr *LogicalManager) getLogicalDeviceAgent(ctx context.Context, logicalDeviceID string) *LogicalAgent {
Andrea Campanella09400bd2020-04-02 11:58:04 +020093 logger.Debugw("get-logical-device-agent", log.Fields{"logical-device-id": logicalDeviceID})
npujar1d86a522019-11-14 17:11:16 +053094 agent, ok := ldMgr.logicalDeviceAgents.Load(logicalDeviceID)
95 if ok {
Kent Hagerman2b216042020-04-03 18:28:56 -040096 lda := agent.(*LogicalAgent)
khenaidoo93d5a3d2020-01-15 12:37:05 -050097 if lda.logicalDevice == nil {
98 // This can happen when an agent for the logical device has been created but the logical device
99 // itself is not ready for action as it is waiting for switch and port capabilities from the
100 // relevant adapter. In such a case prevent any request aimed at that logical device.
Girish Kumarf56a4682020-03-20 20:07:46 +0000101 logger.Debugf("Logical device %s is not ready to serve requests", logicalDeviceID)
khenaidoo93d5a3d2020-01-15 12:37:05 -0500102 return nil
103 }
104 return lda
npujar1d86a522019-11-14 17:11:16 +0530105 }
106 // Try to load into memory - loading will also create the logical device agent
npujar467fe752020-01-16 20:17:45 +0530107 if err := ldMgr.load(ctx, logicalDeviceID); err == nil {
npujar1d86a522019-11-14 17:11:16 +0530108 if agent, ok = ldMgr.logicalDeviceAgents.Load(logicalDeviceID); ok {
Kent Hagerman2b216042020-04-03 18:28:56 -0400109 return agent.(*LogicalAgent)
khenaidoo8c3303d2019-02-13 14:59:39 -0500110 }
khenaidoob9203542018-09-17 22:56:37 -0400111 }
112 return nil
113}
114
Kent Hagerman2b216042020-04-03 18:28:56 -0400115func (ldMgr *LogicalManager) deleteLogicalDeviceAgent(logicalDeviceID string) {
npujar1d86a522019-11-14 17:11:16 +0530116 ldMgr.logicalDeviceAgents.Delete(logicalDeviceID)
khenaidoo92e62c52018-10-03 14:02:54 -0400117}
118
khenaidoo8c3303d2019-02-13 14:59:39 -0500119// GetLogicalDevice provides a cloned most up to date logical device. If device is not in memory
120// it will be fetched from the dB
Kent Hagerman2b216042020-04-03 18:28:56 -0400121func (ldMgr *LogicalManager) GetLogicalDevice(ctx context.Context, id string) (*voltha.LogicalDevice, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000122 logger.Debugw("getlogicalDevice", log.Fields{"logicaldeviceid": id})
npujar467fe752020-01-16 20:17:45 +0530123 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400124 return agent.GetLogicalDevice(ctx)
khenaidoob9203542018-09-17 22:56:37 -0400125 }
126 return nil, status.Errorf(codes.NotFound, "%s", id)
127}
128
Kent Hagerman2b216042020-04-03 18:28:56 -0400129//ListLogicalDevices returns the list of all logical devices
130func (ldMgr *LogicalManager) ListLogicalDevices(ctx context.Context) (*voltha.LogicalDevices, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000131 logger.Debug("ListAllLogicalDevices")
Kent Hagerman4f355f52020-03-30 16:01:33 -0400132
133 var logicalDevices []*voltha.LogicalDevice
134 if err := ldMgr.clusterDataProxy.List(ctx, "logical_devices", &logicalDevices); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000135 logger.Errorw("failed-to-list-logical-devices-from-cluster-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530136 return nil, err
137 }
Kent Hagerman4f355f52020-03-30 16:01:33 -0400138 return &voltha.LogicalDevices{Items: logicalDevices}, nil
khenaidoob9203542018-09-17 22:56:37 -0400139}
140
Kent Hagerman2b216042020-04-03 18:28:56 -0400141func (ldMgr *LogicalManager) createLogicalDevice(ctx context.Context, device *voltha.Device) (*string, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000142 logger.Debugw("creating-logical-device", log.Fields{"deviceId": device.Id})
khenaidoob9203542018-09-17 22:56:37 -0400143 // Sanity check
144 if !device.Root {
khenaidoo2c6a0992019-04-29 13:46:56 -0400145 return nil, errors.New("device-not-root")
khenaidoob9203542018-09-17 22:56:37 -0400146 }
147
148 // Create a logical device agent - the logical device Id is based on the mac address of the device
149 // For now use the serial number - it may contain any combination of alphabetic characters and numbers,
150 // with length varying from eight characters to a maximum of 14 characters. Mac Address is part of oneof
151 // in the Device model. May need to be moved out.
Kent Hagerman2b216042020-04-03 18:28:56 -0400152 id := utils.CreateLogicalDeviceID()
David Bainbridged1afd662020-03-26 18:27:41 -0700153 sn := strings.Replace(device.MacAddress, ":", "", -1)
khenaidoo92e62c52018-10-03 14:02:54 -0400154 if id == "" {
David Bainbridged1afd662020-03-26 18:27:41 -0700155 logger.Errorw("mac-address-not-set", log.Fields{"deviceId": device.Id, "serial-number": sn})
khenaidoo92e62c52018-10-03 14:02:54 -0400156 return nil, errors.New("mac-address-not-set")
157 }
David Bainbridged1afd662020-03-26 18:27:41 -0700158
Girish Kumarf56a4682020-03-20 20:07:46 +0000159 logger.Debugw("logical-device-id", log.Fields{"logicaldeviceId": id})
khenaidoob9203542018-09-17 22:56:37 -0400160
David Bainbridged1afd662020-03-26 18:27:41 -0700161 agent := newLogicalDeviceAgent(id, sn, device.Id, ldMgr, ldMgr.deviceMgr, ldMgr.clusterDataProxy, ldMgr.defaultTimeout)
khenaidoob9203542018-09-17 22:56:37 -0400162 ldMgr.addLogicalDeviceAgentToMap(agent)
khenaidooad06fd72019-10-28 12:26:05 -0400163
164 // Update the root device with the logical device Id reference
npujar467fe752020-01-16 20:17:45 +0530165 if err := ldMgr.deviceMgr.setParentID(ctx, device, id); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000166 logger.Errorw("failed-setting-parent-id", log.Fields{"logicalDeviceId": id, "deviceId": device.Id})
khenaidooad06fd72019-10-28 12:26:05 -0400167 return nil, err
168 }
169
npujar1d86a522019-11-14 17:11:16 +0530170 go func() {
khenaidoo442e7c72020-03-10 16:13:48 -0400171 //agent := newLogicalDeviceAgent(id, device.Id, ldMgr, ldMgr.deviceMgr, ldMgr.clusterDataProxy, ldMgr.defaultTimeout)
172 err := agent.start(context.Background(), false)
npujar1d86a522019-11-14 17:11:16 +0530173 if err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000174 logger.Errorw("unable-to-create-the-logical-device", log.Fields{"error": err})
khenaidoo442e7c72020-03-10 16:13:48 -0400175 ldMgr.deleteLogicalDeviceAgent(id)
npujar1d86a522019-11-14 17:11:16 +0530176 }
177 }()
khenaidoob9203542018-09-17 22:56:37 -0400178
Girish Kumarf56a4682020-03-20 20:07:46 +0000179 logger.Debug("creating-logical-device-ends")
khenaidoob9203542018-09-17 22:56:37 -0400180 return &id, nil
181}
182
khenaidoo6d62c002019-05-15 21:57:03 -0400183// stopManagingLogicalDeviceWithDeviceId stops the management of the logical device. This implies removal of any
184// reference of this logical device in cache. The device Id is passed as param because the logical device may already
185// have been removed from the model. This function returns the logical device Id if found
Kent Hagerman2b216042020-04-03 18:28:56 -0400186func (ldMgr *LogicalManager) stopManagingLogicalDeviceWithDeviceID(ctx context.Context, id string) string {
Girish Kumarf56a4682020-03-20 20:07:46 +0000187 logger.Infow("stop-managing-logical-device", log.Fields{"deviceId": id})
khenaidoo6d62c002019-05-15 21:57:03 -0400188 // Go over the list of logical device agents to find the one which has rootDeviceId as id
npujar1d86a522019-11-14 17:11:16 +0530189 var ldID = ""
Stephane Barbarieef6650d2019-07-18 12:15:09 -0400190 ldMgr.logicalDeviceAgents.Range(func(key, value interface{}) bool {
Kent Hagerman2b216042020-04-03 18:28:56 -0400191 ldAgent := value.(*LogicalAgent)
npujar1d86a522019-11-14 17:11:16 +0530192 if ldAgent.rootDeviceID == id {
Girish Kumarf56a4682020-03-20 20:07:46 +0000193 logger.Infow("stopping-logical-device-agent", log.Fields{"lDeviceId": key})
npujar467fe752020-01-16 20:17:45 +0530194 if err := ldAgent.stop(ctx); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000195 logger.Errorw("failed-to-stop-LDAgent", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530196 return false
197 }
npujar1d86a522019-11-14 17:11:16 +0530198 ldID = key.(string)
199 ldMgr.logicalDeviceAgents.Delete(ldID)
khenaidoo6d62c002019-05-15 21:57:03 -0400200 }
Stephane Barbarieef6650d2019-07-18 12:15:09 -0400201 return true
202 })
npujar1d86a522019-11-14 17:11:16 +0530203 return ldID
khenaidoo6d62c002019-05-15 21:57:03 -0400204}
205
206//getLogicalDeviceFromModel retrieves the logical device data from the model.
Kent Hagerman2b216042020-04-03 18:28:56 -0400207func (ldMgr *LogicalManager) getLogicalDeviceFromModel(ctx context.Context, lDeviceID string) (*voltha.LogicalDevice, error) {
Kent Hagerman4f355f52020-03-30 16:01:33 -0400208 logicalDevice := &voltha.LogicalDevice{}
209 if have, err := ldMgr.clusterDataProxy.Get(ctx, "logical_devices/"+lDeviceID, logicalDevice); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000210 logger.Errorw("failed-to-get-logical-devices-from-cluster-proxy", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530211 return nil, err
Kent Hagerman4f355f52020-03-30 16:01:33 -0400212 } else if !have {
213 return nil, status.Error(codes.NotFound, lDeviceID)
Thomas Lee Se5a44012019-11-07 20:32:24 +0530214 }
Kent Hagerman4f355f52020-03-30 16:01:33 -0400215
216 return logicalDevice, nil
khenaidoo6d62c002019-05-15 21:57:03 -0400217}
218
khenaidoo297cd252019-02-07 22:10:23 -0500219// load loads a logical device manager in memory
Kent Hagerman2b216042020-04-03 18:28:56 -0400220func (ldMgr *LogicalManager) load(ctx context.Context, lDeviceID string) error {
npujar1d86a522019-11-14 17:11:16 +0530221 if lDeviceID == "" {
khenaidoo4c9e5592019-09-09 16:20:41 -0400222 return nil
khenaidoo297cd252019-02-07 22:10:23 -0500223 }
khenaidoo4c9e5592019-09-09 16:20:41 -0400224 // Add a lock to prevent two concurrent calls from loading the same device twice
225 ldMgr.logicalDevicesLoadingLock.Lock()
npujar1d86a522019-11-14 17:11:16 +0530226 if _, exist := ldMgr.logicalDeviceLoadingInProgress[lDeviceID]; !exist {
227 if ldAgent, _ := ldMgr.logicalDeviceAgents.Load(lDeviceID); ldAgent == nil {
228 ldMgr.logicalDeviceLoadingInProgress[lDeviceID] = []chan int{make(chan int, 1)}
khenaidoo4c9e5592019-09-09 16:20:41 -0400229 ldMgr.logicalDevicesLoadingLock.Unlock()
npujar467fe752020-01-16 20:17:45 +0530230 if _, err := ldMgr.getLogicalDeviceFromModel(ctx, lDeviceID); err == nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000231 logger.Debugw("loading-logical-device", log.Fields{"lDeviceId": lDeviceID})
David Bainbridged1afd662020-03-26 18:27:41 -0700232 agent := newLogicalDeviceAgent(lDeviceID, "", "", ldMgr, ldMgr.deviceMgr, ldMgr.clusterDataProxy, ldMgr.defaultTimeout)
npujar467fe752020-01-16 20:17:45 +0530233 if err := agent.start(ctx, true); err != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400234 return err
khenaidoo4c9e5592019-09-09 16:20:41 -0400235 }
khenaidoo442e7c72020-03-10 16:13:48 -0400236 ldMgr.logicalDeviceAgents.Store(agent.logicalDeviceID, agent)
khenaidoo4c9e5592019-09-09 16:20:41 -0400237 } else {
Girish Kumarf56a4682020-03-20 20:07:46 +0000238 logger.Debugw("logicalDevice not in model", log.Fields{"lDeviceId": lDeviceID})
khenaidoo4c9e5592019-09-09 16:20:41 -0400239 }
240 // announce completion of task to any number of waiting channels
241 ldMgr.logicalDevicesLoadingLock.Lock()
npujar1d86a522019-11-14 17:11:16 +0530242 if v, ok := ldMgr.logicalDeviceLoadingInProgress[lDeviceID]; ok {
khenaidoo4c9e5592019-09-09 16:20:41 -0400243 for _, ch := range v {
244 close(ch)
245 }
npujar1d86a522019-11-14 17:11:16 +0530246 delete(ldMgr.logicalDeviceLoadingInProgress, lDeviceID)
khenaidoo4c9e5592019-09-09 16:20:41 -0400247 }
248 ldMgr.logicalDevicesLoadingLock.Unlock()
249 } else {
250 ldMgr.logicalDevicesLoadingLock.Unlock()
251 }
252 } else {
253 ch := make(chan int, 1)
npujar1d86a522019-11-14 17:11:16 +0530254 ldMgr.logicalDeviceLoadingInProgress[lDeviceID] = append(ldMgr.logicalDeviceLoadingInProgress[lDeviceID], ch)
khenaidoo4c9e5592019-09-09 16:20:41 -0400255 ldMgr.logicalDevicesLoadingLock.Unlock()
256 // Wait for the channel to be closed, implying the process loading this device is done.
257 <-ch
258 }
npujar1d86a522019-11-14 17:11:16 +0530259 if _, exist := ldMgr.logicalDeviceAgents.Load(lDeviceID); exist {
khenaidoo4c9e5592019-09-09 16:20:41 -0400260 return nil
261 }
npujar1d86a522019-11-14 17:11:16 +0530262 return status.Errorf(codes.Aborted, "Error loading logical device %s", lDeviceID)
khenaidoo297cd252019-02-07 22:10:23 -0500263}
264
Kent Hagerman2b216042020-04-03 18:28:56 -0400265func (ldMgr *LogicalManager) deleteLogicalDevice(ctx context.Context, device *voltha.Device) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000266 logger.Debugw("deleting-logical-device", log.Fields{"deviceId": device.Id})
khenaidoo92e62c52018-10-03 14:02:54 -0400267 // Sanity check
268 if !device.Root {
khenaidoo2c6a0992019-04-29 13:46:56 -0400269 return errors.New("device-not-root")
khenaidoo92e62c52018-10-03 14:02:54 -0400270 }
npujar1d86a522019-11-14 17:11:16 +0530271 logDeviceID := device.ParentId
npujar467fe752020-01-16 20:17:45 +0530272 if agent := ldMgr.getLogicalDeviceAgent(ctx, logDeviceID); agent != nil {
khenaidoo92e62c52018-10-03 14:02:54 -0400273 // Stop the logical device agent
Thomas Lee Se5a44012019-11-07 20:32:24 +0530274 if err := agent.stop(ctx); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000275 logger.Errorw("failed-to-stop-agent", log.Fields{"error": err})
Thomas Lee Se5a44012019-11-07 20:32:24 +0530276 return err
277 }
khenaidoo92e62c52018-10-03 14:02:54 -0400278 //Remove the logical device agent from the Map
npujar1d86a522019-11-14 17:11:16 +0530279 ldMgr.deleteLogicalDeviceAgent(logDeviceID)
khenaidoo92e62c52018-10-03 14:02:54 -0400280 }
281
Girish Kumarf56a4682020-03-20 20:07:46 +0000282 logger.Debug("deleting-logical-device-ends")
khenaidoo92e62c52018-10-03 14:02:54 -0400283 return nil
284}
285
Kent Hagerman2b216042020-04-03 18:28:56 -0400286func (ldMgr *LogicalManager) getLogicalDeviceID(ctx context.Context, device *voltha.Device) (*string, error) {
khenaidoo92e62c52018-10-03 14:02:54 -0400287 // Device can either be a parent or a child device
288 if device.Root {
289 // Parent device. The ID of a parent device is the logical device ID
290 return &device.ParentId, nil
291 }
292 // Device is child device
293 // retrieve parent device using child device ID
npujar467fe752020-01-16 20:17:45 +0530294 if parentDevice := ldMgr.deviceMgr.getParentDevice(ctx, device); parentDevice != nil {
khenaidoo92e62c52018-10-03 14:02:54 -0400295 return &parentDevice.ParentId, nil
296 }
297 return nil, status.Errorf(codes.NotFound, "%s", device.Id)
298}
299
Kent Hagerman2b216042020-04-03 18:28:56 -0400300func (ldMgr *LogicalManager) getLogicalDeviceIDFromDeviceID(ctx context.Context, deviceID string) (*string, error) {
khenaidoo3ab34882019-05-02 21:33:30 -0400301 // Get the device
302 var device *voltha.Device
303 var err error
npujar467fe752020-01-16 20:17:45 +0530304 if device, err = ldMgr.deviceMgr.GetDevice(ctx, deviceID); err != nil {
khenaidoo3ab34882019-05-02 21:33:30 -0400305 return nil, err
306 }
npujar467fe752020-01-16 20:17:45 +0530307 return ldMgr.getLogicalDeviceID(ctx, device)
khenaidoo3ab34882019-05-02 21:33:30 -0400308}
309
Kent Hagerman2b216042020-04-03 18:28:56 -0400310func (ldMgr *LogicalManager) getLogicalPortID(ctx context.Context, device *voltha.Device) (*voltha.LogicalPortId, error) {
khenaidoo19d7b632018-10-30 10:49:50 -0400311 // Get the logical device where this device is attached
npujar1d86a522019-11-14 17:11:16 +0530312 var lDeviceID *string
khenaidoo19d7b632018-10-30 10:49:50 -0400313 var err error
npujar467fe752020-01-16 20:17:45 +0530314 if lDeviceID, err = ldMgr.getLogicalDeviceID(ctx, device); err != nil {
khenaidoo19d7b632018-10-30 10:49:50 -0400315 return nil, err
316 }
317 var lDevice *voltha.LogicalDevice
Kent Hagerman2b216042020-04-03 18:28:56 -0400318 if lDevice, err = ldMgr.GetLogicalDevice(ctx, *lDeviceID); err != nil {
khenaidoo19d7b632018-10-30 10:49:50 -0400319 return nil, err
320 }
321 // Go over list of ports
322 for _, port := range lDevice.Ports {
323 if port.DeviceId == device.Id {
npujar1d86a522019-11-14 17:11:16 +0530324 return &voltha.LogicalPortId{Id: *lDeviceID, PortId: port.Id}, nil
khenaidoo19d7b632018-10-30 10:49:50 -0400325 }
326 }
327 return nil, status.Errorf(codes.NotFound, "%s", device.Id)
328}
329
npujar1d86a522019-11-14 17:11:16 +0530330// ListLogicalDeviceFlows returns the flows of logical device
Kent Hagerman2b216042020-04-03 18:28:56 -0400331func (ldMgr *LogicalManager) ListLogicalDeviceFlows(ctx context.Context, id string) (*openflow_13.Flows, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000332 logger.Debugw("ListLogicalDeviceFlows", log.Fields{"logicaldeviceid": id})
npujar467fe752020-01-16 20:17:45 +0530333 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400334 return agent.ListLogicalDeviceFlows(ctx)
khenaidoodd237172019-05-27 16:37:17 -0400335 }
336 return nil, status.Errorf(codes.NotFound, "%s", id)
337}
338
npujar1d86a522019-11-14 17:11:16 +0530339// ListLogicalDeviceFlowGroups returns logical device flow groups
Kent Hagerman2b216042020-04-03 18:28:56 -0400340func (ldMgr *LogicalManager) ListLogicalDeviceFlowGroups(ctx context.Context, id string) (*openflow_13.FlowGroups, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000341 logger.Debugw("ListLogicalDeviceFlowGroups", log.Fields{"logicaldeviceid": id})
npujar467fe752020-01-16 20:17:45 +0530342 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400343 return agent.ListLogicalDeviceFlowGroups(ctx)
khenaidoodd237172019-05-27 16:37:17 -0400344 }
345 return nil, status.Errorf(codes.NotFound, "%s", id)
346}
347
npujar1d86a522019-11-14 17:11:16 +0530348// ListLogicalDevicePorts returns logical device ports
Kent Hagerman2b216042020-04-03 18:28:56 -0400349func (ldMgr *LogicalManager) ListLogicalDevicePorts(ctx context.Context, id string) (*voltha.LogicalPorts, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000350 logger.Debugw("ListLogicalDevicePorts", log.Fields{"logicaldeviceid": id})
npujar467fe752020-01-16 20:17:45 +0530351 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400352 return agent.ListLogicalDevicePorts(ctx)
khenaidoo19d7b632018-10-30 10:49:50 -0400353 }
354 return nil, status.Errorf(codes.NotFound, "%s", id)
khenaidoo19d7b632018-10-30 10:49:50 -0400355}
356
Kent Hagerman2b216042020-04-03 18:28:56 -0400357func (ldMgr *LogicalManager) GetLogicalPort(ctx context.Context, lPortID *voltha.LogicalPortId) (*voltha.LogicalPort, error) {
khenaidoo19d7b632018-10-30 10:49:50 -0400358 // Get the logical device where this device is attached
359 var err error
360 var lDevice *voltha.LogicalDevice
Kent Hagerman2b216042020-04-03 18:28:56 -0400361 if lDevice, err = ldMgr.GetLogicalDevice(ctx, lPortID.Id); err != nil {
khenaidoo19d7b632018-10-30 10:49:50 -0400362 return nil, err
363 }
364 // Go over list of ports
365 for _, port := range lDevice.Ports {
npujar1d86a522019-11-14 17:11:16 +0530366 if port.Id == lPortID.PortId {
khenaidoo19d7b632018-10-30 10:49:50 -0400367 return port, nil
368 }
369 }
npujar1d86a522019-11-14 17:11:16 +0530370 return nil, status.Errorf(codes.NotFound, "%s-%s", lPortID.Id, lPortID.PortId)
khenaidoo19d7b632018-10-30 10:49:50 -0400371}
372
khenaidoo2c6a0992019-04-29 13:46:56 -0400373// updateLogicalPort sets up a logical port on the logical device based on the device port
374// information, if needed
Kent Hagerman2b216042020-04-03 18:28:56 -0400375func (ldMgr *LogicalManager) updateLogicalPort(ctx context.Context, device *voltha.Device, port *voltha.Port) error {
npujar467fe752020-01-16 20:17:45 +0530376 ldID, err := ldMgr.getLogicalDeviceID(ctx, device)
npujar1d86a522019-11-14 17:11:16 +0530377 if err != nil || *ldID == "" {
khenaidoo2c6a0992019-04-29 13:46:56 -0400378 // This is not an error as the logical device may not have been created at this time. In such a case,
379 // the ports will be created when the logical device is ready.
380 return nil
khenaidoo2c6a0992019-04-29 13:46:56 -0400381 }
npujar467fe752020-01-16 20:17:45 +0530382 if agent := ldMgr.getLogicalDeviceAgent(ctx, *ldID); agent != nil {
383 if err := agent.updateLogicalPort(ctx, device, port); err != nil {
npujar1d86a522019-11-14 17:11:16 +0530384 return err
khenaidoofc1314d2019-03-14 09:34:21 -0400385 }
386 }
387 return nil
388}
389
khenaidoo0a822f92019-05-08 15:15:57 -0400390// deleteLogicalPort removes the logical port associated with a device
Kent Hagerman2b216042020-04-03 18:28:56 -0400391func (ldMgr *LogicalManager) deleteLogicalPort(ctx context.Context, lPortID *voltha.LogicalPortId) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000392 logger.Debugw("deleting-logical-port", log.Fields{"LDeviceId": lPortID.Id})
khenaidoo19d7b632018-10-30 10:49:50 -0400393 // Get logical port
394 var logicalPort *voltha.LogicalPort
395 var err error
Kent Hagerman2b216042020-04-03 18:28:56 -0400396 if logicalPort, err = ldMgr.GetLogicalPort(ctx, lPortID); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000397 logger.Debugw("no-logical-device-port-present", log.Fields{"logicalPortId": lPortID.PortId})
khenaidoo19d7b632018-10-30 10:49:50 -0400398 return err
399 }
khenaidoo92e62c52018-10-03 14:02:54 -0400400 // Sanity check
khenaidoo19d7b632018-10-30 10:49:50 -0400401 if logicalPort.RootPort {
khenaidoo2c6a0992019-04-29 13:46:56 -0400402 return errors.New("device-root")
khenaidoo92e62c52018-10-03 14:02:54 -0400403 }
npujar467fe752020-01-16 20:17:45 +0530404 if agent := ldMgr.getLogicalDeviceAgent(ctx, lPortID.Id); agent != nil {
405 if err := agent.deleteLogicalPort(ctx, logicalPort); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000406 logger.Warnw("deleting-logicalport-failed", log.Fields{"LDeviceId": lPortID.Id, "error": err})
khenaidoo0a822f92019-05-08 15:15:57 -0400407 }
khenaidoo92e62c52018-10-03 14:02:54 -0400408 }
409
Girish Kumarf56a4682020-03-20 20:07:46 +0000410 logger.Debug("deleting-logical-port-ends")
khenaidoo92e62c52018-10-03 14:02:54 -0400411 return nil
412}
413
khenaidoo0a822f92019-05-08 15:15:57 -0400414// deleteLogicalPort removes the logical port associated with a child device
Kent Hagerman2b216042020-04-03 18:28:56 -0400415func (ldMgr *LogicalManager) deleteLogicalPorts(ctx context.Context, deviceID string) error {
Andrea Campanella09400bd2020-04-02 11:58:04 +0200416 logger.Debugw("deleting-logical-ports", log.Fields{"device-id": deviceID})
khenaidoo0a822f92019-05-08 15:15:57 -0400417 // Get logical port
npujar467fe752020-01-16 20:17:45 +0530418 ldID, err := ldMgr.getLogicalDeviceIDFromDeviceID(ctx, deviceID)
npujar1d86a522019-11-14 17:11:16 +0530419 if err != nil {
khenaidoo0a822f92019-05-08 15:15:57 -0400420 return err
npujar1d86a522019-11-14 17:11:16 +0530421 }
npujar467fe752020-01-16 20:17:45 +0530422 if agent := ldMgr.getLogicalDeviceAgent(ctx, *ldID); agent != nil {
423 if err = agent.deleteLogicalPorts(ctx, deviceID); err != nil {
Andrea Campanella09400bd2020-04-02 11:58:04 +0200424 logger.Warnw("delete-logical-ports-failed", log.Fields{"logical-device-id": *ldID})
npujar1d86a522019-11-14 17:11:16 +0530425 return err
khenaidoo0a822f92019-05-08 15:15:57 -0400426 }
427 }
Andrea Campanella09400bd2020-04-02 11:58:04 +0200428 logger.Debug("deleting-logical-ports-ends")
khenaidoo0a822f92019-05-08 15:15:57 -0400429 return nil
430}
431
Kent Hagerman2b216042020-04-03 18:28:56 -0400432func (ldMgr *LogicalManager) setupUNILogicalPorts(ctx context.Context, childDevice *voltha.Device) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000433 logger.Debugw("setupUNILogicalPorts", log.Fields{"childDeviceId": childDevice.Id, "parentDeviceId": childDevice.ParentId, "current-data": childDevice})
khenaidoob9203542018-09-17 22:56:37 -0400434 // Sanity check
435 if childDevice.Root {
436 return errors.New("Device-root")
437 }
438
439 // Get the logical device id parent device
npujar1d86a522019-11-14 17:11:16 +0530440 parentID := childDevice.ParentId
npujar467fe752020-01-16 20:17:45 +0530441 logDeviceID := ldMgr.deviceMgr.GetParentDeviceID(ctx, parentID)
khenaidoob9203542018-09-17 22:56:37 -0400442
Girish Kumarf56a4682020-03-20 20:07:46 +0000443 logger.Debugw("setupUNILogicalPorts", log.Fields{"logDeviceId": logDeviceID, "parentId": parentID})
khenaidoob9203542018-09-17 22:56:37 -0400444
npujar1d86a522019-11-14 17:11:16 +0530445 if parentID == "" || logDeviceID == "" {
khenaidoo2c6a0992019-04-29 13:46:56 -0400446 return errors.New("device-in-invalid-state")
khenaidoo5e677ae2019-02-28 17:26:29 -0500447 }
448
npujar467fe752020-01-16 20:17:45 +0530449 if agent := ldMgr.getLogicalDeviceAgent(ctx, logDeviceID); agent != nil {
khenaidoofc1314d2019-03-14 09:34:21 -0400450 if err := agent.setupUNILogicalPorts(ctx, childDevice); err != nil {
khenaidoobcf205b2019-01-25 22:21:14 -0500451 return err
452 }
khenaidoob9203542018-09-17 22:56:37 -0400453 }
khenaidoo21d51152019-02-01 13:48:37 -0500454 return nil
khenaidoob9203542018-09-17 22:56:37 -0400455}
khenaidoo19d7b632018-10-30 10:49:50 -0400456
Kent Hagerman2b216042020-04-03 18:28:56 -0400457func (ldMgr *LogicalManager) deleteAllLogicalPorts(ctx context.Context, device *voltha.Device) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000458 logger.Debugw("deleteAllLogicalPorts", log.Fields{"deviceId": device.Id})
khenaidoo0a822f92019-05-08 15:15:57 -0400459
npujar1d86a522019-11-14 17:11:16 +0530460 var ldID *string
khenaidoo0a822f92019-05-08 15:15:57 -0400461 var err error
462 //Get the logical device Id for this device
npujar467fe752020-01-16 20:17:45 +0530463 if ldID, err = ldMgr.getLogicalDeviceID(ctx, device); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000464 logger.Warnw("no-logical-device-found", log.Fields{"deviceId": device.Id, "error": err})
khenaidoo0a822f92019-05-08 15:15:57 -0400465 return err
466 }
npujar467fe752020-01-16 20:17:45 +0530467 if agent := ldMgr.getLogicalDeviceAgent(ctx, *ldID); agent != nil {
Girish Gowdra408cd962020-03-11 14:31:31 -0700468 if err := agent.deleteAllLogicalPorts(ctx); err != nil {
khenaidoo0a822f92019-05-08 15:15:57 -0400469 return err
470 }
471 }
472 return nil
473}
Hardik Windlassc704def2020-02-26 18:23:19 +0000474
Kent Hagerman2b216042020-04-03 18:28:56 -0400475func (ldMgr *LogicalManager) deleteAllUNILogicalPorts(ctx context.Context, parentDevice *voltha.Device) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000476 logger.Debugw("delete-all-uni-logical-ports", log.Fields{"parent-device-id": parentDevice.Id})
Hardik Windlassc704def2020-02-26 18:23:19 +0000477
478 var ldID *string
479 var err error
480 //Get the logical device Id for this device
481 if ldID, err = ldMgr.getLogicalDeviceID(ctx, parentDevice); err != nil {
482 return err
483 }
484 if agent := ldMgr.getLogicalDeviceAgent(ctx, *ldID); agent != nil {
485 if err := agent.deleteAllUNILogicalPorts(ctx, parentDevice); err != nil {
486 return err
487 }
488 }
489 return nil
490}
491
Kent Hagerman2b216042020-04-03 18:28:56 -0400492func (ldMgr *LogicalManager) updatePortState(ctx context.Context, deviceID string, portNo uint32, state voltha.OperStatus_Types) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000493 logger.Debugw("updatePortState", log.Fields{"deviceId": deviceID, "state": state, "portNo": portNo})
khenaidoo171b98e2019-10-31 11:48:15 -0400494
npujar1d86a522019-11-14 17:11:16 +0530495 var ldID *string
khenaidoo171b98e2019-10-31 11:48:15 -0400496 var err error
497 //Get the logical device Id for this device
npujar467fe752020-01-16 20:17:45 +0530498 if ldID, err = ldMgr.getLogicalDeviceIDFromDeviceID(ctx, deviceID); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000499 logger.Warnw("no-logical-device-found", log.Fields{"deviceId": deviceID, "error": err})
khenaidoo171b98e2019-10-31 11:48:15 -0400500 return err
501 }
npujar467fe752020-01-16 20:17:45 +0530502 if agent := ldMgr.getLogicalDeviceAgent(ctx, *ldID); agent != nil {
503 if err := agent.updatePortState(ctx, deviceID, portNo, state); err != nil {
khenaidoo171b98e2019-10-31 11:48:15 -0400504 return err
505 }
506 }
507 return nil
508}
khenaidoo0a822f92019-05-08 15:15:57 -0400509
Kent Hagerman2b216042020-04-03 18:28:56 -0400510func (ldMgr *LogicalManager) updatePortsState(ctx context.Context, device *voltha.Device, state voltha.OperStatus_Types) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000511 logger.Debugw("updatePortsState", log.Fields{"deviceId": device.Id, "state": state, "current-data": device})
khenaidoo3ab34882019-05-02 21:33:30 -0400512
npujar1d86a522019-11-14 17:11:16 +0530513 var ldID *string
khenaidoo3ab34882019-05-02 21:33:30 -0400514 var err error
515 //Get the logical device Id for this device
npujar467fe752020-01-16 20:17:45 +0530516 if ldID, err = ldMgr.getLogicalDeviceID(ctx, device); err != nil {
Girish Kumarf56a4682020-03-20 20:07:46 +0000517 logger.Warnw("no-logical-device-found", log.Fields{"deviceId": device.Id, "error": err})
khenaidoo3ab34882019-05-02 21:33:30 -0400518 return err
519 }
npujar467fe752020-01-16 20:17:45 +0530520 if agent := ldMgr.getLogicalDeviceAgent(ctx, *ldID); agent != nil {
521 if err := agent.updatePortsState(ctx, device, state); err != nil {
khenaidoo3ab34882019-05-02 21:33:30 -0400522 return err
523 }
524 }
525 return nil
526}
527
Kent Hagerman2b216042020-04-03 18:28:56 -0400528func (ldMgr *LogicalManager) UpdateFlowTable(ctx context.Context, id string, flow *openflow_13.OfpFlowMod, ch chan interface{}) {
529 logger.Debugw("UpdateFlowTable", log.Fields{"logicalDeviceId": id})
khenaidoo19d7b632018-10-30 10:49:50 -0400530 var res interface{}
npujar467fe752020-01-16 20:17:45 +0530531 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
khenaidoo19d7b632018-10-30 10:49:50 -0400532 res = agent.updateFlowTable(ctx, flow)
Kent Hagerman2b216042020-04-03 18:28:56 -0400533 logger.Debugw("UpdateFlowTable-result", log.Fields{"result": res})
khenaidoo19d7b632018-10-30 10:49:50 -0400534 } else {
535 res = status.Errorf(codes.NotFound, "%s", id)
536 }
537 sendAPIResponse(ctx, ch, res)
538}
539
Kent Hagerman2b216042020-04-03 18:28:56 -0400540func (ldMgr *LogicalManager) UpdateMeterTable(ctx context.Context, id string, meter *openflow_13.OfpMeterMod, ch chan interface{}) {
541 logger.Debugw("UpdateMeterTable", log.Fields{"logicalDeviceId": id})
Manikkaraj kb1a10922019-07-29 12:10:34 -0400542 var res interface{}
npujar467fe752020-01-16 20:17:45 +0530543 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
Manikkaraj kb1a10922019-07-29 12:10:34 -0400544 res = agent.updateMeterTable(ctx, meter)
Kent Hagerman2b216042020-04-03 18:28:56 -0400545 logger.Debugw("UpdateMeterTable-result", log.Fields{"result": res})
Manikkaraj kb1a10922019-07-29 12:10:34 -0400546 } else {
547 res = status.Errorf(codes.NotFound, "%s", id)
548 }
549 sendAPIResponse(ctx, ch, res)
550}
551
npujar1d86a522019-11-14 17:11:16 +0530552// ListLogicalDeviceMeters returns logical device meters
Kent Hagerman2b216042020-04-03 18:28:56 -0400553func (ldMgr *LogicalManager) ListLogicalDeviceMeters(ctx context.Context, id string) (*openflow_13.Meters, error) {
Girish Kumarf56a4682020-03-20 20:07:46 +0000554 logger.Debugw("ListLogicalDeviceMeters", log.Fields{"logicalDeviceId": id})
npujar467fe752020-01-16 20:17:45 +0530555 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
khenaidoo442e7c72020-03-10 16:13:48 -0400556 return agent.ListLogicalDeviceMeters(ctx)
Manikkaraj kb1a10922019-07-29 12:10:34 -0400557 }
558 return nil, status.Errorf(codes.NotFound, "%s", id)
559}
Kent Hagerman2b216042020-04-03 18:28:56 -0400560func (ldMgr *LogicalManager) UpdateGroupTable(ctx context.Context, id string, groupMod *openflow_13.OfpGroupMod, ch chan interface{}) {
561 logger.Debugw("UpdateGroupTable", log.Fields{"logicalDeviceId": id})
khenaidoo19d7b632018-10-30 10:49:50 -0400562 var res interface{}
npujar467fe752020-01-16 20:17:45 +0530563 if agent := ldMgr.getLogicalDeviceAgent(ctx, id); agent != nil {
khenaidoo19d7b632018-10-30 10:49:50 -0400564 res = agent.updateGroupTable(ctx, groupMod)
Kent Hagerman2b216042020-04-03 18:28:56 -0400565 logger.Debugw("UpdateGroupTable-result", log.Fields{"result": res})
khenaidoo19d7b632018-10-30 10:49:50 -0400566 } else {
567 res = status.Errorf(codes.NotFound, "%s", id)
568 }
569 sendAPIResponse(ctx, ch, res)
570}
571
Kent Hagerman2b216042020-04-03 18:28:56 -0400572func (ldMgr *LogicalManager) EnableLogicalPort(ctx context.Context, id *voltha.LogicalPortId, ch chan interface{}) {
573 logger.Debugw("EnableLogicalPort", log.Fields{"logicalDeviceId": id})
khenaidoo19d7b632018-10-30 10:49:50 -0400574 var res interface{}
npujar467fe752020-01-16 20:17:45 +0530575 if agent := ldMgr.getLogicalDeviceAgent(ctx, id.Id); agent != nil {
576 res = agent.enableLogicalPort(ctx, id.PortId)
Kent Hagerman2b216042020-04-03 18:28:56 -0400577 logger.Debugw("EnableLogicalPort-result", log.Fields{"result": res})
khenaidoo19d7b632018-10-30 10:49:50 -0400578 } else {
579 res = status.Errorf(codes.NotFound, "%s", id.Id)
580 }
581 sendAPIResponse(ctx, ch, res)
582}
583
Kent Hagerman2b216042020-04-03 18:28:56 -0400584func (ldMgr *LogicalManager) DisableLogicalPort(ctx context.Context, id *voltha.LogicalPortId, ch chan interface{}) {
585 logger.Debugw("DisableLogicalPort", log.Fields{"logicalDeviceId": id})
khenaidoo19d7b632018-10-30 10:49:50 -0400586 var res interface{}
npujar467fe752020-01-16 20:17:45 +0530587 if agent := ldMgr.getLogicalDeviceAgent(ctx, id.Id); agent != nil {
588 res = agent.disableLogicalPort(ctx, id.PortId)
Kent Hagerman2b216042020-04-03 18:28:56 -0400589 logger.Debugw("DisableLogicalPort-result", log.Fields{"result": res})
khenaidoo19d7b632018-10-30 10:49:50 -0400590 } else {
591 res = status.Errorf(codes.NotFound, "%s", id.Id)
592 }
593 sendAPIResponse(ctx, ch, res)
594}
khenaidoofdbad6e2018-11-06 22:26:38 -0500595
Kent Hagerman2b216042020-04-03 18:28:56 -0400596func (ldMgr *LogicalManager) packetIn(ctx context.Context, logicalDeviceID string, port uint32, transactionID string, packet []byte) error {
Girish Kumarf56a4682020-03-20 20:07:46 +0000597 logger.Debugw("packetIn", log.Fields{"logicalDeviceId": logicalDeviceID, "port": port})
npujar467fe752020-01-16 20:17:45 +0530598 if agent := ldMgr.getLogicalDeviceAgent(ctx, logicalDeviceID); agent != nil {
npujar1d86a522019-11-14 17:11:16 +0530599 agent.packetIn(port, transactionID, packet)
khenaidoofdbad6e2018-11-06 22:26:38 -0500600 } else {
Girish Kumarf56a4682020-03-20 20:07:46 +0000601 logger.Error("logical-device-not-exist", log.Fields{"logicalDeviceId": logicalDeviceID})
khenaidoofdbad6e2018-11-06 22:26:38 -0500602 }
603 return nil
604}
Kent Hagerman2b216042020-04-03 18:28:56 -0400605
606func (ldMgr *LogicalManager) PacketOut(ctx context.Context, packet *openflow_13.PacketOut) {
607 if agent := ldMgr.getLogicalDeviceAgent(ctx, packet.Id); agent != nil {
608 agent.packetOut(ctx, packet.PacketOut)
609 } else {
610 logger.Errorf("No logical device agent present", log.Fields{"logicalDeviceID": packet.Id})
611 }
612}