blob: 43d690e89b6b77866d06f53126b729c0cbd92cde [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"
20 ofp "github.com/donNewtonAlpha/goloxi/of13"
21 "github.com/opencord/voltha-protos/go/openflow_13"
22 "golang.org/x/net/context"
23 "log"
24)
25
26func handleMeterModRequest(request *ofp.MeterMod, client *Client) {
27 jsonRequest, _ := json.Marshal(request)
28 log.Printf("handleMeterModRequest called with %s", jsonRequest)
29
30 var meterModUpdate openflow_13.MeterModUpdate
31 meterModUpdate.Id = client.DeviceId
32 var meterMod openflow_13.OfpMeterMod
33 meterMod.MeterId = request.MeterId
34 meterMod.Flags = uint32(request.Flags)
35 command := openflow_13.OfpMeterModCommand(request.Command)
36 meterMod.Command = command
37 var bands []*openflow_13.OfpMeterBandHeader
38 ofpBands := request.GetMeters()
39 for i := 0; i < len(ofpBands); i++ {
40 ofpBand := ofpBands[i]
41
42 bandType := ofpBand.GetType()
43 var band openflow_13.OfpMeterBandHeader
44 switch bandType {
45 case ofp.OFPMBTDrop:
46 ofpDrop := ofpBand.(ofp.IMeterBandDrop)
47 band.BurstSize = ofpDrop.GetBurstSize()
48 band.Type = openflow_13.OfpMeterBandType_OFPMBT_DROP
49 band.Rate = ofpDrop.GetRate()
50 var meterBandHeaderDrop openflow_13.OfpMeterBandHeader_Drop
51 var drop openflow_13.OfpMeterBandDrop
52 meterBandHeaderDrop.Drop = &drop
53 band.Data = &meterBandHeaderDrop
54 case ofp.OFPMBTDSCPRemark:
55 ofpDscpRemark := ofpBand.(ofp.IMeterBandDscpRemark)
56 var dscpRemark openflow_13.OfpMeterBandDscpRemark
57 band.Type = openflow_13.OfpMeterBandType_OFPMBT_DSCP_REMARK
58 band.BurstSize = ofpDscpRemark.GetBurstSize()
59 band.Rate = ofpDscpRemark.GetRate()
60 dscpRemark.PrecLevel = uint32(ofpDscpRemark.GetPrecLevel())
61 var meterBandHeaderDscp openflow_13.OfpMeterBandHeader_DscpRemark
62 meterBandHeaderDscp.DscpRemark = &dscpRemark
63 band.Data = &meterBandHeaderDscp
64 case ofp.OFPMBTExperimenter:
65 ofpExperimenter := ofpBand.(ofp.IMeterBandExperimenter)
66 var experimenter openflow_13.OfpMeterBandExperimenter
67 experimenter.Experimenter = ofpExperimenter.GetExperimenter()
68 band.Type = openflow_13.OfpMeterBandType_OFPMBT_EXPERIMENTER
69 band.BurstSize = ofpExperimenter.GetBurstSize()
70 band.Rate = ofpExperimenter.GetRate()
71 var meterBandHeaderExperimenter openflow_13.OfpMeterBandHeader_Experimenter
72 meterBandHeaderExperimenter.Experimenter = &experimenter
73 band.Data = &meterBandHeaderExperimenter
74 }
75 bands = append(bands, &band)
76 }
77 meterMod.Bands = bands
78 meterModUpdate.MeterMod = &meterMod
79 grpcClient := *getGrpcClient()
80 meterModJS, _ := json.Marshal(meterModUpdate)
81 log.Printf("METER MOD UPDATE %s", meterModJS)
82 empty, err := grpcClient.UpdateLogicalDeviceMeterTable(context.Background(), &meterModUpdate)
83 if err != nil {
84 log.Printf("ERROR DOING METER MOD ADD %v", err)
85 }
86 emptyJs, _ := json.Marshal(empty)
87 log.Printf("METER MOD RESPONSE %s", emptyJs)
88}