blob: 021846330129deb7192656e4eb8d9743bdf1243d [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 Newtone0d34a82019-11-14 10:58:06 -050027 "github.com/opencord/voltha-protos/go/openflow_13"
28
29 "github.com/donNewtonAlpha/goloxi"
30 ofp "github.com/donNewtonAlpha/goloxi/of13"
Don Newton98fd8812019-09-23 15:15:02 -040031 "github.com/opencord/voltha-protos/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)
50 response, _ := handleFlowStatsRequest(statsReq, id)
Don Newtone0d34a82019-11-14 10:58:06 -050051 response.Length = uint16(unsafe.Sizeof(*response))
52 jResponse, _ := json.Marshal(response)
53 log.Printf("HANDLE FLOW STATS REQUEST response\n\n\n %s \n\n\n", jResponse)
Don Newton98fd8812019-09-23 15:15:02 -040054 err := client.SendMessage(response)
55 if err != nil {
56 return err
57 }
58
Don Newtone0d34a82019-11-14 10:58:06 -050059 case ofp.OFPSTAggregate:
Don Newton98fd8812019-09-23 15:15:02 -040060 statsReq := request.(*ofp.AggregateStatsRequest)
61 aggregateStatsReply, err := handleAggregateStatsRequest(statsReq, id)
62 if err != nil {
63 return err
64 }
65 client.SendMessage(aggregateStatsReply)
Don Newtone0d34a82019-11-14 10:58:06 -050066 case ofp.OFPSTTable:
Don Newton98fd8812019-09-23 15:15:02 -040067 statsReq := request.(*ofp.TableStatsRequest)
68 tableStatsReply, e := handleTableStatsRequest(statsReq, id)
69 if e != nil {
70 return e
71 }
72 client.SendMessage(tableStatsReply)
Don Newtone0d34a82019-11-14 10:58:06 -050073 case ofp.OFPSTPort:
Don Newton98fd8812019-09-23 15:15:02 -040074 statsReq := request.(*ofp.PortStatsRequest)
75 response, err := handlePortStatsRequest(statsReq, id)
76 if err != nil {
77 return err
78 }
79 client.SendMessage(response)
80
Don Newtone0d34a82019-11-14 10:58:06 -050081 case ofp.OFPSTQueue:
Don Newton98fd8812019-09-23 15:15:02 -040082 statsReq := request.(*ofp.QueueStatsRequest)
83 response, err := handleQueueStatsRequest(statsReq, id)
84 if err != nil {
85 return err
86 }
87 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -050088 case ofp.OFPSTGroup:
Don Newton98fd8812019-09-23 15:15:02 -040089 statsReq := request.(*ofp.GroupStatsRequest)
90 response, err := handleGroupStatsRequest(statsReq, id)
91 if err != nil {
92 return err
93 }
Don Newtone0d34a82019-11-14 10:58:06 -050094
Don Newton98fd8812019-09-23 15:15:02 -040095 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -050096 case ofp.OFPSTGroupDesc:
Don Newton98fd8812019-09-23 15:15:02 -040097 statsReq := request.(*ofp.GroupDescStatsRequest)
98 response, err := handleGroupStatsDescRequest(statsReq, id)
99 if err != nil {
100 return err
101 }
102 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -0500103
104 case ofp.OFPSTGroupFeatures:
Don Newton98fd8812019-09-23 15:15:02 -0400105 statsReq := request.(*ofp.GroupFeaturesStatsRequest)
106 response, err := handleGroupFeatureStatsRequest(statsReq, id)
107 if err != nil {
108 return err
109 }
110 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -0500111 case ofp.OFPSTMeter:
Don Newton98fd8812019-09-23 15:15:02 -0400112 statsReq := request.(*ofp.MeterStatsRequest)
113 response, err := handleMeterStatsRequest(statsReq, id)
114 if err != nil {
Don Newtone0d34a82019-11-14 10:58:06 -0500115 log.Printf("ERROR HANDLE METER STATS REQUEST %v", err)
Don Newton98fd8812019-09-23 15:15:02 -0400116 return err
117 }
118 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -0500119 case ofp.OFPSTMeterConfig:
Don Newton98fd8812019-09-23 15:15:02 -0400120 statsReq := request.(*ofp.MeterConfigStatsRequest)
121 response, err := handleMeterConfigStatsRequest(statsReq, id)
122 if err != nil {
123 return err
124 }
125 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -0500126 case ofp.OFPSTMeterFeatures:
Don Newton98fd8812019-09-23 15:15:02 -0400127 statsReq := request.(*ofp.MeterFeaturesStatsRequest)
128 response, err := handleMeterFeatureStatsRequest(statsReq)
129 if err != nil {
130 return err
131 }
132 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -0500133 case ofp.OFPSTTableFeatures:
Don Newton98fd8812019-09-23 15:15:02 -0400134 statsReq := request.(*ofp.TableFeaturesStatsRequest)
135 response, err := handleTableFeaturesStatsRequest(statsReq, id)
136 if err != nil {
137 return err
138 }
139 client.SendMessage(response)
Don Newtone0d34a82019-11-14 10:58:06 -0500140 case ofp.OFPSTPortDesc:
Don Newton98fd8812019-09-23 15:15:02 -0400141 statsReq := request.(*ofp.PortDescStatsRequest)
142 response, err := handlePortDescStatsRequest(statsReq, deviceId)
143 if err != nil {
144 return err
145 }
146 client.SendMessage(response)
147
Don Newtone0d34a82019-11-14 10:58:06 -0500148 case ofp.OFPSTExperimenter:
Don Newton98fd8812019-09-23 15:15:02 -0400149 statsReq := request.(*ofp.ExperimenterStatsRequest)
150 response, err := handleExperimenterStatsRequest(statsReq, id)
151 if err != nil {
152 return err
153 }
154 client.SendMessage(response)
155 }
156 return nil
157}
158
159func handleDescStatsRequest(request *ofp.DescStatsRequest, id common.ID) (*ofp.DescStatsReply, error) {
160 response := ofp.NewDescStatsReply()
161 response.SetXid(request.GetXid())
162 response.SetVersion(request.GetVersion())
Don Newtone0d34a82019-11-14 10:58:06 -0500163 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
164
Don Newton98fd8812019-09-23 15:15:02 -0400165 client := *getGrpcClient()
166 resp, err := client.GetLogicalDevice(context.Background(), &id)
167 if err != nil {
168 return nil, err
169 }
170 desc := resp.GetDesc()
171
172 response.SetMfrDesc(PadString(desc.GetMfrDesc(), 256))
173 response.SetHwDesc(PadString(desc.GetHwDesc(), 256))
174 response.SetSwDesc(PadString(desc.GetSwDesc(), 256))
175 response.SetSerialNum(PadString(desc.GetSerialNum(), 32))
176 response.SetDpDesc(PadString(desc.GetDpDesc(), 256))
Don Newton98fd8812019-09-23 15:15:02 -0400177 return response, nil
178}
179func handleFlowStatsRequest(request *ofp.FlowStatsRequest, id common.ID) (*ofp.FlowStatsReply, error) {
180 log.Println("****************************************\n***********************************")
181 response := ofp.NewFlowStatsReply()
182 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500183 response.SetVersion(4)
184 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400185 client := *getGrpcClient()
186 resp, err := client.ListLogicalDeviceFlows(context.Background(), &id)
187 if err != nil {
Don Newton98fd8812019-09-23 15:15:02 -0400188 log.Printf("err in handleFlowStatsRequest calling ListLogicalDeviceFlows %v", err)
189 return nil, err
190 }
Don Newtone0d34a82019-11-14 10:58:06 -0500191 js, _ := json.Marshal(resp)
192 log.Printf("HandleFlowStats response: %s", js)
Don Newton98fd8812019-09-23 15:15:02 -0400193 var flow []*ofp.FlowStatsEntry
194 items := resp.GetItems()
195
196 for i := 0; i < len(items); i++ {
Don Newtone0d34a82019-11-14 10:58:06 -0500197 item := items[i]
198 entry := ofp.NewFlowStatsEntry()
Don Newton98fd8812019-09-23 15:15:02 -0400199
Don Newtone0d34a82019-11-14 10:58:06 -0500200 entry.SetTableId(uint8(item.GetTableId()))
Don Newton98fd8812019-09-23 15:15:02 -0400201 entry.SetDurationSec(item.GetDurationSec())
202 entry.SetDurationNsec(item.GetDurationNsec())
203 entry.SetPriority(uint16(item.GetPriority()))
204 entry.SetIdleTimeout(uint16(item.GetIdleTimeout()))
205 entry.SetHardTimeout(uint16(item.GetHardTimeout()))
206 entry.SetFlags(ofp.FlowModFlags(item.GetFlags()))
207 entry.SetCookie(item.GetCookie())
208 entry.SetPacketCount(item.GetPacketCount())
209 entry.SetByteCount(item.GetByteCount())
Don Newtone0d34a82019-11-14 10:58:06 -0500210 var entrySize uint16
211 entrySize = 48
212 match := ofp.NewMatchV3()
Don Newton98fd8812019-09-23 15:15:02 -0400213 pbMatch := item.GetMatch()
Don Newton98fd8812019-09-23 15:15:02 -0400214 var fields []goloxi.IOxm
215 match.SetType(uint16(pbMatch.GetType()))
216 oxFields := pbMatch.GetOxmFields()
Don Newtone0d34a82019-11-14 10:58:06 -0500217 var size uint16
218 size = 4
Don Newton98fd8812019-09-23 15:15:02 -0400219 for i := 0; i < len(oxFields); i++ {
Don Newton98fd8812019-09-23 15:15:02 -0400220 oxmField := oxFields[i]
221 field := oxmField.GetField()
222 ofbField := field.(*openflow_13.OfpOxmField_OfbField).OfbField
Don Newtone0d34a82019-11-14 10:58:06 -0500223 iOxm, oxmSize := parseOxm(ofbField)
224 log.Printf("OXMSIZE %d", oxmSize)
225 fields = append(fields, iOxm)
226 if oxmSize > 0 {
227 size += 4 //header for oxm
Don Newton98fd8812019-09-23 15:15:02 -0400228 }
Don Newtone0d34a82019-11-14 10:58:06 -0500229 size += oxmSize
230 log.Printf("SIZE %d", size)
Don Newton98fd8812019-09-23 15:15:02 -0400231 }
Don Newtone0d34a82019-11-14 10:58:06 -0500232
233 log.Printf("entrySize %d += size %d", entrySize, size)
234 log.Printf("new entrySize %d", entrySize)
Don Newton98fd8812019-09-23 15:15:02 -0400235 match.OxmList = fields
Don Newtone0d34a82019-11-14 10:58:06 -0500236 match.Length = uint16(size)
237 //account for 8 byte alignment
238 log.Printf("Size was %d", size)
239 if size%8 != 0 {
240 size = ((size / 8) + 1) * 8
241 }
242 log.Printf("Size is %d", size)
243 entrySize += size
244 entry.SetMatch(*match)
Don Newton98fd8812019-09-23 15:15:02 -0400245 var instructions []ofp.IInstruction
246 ofpInstructions := item.Instructions
247 for i := 0; i < len(ofpInstructions); i++ {
Don Newtone0d34a82019-11-14 10:58:06 -0500248 instruction, size := parseInstructions(ofpInstructions[i])
249 instructions = append(instructions, instruction)
250 entrySize += size
Don Newton98fd8812019-09-23 15:15:02 -0400251 }
252 entry.Instructions = instructions
Don Newtone0d34a82019-11-14 10:58:06 -0500253 log.Printf("entrysize was %d", entrySize)
254 entrySizeMeasured := uint16(unsafe.Sizeof(*entry))
255 log.Printf("entrysize measure %d", entrySizeMeasured)
256 entry.Length = entrySize
257 entrySize = 0
258 flow = append(flow, entry)
Don Newton98fd8812019-09-23 15:15:02 -0400259 }
260 response.SetEntries(flow)
261 return response, nil
262}
263func handleAggregateStatsRequest(request *ofp.AggregateStatsRequest, id common.ID) (*ofp.AggregateStatsReply, error) {
264 response := ofp.NewAggregateStatsReply()
265 response.SetVersion(request.GetVersion())
266 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500267 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400268 response.SetFlowCount(0)
269 //TODO wire this to voltha core when it implements
270 return response, nil
271}
272func handleGroupStatsRequest(request *ofp.GroupStatsRequest, id common.ID) (*ofp.GroupStatsReply, error) {
273 response := ofp.NewGroupStatsReply()
274 response.SetVersion(request.GetVersion())
275 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500276 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400277 client := *getGrpcClient()
278 reply, err := client.ListLogicalDeviceFlowGroups(context.Background(), &id)
279 if err != nil {
280 return nil, err
281 }
282
283 var groupStatsEntries []*ofp.GroupStatsEntry
284 items := reply.GetItems()
285 for i := 0; i < len(items); i++ {
286 item := items[i].GetStats()
287 var entry ofp.GroupStatsEntry
288 entry.SetByteCount(item.GetByteCount())
289 entry.SetPacketCount(item.GetPacketCount())
290 entry.SetDurationNsec(item.GetDurationNsec())
291 entry.SetDurationSec(item.GetDurationSec())
292 entry.SetRefCount(item.GetRefCount())
293 entry.SetGroupId(item.GetGroupId())
294 bucketStats := item.GetBucketStats()
295 var bucketStatsList []*ofp.BucketCounter
296 for j := 0; j < len(bucketStats); j++ {
297 bucketStat := bucketStats[i]
298 var bucketCounter ofp.BucketCounter
299 bucketCounter.SetPacketCount(bucketStat.GetPacketCount())
300 bucketCounter.SetByteCount(bucketStat.GetByteCount())
301 bucketStatsList = append(bucketStatsList, &bucketCounter)
302 }
303 entry.SetBucketStats(bucketStatsList)
304 groupStatsEntries = append(groupStatsEntries, &entry)
305 }
306 response.SetEntries(groupStatsEntries)
307 return response, nil
308}
309func handleGroupStatsDescRequest(request *ofp.GroupDescStatsRequest, id common.ID) (*ofp.GroupDescStatsReply, error) {
310 response := ofp.NewGroupDescStatsReply()
311 response.SetVersion(request.GetVersion())
312 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500313 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400314 client := *getGrpcClient()
315 reply, err := client.ListLogicalDeviceFlowGroups(context.Background(), &id)
316 if err != nil {
317 return nil, err
318 }
319 entries := reply.GetItems()
320 var groupDescStatsEntries []*ofp.GroupDescStatsEntry
321 for i := 0; i < len(entries); i++ {
322 item := entries[i].GetStats()
323 var groupDesc ofp.GroupDescStatsEntry
324 groupDesc.SetGroupId(item.GetGroupId())
325 /*
326 buckets := item.g
327 var bucketList []*ofp.Bucket
328 for j:=0;j<len(buckets);j++{
329
330 }
331
332 groupDesc.SetBuckets(bucketList)
333 */
334 groupDescStatsEntries = append(groupDescStatsEntries, &groupDesc)
335 }
336 response.SetEntries(groupDescStatsEntries)
337 return response, nil
338}
339func handleGroupFeatureStatsRequest(request *ofp.GroupFeaturesStatsRequest, id common.ID) (*ofp.GroupFeaturesStatsReply, error) {
340 response := ofp.NewGroupFeaturesStatsReply()
341 response.SetVersion(request.GetVersion())
342 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500343 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400344 //TODO wire this to voltha core when it implements
345 return response, nil
346}
347func handleMeterStatsRequest(request *ofp.MeterStatsRequest, id common.ID) (*ofp.MeterStatsReply, error) {
348 response := ofp.NewMeterStatsReply()
349 response.SetVersion(request.GetVersion())
350 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500351 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
352 client := *getGrpcClient()
353 resp, err := client.ListLogicalDeviceMeters(context.Background(), &id)
354 if err != nil {
355 return nil, err
356 }
357 size := uint16(40)
358 items := resp.Items
359 var meterStats []*ofp.MeterStats
360 for i := 0; i < len(items); i++ {
361 meterStat := ofp.NewMeterStats()
362 item := items[i]
363 stats := item.Stats
364 meterStat.DurationNsec = stats.DurationNsec
365 meterStat.DurationSec = stats.DurationSec
366 meterStat.ByteInCount = stats.ByteInCount
367 meterStat.FlowCount = stats.FlowCount
368 meterStat.MeterId = stats.MeterId
369 var bandStats []*ofp.MeterBandStats
370 bStats := stats.BandStats
371 for j := 0; j < len(bStats); j++ {
372 bStat := bStats[j]
373 bandStat := ofp.NewMeterBandStats()
374 bandStat.ByteBandCount = bStat.ByteBandCount
375 bandStat.PacketBandCount = bStat.PacketBandCount
376 bandStats = append(bandStats, bandStat)
377 size += 16
378 }
379 meterStat.SetBandStats(bandStats)
380 meterStat.Len = size
381 meterStats = append(meterStats, meterStat)
382 }
383 response.SetEntries(meterStats)
Don Newton98fd8812019-09-23 15:15:02 -0400384 return response, nil
385}
Don Newton98fd8812019-09-23 15:15:02 -0400386func handleMeterConfigStatsRequest(request *ofp.MeterConfigStatsRequest, id common.ID) (*ofp.MeterConfigStatsReply, error) {
387 response := ofp.NewMeterConfigStatsReply()
388 response.SetVersion(request.GetVersion())
389 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500390 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400391 //TODO wire this to voltha core when it implements
392 return response, nil
393}
Don Newton98fd8812019-09-23 15:15:02 -0400394func handleTableFeaturesStatsRequest(request *ofp.TableFeaturesStatsRequest, id common.ID) (*ofp.TableFeaturesStatsReply, error) {
395 response := ofp.NewTableFeaturesStatsReply()
396 response.SetVersion(request.GetVersion())
397 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500398 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400399 //TODO wire this to voltha core when it implements
400 return response, nil
401}
402func handleTableStatsRequest(request *ofp.TableStatsRequest, id common.ID) (*ofp.TableStatsReply, error) {
Don Newtone0d34a82019-11-14 10:58:06 -0500403 var response = ofp.NewTableStatsReply()
404 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
405 response.SetVersion(request.GetVersion())
406 response.SetXid(request.GetXid())
407 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
408 return response, nil
Don Newton98fd8812019-09-23 15:15:02 -0400409}
410func handleQueueStatsRequest(request *ofp.QueueStatsRequest, id common.ID) (*ofp.QueueStatsReply, error) {
411 response := ofp.NewQueueStatsReply()
412 response.SetVersion(request.GetVersion())
413 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500414 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400415 //TODO wire this to voltha core when it implements
416 return response, nil
417}
418func handlePortStatsRequest(request *ofp.PortStatsRequest, id common.ID) (*ofp.PortStatsReply, error) {
419 log.Println("HERE")
420 response := ofp.NewPortStatsReply()
421 response.SetXid(request.GetXid())
422 response.SetVersion(request.GetVersion())
Don Newtone0d34a82019-11-14 10:58:06 -0500423 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400424 client := *getGrpcClient()
425 reply, err := client.ListLogicalDevicePorts(context.Background(), &id)
426 //reply,err := client.GetLogicalDevicePort(context.Background(),&id)
427 if err != nil {
428 log.Printf("error calling ListDevicePorts %v", err)
429 return nil, err
430 }
431 js, _ := json.Marshal(reply)
432 log.Printf("PORT STATS REPLY %s", js)
433 ports := reply.GetItems()
434 var entries []*ofp.PortStatsEntry
435 if request.GetPortNo() == 0xffffffff { //all ports
436 for i := 0; i < len(ports); i++ {
437 port := ports[i]
438 entry := parsePortStats(port)
439 entries = append(entries, &entry)
440 }
441 } else { //find right port that is requested
442 for i := 0; i < len(ports); i++ {
443 if ports[i].GetOfpPortStats().GetPortNo() == uint32(request.GetPortNo()) {
444 entry := parsePortStats(ports[i])
445 entries = append(entries, &entry)
446 }
447 }
448 }
449 response.SetEntries(entries)
450 js, _ = json.Marshal(response)
451 log.Printf("handlePortStatsResponse %s", js)
452 return response, nil
453
454}
Don Newtone0d34a82019-11-14 10:58:06 -0500455
Don Newton98fd8812019-09-23 15:15:02 -0400456func handlePortDescStatsRequest(request *ofp.PortDescStatsRequest, deviceId string) (*ofp.PortDescStatsReply, error) {
457 response := ofp.NewPortDescStatsReply()
458 response.SetVersion(request.GetVersion())
459 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500460 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400461 var grpcClient = *getGrpcClient()
462 var id = common.ID{Id: deviceId}
463 logicalDevice, err := grpcClient.GetLogicalDevice(context.Background(), &id)
464 if err != nil {
465 return nil, err
466 }
467 ports := logicalDevice.GetPorts()
468 var entries []*ofp.PortDesc
469 for i := 0; i < len(ports); i++ {
470 var entry ofp.PortDesc
471 port := ports[i].GetOfpPort()
472 entry.SetPortNo(ofp.Port(port.GetPortNo()))
473
474 intArray := port.GetHwAddr()
475 var octets []byte
476 for i := 0; i < len(intArray); i++ {
477 octets = append(octets, byte(intArray[i]))
478 }
479 hwAddr := net.HardwareAddr(octets)
480 entry.SetHwAddr(hwAddr)
481 entry.SetName(PadString(port.GetName(), 16))
482 entry.SetConfig(ofp.PortConfig(port.GetConfig()))
483 entry.SetState(ofp.PortState(port.GetState()))
484 entry.SetCurr(ofp.PortFeatures(port.GetCurr()))
485 entry.SetAdvertised(ofp.PortFeatures(port.GetAdvertised()))
486 entry.SetSupported(ofp.PortFeatures(port.GetSupported()))
487 entry.SetPeer(ofp.PortFeatures(port.GetPeer()))
488 entry.SetCurrSpeed(port.GetCurrSpeed())
489 entry.SetMaxSpeed(port.GetMaxSpeed())
490
491 entries = append(entries, &entry)
492 }
493
494 response.SetEntries(entries)
495 //TODO call voltha and get port descriptions etc
496 return response, nil
497
498}
499func handleMeterFeatureStatsRequest(request *ofp.MeterFeaturesStatsRequest) (*ofp.MeterFeaturesStatsReply, error) {
500 response := ofp.NewMeterFeaturesStatsReply()
501 response.SetXid(request.GetXid())
502 response.SetVersion(request.GetVersion())
Don Newtone0d34a82019-11-14 10:58:06 -0500503 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
504 meterFeatures := ofp.NewMeterFeatures()
505 meterFeatures.Capabilities = ofp.OFPMFKbps
506 meterFeatures.BandTypes = ofp.OFPMBTDrop
507 meterFeatures.MaxMeter = 0xffffffff
508 meterFeatures.MaxBands = 0xff
509 meterFeatures.MaxColor = 0xff
510 response.Features = *meterFeatures
Don Newton98fd8812019-09-23 15:15:02 -0400511 return response, nil
512}
513func handleExperimenterStatsRequest(request *ofp.ExperimenterStatsRequest, id common.ID) (*ofp.ExperimenterStatsReply, error) {
514 response := ofp.NewExperimenterStatsReply(request.GetExperimenter())
515 response.SetVersion(request.GetVersion())
516 response.SetXid(request.GetXid())
Don Newtone0d34a82019-11-14 10:58:06 -0500517 response.SetFlags(ofp.StatsReplyFlags(request.GetFlags()))
Don Newton98fd8812019-09-23 15:15:02 -0400518 //TODO wire this to voltha core when it implements
519 return response, nil
520}