blob: 1a110ac6a3910633b1b7813ecd9de67b5cf55d3f [file] [log] [blame]
Don Newtone0d34a82019-11-14 10:58:06 -05001/*
David K. Bainbridge157bdab2020-01-16 14:38:05 -08002Copyright 2020 the original author or authors.
Don Newtone0d34a82019-11-14 10:58:06 -05003
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 (
Andrea Campanella07e94942020-07-20 17:35:46 +020019 "encoding/binary"
Don Newtone0d34a82019-11-14 10:58:06 -050020 "encoding/json"
Andrea Campanella07e94942020-07-20 17:35:46 +020021 "unsafe"
David Bainbridgef8ce7d22020-04-08 12:49:41 -070022
Jonathan Hart828908c2020-04-15 14:23:45 -070023 ofp "github.com/opencord/goloxi/of13"
David K. Bainbridgeaea73cd2020-01-27 10:44:50 -080024 "github.com/opencord/voltha-lib-go/v3/pkg/log"
25 "github.com/opencord/voltha-protos/v3/go/openflow_13"
Don Newtone0d34a82019-11-14 10:58:06 -050026 "golang.org/x/net/context"
Don Newtone0d34a82019-11-14 10:58:06 -050027)
28
Rohan Agrawalc32d9932020-06-15 11:01:47 +000029func (ofc *OFConnection) handleMeterModRequest(ctx context.Context, request *ofp.MeterMod) {
David K. Bainbridge157bdab2020-01-16 14:38:05 -080030 if logger.V(log.DebugLevel) {
Don Newton7577f072020-01-06 12:41:11 -050031 js, _ := json.Marshal(request)
Rohan Agrawalc32d9932020-06-15 11:01:47 +000032 logger.Debugw(ctx, "handleMeterModRequest called",
David K. Bainbridge157bdab2020-01-16 14:38:05 -080033 log.Fields{
34 "device-id": ofc.DeviceID,
35 "request": js})
Don Newton7577f072020-01-06 12:41:11 -050036 }
Don Newtone0d34a82019-11-14 10:58:06 -050037
David Bainbridgef8ce7d22020-04-08 12:49:41 -070038 volthaClient := ofc.VolthaClient.Get()
39 if volthaClient == nil {
Rohan Agrawalc32d9932020-06-15 11:01:47 +000040 logger.Errorw(ctx, "no-voltha-connection",
David K. Bainbridge9cb404e2020-01-28 14:32:29 -080041 log.Fields{"device-id": ofc.DeviceID})
42 return
43 }
44
David K. Bainbridge157bdab2020-01-16 14:38:05 -080045 meterModUpdate := openflow_13.MeterModUpdate{Id: ofc.DeviceID}
46 meterMod := openflow_13.OfpMeterMod{
47 MeterId: request.MeterId,
48 Flags: uint32(request.Flags),
49 Command: openflow_13.OfpMeterModCommand(request.Command),
50 }
Don Newtone0d34a82019-11-14 10:58:06 -050051 var bands []*openflow_13.OfpMeterBandHeader
David K. Bainbridge157bdab2020-01-16 14:38:05 -080052 for _, ofpBand := range request.GetMeters() {
Don Newtone0d34a82019-11-14 10:58:06 -050053 var band openflow_13.OfpMeterBandHeader
David K. Bainbridge157bdab2020-01-16 14:38:05 -080054 switch ofpBand.GetType() {
Don Newtone0d34a82019-11-14 10:58:06 -050055 case ofp.OFPMBTDrop:
56 ofpDrop := ofpBand.(ofp.IMeterBandDrop)
Don Newtone0d34a82019-11-14 10:58:06 -050057 band.Type = openflow_13.OfpMeterBandType_OFPMBT_DROP
58 band.Rate = ofpDrop.GetRate()
Don Newtonb437c6f2019-12-18 11:51:57 -050059 band.BurstSize = ofpDrop.GetBurstSize()
Don Newtone0d34a82019-11-14 10:58:06 -050060 case ofp.OFPMBTDSCPRemark:
61 ofpDscpRemark := ofpBand.(ofp.IMeterBandDscpRemark)
62 var dscpRemark openflow_13.OfpMeterBandDscpRemark
63 band.Type = openflow_13.OfpMeterBandType_OFPMBT_DSCP_REMARK
64 band.BurstSize = ofpDscpRemark.GetBurstSize()
65 band.Rate = ofpDscpRemark.GetRate()
66 dscpRemark.PrecLevel = uint32(ofpDscpRemark.GetPrecLevel())
Don Newtonb437c6f2019-12-18 11:51:57 -050067 /*
68 var meterBandHeaderDscp openflow_13.OfpMeterBandHeader_DscpRemark
69 meterBandHeaderDscp.DscpRemark = &dscpRemark
70 band.Data = &meterBandHeaderDscp
71
72 */
Don Newtone0d34a82019-11-14 10:58:06 -050073 case ofp.OFPMBTExperimenter:
74 ofpExperimenter := ofpBand.(ofp.IMeterBandExperimenter)
75 var experimenter openflow_13.OfpMeterBandExperimenter
76 experimenter.Experimenter = ofpExperimenter.GetExperimenter()
77 band.Type = openflow_13.OfpMeterBandType_OFPMBT_EXPERIMENTER
78 band.BurstSize = ofpExperimenter.GetBurstSize()
79 band.Rate = ofpExperimenter.GetRate()
Don Newtonb437c6f2019-12-18 11:51:57 -050080 /*
81 var meterBandHeaderExperimenter openflow_13.OfpMeterBandHeader_Experimenter
82 meterBandHeaderExperimenter.Experimenter = &experimenter
83 band.Data = &meterBandHeaderExperimenter
84
85 */
Don Newtone0d34a82019-11-14 10:58:06 -050086 }
87 bands = append(bands, &band)
88 }
89 meterMod.Bands = bands
90 meterModUpdate.MeterMod = &meterMod
David K. Bainbridge157bdab2020-01-16 14:38:05 -080091 if logger.V(log.DebugLevel) {
Don Newton7577f072020-01-06 12:41:11 -050092 meterModJS, _ := json.Marshal(meterModUpdate)
Rohan Agrawalc32d9932020-06-15 11:01:47 +000093 logger.Debugw(ctx, "handleMeterModUpdate sending request",
David K. Bainbridge157bdab2020-01-16 14:38:05 -080094 log.Fields{
95 "device-id": ofc.DeviceID,
96 "meter-mod-request": meterModJS})
Don Newtone0d34a82019-11-14 10:58:06 -050097 }
David Bainbridgef8ce7d22020-04-08 12:49:41 -070098 if _, err := volthaClient.UpdateLogicalDeviceMeterTable(context.Background(), &meterModUpdate); err != nil {
Rohan Agrawalc32d9932020-06-15 11:01:47 +000099 logger.Errorw(ctx, "Error calling UpdateLogicalDeviceMeterTable",
David K. Bainbridge157bdab2020-01-16 14:38:05 -0800100 log.Fields{
101 "device-id": ofc.DeviceID,
102 "error": err})
Andrea Campanella07e94942020-07-20 17:35:46 +0200103 message := ofp.NewMeterModFailedErrorMsg()
104 message.SetXid(request.Xid)
105 //OF 1.3
106 message.SetVersion(4)
107 //FIXME Hardcoding to Invalid Meter for now.
108 message.SetCode(ofp.OFPMMFCInvalidMeter)
109 meterByteId := make([]byte, 4)
110 binary.BigEndian.PutUint32(meterByteId, request.MeterId)
111 message.SetData(meterByteId)
112 message.Length = uint16(unsafe.Sizeof(*message))
113 if err := ofc.SendMessage(ctx, message); err != nil {
114 logger.Errorw(ctx, "Error reporting failure of MeterMod to controller",
115 log.Fields{
116 "device-id": ofc.DeviceID,
117 "error": err})
118 }
Don Newton7577f072020-01-06 12:41:11 -0500119 }
Don Newtone0d34a82019-11-14 10:58:06 -0500120}