blob: ea1f55297124913a3917bde4cf84234bc92444f4 [file] [log] [blame]
Don Newtone0d34a82019-11-14 10:58:06 -05001/*
2 Copyright 2017 the original author or authors.
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*/
16package openflow
17
18import (
19 "encoding/json"
Don Newton7577f072020-01-06 12:41:11 -050020
Don Newtone0d34a82019-11-14 10:58:06 -050021 ofp "github.com/donNewtonAlpha/goloxi/of13"
Don Newton7577f072020-01-06 12:41:11 -050022 "github.com/opencord/ofagent-go/settings"
23 l "github.com/opencord/voltha-lib-go/v2/pkg/log"
Don Newtonb437c6f2019-12-18 11:51:57 -050024 "github.com/opencord/voltha-protos/v2/go/openflow_13"
Don Newtone0d34a82019-11-14 10:58:06 -050025 "golang.org/x/net/context"
Don Newtone0d34a82019-11-14 10:58:06 -050026)
27
Don Newton7577f072020-01-06 12:41:11 -050028func handleMeterModRequest(request *ofp.MeterMod, DeviceID string, client *Client) {
29 if settings.GetDebug(DeviceID) {
30 js, _ := json.Marshal(request)
31 logger.Debugw("handleMeterModRequest called", l.Fields{"DeviceID": DeviceID, "request": js})
32 }
Don Newtone0d34a82019-11-14 10:58:06 -050033
34 var meterModUpdate openflow_13.MeterModUpdate
Don Newton7577f072020-01-06 12:41:11 -050035 meterModUpdate.Id = DeviceID
Don Newtone0d34a82019-11-14 10:58:06 -050036 var meterMod openflow_13.OfpMeterMod
37 meterMod.MeterId = request.MeterId
38 meterMod.Flags = uint32(request.Flags)
39 command := openflow_13.OfpMeterModCommand(request.Command)
40 meterMod.Command = command
41 var bands []*openflow_13.OfpMeterBandHeader
42 ofpBands := request.GetMeters()
43 for i := 0; i < len(ofpBands); i++ {
44 ofpBand := ofpBands[i]
Don Newtone0d34a82019-11-14 10:58:06 -050045 bandType := ofpBand.GetType()
46 var band openflow_13.OfpMeterBandHeader
47 switch bandType {
48 case ofp.OFPMBTDrop:
49 ofpDrop := ofpBand.(ofp.IMeterBandDrop)
Don Newtone0d34a82019-11-14 10:58:06 -050050 band.Type = openflow_13.OfpMeterBandType_OFPMBT_DROP
51 band.Rate = ofpDrop.GetRate()
Don Newtonb437c6f2019-12-18 11:51:57 -050052 band.BurstSize = ofpDrop.GetBurstSize()
Don Newtone0d34a82019-11-14 10:58:06 -050053 case ofp.OFPMBTDSCPRemark:
54 ofpDscpRemark := ofpBand.(ofp.IMeterBandDscpRemark)
55 var dscpRemark openflow_13.OfpMeterBandDscpRemark
56 band.Type = openflow_13.OfpMeterBandType_OFPMBT_DSCP_REMARK
57 band.BurstSize = ofpDscpRemark.GetBurstSize()
58 band.Rate = ofpDscpRemark.GetRate()
59 dscpRemark.PrecLevel = uint32(ofpDscpRemark.GetPrecLevel())
Don Newtonb437c6f2019-12-18 11:51:57 -050060 /*
61 var meterBandHeaderDscp openflow_13.OfpMeterBandHeader_DscpRemark
62 meterBandHeaderDscp.DscpRemark = &dscpRemark
63 band.Data = &meterBandHeaderDscp
64
65 */
Don Newtone0d34a82019-11-14 10:58:06 -050066 case ofp.OFPMBTExperimenter:
67 ofpExperimenter := ofpBand.(ofp.IMeterBandExperimenter)
68 var experimenter openflow_13.OfpMeterBandExperimenter
69 experimenter.Experimenter = ofpExperimenter.GetExperimenter()
70 band.Type = openflow_13.OfpMeterBandType_OFPMBT_EXPERIMENTER
71 band.BurstSize = ofpExperimenter.GetBurstSize()
72 band.Rate = ofpExperimenter.GetRate()
Don Newtonb437c6f2019-12-18 11:51:57 -050073 /*
74 var meterBandHeaderExperimenter openflow_13.OfpMeterBandHeader_Experimenter
75 meterBandHeaderExperimenter.Experimenter = &experimenter
76 band.Data = &meterBandHeaderExperimenter
77
78 */
Don Newtone0d34a82019-11-14 10:58:06 -050079 }
80 bands = append(bands, &band)
81 }
82 meterMod.Bands = bands
83 meterModUpdate.MeterMod = &meterMod
84 grpcClient := *getGrpcClient()
Don Newton7577f072020-01-06 12:41:11 -050085 if settings.GetDebug(DeviceID) {
86 meterModJS, _ := json.Marshal(meterModUpdate)
87 logger.Debugw("handleMeterModUpdate sending request",
88 l.Fields{"DeviceID": DeviceID, "MeterModRequest": meterModJS})
Don Newtone0d34a82019-11-14 10:58:06 -050089 }
Don Newton7577f072020-01-06 12:41:11 -050090 _, err := grpcClient.UpdateLogicalDeviceMeterTable(context.Background(), &meterModUpdate)
91 if err != nil {
92 logger.Errorw("Error calling UpdateLogicalDeviceMeterTable", l.Fields{"DeviceID": DeviceID, "error": err})
93 }
Don Newtone0d34a82019-11-14 10:58:06 -050094}