blob: 54a23de6d56ceeaa8df9a39a0bfb92959eadb91c [file] [log] [blame]
Don Newton98fd8812019-09-23 15:15:02 -04001/*
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*/
16
17package openflow
18
19import (
20 "context"
21 "encoding/json"
Don Newtone0d34a82019-11-14 10:58:06 -050022
Don Newton98fd8812019-09-23 15:15:02 -040023 "log"
24 "net"
25 "unsafe"
26
Don Newtonb437c6f2019-12-18 11:51:57 -050027 "github.com/opencord/voltha-protos/v2/go/openflow_13"
Don Newtone0d34a82019-11-14 10:58:06 -050028
29 "github.com/donNewtonAlpha/goloxi"
30 ofp "github.com/donNewtonAlpha/goloxi/of13"
Don Newtonb437c6f2019-12-18 11:51:57 -050031 "github.com/opencord/voltha-protos/v2/go/common"
Don Newton98fd8812019-09-23 15:15:02 -040032)
33
34func handleStatsRequest(request ofp.IHeader, statType uint16, deviceId string, client *Client) error {
35 message, _ := json.Marshal(request)
36 log.Printf("handleStatsRequest called with %s\n ", message)
37 var id = common.ID{Id: deviceId}
38
39 switch statType {
Don Newtone0d34a82019-11-14 10:58:06 -050040 case ofp.OFPSTDesc:
Don Newton98fd8812019-09-23 15:15:02 -040041 statsReq := request.(*ofp.DescStatsRequest)
42 response, err := handleDescStatsRequest(statsReq, id)
43 if err != nil {
44 return err
45 }
46 client.SendMessage(response)
47
Don Newtone0d34a82019-11-14 10:58:06 -050048 case ofp.OFPSTFlow:
Don Newton98fd8812019-09-23 15:15:02 -040049 statsReq := request.(*ofp.FlowStatsRequest)
Don Newtonb437c6f2019-12-18 11:51:57 -050050 response, err := handleFlowStatsRequest(statsReq, id)
51 if err != nil {
52 return err
53 }
Don Newtone0d34a82019-11-14 10:58:06 -050054 response.Length = uint16(unsafe.Sizeof(*response))
55 jResponse, _ := json.Marshal(response)
56 log.Printf("HANDLE FLOW STATS REQUEST response\n\n\n %s \n\n\n", jResponse)
Don Newtonb437c6f2019-12-18 11:51:57 -050057 err = client.SendMessage(response)
Don Newton98fd8812019-09-23 15:15:02 -040058 if err != nil {
59 return err
60 }
61
Don Newtone0d34a82019-11-14 10:58:06 -050062 case ofp.OFPSTAggregate:
Don Newton98fd8812019-09-23 15:15:02 -040063 statsReq := request.(*ofp.AggregateStatsRequest)
64 aggregateStatsReply, err := handleAggregateStatsRequest(statsReq, id)
65 if err != nil {
66 return err
67 }
68 client.SendMessage(aggregateStatsReply)
Don Newtone0d34a82019-11-14 10:58:06 -050069 case ofp.OFPSTTable:
Don Newton98fd8812019-09-23 15:15:02 -040070 statsReq := request.(*ofp.TableStatsRequest)
71 tableStatsReply, e := handleTableStatsRequest(statsReq, id)
72 if e != nil {
73 return e
74 }
75 client.SendMessage(tableStatsReply)
Don Newtone0d34a82019-11-14 10:58:06 -050076 case ofp.OFPSTPort:
Don Newton98fd8812019-09-23 15:15:02 -040077 statsReq := request.(*ofp.PortStatsRequest)
78 response, err := handlePortStatsRequest(statsReq, id)
79 if err != nil {
80 return err
81 }
82 client.SendMessage(response)
83
Don Newtone0d34a82019-11-14 10:58:06 -050084 case ofp.OFPSTQueue:
Don Newton98fd8812019-09-23 15:15:02 -040085 statsReq := request.(*ofp.QueueStatsRequest)
86 response, err := handleQueueStatsRequest(statsReq, id)
87 if err != nil {
88 return err
89 }
90 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -050091 case ofp.OFPSTGroup:
Don Newton98fd8812019-09-23 15:15:02 -040092 statsReq := request.(*ofp.GroupStatsRequest)
93 response, err := handleGroupStatsRequest(statsReq, id)
94 if err != nil {
95 return err
96 }
Don Newtone0d34a82019-11-14 10:58:06 -050097
Don Newton98fd8812019-09-23 15:15:02 -040098 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -050099 case ofp.OFPSTGroupDesc:
Don Newton98fd8812019-09-23 15:15:02 -0400100 statsReq := request.(*ofp.GroupDescStatsRequest)
101 response, err := handleGroupStatsDescRequest(statsReq, id)
102 if err != nil {
103 return err
104 }
105 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -0500106
107 case ofp.OFPSTGroupFeatures:
Don Newton98fd8812019-09-23 15:15:02 -0400108 statsReq := request.(*ofp.GroupFeaturesStatsRequest)
109 response, err := handleGroupFeatureStatsRequest(statsReq, id)
110 if err != nil {
111 return err
112 }
113 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -0500114 case ofp.OFPSTMeter:
Don Newton98fd8812019-09-23 15:15:02 -0400115 statsReq := request.(*ofp.MeterStatsRequest)
116 response, err := handleMeterStatsRequest(statsReq, id)
117 if err != nil {
Don Newtone0d34a82019-11-14 10:58:06 -0500118 log.Printf("ERROR HANDLE METER STATS REQUEST %v", err)
Don Newton98fd8812019-09-23 15:15:02 -0400119 return err
120 }
121 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -0500122 case ofp.OFPSTMeterConfig:
Don Newton98fd8812019-09-23 15:15:02 -0400123 statsReq := request.(*ofp.MeterConfigStatsRequest)
124 response, err := handleMeterConfigStatsRequest(statsReq, id)
125 if err != nil {
126 return err
127 }
128 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -0500129 case ofp.OFPSTMeterFeatures:
Don Newton98fd8812019-09-23 15:15:02 -0400130 statsReq := request.(*ofp.MeterFeaturesStatsRequest)
131 response, err := handleMeterFeatureStatsRequest(statsReq)
132 if err != nil {
133 return err
134 }
135 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -0500136 case ofp.OFPSTTableFeatures:
Don Newton98fd8812019-09-23 15:15:02 -0400137 statsReq := request.(*ofp.TableFeaturesStatsRequest)
138 response, err := handleTableFeaturesStatsRequest(statsReq, id)
139 if err != nil {
140 return err
141 }
142 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -0500143 case ofp.OFPSTPortDesc:
Don Newton98fd8812019-09-23 15:15:02 -0400144 statsReq := request.(*ofp.PortDescStatsRequest)
145 response, err := handlePortDescStatsRequest(statsReq, deviceId)
146 if err != nil {
147 return err
148 }
149 client.SendMessage(response)
150
Don Newtone0d34a82019-11-14 10:58:06 -0500151 case ofp.OFPSTExperimenter:
Don Newton98fd8812019-09-23 15:15:02 -0400152 statsReq := request.(*ofp.ExperimenterStatsRequest)
153 response, err := handleExperimenterStatsRequest(statsReq, id)
154 if err != nil {
155 return err
156 }
157 client.SendMessage(response)
158 }
159 return nil
160}
161
162func handleDescStatsRequest(request *ofp.DescStatsRequest, id common.ID) (*ofp.DescStatsReply, error) {
163 response := ofp.NewDescStatsReply()
164 response.SetXid(request.GetXid())
165 response.SetVersion(request.GetVersion())
Don Newtone0d34a82019-11-14 10:58:06 -0500166 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
167
Don Newton98fd8812019-09-23 15:15:02 -0400168 client := *getGrpcClient()
169 resp, err := client.GetLogicalDevice(context.Background(), &id)
170 if err != nil {
171 return nil, err
172 }
173 desc := resp.GetDesc()
174
175 response.SetMfrDesc(PadString(desc.GetMfrDesc(), 256))
176 response.SetHwDesc(PadString(desc.GetHwDesc(), 256))
177 response.SetSwDesc(PadString(desc.GetSwDesc(), 256))
178 response.SetSerialNum(PadString(desc.GetSerialNum(), 32))
179 response.SetDpDesc(PadString(desc.GetDpDesc(), 256))
Don Newton98fd8812019-09-23 15:15:02 -0400180 return response, nil
181}
182func handleFlowStatsRequest(request *ofp.FlowStatsRequest, id common.ID) (*ofp.FlowStatsReply, error) {
183 log.Println("****************************************\n***********************************")
184 response := ofp.NewFlowStatsReply()
185 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500186 response.SetVersion(4)
187 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400188 client := *getGrpcClient()
189 resp, err := client.ListLogicalDeviceFlows(context.Background(), &id)
190 if err != nil {
Don Newton98fd8812019-09-23 15:15:02 -0400191 log.Printf("err in handleFlowStatsRequest calling ListLogicalDeviceFlows %v", err)
192 return nil, err
193 }
Don Newtone0d34a82019-11-14 10:58:06 -0500194 js, _ := json.Marshal(resp)
195 log.Printf("HandleFlowStats response: %s", js)
Don Newton98fd8812019-09-23 15:15:02 -0400196 var flow []*ofp.FlowStatsEntry
197 items := resp.GetItems()
198
199 for i := 0; i < len(items); i++ {
Don Newtone0d34a82019-11-14 10:58:06 -0500200 item := items[i]
201 entry := ofp.NewFlowStatsEntry()
Don Newton98fd8812019-09-23 15:15:02 -0400202
Don Newtone0d34a82019-11-14 10:58:06 -0500203 entry.SetTableId(uint8(item.GetTableId()))
Don Newton98fd8812019-09-23 15:15:02 -0400204 entry.SetDurationSec(item.GetDurationSec())
205 entry.SetDurationNsec(item.GetDurationNsec())
206 entry.SetPriority(uint16(item.GetPriority()))
207 entry.SetIdleTimeout(uint16(item.GetIdleTimeout()))
208 entry.SetHardTimeout(uint16(item.GetHardTimeout()))
209 entry.SetFlags(ofp.FlowModFlags(item.GetFlags()))
210 entry.SetCookie(item.GetCookie())
211 entry.SetPacketCount(item.GetPacketCount())
212 entry.SetByteCount(item.GetByteCount())
Don Newtone0d34a82019-11-14 10:58:06 -0500213 var entrySize uint16
214 entrySize = 48
215 match := ofp.NewMatchV3()
Don Newton98fd8812019-09-23 15:15:02 -0400216 pbMatch := item.GetMatch()
Don Newton98fd8812019-09-23 15:15:02 -0400217 var fields []goloxi.IOxm
218 match.SetType(uint16(pbMatch.GetType()))
219 oxFields := pbMatch.GetOxmFields()
Don Newtone0d34a82019-11-14 10:58:06 -0500220 var size uint16
221 size = 4
Don Newton98fd8812019-09-23 15:15:02 -0400222 for i := 0; i < len(oxFields); i++ {
Don Newton98fd8812019-09-23 15:15:02 -0400223 oxmField := oxFields[i]
224 field := oxmField.GetField()
225 ofbField := field.(*openflow_13.OfpOxmField_OfbField).OfbField
Don Newtone0d34a82019-11-14 10:58:06 -0500226 iOxm, oxmSize := parseOxm(ofbField)
227 log.Printf("OXMSIZE %d", oxmSize)
228 fields = append(fields, iOxm)
229 if oxmSize > 0 {
230 size += 4 //header for oxm
Don Newton98fd8812019-09-23 15:15:02 -0400231 }
Don Newtone0d34a82019-11-14 10:58:06 -0500232 size += oxmSize
233 log.Printf("SIZE %d", size)
Don Newton98fd8812019-09-23 15:15:02 -0400234 }
Don Newtone0d34a82019-11-14 10:58:06 -0500235
236 log.Printf("entrySize %d += size %d", entrySize, size)
237 log.Printf("new entrySize %d", entrySize)
Don Newton98fd8812019-09-23 15:15:02 -0400238 match.OxmList = fields
Don Newtone0d34a82019-11-14 10:58:06 -0500239 match.Length = uint16(size)
240 //account for 8 byte alignment
241 log.Printf("Size was %d", size)
242 if size%8 != 0 {
243 size = ((size / 8) + 1) * 8
244 }
Don Newtonb437c6f2019-12-18 11:51:57 -0500245
Don Newtone0d34a82019-11-14 10:58:06 -0500246 log.Printf("Size is %d", size)
247 entrySize += size
248 entry.SetMatch(*match)
Don Newton98fd8812019-09-23 15:15:02 -0400249 var instructions []ofp.IInstruction
250 ofpInstructions := item.Instructions
251 for i := 0; i < len(ofpInstructions); i++ {
Don Newtone0d34a82019-11-14 10:58:06 -0500252 instruction, size := parseInstructions(ofpInstructions[i])
253 instructions = append(instructions, instruction)
254 entrySize += size
Don Newton98fd8812019-09-23 15:15:02 -0400255 }
256 entry.Instructions = instructions
Don Newtone0d34a82019-11-14 10:58:06 -0500257 log.Printf("entrysize was %d", entrySize)
258 entrySizeMeasured := uint16(unsafe.Sizeof(*entry))
259 log.Printf("entrysize measure %d", entrySizeMeasured)
260 entry.Length = entrySize
261 entrySize = 0
262 flow = append(flow, entry)
Don Newton98fd8812019-09-23 15:15:02 -0400263 }
264 response.SetEntries(flow)
265 return response, nil
266}
267func handleAggregateStatsRequest(request *ofp.AggregateStatsRequest, id common.ID) (*ofp.AggregateStatsReply, error) {
268 response := ofp.NewAggregateStatsReply()
269 response.SetVersion(request.GetVersion())
270 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500271 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400272 response.SetFlowCount(0)
273 //TODO wire this to voltha core when it implements
274 return response, nil
275}
276func handleGroupStatsRequest(request *ofp.GroupStatsRequest, id common.ID) (*ofp.GroupStatsReply, error) {
277 response := ofp.NewGroupStatsReply()
278 response.SetVersion(request.GetVersion())
279 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500280 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400281 client := *getGrpcClient()
282 reply, err := client.ListLogicalDeviceFlowGroups(context.Background(), &id)
283 if err != nil {
284 return nil, err
285 }
286
287 var groupStatsEntries []*ofp.GroupStatsEntry
288 items := reply.GetItems()
289 for i := 0; i < len(items); i++ {
290 item := items[i].GetStats()
291 var entry ofp.GroupStatsEntry
292 entry.SetByteCount(item.GetByteCount())
293 entry.SetPacketCount(item.GetPacketCount())
294 entry.SetDurationNsec(item.GetDurationNsec())
295 entry.SetDurationSec(item.GetDurationSec())
296 entry.SetRefCount(item.GetRefCount())
297 entry.SetGroupId(item.GetGroupId())
298 bucketStats := item.GetBucketStats()
299 var bucketStatsList []*ofp.BucketCounter
300 for j := 0; j < len(bucketStats); j++ {
301 bucketStat := bucketStats[i]
302 var bucketCounter ofp.BucketCounter
303 bucketCounter.SetPacketCount(bucketStat.GetPacketCount())
304 bucketCounter.SetByteCount(bucketStat.GetByteCount())
305 bucketStatsList = append(bucketStatsList, &bucketCounter)
306 }
307 entry.SetBucketStats(bucketStatsList)
308 groupStatsEntries = append(groupStatsEntries, &entry)
309 }
310 response.SetEntries(groupStatsEntries)
311 return response, nil
312}
313func handleGroupStatsDescRequest(request *ofp.GroupDescStatsRequest, id common.ID) (*ofp.GroupDescStatsReply, error) {
314 response := ofp.NewGroupDescStatsReply()
315 response.SetVersion(request.GetVersion())
316 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500317 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400318 client := *getGrpcClient()
319 reply, err := client.ListLogicalDeviceFlowGroups(context.Background(), &id)
320 if err != nil {
321 return nil, err
322 }
323 entries := reply.GetItems()
324 var groupDescStatsEntries []*ofp.GroupDescStatsEntry
325 for i := 0; i < len(entries); i++ {
326 item := entries[i].GetStats()
327 var groupDesc ofp.GroupDescStatsEntry
328 groupDesc.SetGroupId(item.GetGroupId())
329 /*
330 buckets := item.g
331 var bucketList []*ofp.Bucket
332 for j:=0;j<len(buckets);j++{
333
334 }
335
336 groupDesc.SetBuckets(bucketList)
337 */
338 groupDescStatsEntries = append(groupDescStatsEntries, &groupDesc)
339 }
340 response.SetEntries(groupDescStatsEntries)
341 return response, nil
342}
343func handleGroupFeatureStatsRequest(request *ofp.GroupFeaturesStatsRequest, id common.ID) (*ofp.GroupFeaturesStatsReply, error) {
344 response := ofp.NewGroupFeaturesStatsReply()
345 response.SetVersion(request.GetVersion())
346 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500347 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400348 //TODO wire this to voltha core when it implements
349 return response, nil
350}
351func handleMeterStatsRequest(request *ofp.MeterStatsRequest, id common.ID) (*ofp.MeterStatsReply, error) {
352 response := ofp.NewMeterStatsReply()
353 response.SetVersion(request.GetVersion())
354 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500355 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
356 client := *getGrpcClient()
357 resp, err := client.ListLogicalDeviceMeters(context.Background(), &id)
358 if err != nil {
359 return nil, err
360 }
361 size := uint16(40)
362 items := resp.Items
363 var meterStats []*ofp.MeterStats
364 for i := 0; i < len(items); i++ {
365 meterStat := ofp.NewMeterStats()
366 item := items[i]
367 stats := item.Stats
368 meterStat.DurationNsec = stats.DurationNsec
369 meterStat.DurationSec = stats.DurationSec
370 meterStat.ByteInCount = stats.ByteInCount
371 meterStat.FlowCount = stats.FlowCount
372 meterStat.MeterId = stats.MeterId
373 var bandStats []*ofp.MeterBandStats
374 bStats := stats.BandStats
375 for j := 0; j < len(bStats); j++ {
376 bStat := bStats[j]
377 bandStat := ofp.NewMeterBandStats()
378 bandStat.ByteBandCount = bStat.ByteBandCount
379 bandStat.PacketBandCount = bStat.PacketBandCount
380 bandStats = append(bandStats, bandStat)
381 size += 16
382 }
383 meterStat.SetBandStats(bandStats)
384 meterStat.Len = size
385 meterStats = append(meterStats, meterStat)
386 }
387 response.SetEntries(meterStats)
Don Newton98fd8812019-09-23 15:15:02 -0400388 return response, nil
389}
Don Newton98fd8812019-09-23 15:15:02 -0400390func handleMeterConfigStatsRequest(request *ofp.MeterConfigStatsRequest, id common.ID) (*ofp.MeterConfigStatsReply, error) {
391 response := ofp.NewMeterConfigStatsReply()
392 response.SetVersion(request.GetVersion())
393 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500394 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400395 //TODO wire this to voltha core when it implements
396 return response, nil
397}
Don Newton98fd8812019-09-23 15:15:02 -0400398func handleTableFeaturesStatsRequest(request *ofp.TableFeaturesStatsRequest, id common.ID) (*ofp.TableFeaturesStatsReply, error) {
399 response := ofp.NewTableFeaturesStatsReply()
400 response.SetVersion(request.GetVersion())
401 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500402 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400403 //TODO wire this to voltha core when it implements
404 return response, nil
405}
406func handleTableStatsRequest(request *ofp.TableStatsRequest, id common.ID) (*ofp.TableStatsReply, error) {
Don Newtone0d34a82019-11-14 10:58:06 -0500407 var response = ofp.NewTableStatsReply()
408 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
409 response.SetVersion(request.GetVersion())
410 response.SetXid(request.GetXid())
411 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
412 return response, nil
Don Newton98fd8812019-09-23 15:15:02 -0400413}
414func handleQueueStatsRequest(request *ofp.QueueStatsRequest, id common.ID) (*ofp.QueueStatsReply, error) {
415 response := ofp.NewQueueStatsReply()
416 response.SetVersion(request.GetVersion())
417 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500418 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400419 //TODO wire this to voltha core when it implements
420 return response, nil
421}
422func handlePortStatsRequest(request *ofp.PortStatsRequest, id common.ID) (*ofp.PortStatsReply, error) {
423 log.Println("HERE")
424 response := ofp.NewPortStatsReply()
425 response.SetXid(request.GetXid())
426 response.SetVersion(request.GetVersion())
Don Newtone0d34a82019-11-14 10:58:06 -0500427 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400428 client := *getGrpcClient()
429 reply, err := client.ListLogicalDevicePorts(context.Background(), &id)
430 //reply,err := client.GetLogicalDevicePort(context.Background(),&id)
431 if err != nil {
432 log.Printf("error calling ListDevicePorts %v", err)
433 return nil, err
434 }
435 js, _ := json.Marshal(reply)
436 log.Printf("PORT STATS REPLY %s", js)
437 ports := reply.GetItems()
438 var entries []*ofp.PortStatsEntry
439 if request.GetPortNo() == 0xffffffff { //all ports
440 for i := 0; i < len(ports); i++ {
441 port := ports[i]
442 entry := parsePortStats(port)
443 entries = append(entries, &entry)
444 }
445 } else { //find right port that is requested
446 for i := 0; i < len(ports); i++ {
447 if ports[i].GetOfpPortStats().GetPortNo() == uint32(request.GetPortNo()) {
448 entry := parsePortStats(ports[i])
449 entries = append(entries, &entry)
450 }
451 }
452 }
453 response.SetEntries(entries)
454 js, _ = json.Marshal(response)
455 log.Printf("handlePortStatsResponse %s", js)
456 return response, nil
457
458}
Don Newtone0d34a82019-11-14 10:58:06 -0500459
Don Newton98fd8812019-09-23 15:15:02 -0400460func handlePortDescStatsRequest(request *ofp.PortDescStatsRequest, deviceId string) (*ofp.PortDescStatsReply, error) {
461 response := ofp.NewPortDescStatsReply()
462 response.SetVersion(request.GetVersion())
463 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500464 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400465 var grpcClient = *getGrpcClient()
466 var id = common.ID{Id: deviceId}
467 logicalDevice, err := grpcClient.GetLogicalDevice(context.Background(), &id)
468 if err != nil {
469 return nil, err
470 }
471 ports := logicalDevice.GetPorts()
472 var entries []*ofp.PortDesc
473 for i := 0; i < len(ports); i++ {
474 var entry ofp.PortDesc
475 port := ports[i].GetOfpPort()
476 entry.SetPortNo(ofp.Port(port.GetPortNo()))
477
478 intArray := port.GetHwAddr()
479 var octets []byte
480 for i := 0; i < len(intArray); i++ {
481 octets = append(octets, byte(intArray[i]))
482 }
483 hwAddr := net.HardwareAddr(octets)
484 entry.SetHwAddr(hwAddr)
485 entry.SetName(PadString(port.GetName(), 16))
486 entry.SetConfig(ofp.PortConfig(port.GetConfig()))
487 entry.SetState(ofp.PortState(port.GetState()))
488 entry.SetCurr(ofp.PortFeatures(port.GetCurr()))
489 entry.SetAdvertised(ofp.PortFeatures(port.GetAdvertised()))
490 entry.SetSupported(ofp.PortFeatures(port.GetSupported()))
491 entry.SetPeer(ofp.PortFeatures(port.GetPeer()))
492 entry.SetCurrSpeed(port.GetCurrSpeed())
493 entry.SetMaxSpeed(port.GetMaxSpeed())
494
495 entries = append(entries, &entry)
496 }
497
498 response.SetEntries(entries)
499 //TODO call voltha and get port descriptions etc
500 return response, nil
501
502}
503func handleMeterFeatureStatsRequest(request *ofp.MeterFeaturesStatsRequest) (*ofp.MeterFeaturesStatsReply, error) {
504 response := ofp.NewMeterFeaturesStatsReply()
505 response.SetXid(request.GetXid())
506 response.SetVersion(request.GetVersion())
Don Newtone0d34a82019-11-14 10:58:06 -0500507 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
508 meterFeatures := ofp.NewMeterFeatures()
509 meterFeatures.Capabilities = ofp.OFPMFKbps
510 meterFeatures.BandTypes = ofp.OFPMBTDrop
511 meterFeatures.MaxMeter = 0xffffffff
512 meterFeatures.MaxBands = 0xff
513 meterFeatures.MaxColor = 0xff
514 response.Features = *meterFeatures
Don Newton98fd8812019-09-23 15:15:02 -0400515 return response, nil
516}
517func handleExperimenterStatsRequest(request *ofp.ExperimenterStatsRequest, id common.ID) (*ofp.ExperimenterStatsReply, error) {
518 response := ofp.NewExperimenterStatsReply(request.GetExperimenter())
519 response.SetVersion(request.GetVersion())
520 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500521 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400522 //TODO wire this to voltha core when it implements
523 return response, nil
524}