blob: 76b548f1c1eff97d022290328d5bb4c88702a5b0 [file] [log] [blame]
Takahiro Suzukid7bf8202020-12-17 20:21:59 +09001/*
2 * Copyright 2020-present Open Networking Foundation
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 core
17
18import (
19 "context"
20 "encoding/binary"
21 "errors"
22 "fmt"
23 "strconv"
24 "strings"
25 "sync"
26 "time"
27
28 "github.com/google/gopacket"
29 "github.com/google/gopacket/layers"
30 "github.com/opencord/voltha-openolt-adapter/internal/pkg/core/l2oam"
31 "github.com/opencord/voltha-protos/v3/go/common"
32 oop "github.com/opencord/voltha-protos/v3/go/openolt"
33 "github.com/opencord/voltha-protos/v3/go/voltha"
34)
35
36// DeviceNameOlt is a constant for OLT
37const DeviceNameOlt = "L2oamOltDevice"
38
39// DeviceNameOnu is a constant for ONU
40const DeviceNameOnu = "L2oamOnuDevice"
41
42// KeepAliveInterval is an interval time for keep-alive
43const KeepAliveInterval = 800
44
45// KeepAliveCounter is max count of not receiving keep-alive response
46const KeepAliveCounter = 10
47
48// ResponseTimer is wait time for receiving response message(seconds)
49const ResponseTimer = 20
50
51//KeepAliveStatusE is state of keep-alive message
52type KeepAliveStatusE int
53
54const (
55 KeepAliveDisable KeepAliveStatusE = iota
56 KeepAliveStep1
57 KeepAliveStep2
58 KeepAliveStep3
59)
60
61// map for L2oamDevice, its key is MAC address without colon
62var deviceMap map[string]L2oamDevice
63
64// map for L2oamDevice, its key is device-ID
65var deviceMacMap map[string]string
66
67var mapMutex sync.Mutex
68
69var l2oamDeviceHandler *DeviceHandler
70
71func init() {
72 deviceMap = map[string]L2oamDevice{}
73 deviceMacMap = map[string]string{}
74 monitoringOnuStatus()
75}
76
77// FindL2oamDevice returns a L2oamDevice using MAC address
78func FindL2oamDevice(macAddress string) L2oamDevice {
79 mapMutex.Lock()
80 defer mapMutex.Unlock()
81 mac := strings.Replace(macAddress, ":", "", -1)
82 onu, ok := deviceMap[mac]
83 if !ok {
84 return nil
85 }
86 return onu
87
88}
89
90// FindL2oamDeviceByDeviceID returns a L2oamDevice using device-ID
91func FindL2oamDeviceByDeviceID(deviceID string) L2oamDevice {
92 mapMutex.Lock()
93 defer mapMutex.Unlock()
94 mac, ok := deviceMacMap[deviceID]
95 if !ok {
96 return nil
97 }
98 onu, ok := deviceMap[mac]
99 if !ok {
100 return nil
101 }
102 return onu
103}
104
105// SetupL2oamDeleteFlag sets delete flag
106func SetupL2oamDeleteFlag(deviceID string) bool {
107 mapMutex.Lock()
108 defer mapMutex.Unlock()
109
110 mac, ok := deviceMacMap[deviceID]
111 if !ok {
112 return false
113 }
114 device, ok := deviceMap[mac]
115 if !ok {
116 return false
117 }
118 if device.getDeleteFlag() {
119 return false
120 }
121 device.setDeleteFlag()
122 deviceMap[mac] = device
123
124 return true
125}
126
127// NewL2oamOltDevice creates a new OLT device
128func NewL2oamOltDevice(macAddress string, dh *DeviceHandler) (L2oamDevice, error) {
129 mapMutex.Lock()
130 defer mapMutex.Unlock()
131
132 l2oamDeviceHandler = dh
133
134 mac := strings.Replace(macAddress, ":", "", -1)
135 _, ok := deviceMap[mac]
136 if !ok {
137 device := &L2oamOltDevice{
138 Base: DeviceBase{
139 ResCh: nil,
140 KeepAliveResCh: make(chan *layers.Ethernet, 100),
141 DstMac: mac,
142 DH: dh,
143 DeviceID: dh.device.Id,
144 StopCh: make(chan string, 1),
145 ActiveState: false,
146 Name: DeviceNameOlt,
147 },
148 L2SwitchDomainMap: map[uint32]*l2SwitchDomain{},
149 }
150 deviceMap[mac] = device
151 deviceMacMap[dh.device.Id] = mac
152 return device, nil
153 }
154 return nil, fmt.Errorf("NewL2oamOltDevice() Already registered. mac=%s", mac)
155}
156
157// NewL2oamOnuDevice creates a new ONU device
158func NewL2oamOnuDevice(macAddress string, dh *DeviceHandler) (L2oamDevice, error) {
159 mapMutex.Lock()
160 defer mapMutex.Unlock()
161
162 mac := strings.Replace(macAddress, ":", "", -1)
163 _, ok := deviceMap[mac]
164 if !ok {
165 device := &L2oamOnuDevice{
166 Base: DeviceBase{
167 ResCh: nil,
168 KeepAliveResCh: make(chan *layers.Ethernet, 100),
169 DstMac: mac,
170 DH: dh,
171 StopCh: make(chan string, 1),
172 ActiveState: true,
173 Name: DeviceNameOnu,
174 },
175 keepAliveResponse: make(chan string, 1),
176 MacAddress: mac,
177 }
178 deviceMap[mac] = device
179 return device, nil
180 }
181 return nil, fmt.Errorf("NewL2oamOnuDevice() Already registered. mac=%s", mac)
182}
183
184// DeleteAllDevice deletes all devices
185func DeleteAllDevice() {
186 mapMutex.Lock()
187 defer mapMutex.Unlock()
188
189 for _, value := range deviceMap {
190 value.delete(context.Background())
191 }
192 deviceMap = map[string]L2oamDevice{}
193 deviceMacMap = map[string]string{}
194}
195
196// DeleteDevice deletes device
197func DeleteDevice(deviceId string, deviceMac string) {
198 mapMutex.Lock()
199 defer mapMutex.Unlock()
200
201 _, ok := deviceMacMap[deviceId]
202 if ok {
203 delete(deviceMacMap, deviceId)
204 logger.Info(context.Background(), fmt.Sprintf("DeleteDevice() deviceMacMap. deviceid=%s, ", deviceId))
205 }
206 mac := strings.Replace(deviceMac, ":", "", -1)
207 _, ok = deviceMap[mac]
208 if ok {
209 delete(deviceMap, mac)
210 logger.Info(context.Background(), fmt.Sprintf("DeleteDevice() deviceMap. mac=%s, ", mac))
211 }
212}
213
214// L2oamDevice interface provides some methods for device
215// OLT and ONU implement each functions
216type L2oamDevice interface {
217 getDeviceName() string
218 send(message gopacket.SerializableLayer) error
219 waitResponse(timeoutSecond int) (*layers.Ethernet, error)
220 sendAndWait(message gopacket.SerializableLayer, timeoutSecond int) (*layers.Ethernet, error)
221 recieve(etherPacket *layers.Ethernet)
222 recieveKeepAlive(etherPacket *layers.Ethernet)
223 startKeepAlive()
224 stopKeepAlive()
225 setActiveState(ctx context.Context, isActive bool)
226 startMountSequence(ctx context.Context, pkgType string, cmd *L2oamCmd)
227 reboot(ctx context.Context)
228 setL2oamCmd(*L2oamCmd)
229 getL2oamCmd() *L2oamCmd
230 setObjectContext(*l2oam.TomiObjectContext)
231 getObjectContext() *l2oam.TomiObjectContext
232 setReferenceTable(*l2oam.GetTrafficControlReferenceTableRes)
233 getReferenceTable() *l2oam.GetTrafficControlReferenceTableRes
234 setProfile(*l2oam.SetGenericActionCreateRes, *l2oam.SetGenericActionCreateRes)
235 getProfile() (*l2oam.SetGenericActionCreateRes, *l2oam.SetGenericActionCreateRes)
236 delete(ctx context.Context)
237 setDeleteFlag()
238 getDeleteFlag() bool
239 setAutonomousFlag(bool)
240 getAutonomousFlag() bool
241 updateMap()
242 receiveEapol(etherPacket *layers.Ethernet)
243 addFlow(ctx context.Context, cmd *L2oamCmd) error
244 updateFlow(ctx context.Context, cmd *L2oamCmd) error
245 removeFlow(ctx context.Context) error
246}
247
248type l2SwitchDomain struct {
249 OcAction *l2oam.TomiObjectContext
250 Tpid []byte
251 Vid []byte
252 Onus map[string]bool
253}
254
255// DeviceBase ====================================
256// DeviceBase contains common functions
257// ===============================================
258type DeviceBase struct {
259 ResCh chan *layers.Ethernet
260 KeepAliveResCh chan *layers.Ethernet
261 DstMac string
262 DH *DeviceHandler
263 DeviceID string
264 mu sync.Mutex
265 muResponse sync.Mutex
266 muResCh sync.Mutex
267 StopCh chan string
268 ActiveState bool
269 KeepAliveStatus KeepAliveStatusE
270 KeepAliveRemoteValue []byte
271 KeepAliveSendCounter int
272 Name string
273 DeleteFlag bool
274 AutonomousFlag bool
275 FlowAdded bool
276 ActionIds map[int]uint32
277 EapFlag bool
278}
279
280const (
281 ActionIDFilterPonPort = 1
282 ActionIDFilterEthPort = 2
283)
284
285func (d *DeviceBase) getDeviceName() string {
286 return d.Name
287}
288
289func (d *DeviceBase) send(message gopacket.SerializableLayer) error {
290 var bytes []byte
291 if vlanEnable {
292 vlanLayer := &layers.Dot1Q{
293 VLANIdentifier: vlanIdManagement,
294 Type: 0xa8c8,
295 }
296 bytes = l2oam.CreateMessageVlan(
297 SrcMac,
298 convertMacString(d.DstMac),
299 0x88a8,
300 message,
301 vlanLayer,
302 )
303 } else {
304 bytes = l2oam.CreateMessage(
305 SrcMac,
306 convertMacString(d.DstMac),
307 0xa8c8,
308 message,
309 )
310
311 }
312 GetL2oamHandle().send(bytes)
313 return nil
314}
315
316func (d *DeviceBase) waitResponse(timeoutSecond int) (*layers.Ethernet, error) {
317 d.muResponse.Lock()
318 defer d.muResponse.Unlock()
319
320 d.ResCh = make(chan *layers.Ethernet, 1)
321 defer func() {
322 d.muResCh.Lock()
323 close(d.ResCh)
324 d.ResCh = nil
325 d.muResCh.Unlock()
326 }()
327 ctx := context.Background()
328 var res *layers.Ethernet
329 var err error
330 select {
331 case res = <-d.ResCh:
332 // DeviceBase do nothing
333 logger.Debug(ctx, fmt.Sprintf("[%s] DeviceBase.waitResponse() received", d.getDeviceName()))
334 case <-time.After(time.Duration(timeoutSecond) * time.Second):
335 err = fmt.Errorf("DeviceBase.waitResponse().ResCh receive timeout")
336 }
337 return res, err
338}
339
340func (d *DeviceBase) sendAndWait(message gopacket.SerializableLayer, timeoutSecond int) (*layers.Ethernet, error) {
341 if err := d.send(message); err != nil {
342 return nil, err
343 }
344
345 return d.waitResponse(timeoutSecond)
346}
347
348func (d *DeviceBase) recieve(etherPacket *layers.Ethernet) {
349 d.muResCh.Lock()
350 defer d.muResCh.Unlock()
351
352 if d.ResCh != nil {
353 if len(d.ResCh) == cap(d.ResCh) {
354 logger.Error(context.Background(), fmt.Sprintf("[%s] recieve() ResCh channel is full. MacAddress=%s", d.getDeviceName(), d.DstMac))
355 } else {
356 d.ResCh <- etherPacket
357 }
358 }
359}
360
361func (d *DeviceBase) recieveKeepAlive(etherPacket *layers.Ethernet) {
362 d.KeepAliveResCh <- etherPacket
363}
364
365func (d *DeviceBase) startKeepAlive() {
366 go func() {
367 ctx := context.Background()
368 d.KeepAliveStatus = KeepAliveStep1
369 d.countClearKeepAliveCounter()
370 logger.Debug(ctx, fmt.Sprintf("[%s] startKeepAlive(). MacAddress=%s, %v", d.getDeviceName(), d.DstMac, d))
371
372 for {
373 select {
374 case <-d.StopCh:
375 logger.Debug(ctx, fmt.Sprintf("[%s] startKeepAlive() StopCh request. MacAddress=%s", d.getDeviceName(), d.DstMac))
376 return
377 case etherPacket := <-d.KeepAliveResCh:
378 packet := &l2oam.OAMPDUInformation{}
379 if err := packet.Decode(etherPacket.Payload); err != nil {
380 break
381 }
382 logger.Debug(ctx, fmt.Sprintf("[%s] receive KeepAlive() mac=%s", d.getDeviceName(), d.DstMac))
383
384 // discards received packet if the device is not active
385 if d.isEnable() {
386 // keep received LIValue for sending next messages
387 d.KeepAliveRemoteValue = packet.LIValue
388 if packet.Flags == 0x0028 {
389 d.KeepAliveStatus = KeepAliveStep2
390 } else {
391 d.KeepAliveStatus = KeepAliveStep3
392 }
393 d.setActiveState(ctx, true)
394 d.countClearKeepAliveCounter()
395 }
396
397 case <-time.After(KeepAliveInterval * time.Millisecond):
398
399 if !d.isActive() {
400 d.countClearKeepAliveCounter()
401 } else {
402 logger.Debug(ctx, fmt.Sprintf("[%s] KeepAlive timer expired. MacAddress=%s", d.getDeviceName(), d.DstMac))
403 // First three messages are sent each messages.
404 // After that, third message will be sent repeatedly
405 var err error = nil
406 if d.KeepAliveStatus == KeepAliveStep1 {
407 err = d.send(l2oam.GeneateKeepAlive1(l2oam.OnuPkgType == l2oam.OnuPkgTypeA))
408 } else if d.KeepAliveStatus == KeepAliveStep2 {
409 err = d.send(l2oam.GeneateKeepAlive2(d.KeepAliveRemoteValue, l2oam.OnuPkgType == l2oam.OnuPkgTypeA))
410 } else if d.KeepAliveStatus == KeepAliveStep3 {
411 err = d.send(l2oam.GeneateKeepAlive3(d.KeepAliveRemoteValue))
412 }
413 if err != nil {
414 break
415 }
416 d.countUpKeepAliveCounter()
417
418 if d.isKeepAliveLimitOver() {
419 d.setActiveState(ctx, false)
420 }
421 }
422
423 if d.EapFlag {
424 logger.Debug(ctx, fmt.Sprintf("[%s] EapFlag == true. MacAddress=%s", d.getDeviceName(), d.DstMac))
425 /*
426 onu := FindL2oamDevice(d.DstMac)
427 if onu == nil {
428 logger.Debug(ctx, "onu not found.")
429 } else {
430 go d.DH.L2oamAddFlowAndMount(ctx, d.DeviceID, []byte{0x64}, []byte{0x00, 0x64})
431 }
432 */
433 d.EapFlag = false
434 }
435 }
436 }
437 }()
438}
439
440func (d *DeviceBase) stopKeepAlive() {
441 if len(d.StopCh) == cap(d.StopCh) {
442 logger.Error(context.Background(), fmt.Sprintf("[%s] stopKeepAlive stop channel is full. MacAddress=%s", d.getDeviceName(), d.DstMac))
443 } else {
444 d.StopCh <- "Stop"
445 }
446}
447
448func (d *DeviceBase) countUpKeepAliveCounter() {
449 d.mu.Lock()
450 defer d.mu.Unlock()
451 d.KeepAliveSendCounter++
452}
453
454func (d *DeviceBase) countClearKeepAliveCounter() {
455 d.mu.Lock()
456 defer d.mu.Unlock()
457 d.KeepAliveSendCounter = 0
458}
459
460func (d *DeviceBase) isKeepAliveLimitOver() bool {
461 d.mu.Lock()
462 defer d.mu.Unlock()
463 return KeepAliveCounter <= d.KeepAliveSendCounter
464}
465
466func (d *DeviceBase) isActive() bool {
467 if !d.isEnable() {
468 return false
469 }
470 return d.ActiveState
471}
472
473func (d *DeviceBase) isEnable() bool {
474 if d.DeviceID == "" {
475 return true
476 }
477 device, err := d.DH.coreProxy.GetDevice(context.Background(), d.DeviceID, d.DeviceID)
478 if err != nil || device == nil {
479 logger.Debug(context.Background(), fmt.Sprintf("[%s] isEnable() coreProxy.GetDevice() deviceid=%s, error. %v", d.getDeviceName(), d.DeviceID, err))
480 return false
481 }
482 return device.AdminState == common.AdminState_ENABLED
483}
484
485func (d *DeviceBase) setActiveState(ctx context.Context, isActive bool) {
486 d.ActiveState = isActive
487
488 switch d.getDeviceName() {
489 case DeviceNameOlt:
490 if !isActive {
491 d.ActiveState = true
492 }
493 updateOltActiveStatus(ctx, d.DH, isActive)
494
495 case DeviceNameOnu:
496 // updateOnuActiveStatus(ctx, d.DstMac, isActive, d.DH)
497 updateOnuActiveStatus2(ctx, d.DH, isActive, d.DeviceID)
498 }
499}
500
501/*
502func (d *DeviceBase) startMountSequence(ctx context.Context, pkgType string, cmd *L2oamCmd) {
503}
504
505func (d *DeviceBase) reboot(ctx context.Context) {
506}
507*/
508
509func (d *DeviceBase) delete(ctx context.Context) {
510 logger.Info(ctx, fmt.Sprintf("[%s] delete() deviceid=%s, mac=%s", d.getDeviceName(), d.DeviceID, d.DstMac))
511 d.stopKeepAlive()
512}
513
514func (d *DeviceBase) setDeleteFlag() {
515 d.DeleteFlag = true
516}
517
518func (d *DeviceBase) getDeleteFlag() bool {
519 return d.DeleteFlag
520}
521
522func (d *DeviceBase) setAutonomousFlag(flag bool) {
523 d.AutonomousFlag = flag
524}
525
526func (d *DeviceBase) getAutonomousFlag() bool {
527 return d.AutonomousFlag
528}
529
530func (d *DeviceBase) receiveEapol(etherPacket *layers.Ethernet) {
531 go func() {
532 packetBytes := append(etherPacket.Contents, etherPacket.Payload...)
533 pktInd := &oop.PacketIndication{
534 IntfId: 0,
535 GemportId: 1,
536 PortNo: 16,
537 Pkt: packetBytes,
538 IntfType: "pon",
539 }
540 logger.Info(context.Background(), fmt.Sprintf("[%s] receiveEapol() deviceid=%s, pktInd=%x", d.getDeviceName(), d.DeviceID, pktInd))
541
542 if err := d.DH.handlePacketIndication(context.Background(), pktInd); err != nil {
543 logger.Error(context.Background(), fmt.Sprintf("[%s] receiveEapol() error. deviceid=%s, ", d.getDeviceName(), d.DeviceID))
544 }
545 }()
546}
547
548// L2oamOltDevice =================================
549// L2oamOltDevice provides functions for OLT device
550// ================================================
551type L2oamOltDevice struct {
552 Base DeviceBase
553 autonomousExecMutex sync.Mutex
554 L2oamCmd *L2oamCmd
555 ObjectContext *l2oam.TomiObjectContext
556 ReferenceTable *l2oam.GetTrafficControlReferenceTableRes
557 DownProfile *l2oam.SetGenericActionCreateRes
558 UpProfile *l2oam.SetGenericActionCreateRes
559 L2SwitchDomainMap map[uint32]*l2SwitchDomain
560}
561
562func (d *L2oamOltDevice) getDeviceName() string {
563 return d.Base.getDeviceName()
564}
565func (d *L2oamOltDevice) send(message gopacket.SerializableLayer) error {
566 return d.Base.send(message)
567}
568func (d *L2oamOltDevice) waitResponse(timeoutSecond int) (*layers.Ethernet, error) {
569 return d.Base.waitResponse(timeoutSecond)
570}
571func (d *L2oamOltDevice) sendAndWait(message gopacket.SerializableLayer, timeoutSecond int) (*layers.Ethernet, error) {
572 return d.Base.sendAndWait(message, timeoutSecond)
573}
574
575func (d *L2oamOltDevice) recieve(etherPacket *layers.Ethernet) {
576 bytes := etherPacket.Payload
577 opcode := bytes[0]
578 oampduCode := bytes[3]
579 tomiOpCode := bytes[7]
580 logger.Debug(context.Background(), fmt.Sprintf("[%s] recieve. opcode=%v oampduCode=%v, %x", d.getDeviceName(), opcode, oampduCode, bytes))
581
582 if opcode == 0x03 && oampduCode == 0xfe {
583 // Autonomous message
584 if tomiOpCode == 0xae {
585 go d.receiveAutonomounsEvent(etherPacket)
586 } else {
587 d.Base.recieve(etherPacket)
588 }
589 } else if opcode == 0xfd {
590 // other messages
591 d.Base.recieve(etherPacket)
592 } else {
593 logger.Error(context.Background(), fmt.Sprintf("[%s] receive error. invalid message %v", d.getDeviceName(), etherPacket))
594 }
595
596}
597func (d *L2oamOltDevice) recieveKeepAlive(etherPacket *layers.Ethernet) {
598 d.Base.recieveKeepAlive(etherPacket)
599}
600func (d *L2oamOltDevice) startKeepAlive() {
601 d.Base.startKeepAlive()
602}
603func (d *L2oamOltDevice) stopKeepAlive() {
604 d.Base.stopKeepAlive()
605}
606func (d *L2oamOltDevice) receiveAutonomounsEvent(etherPacket *layers.Ethernet) {
607 d.autonomousExecMutex.Lock()
608 defer d.autonomousExecMutex.Unlock()
609
610 packet := &l2oam.AutonomousEvent{}
611 if err := packet.Decode(etherPacket.Payload); err != nil {
612 return
613 }
614
615 if packet.IsRegistrationStatusMessage() {
616 if d.getAutonomousFlag() {
617 d.addOnu(packet)
618 } else {
619 logger.Debug(context.Background(), fmt.Sprintf("[%s] receiveAutonomounsEvent() skip. AutonomousFlag is false. ", d.getDeviceName()))
620 }
621 }
622}
623func (d *L2oamOltDevice) addOnu(packet *l2oam.AutonomousEvent) {
624 ctx := context.Background()
625 logger.Debug(ctx, fmt.Sprintf("[%s] addOnu() Start. ", d.getDeviceName()))
626 operIndication := &oop.Indication_IntfOperInd{
627 IntfOperInd: &oop.IntfOperIndication{
628 Type: "nni",
629 IntfId: 0,
630 OperState: "up",
631 },
632 }
633 indication := &oop.Indication{
634 Data: operIndication,
635 }
636 d.Base.DH.handleIndication(ctx, indication)
637 operIndication.IntfOperInd.Type = "pon"
638 d.Base.DH.handleIndication(ctx, indication)
639
640 oc := &l2oam.TomiObjectContext{
641 Branch: packet.ComResp.OCBranch,
642 Type: packet.ComResp.OCType,
643 Length: packet.ComResp.OCLength,
644 Instance: packet.ComResp.OCInstance,
645 }
646
647 ether, err := d.sendAndWait(l2oam.GenerateGetMpcpMacAddress(oc), ResponseTimer)
648 if err != nil {
649 logger.Error(ctx, fmt.Sprintf("[%s] addOnu() GetMpcpMacAddress Send Error: %v", d.getDeviceName(), err))
650 return
651 }
652 macPacket := &l2oam.GetMpcpMacAddressRes{}
653 if err = macPacket.Decode(ether.Payload); err != nil {
654 return
655 }
656 macAddress := macPacket.GetMacAddress()
657 logger.Debug(ctx, fmt.Sprintf("[%s] addOnu() GetMpcpMacAddress Success: macAddress=%s, response=%x:%s", d.getDeviceName(), macAddress, ether.Payload, macPacket))
658
659 var onu *L2oamOnuDevice
660 device := FindL2oamDevice(macAddress)
661 if device != nil {
662 logger.Debug(ctx, fmt.Sprintf("addOnu() FindL2oamDevice() is find. macAddress=%s", macAddress))
663 onu = device.(*L2oamOnuDevice)
664 if onu != nil {
665 logger.Debug(ctx, fmt.Sprintf("addOnu() assertion success. macAddress=%s, deviceId=%s", macAddress, onu.Base.DeviceID))
666 onu.setActiveState(ctx, true)
667 }
668 return
669 }
670
671 logger.Debug(ctx, fmt.Sprintf("addOnu() NewL2oamOnuDevice() called. macAddress=%s", macAddress))
672 device, _ = NewL2oamOnuDevice(macAddress, d.Base.DH)
673 onu = device.(*L2oamOnuDevice)
674
675 ether, err = d.sendAndWait(l2oam.GenerateGetMpcpLLId(oc), ResponseTimer)
676 if err != nil {
677 logger.Error(ctx, fmt.Sprintf("[%s] addOnu() GetMpcpLLId Send Error: %v", d.getDeviceName(), err))
678 return
679 }
680
681 llidPacket := &l2oam.GetMpcpLLIdRes{}
682 if err = llidPacket.Decode(ether.Payload); err != nil {
683 return
684 }
685 llid := llidPacket.GetLLID()
686 logger.Debug(ctx, fmt.Sprintf("[%s] addOnu() GetMpcpLLId Success: LLID=%d, response=%x:%s", d.getDeviceName(), llid, ether.Payload, llidPacket))
687
688 vendorID := ""
689 VendorSpecific := ""
690 serialNumber := ""
691 onu.setActiveState(ctx, false)
692
693 if err := onu.send(l2oam.GeneateKeepAlive1(l2oam.OnuPkgType == l2oam.OnuPkgTypeA)); err != nil {
694 logger.Debug(ctx, fmt.Sprintf("error: %v", err))
695 }
696 go func() {
697
698 err = onu.waitKeepALiveResponse()
699 if err != nil {
700 logger.Error(ctx, fmt.Sprintf("[%s] addOnu() onu keep alive error. %s", d.getDeviceName(), err))
701 DeleteDevice(onu.Base.DeviceID, onu.Base.DstMac)
702 return
703 }
704 onu.keepAliveResponse = nil
705 logger.Info(ctx, fmt.Sprintf("[%s] addOnu() onu keep alive success.", d.getDeviceName()))
706 onu.startKeepAlive()
707 vendorID = "FEC"
708 VendorSpecific = "EponONU"
709 //serialNumber = macAddress[6:12]
710 serialNumber = strings.Replace(macAddress, ":", "", -1)[6:12]
711
712 onuDiscInd := &oop.OnuDiscIndication{
713 IntfId: 0,
714 SerialNumber: &oop.SerialNumber{
715 VendorId: []byte(vendorID),
716 VendorSpecific: []byte(VendorSpecific),
717 },
718 }
719 if err = d.Base.DH.onuDiscIndication2(ctx, onuDiscInd, serialNumber, macAddress); err != nil {
720 return
721 }
722
723 onu.setObjectContext(oc)
724 onu.updateMap()
725 // onu := FindL2oamDevice(macAddress)
726 // if onu == nil {
727 // logger.Debug(ctx, fmt.Sprintf("[%s] addOnu() NewL2oamOnuDevice() called. macAddress=%s", d.getDeviceName(), macAddress))
728 // onu, _ = NewL2oamOnuDevice(macAddress, d.Base.DH, deviceId)
729 // onu.startKeepAlive()
730 // }
731 // onu.setActiveState(ctx, true)
732 device = FindL2oamDevice(macAddress)
733 onuInd := &oop.OnuIndication{
734 IntfId: 0,
735 OnuId: device.(*L2oamOnuDevice).OnuID,
736 OperState: "up",
737 AdminState: "up",
738 SerialNumber: onuDiscInd.SerialNumber,
739 }
740 if err := d.Base.DH.onuIndication(ctx, onuInd); err != nil {
741 return
742 }
743 }()
744}
745
746func (dh *DeviceHandler) fakeOmciIndication(ctx context.Context, intfID uint32, onuID uint32, pkt []byte) error {
747 omciInd := &oop.OmciIndication{
748 IntfId: intfID,
749 OnuId: onuID,
750 Pkt: make([]byte, 48),
751 }
752
753 onuKey := dh.formOnuKey(intfID, onuID)
754 onuDev, ok := dh.onus.Load(onuKey)
755 if !ok {
756 logger.Errorf(ctx, "not-found-onu-device. intf-id:%d, onu-id:%d", intfID, onuID)
757 return nil
758 }
759 onuDeviceID := (onuDev.(*OnuDevice)).deviceID
760 onu := FindL2oamDeviceByDeviceID(onuDeviceID)
761 if onu == nil {
762 logger.Errorf(ctx, "not-found-l2oam-onu-device. onu-device-id:%s", onuDeviceID)
763 return nil
764 }
765
766
767 if len(pkt) < 11 {
768 return nil
769 }
770 messageType := uint8(pkt[2])
771 meID := binary.BigEndian.Uint16(pkt[4:6])
772 meSubID := binary.BigEndian.Uint16(pkt[6:8])
773 omciInd.Pkt[0] = pkt[0]
774 omciInd.Pkt[1] = pkt[1]
775 omciInd.Pkt[2] = (pkt[2] & 0xbf) | 0x20 // AR -> AK
776 copy(omciInd.Pkt[3:8], pkt[3:8])
777 contentIdx := 8
778
779 switch messageType {
780 case 0x49: // Get
781 if meID == 0x0101 { // ONU2-G
782 if pkt[contentIdx] == 0xe0 {
783 copy(omciInd.Pkt[contentIdx:], []byte{
784 0x00, 0xe0, 0x00, 0x31, 0x32, 0x33, 0x34, 0x35,
785 0x31, 0x32, 0x33, 0x34, 0x35, 0x31, 0x32, 0x33,
786 0x34, 0x35, 0x31, 0x32, 0x33, 0x34, 0x35, 0xb4,
787 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
788 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
789 })
790 } else if pkt[contentIdx] == 0x80 {
791 copy(omciInd.Pkt[contentIdx:], []byte{
792 0x00, 0x80, 0x00, 0x31, 0x32, 0x33, 0x34, 0x35,
793 0x31, 0x32, 0x33, 0x34, 0x35, 0x31, 0x32, 0x33,
794 0x34, 0x35, 0x31, 0x32, 0x33, 0x34, 0x35, 0x00,
795 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
797 })
798 } else {
799 logger.Error(ctx, fmt.Sprintf("fakeOmciIndication() unknown-format:message-type:%x, me-id:%x",
800 messageType, meID))
801 }
802 } else if meID == 0x0100 { // ONU-G
803 copy(omciInd.Pkt[contentIdx:], []byte{
804 0x00, 0xa0, 0x00, 0x45, 0x50, 0x4f, 0x4e, 0x45,
805 0x50, 0x4f, 0x4e, 0x00, 0x00, 0x00, 0x01, 0x00,
806 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
807 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
808 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
809 })
810 } else if meID == 0x0007 { // Software image
811 if meSubID == 0 {
812 copy(omciInd.Pkt[contentIdx:], []byte{
813 0x00, 0xa0, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30,
814 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
815 0x31, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
816 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
817 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
818 })
819 } else {
820 copy(omciInd.Pkt[contentIdx:], []byte{
821 0x00, 0xa0, 0x00, 0x30, 0x30, 0x30, 0x30, 0x30,
822 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
823 0x31, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
824 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
825 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
826 })
827 }
828 } else if meID == 0x0086 { // IP host config data
829 var macOctets [6]byte
830 onuDev := onu.(*L2oamOnuDevice)
831 if len(onuDev.MacAddress) == 12 {
832 for idx := 0; idx < 6; idx++ {
833 if v, err := strconv.ParseInt(onuDev.MacAddress[idx*2:(idx*2)+2], 16, 8); err == nil {
834 macOctets[idx] = byte(v)
835 }
836 }
837 }
838 // 0x09-0a: Mask
839 // 0x0b-10: MAC Address
840 copy(omciInd.Pkt[contentIdx:], []byte{
841 0x00, 0x40, 0x00, macOctets[0], macOctets[1], macOctets[2], macOctets[3], macOctets[4],
842 macOctets[5], 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
843 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
844 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
845 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
846 })
847 } else {
848 logger.Error(ctx, fmt.Sprintf("fakeOmciIndication() unknown-format:message-type:%x, me-id:%x",
849 messageType, meID))
850 }
851 case 0x4f: // MIB reset
852 copy(omciInd.Pkt[contentIdx:], []byte{
853 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
854 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
855 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
856 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
857 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
858 })
859 case 0x4d: // MIB upload
860 copy(omciInd.Pkt[contentIdx:], []byte{
861 // first 2 bytes: the number of upload message
862 // upload messages are sent specified number of times
863 // following this message
864 0x01, 0x23 - 3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
865 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
866 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
867 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
868 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
869 })
870 case 0x4e: // MIB upload next
871 uploadIdx := binary.BigEndian.Uint16(pkt[contentIdx : contentIdx+2])
872 copy(omciInd.Pkt[contentIdx:], [][]byte{
873 {
874 0x00, 0x02, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
875 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
876 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
877 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
878 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
879 },
880 {
881 // addr: memo
882 // 0x08-09: Class ID(#6 Circuit Pack)
883 // 0x0a-0b: Managed entity ID(#257 ONU2-G)
884 // 0x0c-0d: field mask, 0xf000 means first 4 fields
885 // are stored in this message
886 // 0x0e: Type, 0x2f means 10/100/1000 BASE-T
887 // 0x0f: Number of ports
888 // 0x10-17: Serial Number
889 // 0x18-25: Version
890 0x00, 0x06, 0x01, 0x01, 0xf0, 0x00, 0x2f, 0x04, // 0x08 - 0x0f
891 0x49, 0x53, 0x4b, 0x54, 0x71, 0xe8, 0x00, 0x80, // 0x10 - 0x17
892 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 - 0x1f
893 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, // 0x20 - 0x27
894 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 - 0x2f
895 },
896 {
897 // addr: memo
898 // 0x08-09: Class ID(#6 Circuit Pack)
899 // 0x0a-0b: Managed entity ID(#257 ONU2-G)
900 // 0x0c-0d: field mask, 0x0f00 means from 5th to 8th fields
901 // are stored in this message
902 // 0x0e-11: Vendor ID
903 // 0x12: Administrative state
904 // 0x13: Operational state
905 // 0x14: Bridged or IP ind
906 0x00, 0x06, 0x01, 0x01, 0x0f, 0x00, 0x42, 0x52, // 0x08 - 0x0f
907 0x43, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 - 0x17
908 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 - 0x1f
909 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 - 0x27
910 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 - 0x2f
911 },
912 {
913 // addr: memo
914 // 0x08-09: Class ID(#6 Circuit Pack)
915 // 0x0a-0b: Managed entity ID(#257 ONU2-G)
916 // 0x0c-0d: field mask, 0x00f8 means from 9th to 13th fields
917 // are stored in this message
918 // 0x0e-21: Equipment ID
919 // 0x22: Card configuration
920 // 0x23: Total T-CONT buffer number
921 // 0x24: Total priority queue number
922 // 0x25: Total traffic scheduler number
923 0x00, 0x06, 0x01, 0x01, 0x00, 0xf8, 0x20, 0x20, // 0x08 - 0x0f
924 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 0x10 - 0x17
925 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, // 0x18 - 0x1f
926 0x20, 0x20, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, // 0x20 - 0x27
927 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 - 0x2f
928 },
929 {
930 // addr: memo
931 // 0x08-09: Class ID(#6 Circuit Pack)
932 // 0x0a-0b: Managed entity ID(#257 ONU2-G)
933 // 0x0c-0d: field mask, 0x0004 means from 14th field
934 // is stored in this message
935 // 0x0e-0x11: Power shed override
936 0x00, 0x06, 0x01, 0x01, 0x00, 0x04, 0x00, 0x00, // 0x08 - 0x0f
937 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 - 0x17
938 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 - 0x1f
939 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 - 0x27
940 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 - 0x2f
941 },
942 {
943 // addr: memo
944 // 0x08-09: Class ID(#6 Circuit Pack)
945 // 0x0a-0b: Managed entity ID(#384)
946 // 0x0c-0d: field mask, 0xf000 means first 4 fields
947 // are stored in this message
948 // 0x0e: Type, 0xee means XG-PON10G10
949 // 0x0f: Number of ports
950 // 0x10-17: Serial Number
951 // 0x18-25: Version
952 0x00, 0x06, 0x01, 0x80, 0xf0, 0x00, 0xee, 0x01,
953 0x49, 0x53, 0x4b, 0x54, 0x71, 0xe8, 0x00, 0x80,
954 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
955 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00,
956 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
957 },
958 { // Circuit Pack-#384
959 0x00, 0x06, 0x01, 0x80, 0x0f, 0x00, 0x42, 0x52,
960 0x43, 0x4d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
961 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
962 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
963 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
964 },
965 { // Circuit Pack-#384
966 0x00, 0x06, 0x01, 0x80, 0x00, 0xf8, 0x20, 0x20,
967 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
968 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
969 0x20, 0x20, 0x00, 0x08, 0x40, 0x10, 0x00, 0x00,
970 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
971 },
972 { // Circuit Pack-#384
973 0x00, 0x06, 0x01, 0x80, 0x00, 0x04, 0x00, 0x00,
974 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
975 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
976 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
977 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
978 },
979 { // Physical Path Termination Point Ethernet UNI(port#1)
980 // addr: memo
981 // 0x08-09: Class ID(#11 Physical Path Termination Point Ethernet UNI)
982 // 0x0a: slot ID
983 // 0x0b: port ID
984 // 0x0c-0d: field mask, 0xfffe means first 15 fields
985 // are stored in this message
986 // 0x0e: Expected type
987 // 0x0f: Sensed type, 0x2f means 10/100/1000 BASE-T
988 // 0x10: Auto detection configuration, 0x00 means Rate/Duplex = Auto/Auto
989 // 0x11: Ethernet loopback configulation
990 // 0x12: Administrative state(0: unlocks, 1: locks)
991 // 0x13: Operational state(0: enabled, 1: disabled)
992 // 0x14: Configuration ind, 0x03 means Gigabit Ethernet full duplex
993 // 0x15-16: Max frame size
994 // 0x17: DTE or DCE ind, 0x00 means DCE or MDI-X
995 // 0x18-19: Pause time
996 // 0x1a: Bridged or IP ind, 0x02 means Depends on the parent circuit pack
997 // 0x1b: ARC
998 // 0x1c: ARC interval
999 // 0x1d: PPPoE filter
1000 // 0x1e: Power control
1001 0x00, 0x0b, 0x01, 0x01, 0xff, 0xfe, 0x00, 0x2f, // 0x08 - 0x0f
1002 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0xee, 0x00, // 0x10 - 0x17
1003 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 - 0x1f
1004 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 - 0x27
1005 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 - 0x2f
1006 },
1007 { // Physical Path Termination Point Ethernet UNI(port#2)
1008 0x00, 0x0b, 0x01, 0x02, 0xff, 0xfe, 0x00, 0x2f,
1009 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0xee, 0x00,
1010 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
1011 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1012 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1013 },
1014 { // Physical Path Termination Point Ethernet UNI(port#3)
1015 0x00, 0x0b, 0x01, 0x03, 0xff, 0xfe, 0x00, 0x2f,
1016 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0xee, 0x00,
1017 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
1018 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1019 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1020 },
1021 { // Physical Path Termination Point Ethernet UNI(port#4)
1022 0x00, 0x0b, 0x01, 0x04, 0xff, 0xfe, 0x00, 0x2f,
1023 0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0xee, 0x00,
1024 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
1025 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1026 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1027 },
1028 { // T-CONT(T-CONT#1)
1029 // addr: memo
1030 // 0x08-09: Class ID(#262 T-CONT)
1031 // 0x0a: slot ID
1032 // 0x0b: T-CONT ID
1033 // 0x0c-0d: field mask, 0xe000 means first 3 fields
1034 // are stored in this message
1035 // 0x0e-0f: Alloc-ID
1036 // 0x10: Deprecated
1037 // 0x11: Policy
1038 0x01, 0x06, 0x80, 0x01, 0xe0, 0x00, 0xff, 0xff, // 0x08 - 0x0f
1039 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 - 0x17
1040 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1041 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1042 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1043 },
1044 { // T-CONT(T-CONT#2)
1045 0x01, 0x06, 0x80, 0x02, 0xe0, 0x00, 0xff, 0xff,
1046 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1047 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1048 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1049 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1050 },
1051 { // T-CONT(T-CONT#3)
1052 0x01, 0x06, 0x80, 0x03, 0xe0, 0x00, 0xff, 0xff,
1053 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1054 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1055 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1056 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1057 },
1058 { // T-CONT(T-CONT#4)
1059 0x01, 0x06, 0x80, 0x04, 0xe0, 0x00, 0xff, 0xff,
1060 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1061 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1062 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1063 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1064 },
1065 { // T-CONT(T-CONT#5)
1066 0x01, 0x06, 0x80, 0x05, 0xe0, 0x00, 0xff, 0xff,
1067 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1068 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1069 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1070 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1071 },
1072 { // T-CONT(T-CONT#6)
1073 0x01, 0x06, 0x80, 0x06, 0xe0, 0x00, 0xff, 0xff,
1074 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1075 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1076 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1077 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1078 },
1079 { // T-CONT(T-CONT#7)
1080 0x01, 0x06, 0x80, 0x07, 0xe0, 0x00, 0xff, 0xff,
1081 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1082 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1083 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1084 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1085 },
1086 { // T-CONT(T-CONT#8)
1087 0x01, 0x06, 0x80, 0x08, 0xe0, 0x00, 0xff, 0xff,
1088 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1089 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1090 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1091 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1092 },
1093 { // ANI-G(port#1)
1094 // addr: memo
1095 // 0x08-09: Class ID(#263 ANI-G)
1096 // 0x0a: slot ID
1097 // 0x0b: port ID
1098 // 0x0c-0d: field mask, 0xffff means first 16 fields
1099 // are stored in this message
1100 // 0x0e: SR indication
1101 // 0x0f-10: Total T-CONT number
1102 // 0x11-12: GEM block length
1103 // 0x13: Piggyback DBA reporting
1104 // 0x14: Deprecated
1105 // 0x15: SF threshold
1106 // 0x16: SD threshold
1107 // 0x17: ARC
1108 // 0x18: ARC interval
1109 // 0x19-0x1a: Optical signal level
1110 // 0x1b: Lower optical threshold
1111 // 0x1c: Upper optical threshold
1112 // 0x1d-0x1e: ONU response time
1113 // 0x1f-0x20: Transmit optical level
1114 // 0x21: Lower transmit power threshold
1115 // 0x22: Upper transmit power threshold
1116 0x01, 0x07, 0x80, 0x01, 0xff, 0xff, 0x01, 0x00, // 0x08 - 0x0f
1117 0x08, 0x00, 0x30, 0x00, 0x00, 0x05, 0x09, 0x00, // 0x10 - 0x17
1118 0x00, 0xe0, 0x54, 0xff, 0xff, 0x00, 0x00, 0x0c, // 0x18 - 0x1f
1119 0x63, 0x81, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 - 0x27
1120 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 - 0x2f
1121 },
1122 { // UNI-G(port#1)
1123 // addr: memo
1124 // 0x08-09: Class ID(#264 UNI-G)
1125 // 0x0a-0b: Managed entity ID
1126 // 0x0c-0d: field mask, 0xf800 means first 5 fields
1127 // are stored in this message
1128 // 0x0e-0f: Deprecated
1129 // 0x10: Administrative state(0: unlocks, 1: locks)
1130 // 0x11: Management capability
1131 // 0x12-13: Non-OMCI management identifier
1132 // 0x14-15: Relay agent options
1133 0x01, 0x08, 0x01, 0x01, 0xf8, 0x00, 0x00, 0x00, // 0x08 - 0x0f
1134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x10 - 0x17
1135 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x18 - 0x1f
1136 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x20 - 0x27
1137 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0x28 - 0x2f
1138 },
1139 /*
1140 { // UNI-G(port#2)
1141 0x01, 0x08, 0x01, 0x02, 0xf8, 0x00, 0x00, 0x00,
1142 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1143 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1144 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1146 },
1147 { // UNI-G(port#3)
1148 0x01, 0x08, 0x01, 0x03, 0xf8, 0x00, 0x00, 0x00,
1149 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1150 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1151 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1153 },
1154 { // UNI-G(port#4)
1155 0x01, 0x08, 0x01, 0x04, 0xf8, 0x00, 0x00, 0x00,
1156 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1157 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1158 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1160 },
1161 */
1162 { // Priority Queue(downstream-queue#1)
1163 // addr: memo
1164 // 0x08-09: Class ID(#277 Priority Queue)
1165 // 0x0a-0b: Managed entity ID(most significant bit represents the direction (1: upstream, 0: downstream))
1166 // 0x0c-0d: field mask, 0x000f means from 13th to 16th fields
1167 // are stored in this message
1168 // 0x0e-0f: Deprecated
1169 0x01, 0x15, 0x00, 0x01, 0x00, 0x0f, 0xff, 0xff,
1170 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1171 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1172 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1174 },
1175 { // Priority Queue(downstream-queue#1)
1176 0x01, 0x15, 0x00, 0x01, 0xff, 0xf0, 0x00, 0x01,
1177 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1178 0x01, 0x00, 0x00, 0x01, 0x08, 0x01, 0x00, 0x01,
1179 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1181 },
1182 { // Priority Queue(upstream-queue#1)
1183 0x01, 0x15, 0x80, 0x01, 0x00, 0x0f, 0xff, 0xff,
1184 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1185 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1186 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1188 },
1189 { // Priority Queue(upstream-queue#1)
1190 0x01, 0x15, 0x80, 0x01, 0xff, 0xf0, 0x00, 0x01,
1191 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1192 0x01, 0x00, 0x00, 0x80, 0x08, 0x01, 0x00, 0x01,
1193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1195 },
1196 { // Priority Queue(downstream-queue#2)
1197 0x01, 0x15, 0x00, 0x02, 0x00, 0x0f, 0xff, 0xff,
1198 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1199 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1202 },
1203 { // Priority Queue(downstream-queue#2)
1204 0x01, 0x15, 0x00, 0x02, 0xff, 0xf0, 0x00, 0x01,
1205 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1206 0x01, 0x00, 0x01, 0x01, 0x08, 0x01, 0x00, 0x01,
1207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1209 },
1210 { // Priority Queue(upstream-queue#2)
1211 0x01, 0x15, 0x80, 0x02, 0x00, 0x0f, 0xff, 0xff,
1212 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1213 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1216 },
1217 { // Priority Queue(upstream-queue#2)
1218 0x01, 0x15, 0x80, 0x02, 0xff, 0xf0, 0x00, 0x01,
1219 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1220 0x01, 0x00, 0x01, 0x80, 0x08, 0x01, 0x00, 0x01,
1221 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1223 },
1224 { // Priority Queue(downstream-queue#3)
1225 0x01, 0x15, 0x00, 0x03, 0x00, 0x0f, 0xff, 0xff,
1226 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1227 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1230 },
1231 { // Priority Queue(downstream-queue#3)
1232 0x01, 0x15, 0x00, 0x03, 0xff, 0xf0, 0x00, 0x01,
1233 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1234 0x01, 0x00, 0x02, 0x01, 0x08, 0x01, 0x00, 0x01,
1235 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1237 },
1238 { // Priority Queue(upstream-queue#3)
1239 0x01, 0x15, 0x80, 0x03, 0x00, 0x0f, 0xff, 0xff,
1240 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1241 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1242 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1244 },
1245 { // Priority Queue(upstream-queue#3)
1246 0x01, 0x15, 0x80, 0x03, 0xff, 0xf0, 0x00, 0x01,
1247 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1248 0x01, 0x00, 0x02, 0x80, 0x08, 0x01, 0x00, 0x01,
1249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1251 },
1252 { // Priority Queue(downstream-queue#4)
1253 0x01, 0x15, 0x00, 0x04, 0x00, 0x0f, 0xff, 0xff,
1254 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1255 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1256 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1257 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1258 },
1259 { // Priority Queue(downstream-queue#4)
1260 0x01, 0x15, 0x00, 0x04, 0xff, 0xf0, 0x00, 0x01,
1261 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1262 0x01, 0x00, 0x03, 0x01, 0x08, 0x01, 0x00, 0x01,
1263 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1264 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1265 },
1266 { // Priority Queue(upstream-queue#4)
1267 0x01, 0x15, 0x80, 0x04, 0x00, 0x0f, 0xff, 0xff,
1268 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1269 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1270 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1272 },
1273 { // Priority Queue(upstream-queue#4)
1274 0x01, 0x15, 0x80, 0x04, 0xff, 0xf0, 0x00, 0x01,
1275 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1276 0x01, 0x00, 0x03, 0x80, 0x08, 0x01, 0x00, 0x01,
1277 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1279 },
1280 { // Priority Queue(downstream-queue#5)
1281 0x01, 0x15, 0x00, 0x05, 0x00, 0x0f, 0xff, 0xff,
1282 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1283 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1284 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1286 },
1287 { // Priority Queue(downstream-queue#5)
1288 0x01, 0x15, 0x00, 0x05, 0xff, 0xf0, 0x00, 0x01,
1289 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1290 0x01, 0x00, 0x04, 0x01, 0x08, 0x01, 0x00, 0x01,
1291 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1293 },
1294 { // Priority Queue(upstream-queue#5)
1295 0x01, 0x15, 0x80, 0x05, 0x00, 0x0f, 0xff, 0xff,
1296 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1297 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1298 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1300 },
1301 { // Priority Queue(upstream-queue#5)
1302 0x01, 0x15, 0x80, 0x05, 0xff, 0xf0, 0x00, 0x01,
1303 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1304 0x01, 0x00, 0x04, 0x80, 0x08, 0x01, 0x00, 0x01,
1305 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1307 },
1308 { // Priority Queue(downstream-queue#6)
1309 0x01, 0x15, 0x00, 0x06, 0x00, 0x0f, 0xff, 0xff,
1310 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1311 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1312 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1314 },
1315 { // Priority Queue(downstream-queue#6)
1316 0x01, 0x15, 0x00, 0x06, 0xff, 0xf0, 0x00, 0x01,
1317 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1318 0x01, 0x00, 0x05, 0x01, 0x08, 0x01, 0x00, 0x01,
1319 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1321 },
1322 { // Priority Queue(upstream-queue#6)
1323 0x01, 0x15, 0x80, 0x06, 0x00, 0x0f, 0xff, 0xff,
1324 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1325 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1326 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1328 },
1329 { // Priority Queue(upstream-queue#6)
1330 0x01, 0x15, 0x80, 0x06, 0xff, 0xf0, 0x00, 0x01,
1331 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1332 0x01, 0x00, 0x05, 0x80, 0x08, 0x01, 0x00, 0x01,
1333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1335 },
1336 { // Priority Queue(downstream-queue#7)
1337 0x01, 0x15, 0x00, 0x07, 0x00, 0x0f, 0xff, 0xff,
1338 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1339 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1340 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1342 },
1343 { // Priority Queue(downstream-queue#7)
1344 0x01, 0x15, 0x00, 0x07, 0xff, 0xf0, 0x00, 0x01,
1345 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1346 0x01, 0x00, 0x06, 0x01, 0x08, 0x01, 0x00, 0x01,
1347 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1349 },
1350 { // Priority Queue(upstream-queue#7)
1351 0x01, 0x15, 0x80, 0x07, 0x00, 0x0f, 0xff, 0xff,
1352 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1353 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1354 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1356 },
1357 { // Priority Queue(upstream-queue#7)
1358 0x01, 0x15, 0x80, 0x07, 0xff, 0xf0, 0x00, 0x01,
1359 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1360 0x01, 0x00, 0x06, 0x80, 0x08, 0x01, 0x00, 0x01,
1361 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1363 },
1364 { // Priority Queue(downstream-queue#8)
1365 0x01, 0x15, 0x00, 0x08, 0x00, 0x0f, 0xff, 0xff,
1366 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1367 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1368 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1370 },
1371 { // Priority Queue(downstream-queue#8)
1372 0x01, 0x15, 0x00, 0x08, 0xff, 0xf0, 0x00, 0x01,
1373 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1374 0x01, 0x00, 0x07, 0x01, 0x08, 0x01, 0x00, 0x01,
1375 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1377 },
1378 { // Priority Queue(downstream-queue#8)
1379 0x01, 0x15, 0x80, 0x08, 0x00, 0x0f, 0xff, 0xff,
1380 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1381 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1382 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1383 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1384 },
1385 { // Priority Queue(downstream-queue#8)
1386 0x01, 0x15, 0x80, 0x08, 0xff, 0xf0, 0x00, 0x01,
1387 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1388 0x01, 0x00, 0x07, 0x80, 0x08, 0x01, 0x00, 0x01,
1389 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1391 },
1392 { // Priority Queue(downstream-queue#9)
1393 0x01, 0x15, 0x00, 0x09, 0x00, 0x0f, 0xff, 0xff,
1394 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1395 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1396 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1398 },
1399 { // Priority Queue(downstream-queue#9)
1400 0x01, 0x15, 0x00, 0x09, 0xff, 0xf0, 0x00, 0x01,
1401 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1402 0x02, 0x00, 0x00, 0x01, 0x08, 0x01, 0x00, 0x01,
1403 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1405 },
1406 { // Priority Queue(upstream-queue#9)
1407 0x01, 0x15, 0x80, 0x09, 0x00, 0x0f, 0xff, 0xff,
1408 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1409 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1410 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1412 },
1413 { // Priority Queue(upstream-queue#9)
1414 0x01, 0x15, 0x80, 0x09, 0xff, 0xf0, 0x00, 0x01,
1415 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1416 0x02, 0x00, 0x00, 0x80, 0x08, 0x01, 0x00, 0x01,
1417 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1418 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1419 },
1420 { // Priority Queue(downstream-queue#10)
1421 0x01, 0x15, 0x00, 0x0a, 0x00, 0x0f, 0xff, 0xff,
1422 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1423 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1424 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1426 },
1427 { // Priority Queue(downstream-queue#10)
1428 0x01, 0x15, 0x00, 0x0a, 0xff, 0xf0, 0x00, 0x01,
1429 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1430 0x02, 0x00, 0x01, 0x01, 0x08, 0x01, 0x00, 0x01,
1431 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1432 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1433 },
1434 { // Priority Queue(upstream-queue#10)
1435 0x01, 0x15, 0x80, 0x0a, 0x00, 0x0f, 0xff, 0xff,
1436 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1437 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1438 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1439 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1440 },
1441 { // Priority Queue(upstream-queue#10)
1442 0x01, 0x15, 0x80, 0x0a, 0xff, 0xf0, 0x00, 0x01,
1443 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1444 0x02, 0x00, 0x01, 0x80, 0x08, 0x01, 0x00, 0x01,
1445 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1446 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1447 },
1448 { // Priority Queue(downstream-queue#11)
1449 0x01, 0x15, 0x00, 0x0b, 0x00, 0x0f, 0xff, 0xff,
1450 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1451 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1452 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1453 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1454 },
1455 { // Priority Queue(downstream-queue#11)
1456 0x01, 0x15, 0x00, 0x0b, 0xff, 0xf0, 0x00, 0x01,
1457 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1458 0x02, 0x00, 0x02, 0x01, 0x08, 0x01, 0x00, 0x01,
1459 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1460 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1461 },
1462 { // Priority Queue(upstream-queue#11)
1463 0x01, 0x15, 0x80, 0x0b, 0x00, 0x0f, 0xff, 0xff,
1464 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1465 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1466 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1467 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1468 },
1469 { // Priority Queue(upstream-queue#11)
1470 0x01, 0x15, 0x80, 0x0b, 0xff, 0xf0, 0x00, 0x01,
1471 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1472 0x02, 0x00, 0x02, 0x80, 0x08, 0x01, 0x00, 0x01,
1473 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1474 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1475 },
1476 { // Priority Queue(downstream-queue#12)
1477 0x01, 0x15, 0x00, 0x0c, 0x00, 0x0f, 0xff, 0xff,
1478 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1479 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1480 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1482 },
1483 { // Priority Queue(downstream-queue#12)
1484 0x01, 0x15, 0x00, 0x0c, 0xff, 0xf0, 0x00, 0x01,
1485 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1486 0x02, 0x00, 0x03, 0x01, 0x08, 0x01, 0x00, 0x01,
1487 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1488 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1489 },
1490 { // Priority Queue(upstream-queue#12)
1491 0x01, 0x15, 0x80, 0x0c, 0x00, 0x0f, 0xff, 0xff,
1492 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1493 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1494 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1495 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1496 },
1497 { // Priority Queue(upstream-queue#12)
1498 0x01, 0x15, 0x80, 0x0c, 0xff, 0xf0, 0x00, 0x01,
1499 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1500 0x02, 0x00, 0x03, 0x80, 0x08, 0x01, 0x00, 0x01,
1501 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1502 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1503 },
1504 { // Priority Queue(downstream-queue#13)
1505 0x01, 0x15, 0x00, 0x0d, 0x00, 0x0f, 0xff, 0xff,
1506 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1507 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1508 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1509 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1510 },
1511 { // Priority Queue(downstream-queue#13)
1512 0x01, 0x15, 0x00, 0x0d, 0xff, 0xf0, 0x00, 0x01,
1513 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1514 0x02, 0x00, 0x04, 0x01, 0x08, 0x01, 0x00, 0x01,
1515 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1516 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1517 },
1518 { // Priority Queue(upstream-queue#13)
1519 0x01, 0x15, 0x80, 0x0d, 0x00, 0x0f, 0xff, 0xff,
1520 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1521 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1522 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1523 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1524 },
1525 { // Priority Queue(upstream-queue#13)
1526 0x01, 0x15, 0x80, 0x0d, 0xff, 0xf0, 0x00, 0x01,
1527 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1528 0x02, 0x00, 0x04, 0x80, 0x08, 0x01, 0x00, 0x01,
1529 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1530 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1531 },
1532 { // Priority Queue(downstream-queue#14)
1533 0x01, 0x15, 0x00, 0x0e, 0x00, 0x0f, 0xff, 0xff,
1534 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1535 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1536 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1537 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1538 },
1539 { // Priority Queue(downstream-queue#14)
1540 0x01, 0x15, 0x00, 0x0e, 0xff, 0xf0, 0x00, 0x01,
1541 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1542 0x02, 0x00, 0x05, 0x01, 0x08, 0x01, 0x00, 0x01,
1543 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1544 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1545 },
1546 { // Priority Queue(upstream-queue#14)
1547 0x01, 0x15, 0x80, 0x0e, 0x00, 0x0f, 0xff, 0xff,
1548 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1549 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1550 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1551 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1552 },
1553 { // Priority Queue(upstream-queue#14)
1554 0x01, 0x15, 0x80, 0x0e, 0xff, 0xf0, 0x00, 0x01,
1555 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1556 0x02, 0x00, 0x05, 0x80, 0x08, 0x01, 0x00, 0x01,
1557 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1558 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1559 },
1560 { // Priority Queue(downstream-queue#15)
1561 0x01, 0x15, 0x00, 0x0f, 0x00, 0x0f, 0xff, 0xff,
1562 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1563 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1564 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1565 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1566 },
1567 { // Priority Queue(downstream-queue#15)
1568 0x01, 0x15, 0x00, 0x0f, 0xff, 0xf0, 0x00, 0x01,
1569 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1570 0x02, 0x00, 0x06, 0x01, 0x08, 0x01, 0x00, 0x01,
1571 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1572 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1573 },
1574 { // Priority Queue(upstream-queue#15)
1575 0x01, 0x15, 0x80, 0x0f, 0x00, 0x0f, 0xff, 0xff,
1576 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1577 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1578 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1579 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1580 },
1581 { // Priority Queue(upstream-queue#15)
1582 0x01, 0x15, 0x80, 0x0f, 0xff, 0xf0, 0x00, 0x01,
1583 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1584 0x02, 0x00, 0x06, 0x80, 0x08, 0x01, 0x00, 0x01,
1585 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1586 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1587 },
1588 { // Priority Queue(downstream-queue#16)
1589 0x01, 0x15, 0x00, 0x10, 0x00, 0x0f, 0xff, 0xff,
1590 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1591 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1592 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1593 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1594 },
1595 { // Priority Queue(downstream-queue#16)
1596 0x01, 0x15, 0x00, 0x10, 0xff, 0xf0, 0x00, 0x01,
1597 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1598 0x02, 0x00, 0x07, 0x01, 0x08, 0x01, 0x00, 0x01,
1599 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1600 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1601 },
1602 { // Priority Queue(upstream-queue#16)
1603 0x01, 0x15, 0x80, 0x10, 0x00, 0x0f, 0xff, 0xff,
1604 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1605 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1606 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1607 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1608 },
1609 { // Priority Queue(uptream-queue#16)
1610 0x01, 0x15, 0x80, 0x10, 0xff, 0xf0, 0x00, 0x01,
1611 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1612 0x02, 0x00, 0x07, 0x80, 0x08, 0x01, 0x00, 0x01,
1613 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1614 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1615 },
1616 {
1617 0x01, 0x15, 0x00, 0x11, 0x00, 0x0f, 0xff, 0xff,
1618 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1619 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1620 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1621 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1622 },
1623 {
1624 0x01, 0x15, 0x00, 0x11, 0xff, 0xf0, 0x00, 0x01,
1625 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1626 0x03, 0x00, 0x00, 0x01, 0x08, 0x01, 0x00, 0x01,
1627 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1628 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1629 },
1630 {
1631 0x01, 0x15, 0x80, 0x11, 0x00, 0x0f, 0xff, 0xff,
1632 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1633 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1634 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1635 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1636 },
1637 {
1638 0x01, 0x15, 0x80, 0x11, 0xff, 0xf0, 0x00, 0x01,
1639 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1640 0x03, 0x00, 0x00, 0x80, 0x08, 0x01, 0x00, 0x01,
1641 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1642 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1643 },
1644 {
1645 0x01, 0x15, 0x00, 0x12, 0x00, 0x0f, 0xff, 0xff,
1646 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1647 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1648 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1649 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1650 },
1651 {
1652 0x01, 0x15, 0x00, 0x12, 0xff, 0xf0, 0x00, 0x01,
1653 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1654 0x03, 0x00, 0x01, 0x01, 0x08, 0x01, 0x00, 0x01,
1655 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1656 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1657 },
1658 {
1659 0x01, 0x15, 0x80, 0x12, 0x00, 0x0f, 0xff, 0xff,
1660 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1661 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1662 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1663 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1664 },
1665 {
1666 0x01, 0x15, 0x80, 0x12, 0xff, 0xf0, 0x00, 0x01,
1667 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1668 0x03, 0x00, 0x01, 0x80, 0x08, 0x01, 0x00, 0x01,
1669 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1670 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1671 },
1672 {
1673 0x01, 0x15, 0x00, 0x13, 0x00, 0x0f, 0xff, 0xff,
1674 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1675 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1676 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1677 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1678 },
1679 {
1680 0x01, 0x15, 0x00, 0x13, 0xff, 0xf0, 0x00, 0x01,
1681 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1682 0x03, 0x00, 0x02, 0x01, 0x08, 0x01, 0x00, 0x01,
1683 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1684 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1685 },
1686 {
1687 0x01, 0x15, 0x80, 0x13, 0x00, 0x0f, 0xff, 0xff,
1688 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1689 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1690 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1691 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1692 },
1693 {
1694 0x01, 0x15, 0x80, 0x13, 0xff, 0xf0, 0x00, 0x01,
1695 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1696 0x03, 0x00, 0x02, 0x80, 0x08, 0x01, 0x00, 0x01,
1697 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1698 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1699 },
1700 {
1701 0x01, 0x15, 0x00, 0x14, 0x00, 0x0f, 0xff, 0xff,
1702 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1703 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1704 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1705 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1706 },
1707 {
1708 0x01, 0x15, 0x00, 0x14, 0xff, 0xf0, 0x00, 0x01,
1709 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1710 0x03, 0x00, 0x03, 0x01, 0x08, 0x01, 0x00, 0x01,
1711 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1712 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1713 },
1714 {
1715 0x01, 0x15, 0x80, 0x14, 0x00, 0x0f, 0xff, 0xff,
1716 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1717 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1718 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1719 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1720 },
1721 {
1722 0x01, 0x15, 0x80, 0x14, 0xff, 0xf0, 0x00, 0x01,
1723 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1724 0x03, 0x00, 0x03, 0x80, 0x08, 0x01, 0x00, 0x01,
1725 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1726 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1727 },
1728 {
1729 0x01, 0x15, 0x00, 0x15, 0x00, 0x0f, 0xff, 0xff,
1730 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1731 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1732 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1733 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1734 },
1735 {
1736 0x01, 0x15, 0x00, 0x15, 0xff, 0xf0, 0x00, 0x01,
1737 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1738 0x03, 0x00, 0x04, 0x01, 0x08, 0x01, 0x00, 0x01,
1739 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1740 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1741 },
1742 {
1743 0x01, 0x15, 0x80, 0x15, 0x00, 0x0f, 0xff, 0xff,
1744 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1745 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1746 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1747 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1748 },
1749 {
1750 0x01, 0x15, 0x80, 0x15, 0xff, 0xf0, 0x00, 0x01,
1751 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1752 0x03, 0x00, 0x04, 0x80, 0x08, 0x01, 0x00, 0x01,
1753 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1754 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1755 },
1756 {
1757 0x01, 0x15, 0x00, 0x16, 0x00, 0x0f, 0xff, 0xff,
1758 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1759 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1760 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1761 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1762 },
1763 {
1764 0x01, 0x15, 0x00, 0x16, 0xff, 0xf0, 0x00, 0x01,
1765 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1766 0x03, 0x00, 0x05, 0x01, 0x08, 0x01, 0x00, 0x01,
1767 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1768 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1769 },
1770 {
1771 0x01, 0x15, 0x80, 0x16, 0x00, 0x0f, 0xff, 0xff,
1772 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1773 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1774 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1775 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1776 },
1777 {
1778 0x01, 0x15, 0x80, 0x16, 0xff, 0xf0, 0x00, 0x01,
1779 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1780 0x03, 0x00, 0x05, 0x80, 0x08, 0x01, 0x00, 0x01,
1781 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1783 },
1784 {
1785 0x01, 0x15, 0x00, 0x17, 0x00, 0x0f, 0xff, 0xff,
1786 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1787 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1788 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1789 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1790 },
1791 {
1792 0x01, 0x15, 0x00, 0x17, 0xff, 0xf0, 0x00, 0x01,
1793 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1794 0x03, 0x00, 0x06, 0x01, 0x08, 0x01, 0x00, 0x01,
1795 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1797 },
1798 {
1799 0x01, 0x15, 0x80, 0x17, 0x00, 0x0f, 0xff, 0xff,
1800 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1801 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1802 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1803 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1804 },
1805 {
1806 0x01, 0x15, 0x80, 0x17, 0xff, 0xf0, 0x00, 0x01,
1807 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1808 0x03, 0x00, 0x06, 0x80, 0x08, 0x01, 0x00, 0x01,
1809 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1810 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1811 },
1812 {
1813 0x01, 0x15, 0x00, 0x18, 0x00, 0x0f, 0xff, 0xff,
1814 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1815 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1816 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1817 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1818 },
1819 {
1820 0x01, 0x15, 0x00, 0x18, 0xff, 0xf0, 0x00, 0x01,
1821 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1822 0x03, 0x00, 0x07, 0x01, 0x08, 0x01, 0x00, 0x01,
1823 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1824 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1825 },
1826 {
1827 0x01, 0x15, 0x80, 0x18, 0x00, 0x0f, 0xff, 0xff,
1828 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1829 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1830 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1831 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1832 },
1833 {
1834 0x01, 0x15, 0x80, 0x18, 0xff, 0xf0, 0x00, 0x01,
1835 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1836 0x03, 0x00, 0x07, 0x80, 0x08, 0x01, 0x00, 0x01,
1837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1838 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1839 },
1840 {
1841 0x01, 0x15, 0x00, 0x19, 0x00, 0x0f, 0xff, 0xff,
1842 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1843 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1844 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1845 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1846 },
1847 {
1848 0x01, 0x15, 0x00, 0x19, 0xff, 0xf0, 0x00, 0x01,
1849 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1850 0x04, 0x00, 0x00, 0x01, 0x08, 0x01, 0x00, 0x01,
1851 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1852 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1853 },
1854 {
1855 0x01, 0x15, 0x80, 0x19, 0x00, 0x0f, 0xff, 0xff,
1856 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1857 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1858 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1859 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1860 },
1861 {
1862 0x01, 0x15, 0x80, 0x19, 0xff, 0xf0, 0x00, 0x01,
1863 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1864 0x04, 0x00, 0x00, 0x80, 0x08, 0x01, 0x00, 0x01,
1865 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1866 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1867 },
1868 {
1869 0x01, 0x15, 0x00, 0x1a, 0x00, 0x0f, 0xff, 0xff,
1870 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1871 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1872 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1873 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1874 },
1875 {
1876 0x01, 0x15, 0x00, 0x1a, 0xff, 0xf0, 0x00, 0x01,
1877 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1878 0x04, 0x00, 0x01, 0x01, 0x08, 0x01, 0x00, 0x01,
1879 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1880 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1881 },
1882 {
1883 0x01, 0x15, 0x80, 0x1a, 0x00, 0x0f, 0xff, 0xff,
1884 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1885 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1886 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1887 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1888 },
1889 {
1890 0x01, 0x15, 0x80, 0x1a, 0xff, 0xf0, 0x00, 0x01,
1891 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1892 0x04, 0x00, 0x01, 0x80, 0x08, 0x01, 0x00, 0x01,
1893 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1894 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1895 },
1896 {
1897 0x01, 0x15, 0x00, 0x1b, 0x00, 0x0f, 0xff, 0xff,
1898 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1899 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1900 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1901 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1902 },
1903 {
1904 0x01, 0x15, 0x00, 0x1b, 0xff, 0xf0, 0x00, 0x01,
1905 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1906 0x04, 0x00, 0x02, 0x01, 0x08, 0x01, 0x00, 0x01,
1907 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1908 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1909 },
1910 {
1911 0x01, 0x15, 0x80, 0x1b, 0x00, 0x0f, 0xff, 0xff,
1912 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1913 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1914 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1915 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1916 },
1917 {
1918 0x01, 0x15, 0x80, 0x1b, 0xff, 0xf0, 0x00, 0x01,
1919 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1920 0x04, 0x00, 0x02, 0x80, 0x08, 0x01, 0x00, 0x01,
1921 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1922 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1923 },
1924 {
1925 0x01, 0x15, 0x00, 0x1c, 0x00, 0x0f, 0xff, 0xff,
1926 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1927 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1928 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1929 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1930 },
1931 {
1932 0x01, 0x15, 0x00, 0x1c, 0xff, 0xf0, 0x00, 0x01,
1933 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1934 0x04, 0x00, 0x03, 0x01, 0x08, 0x01, 0x00, 0x01,
1935 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1936 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1937 },
1938 {
1939 0x01, 0x15, 0x80, 0x1c, 0x00, 0x0f, 0xff, 0xff,
1940 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1941 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1942 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1943 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1944 },
1945 {
1946 0x01, 0x15, 0x80, 0x1c, 0xff, 0xf0, 0x00, 0x01,
1947 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1948 0x04, 0x00, 0x03, 0x80, 0x08, 0x01, 0x00, 0x01,
1949 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1950 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1951 },
1952 {
1953 0x01, 0x15, 0x00, 0x1d, 0x00, 0x0f, 0xff, 0xff,
1954 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1955 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1956 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1957 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1958 },
1959 {
1960 0x01, 0x15, 0x00, 0x1d, 0xff, 0xf0, 0x00, 0x01,
1961 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1962 0x04, 0x00, 0x04, 0x01, 0x08, 0x01, 0x00, 0x01,
1963 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1964 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1965 },
1966 {
1967 0x01, 0x15, 0x80, 0x1d, 0x00, 0x0f, 0xff, 0xff,
1968 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1969 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1970 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1971 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1972 },
1973 {
1974 0x01, 0x15, 0x80, 0x1d, 0xff, 0xf0, 0x00, 0x01,
1975 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
1976 0x04, 0x00, 0x04, 0x80, 0x08, 0x01, 0x00, 0x01,
1977 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1978 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1979 },
1980 {
1981 0x01, 0x15, 0x00, 0x1e, 0x00, 0x0f, 0xff, 0xff,
1982 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1983 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1984 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1985 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1986 },
1987 {
1988 0x01, 0x15, 0x00, 0x1e, 0xff, 0xf0, 0x00, 0x01,
1989 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
1990 0x04, 0x00, 0x05, 0x01, 0x08, 0x01, 0x00, 0x01,
1991 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1992 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1993 },
1994 {
1995 0x01, 0x15, 0x80, 0x1e, 0x00, 0x0f, 0xff, 0xff,
1996 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
1997 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1998 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1999 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2000 },
2001 {
2002 0x01, 0x15, 0x80, 0x1e, 0xff, 0xf0, 0x00, 0x01,
2003 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2004 0x04, 0x00, 0x05, 0x80, 0x08, 0x01, 0x00, 0x01,
2005 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2006 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2007 },
2008 {
2009 0x01, 0x15, 0x00, 0x1f, 0x00, 0x0f, 0xff, 0xff,
2010 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2011 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2012 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2013 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2014 },
2015 {
2016 0x01, 0x15, 0x00, 0x1f, 0xff, 0xf0, 0x00, 0x01,
2017 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2018 0x04, 0x00, 0x06, 0x01, 0x08, 0x01, 0x00, 0x01,
2019 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2020 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2021 },
2022 {
2023 0x01, 0x15, 0x80, 0x1f, 0x00, 0x0f, 0xff, 0xff,
2024 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2025 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2026 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2027 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2028 },
2029 {
2030 0x01, 0x15, 0x80, 0x1f, 0xff, 0xf0, 0x00, 0x01,
2031 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2032 0x04, 0x00, 0x06, 0x80, 0x08, 0x01, 0x00, 0x01,
2033 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2034 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2035 },
2036 {
2037 0x01, 0x15, 0x00, 0x20, 0x00, 0x0f, 0xff, 0xff,
2038 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2039 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2040 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2041 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2042 },
2043 {
2044 0x01, 0x15, 0x00, 0x20, 0xff, 0xf0, 0x00, 0x01,
2045 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2046 0x04, 0x00, 0x07, 0x01, 0x08, 0x01, 0x00, 0x01,
2047 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2048 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2049 },
2050 {
2051 0x01, 0x15, 0x80, 0x20, 0x00, 0x0f, 0xff, 0xff,
2052 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2053 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2054 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2055 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2056 },
2057 {
2058 0x01, 0x15, 0x80, 0x20, 0xff, 0xf0, 0x00, 0x01,
2059 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2060 0x04, 0x00, 0x07, 0x80, 0x08, 0x01, 0x00, 0x01,
2061 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2062 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2063 },
2064 {
2065 0x01, 0x15, 0x00, 0x21, 0x00, 0x0f, 0xff, 0xff,
2066 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2067 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2068 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2069 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2070 },
2071 {
2072 0x01, 0x15, 0x00, 0x21, 0xff, 0xf0, 0x00, 0x01,
2073 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2074 0x05, 0x00, 0x00, 0x01, 0x08, 0x01, 0x00, 0x01,
2075 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2076 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2077 },
2078 {
2079 0x01, 0x15, 0x80, 0x21, 0x00, 0x0f, 0xff, 0xff,
2080 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2081 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2082 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2083 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2084 },
2085 {
2086 0x01, 0x15, 0x80, 0x21, 0xff, 0xf0, 0x00, 0x01,
2087 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2088 0x05, 0x00, 0x00, 0x80, 0x08, 0x01, 0x00, 0x01,
2089 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2090 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2091 },
2092 {
2093 0x01, 0x15, 0x00, 0x22, 0x00, 0x0f, 0xff, 0xff,
2094 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2095 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2096 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2097 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2098 },
2099 {
2100 0x01, 0x15, 0x00, 0x22, 0xff, 0xf0, 0x00, 0x01,
2101 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2102 0x05, 0x00, 0x01, 0x01, 0x08, 0x01, 0x00, 0x01,
2103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2105 },
2106 {
2107 0x01, 0x15, 0x80, 0x22, 0x00, 0x0f, 0xff, 0xff,
2108 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2109 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2112 },
2113 {
2114 0x01, 0x15, 0x80, 0x22, 0xff, 0xf0, 0x00, 0x01,
2115 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2116 0x05, 0x00, 0x01, 0x80, 0x08, 0x01, 0x00, 0x01,
2117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2119 },
2120 {
2121 0x01, 0x15, 0x00, 0x23, 0x00, 0x0f, 0xff, 0xff,
2122 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2123 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2124 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2125 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2126 },
2127 {
2128 0x01, 0x15, 0x00, 0x23, 0xff, 0xf0, 0x00, 0x01,
2129 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2130 0x05, 0x00, 0x02, 0x01, 0x08, 0x01, 0x00, 0x01,
2131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2133 },
2134 {
2135 0x01, 0x15, 0x80, 0x23, 0x00, 0x0f, 0xff, 0xff,
2136 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2137 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2138 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2139 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2140 },
2141 {
2142 0x01, 0x15, 0x80, 0x23, 0xff, 0xf0, 0x00, 0x01,
2143 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2144 0x05, 0x00, 0x02, 0x80, 0x08, 0x01, 0x00, 0x01,
2145 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2146 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2147 },
2148 {
2149 0x01, 0x15, 0x00, 0x24, 0x00, 0x0f, 0xff, 0xff,
2150 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2151 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2152 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2153 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2154 },
2155 {
2156 0x01, 0x15, 0x00, 0x24, 0xff, 0xf0, 0x00, 0x01,
2157 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2158 0x05, 0x00, 0x03, 0x01, 0x08, 0x01, 0x00, 0x01,
2159 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2160 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2161 },
2162 {
2163 0x01, 0x15, 0x80, 0x24, 0x00, 0x0f, 0xff, 0xff,
2164 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2165 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2166 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2167 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2168 },
2169 {
2170 0x01, 0x15, 0x80, 0x24, 0xff, 0xf0, 0x00, 0x01,
2171 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2172 0x05, 0x00, 0x03, 0x80, 0x08, 0x01, 0x00, 0x01,
2173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2174 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2175 },
2176 {
2177 0x01, 0x15, 0x00, 0x25, 0x00, 0x0f, 0xff, 0xff,
2178 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2179 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2180 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2181 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2182 },
2183 {
2184 0x01, 0x15, 0x00, 0x25, 0xff, 0xf0, 0x00, 0x01,
2185 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2186 0x05, 0x00, 0x04, 0x01, 0x08, 0x01, 0x00, 0x01,
2187 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2188 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2189 },
2190 {
2191 0x01, 0x15, 0x80, 0x25, 0x00, 0x0f, 0xff, 0xff,
2192 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2193 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2196 },
2197 {
2198 0x01, 0x15, 0x80, 0x25, 0xff, 0xf0, 0x00, 0x01,
2199 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2200 0x05, 0x00, 0x04, 0x80, 0x08, 0x01, 0x00, 0x01,
2201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2203 },
2204 {
2205 0x01, 0x15, 0x00, 0x26, 0x00, 0x0f, 0xff, 0xff,
2206 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2207 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2210 },
2211 {
2212 0x01, 0x15, 0x00, 0x26, 0xff, 0xf0, 0x00, 0x01,
2213 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2214 0x05, 0x00, 0x05, 0x01, 0x08, 0x01, 0x00, 0x01,
2215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2217 },
2218 {
2219 0x01, 0x15, 0x80, 0x26, 0x00, 0x0f, 0xff, 0xff,
2220 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2221 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2222 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2223 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2224 },
2225 {
2226 0x01, 0x15, 0x80, 0x26, 0xff, 0xf0, 0x00, 0x01,
2227 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2228 0x05, 0x00, 0x05, 0x80, 0x08, 0x01, 0x00, 0x01,
2229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2230 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2231 },
2232 {
2233 0x01, 0x15, 0x00, 0x27, 0x00, 0x0f, 0xff, 0xff,
2234 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2235 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2238 },
2239 {
2240 0x01, 0x15, 0x00, 0x27, 0xff, 0xf0, 0x00, 0x01,
2241 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2242 0x05, 0x00, 0x06, 0x01, 0x08, 0x01, 0x00, 0x01,
2243 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2244 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2245 },
2246 {
2247 0x01, 0x15, 0x80, 0x27, 0x00, 0x0f, 0xff, 0xff,
2248 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2249 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2251 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2252 },
2253 {
2254 0x01, 0x15, 0x80, 0x27, 0xff, 0xf0, 0x00, 0x01,
2255 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2256 0x05, 0x00, 0x06, 0x80, 0x08, 0x01, 0x00, 0x01,
2257 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2258 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2259 },
2260 {
2261 0x01, 0x15, 0x00, 0x28, 0x00, 0x0f, 0xff, 0xff,
2262 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2263 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2264 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2265 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2266 },
2267 {
2268 0x01, 0x15, 0x00, 0x28, 0xff, 0xf0, 0x00, 0x01,
2269 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2270 0x05, 0x00, 0x07, 0x01, 0x08, 0x01, 0x00, 0x01,
2271 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2272 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2273 },
2274 {
2275 0x01, 0x15, 0x80, 0x28, 0x00, 0x0f, 0xff, 0xff,
2276 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2277 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2278 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2279 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2280 },
2281 {
2282 0x01, 0x15, 0x80, 0x28, 0xff, 0xf0, 0x00, 0x01,
2283 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2284 0x05, 0x00, 0x07, 0x80, 0x08, 0x01, 0x00, 0x01,
2285 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2286 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2287 },
2288 {
2289 0x01, 0x15, 0x00, 0x29, 0x00, 0x0f, 0xff, 0xff,
2290 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2291 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2292 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2293 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2294 },
2295 {
2296 0x01, 0x15, 0x00, 0x29, 0xff, 0xf0, 0x00, 0x01,
2297 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2298 0x06, 0x00, 0x00, 0x01, 0x08, 0x01, 0x00, 0x01,
2299 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2300 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2301 },
2302 {
2303 0x01, 0x15, 0x80, 0x29, 0x00, 0x0f, 0xff, 0xff,
2304 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2305 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2306 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2307 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2308 },
2309 {
2310 0x01, 0x15, 0x80, 0x29, 0xff, 0xf0, 0x00, 0x01,
2311 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2312 0x06, 0x00, 0x00, 0x80, 0x08, 0x01, 0x00, 0x01,
2313 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2315 },
2316 {
2317 0x01, 0x15, 0x00, 0x2a, 0x00, 0x0f, 0xff, 0xff,
2318 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2319 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2320 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2321 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2322 },
2323 {
2324 0x01, 0x15, 0x00, 0x2a, 0xff, 0xf0, 0x00, 0x01,
2325 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2326 0x06, 0x00, 0x01, 0x01, 0x08, 0x01, 0x00, 0x01,
2327 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2328 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2329 },
2330 {
2331 0x01, 0x15, 0x80, 0x2a, 0x00, 0x0f, 0xff, 0xff,
2332 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2333 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2334 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2335 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2336 },
2337 {
2338 0x01, 0x15, 0x80, 0x2a, 0xff, 0xf0, 0x00, 0x01,
2339 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2340 0x06, 0x00, 0x01, 0x80, 0x08, 0x01, 0x00, 0x01,
2341 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2342 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2343 },
2344 {
2345 0x01, 0x15, 0x00, 0x2b, 0x00, 0x0f, 0xff, 0xff,
2346 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2347 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2348 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2349 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2350 },
2351 {
2352 0x01, 0x15, 0x00, 0x2b, 0xff, 0xf0, 0x00, 0x01,
2353 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2354 0x06, 0x00, 0x02, 0x01, 0x08, 0x01, 0x00, 0x01,
2355 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2356 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2357 },
2358 {
2359 0x01, 0x15, 0x80, 0x2b, 0x00, 0x0f, 0xff, 0xff,
2360 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2361 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2362 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2363 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2364 },
2365 {
2366 0x01, 0x15, 0x80, 0x2b, 0xff, 0xf0, 0x00, 0x01,
2367 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2368 0x06, 0x00, 0x02, 0x80, 0x08, 0x01, 0x00, 0x01,
2369 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2370 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2371 },
2372 {
2373 0x01, 0x15, 0x00, 0x2c, 0x00, 0x0f, 0xff, 0xff,
2374 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2375 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2376 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2377 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2378 },
2379 {
2380 0x01, 0x15, 0x00, 0x2c, 0xff, 0xf0, 0x00, 0x01,
2381 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2382 0x06, 0x00, 0x03, 0x01, 0x08, 0x01, 0x00, 0x01,
2383 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2384 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2385 },
2386 {
2387 0x01, 0x15, 0x80, 0x2c, 0x00, 0x0f, 0xff, 0xff,
2388 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2389 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2390 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2391 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2392 },
2393 {
2394 0x01, 0x15, 0x80, 0x2c, 0xff, 0xf0, 0x00, 0x01,
2395 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2396 0x06, 0x00, 0x03, 0x80, 0x08, 0x01, 0x00, 0x01,
2397 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2398 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2399 },
2400 {
2401 0x01, 0x15, 0x00, 0x2d, 0x00, 0x0f, 0xff, 0xff,
2402 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2403 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2404 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2405 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2406 },
2407 {
2408 0x01, 0x15, 0x00, 0x2d, 0xff, 0xf0, 0x00, 0x01,
2409 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2410 0x06, 0x00, 0x04, 0x01, 0x08, 0x01, 0x00, 0x01,
2411 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2412 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2413 },
2414 {
2415 0x01, 0x15, 0x80, 0x2d, 0x00, 0x0f, 0xff, 0xff,
2416 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2417 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2418 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2419 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2420 },
2421 {
2422 0x01, 0x15, 0x80, 0x2d, 0xff, 0xf0, 0x00, 0x01,
2423 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2424 0x06, 0x00, 0x04, 0x80, 0x08, 0x01, 0x00, 0x01,
2425 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2426 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2427 },
2428 {
2429 0x01, 0x15, 0x00, 0x2e, 0x00, 0x0f, 0xff, 0xff,
2430 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2431 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2432 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2433 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2434 },
2435 {
2436 0x01, 0x15, 0x00, 0x2e, 0xff, 0xf0, 0x00, 0x01,
2437 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2438 0x06, 0x00, 0x05, 0x01, 0x08, 0x01, 0x00, 0x01,
2439 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2440 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2441 },
2442 {
2443 0x01, 0x15, 0x80, 0x2e, 0x00, 0x0f, 0xff, 0xff,
2444 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2445 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2446 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2447 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2448 },
2449 {
2450 0x01, 0x15, 0x80, 0x2e, 0xff, 0xf0, 0x00, 0x01,
2451 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2452 0x06, 0x00, 0x05, 0x80, 0x08, 0x01, 0x00, 0x01,
2453 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2454 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2455 },
2456 {
2457 0x01, 0x15, 0x00, 0x2f, 0x00, 0x0f, 0xff, 0xff,
2458 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2459 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2460 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2461 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2462 },
2463 {
2464 0x01, 0x15, 0x00, 0x2f, 0xff, 0xf0, 0x00, 0x01,
2465 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2466 0x06, 0x00, 0x06, 0x01, 0x08, 0x01, 0x00, 0x01,
2467 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2468 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2469 },
2470 {
2471 0x01, 0x15, 0x80, 0x2f, 0x00, 0x0f, 0xff, 0xff,
2472 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2473 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2474 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2475 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2476 },
2477 {
2478 0x01, 0x15, 0x80, 0x2f, 0xff, 0xf0, 0x00, 0x01,
2479 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2480 0x06, 0x00, 0x06, 0x80, 0x08, 0x01, 0x00, 0x01,
2481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2482 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2483 },
2484 {
2485 0x01, 0x15, 0x00, 0x30, 0x00, 0x0f, 0xff, 0xff,
2486 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2487 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2488 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2490 },
2491 {
2492 0x01, 0x15, 0x00, 0x30, 0xff, 0xf0, 0x00, 0x01,
2493 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2494 0x06, 0x00, 0x07, 0x01, 0x08, 0x01, 0x00, 0x01,
2495 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2496 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2497 },
2498 {
2499 0x01, 0x15, 0x80, 0x30, 0x00, 0x0f, 0xff, 0xff,
2500 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2501 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2502 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2503 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2504 },
2505 {
2506 0x01, 0x15, 0x80, 0x30, 0xff, 0xf0, 0x00, 0x01,
2507 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2508 0x06, 0x00, 0x07, 0x80, 0x08, 0x01, 0x00, 0x01,
2509 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2510 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2511 },
2512 {
2513 0x01, 0x15, 0x00, 0x31, 0x00, 0x0f, 0xff, 0xff,
2514 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2515 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2516 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2517 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2518 },
2519 {
2520 0x01, 0x15, 0x00, 0x31, 0xff, 0xf0, 0x00, 0x01,
2521 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2522 0x07, 0x00, 0x00, 0x01, 0x08, 0x01, 0x00, 0x01,
2523 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2524 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2525 },
2526 {
2527 0x01, 0x15, 0x80, 0x31, 0x00, 0x0f, 0xff, 0xff,
2528 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2529 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2530 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2531 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2532 },
2533 {
2534 0x01, 0x15, 0x80, 0x31, 0xff, 0xf0, 0x00, 0x01,
2535 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2536 0x07, 0x00, 0x00, 0x80, 0x08, 0x01, 0x00, 0x01,
2537 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2538 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2539 },
2540 {
2541 0x01, 0x15, 0x00, 0x32, 0x00, 0x0f, 0xff, 0xff,
2542 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2543 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2544 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2545 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2546 },
2547 {
2548 0x01, 0x15, 0x00, 0x32, 0xff, 0xf0, 0x00, 0x01,
2549 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2550 0x07, 0x00, 0x01, 0x01, 0x08, 0x01, 0x00, 0x01,
2551 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2552 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2553 },
2554 {
2555 0x01, 0x15, 0x80, 0x32, 0x00, 0x0f, 0xff, 0xff,
2556 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2557 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2558 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2559 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2560 },
2561 {
2562 0x01, 0x15, 0x80, 0x32, 0xff, 0xf0, 0x00, 0x01,
2563 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2564 0x07, 0x00, 0x01, 0x80, 0x08, 0x01, 0x00, 0x01,
2565 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2566 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2567 },
2568 {
2569 0x01, 0x15, 0x00, 0x33, 0x00, 0x0f, 0xff, 0xff,
2570 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2571 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2572 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2573 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2574 },
2575 {
2576 0x01, 0x15, 0x00, 0x33, 0xff, 0xf0, 0x00, 0x01,
2577 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2578 0x07, 0x00, 0x02, 0x01, 0x08, 0x01, 0x00, 0x01,
2579 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2580 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2581 },
2582 {
2583 0x01, 0x15, 0x80, 0x33, 0x00, 0x0f, 0xff, 0xff,
2584 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2585 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2586 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2587 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2588 },
2589 {
2590 0x01, 0x15, 0x80, 0x33, 0xff, 0xf0, 0x00, 0x01,
2591 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2592 0x07, 0x00, 0x02, 0x80, 0x08, 0x01, 0x00, 0x01,
2593 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2594 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2595 },
2596 {
2597 0x01, 0x15, 0x00, 0x34, 0x00, 0x0f, 0xff, 0xff,
2598 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2599 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2600 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2601 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2602 },
2603 {
2604 0x01, 0x15, 0x00, 0x34, 0xff, 0xf0, 0x00, 0x01,
2605 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2606 0x07, 0x00, 0x03, 0x01, 0x08, 0x01, 0x00, 0x01,
2607 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2608 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2609 },
2610 {
2611 0x01, 0x15, 0x80, 0x34, 0x00, 0x0f, 0xff, 0xff,
2612 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2613 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2614 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2615 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2616 },
2617 {
2618 0x01, 0x15, 0x80, 0x34, 0xff, 0xf0, 0x00, 0x01,
2619 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2620 0x07, 0x00, 0x03, 0x80, 0x08, 0x01, 0x00, 0x01,
2621 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2622 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2623 },
2624 {
2625 0x01, 0x15, 0x00, 0x35, 0x00, 0x0f, 0xff, 0xff,
2626 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2627 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2628 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2629 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2630 },
2631 {
2632 0x01, 0x15, 0x00, 0x35, 0xff, 0xf0, 0x00, 0x01,
2633 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2634 0x07, 0x00, 0x04, 0x01, 0x08, 0x01, 0x00, 0x01,
2635 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2636 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2637 },
2638 {
2639 0x01, 0x15, 0x80, 0x35, 0x00, 0x0f, 0xff, 0xff,
2640 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2641 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2642 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2643 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2644 },
2645 {
2646 0x01, 0x15, 0x80, 0x35, 0xff, 0xf0, 0x00, 0x01,
2647 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2648 0x07, 0x00, 0x04, 0x80, 0x08, 0x01, 0x00, 0x01,
2649 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2650 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2651 },
2652 {
2653 0x01, 0x15, 0x00, 0x36, 0x00, 0x0f, 0xff, 0xff,
2654 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2655 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2656 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2657 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2658 },
2659 {
2660 0x01, 0x15, 0x00, 0x36, 0xff, 0xf0, 0x00, 0x01,
2661 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2662 0x07, 0x00, 0x05, 0x01, 0x08, 0x01, 0x00, 0x01,
2663 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2664 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2665 },
2666 {
2667 0x01, 0x15, 0x80, 0x36, 0x00, 0x0f, 0xff, 0xff,
2668 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2669 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2670 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2671 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2672 },
2673 {
2674 0x01, 0x15, 0x80, 0x36, 0xff, 0xf0, 0x00, 0x01,
2675 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2676 0x07, 0x00, 0x05, 0x80, 0x08, 0x01, 0x00, 0x01,
2677 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2678 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2679 },
2680 {
2681 0x01, 0x15, 0x00, 0x37, 0x00, 0x0f, 0xff, 0xff,
2682 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2683 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2684 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2685 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2686 },
2687 {
2688 0x01, 0x15, 0x00, 0x37, 0xff, 0xf0, 0x00, 0x01,
2689 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2690 0x07, 0x00, 0x06, 0x01, 0x08, 0x01, 0x00, 0x01,
2691 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2692 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2693 },
2694 {
2695 0x01, 0x15, 0x80, 0x37, 0x00, 0x0f, 0xff, 0xff,
2696 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2697 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2698 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2699 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2700 },
2701 {
2702 0x01, 0x15, 0x80, 0x37, 0xff, 0xf0, 0x00, 0x01,
2703 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2704 0x07, 0x00, 0x06, 0x80, 0x08, 0x01, 0x00, 0x01,
2705 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2706 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2707 },
2708 {
2709 0x01, 0x15, 0x00, 0x38, 0x00, 0x0f, 0xff, 0xff,
2710 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2711 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2712 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2713 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2714 },
2715 {
2716 0x01, 0x15, 0x00, 0x38, 0xff, 0xf0, 0x00, 0x01,
2717 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2718 0x07, 0x00, 0x07, 0x01, 0x08, 0x01, 0x00, 0x01,
2719 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2720 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2721 },
2722 {
2723 0x01, 0x15, 0x80, 0x38, 0x00, 0x0f, 0xff, 0xff,
2724 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2725 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2726 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2727 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2728 },
2729 {
2730 0x01, 0x15, 0x80, 0x38, 0xff, 0xf0, 0x00, 0x01,
2731 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2732 0x07, 0x00, 0x07, 0x80, 0x08, 0x01, 0x00, 0x01,
2733 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2734 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2735 },
2736 {
2737 0x01, 0x15, 0x00, 0x39, 0x00, 0x0f, 0xff, 0xff,
2738 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2739 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2740 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2741 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2742 },
2743 {
2744 0x01, 0x15, 0x00, 0x39, 0xff, 0xf0, 0x00, 0x01,
2745 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2746 0x08, 0x00, 0x00, 0x01, 0x08, 0x01, 0x00, 0x01,
2747 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2748 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2749 },
2750 {
2751 0x01, 0x15, 0x80, 0x39, 0x00, 0x0f, 0xff, 0xff,
2752 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2753 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2754 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2755 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2756 },
2757 {
2758 0x01, 0x15, 0x80, 0x39, 0xff, 0xf0, 0x00, 0x01,
2759 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2760 0x08, 0x00, 0x00, 0x80, 0x08, 0x01, 0x00, 0x01,
2761 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2762 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2763 },
2764 {
2765 0x01, 0x15, 0x00, 0x3a, 0x00, 0x0f, 0xff, 0xff,
2766 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2767 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2768 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2769 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2770 },
2771 {
2772 0x01, 0x15, 0x00, 0x3a, 0xff, 0xf0, 0x00, 0x01,
2773 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2774 0x08, 0x00, 0x01, 0x01, 0x08, 0x01, 0x00, 0x01,
2775 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2776 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2777 },
2778 {
2779 0x01, 0x15, 0x80, 0x3a, 0x00, 0x0f, 0xff, 0xff,
2780 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2781 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2782 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2783 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2784 },
2785 {
2786 0x01, 0x15, 0x80, 0x3a, 0xff, 0xf0, 0x00, 0x01,
2787 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2788 0x08, 0x00, 0x01, 0x80, 0x08, 0x01, 0x00, 0x01,
2789 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2790 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2791 },
2792 {
2793 0x01, 0x15, 0x00, 0x3b, 0x00, 0x0f, 0xff, 0xff,
2794 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2795 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2796 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2797 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2798 },
2799 {
2800 0x01, 0x15, 0x00, 0x3b, 0xff, 0xf0, 0x00, 0x01,
2801 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2802 0x08, 0x00, 0x02, 0x01, 0x08, 0x01, 0x00, 0x01,
2803 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2804 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2805 },
2806 {
2807 0x01, 0x15, 0x80, 0x3b, 0x00, 0x0f, 0xff, 0xff,
2808 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2809 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2810 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2811 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2812 },
2813 {
2814 0x01, 0x15, 0x80, 0x3b, 0xff, 0xf0, 0x00, 0x01,
2815 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2816 0x08, 0x00, 0x02, 0x80, 0x08, 0x01, 0x00, 0x01,
2817 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2818 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2819 },
2820 {
2821 0x01, 0x15, 0x00, 0x3c, 0x00, 0x0f, 0xff, 0xff,
2822 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2823 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2824 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2825 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2826 },
2827 {
2828 0x01, 0x15, 0x00, 0x3c, 0xff, 0xf0, 0x00, 0x01,
2829 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2830 0x08, 0x00, 0x03, 0x01, 0x08, 0x01, 0x00, 0x01,
2831 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2832 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2833 },
2834 {
2835 0x01, 0x15, 0x80, 0x3c, 0x00, 0x0f, 0xff, 0xff,
2836 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2837 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2838 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2839 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2840 },
2841 {
2842 0x01, 0x15, 0x80, 0x3c, 0xff, 0xf0, 0x00, 0x01,
2843 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2844 0x08, 0x00, 0x03, 0x80, 0x08, 0x01, 0x00, 0x01,
2845 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2846 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2847 },
2848 {
2849 0x01, 0x15, 0x00, 0x3d, 0x00, 0x0f, 0xff, 0xff,
2850 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2851 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2852 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2853 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2854 },
2855 {
2856 0x01, 0x15, 0x00, 0x3d, 0xff, 0xf0, 0x00, 0x01,
2857 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2858 0x08, 0x00, 0x04, 0x01, 0x08, 0x01, 0x00, 0x01,
2859 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2860 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2861 },
2862 {
2863 0x01, 0x15, 0x80, 0x3d, 0x00, 0x0f, 0xff, 0xff,
2864 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2865 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2866 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2867 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2868 },
2869 {
2870 0x01, 0x15, 0x80, 0x3d, 0xff, 0xf0, 0x00, 0x01,
2871 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2872 0x08, 0x00, 0x04, 0x80, 0x08, 0x01, 0x00, 0x01,
2873 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2874 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2875 },
2876 {
2877 0x01, 0x15, 0x00, 0x3e, 0x00, 0x0f, 0xff, 0xff,
2878 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2879 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2880 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2881 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2882 },
2883 {
2884 0x01, 0x15, 0x00, 0x3e, 0xff, 0xf0, 0x00, 0x01,
2885 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2886 0x08, 0x00, 0x05, 0x01, 0x08, 0x01, 0x00, 0x01,
2887 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2888 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2889 },
2890 {
2891 0x01, 0x15, 0x80, 0x3e, 0x00, 0x0f, 0xff, 0xff,
2892 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2893 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2894 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2895 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2896 },
2897 {
2898 0x01, 0x15, 0x80, 0x3e, 0xff, 0xf0, 0x00, 0x01,
2899 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2900 0x08, 0x00, 0x05, 0x80, 0x08, 0x01, 0x00, 0x01,
2901 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2902 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2903 },
2904 {
2905 0x01, 0x15, 0x00, 0x3f, 0x00, 0x0f, 0xff, 0xff,
2906 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2907 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2908 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2909 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2910 },
2911 {
2912 0x01, 0x15, 0x00, 0x3f, 0xff, 0xf0, 0x00, 0x01,
2913 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2914 0x08, 0x00, 0x06, 0x01, 0x08, 0x01, 0x00, 0x01,
2915 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2916 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2917 },
2918 {
2919 0x01, 0x15, 0x80, 0x3f, 0x00, 0x0f, 0xff, 0xff,
2920 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2921 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2922 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2923 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2924 },
2925 {
2926 0x01, 0x15, 0x80, 0x3f, 0xff, 0xf0, 0x00, 0x01,
2927 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2928 0x08, 0x00, 0x06, 0x80, 0x08, 0x01, 0x00, 0x01,
2929 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2930 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2931 },
2932 {
2933 0x01, 0x15, 0x00, 0x40, 0x00, 0x0f, 0xff, 0xff,
2934 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2935 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2936 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2937 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2938 },
2939 {
2940 0x01, 0x15, 0x00, 0x40, 0xff, 0xf0, 0x00, 0x01,
2941 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
2942 0x08, 0x00, 0x07, 0x01, 0x08, 0x01, 0x00, 0x01,
2943 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2944 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2945 },
2946 {
2947 0x01, 0x15, 0x80, 0x40, 0x00, 0x0f, 0xff, 0xff,
2948 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2949 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2950 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2951 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2952 },
2953 {
2954 0x01, 0x15, 0x80, 0x40, 0xff, 0xf0, 0x00, 0x01,
2955 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
2956 0x08, 0x00, 0x07, 0x80, 0x08, 0x01, 0x00, 0x01,
2957 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2958 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2959 },
2960 { // Traffic Scheduler
2961 0x01, 0x16, 0x80, 0x00, 0xf0, 0x00, 0x80, 0x08,
2962 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
2963 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2964 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2965 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2966 },
2967 { // Traffic Scheduler
2968 0x01, 0x16, 0x80, 0x00, 0xf0, 0x00, 0x80, 0x09,
2969 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
2970 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2971 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2972 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2973 },
2974 { // Traffic Scheduler
2975 0x01, 0x16, 0x80, 0x00, 0xf0, 0x00, 0x80, 0x0a,
2976 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
2977 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2978 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2979 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2980 },
2981 { // Traffic Scheduler
2982 0x01, 0x16, 0x80, 0x00, 0xf0, 0x00, 0x80, 0x0b,
2983 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
2984 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2985 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2986 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2987 },
2988 { // Traffic Scheduler
2989 0x01, 0x16, 0x80, 0x00, 0xf0, 0x00, 0x80, 0x0c,
2990 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
2991 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2992 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2993 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2994 },
2995 { // Traffic Scheduler
2996 0x01, 0x16, 0x80, 0x00, 0xf0, 0x00, 0x80, 0x0d,
2997 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
2998 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
2999 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3000 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3001 },
3002 { // Traffic Scheduler
3003 0x01, 0x16, 0x80, 0x00, 0xf0, 0x00, 0x80, 0x0e,
3004 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
3005 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3006 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3007 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3008 },
3009 { // Traffic Scheduler
3010 0x01, 0x16, 0x80, 0x00, 0xf0, 0x00, 0x80, 0x0f,
3011 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
3012 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3013 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3014 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3015 },
3016 { // ONU2-G
3017 0x01, 0x01, 0x00, 0x00, 0x07, 0xfc, 0x00, 0x40,
3018 0x08, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
3019 0x00, 0x7f, 0x00, 0x00, 0x3f, 0x00, 0x01, 0x00,
3020 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3021 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3022 },
3023 }[uploadIdx][:])
3024 case 0x44: // Create
3025 // meID
3026 // 0x0110: GAL Ethernet profile
3027 // 0x002d: MAC bridge service profile
3028 // 0x002f: MAC brige port configuration data
3029 // 0x00ab: Extended VLAN tagging operation configuration data
3030 // 0x0082: IEEE 802.1p mapper service profile
3031 // 0x010c: GEM port network CTP
3032 // 0x010a: GEM interworking termination point
3033 copy(omciInd.Pkt[contentIdx:], []byte{
3034 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3035 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3036 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3037 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3038 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3039 })
3040 case 0x48: // Set
3041 // meID
3042 // 0x0101: ONU2-G
3043 // 0x0100: ONU-G
3044 // 0x0108: UNI-G
3045 // 0x0106: T-CONT
3046 // 0x0115: Priority queue
3047 // 0x0082: IEEE 802.1p mapper service profile
3048 copy(omciInd.Pkt[contentIdx:], []byte{
3049 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3050 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3051 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3052 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3053 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
3054 })
3055 }
3056 go func() {
3057 if err := dh.omciIndication(ctx, omciInd); err != nil {
3058 return
3059 }
3060 }()
3061
3062 return nil
3063}
3064
3065func (d *L2oamOltDevice) setActiveState(ctx context.Context, isActive bool) {
3066 d.Base.setActiveState(ctx, isActive)
3067}
3068func (d *L2oamOltDevice) startMountSequence(ctx context.Context, pkgType string, cmd *L2oamCmd) {
3069}
3070func (d *L2oamOltDevice) reboot(ctx context.Context) {
3071}
3072func (d *L2oamOltDevice) updateMap() {
3073 mapMutex.Lock()
3074 defer mapMutex.Unlock()
3075 _, ok := deviceMap[d.Base.DstMac]
3076 if ok {
3077 deviceMap[d.Base.DstMac] = d
3078 }
3079}
3080func (d *L2oamOltDevice) setL2oamCmd(cmd *L2oamCmd) {
3081 d.L2oamCmd = cmd
3082}
3083func (d *L2oamOltDevice) getL2oamCmd() *L2oamCmd {
3084 return d.L2oamCmd
3085}
3086func (d *L2oamOltDevice) setObjectContext(oc *l2oam.TomiObjectContext) {
3087 d.ObjectContext = oc
3088}
3089func (d *L2oamOltDevice) getObjectContext() *l2oam.TomiObjectContext {
3090 return d.ObjectContext
3091}
3092func (d *L2oamOltDevice) setReferenceTable(tbl *l2oam.GetTrafficControlReferenceTableRes) {
3093 d.ReferenceTable = tbl
3094}
3095func (d *L2oamOltDevice) getReferenceTable() *l2oam.GetTrafficControlReferenceTableRes {
3096 return d.ReferenceTable
3097}
3098func (d *L2oamOltDevice) setProfile(down *l2oam.SetGenericActionCreateRes, up *l2oam.SetGenericActionCreateRes) {
3099 d.DownProfile = down
3100 d.UpProfile = up
3101}
3102func (d *L2oamOltDevice) getProfile() (*l2oam.SetGenericActionCreateRes, *l2oam.SetGenericActionCreateRes) {
3103 return d.DownProfile, d.UpProfile
3104}
3105func (d *L2oamOltDevice) delete(ctx context.Context) {
3106 d.Base.delete(ctx)
3107}
3108func (d *L2oamOltDevice) setDeleteFlag() {
3109 d.Base.setDeleteFlag()
3110}
3111func (d *L2oamOltDevice) getDeleteFlag() bool {
3112 return d.Base.getDeleteFlag()
3113}
3114func (d *L2oamOltDevice) setAutonomousFlag(flag bool) {
3115 d.Base.setAutonomousFlag(flag)
3116 d.updateMap()
3117}
3118func (d *L2oamOltDevice) getAutonomousFlag() bool {
3119 return d.Base.getAutonomousFlag()
3120}
3121func (d *L2oamOltDevice) receiveEapol(etherPacket *layers.Ethernet) {
3122 d.Base.receiveEapol(etherPacket)
3123}
3124
3125func (d *L2oamOltDevice) addFlow(ctx context.Context, cmd *L2oamCmd) error {
3126 d.autonomousExecMutex.Lock()
3127 defer d.autonomousExecMutex.Unlock()
3128
3129 onu := FindL2oamDeviceByDeviceID(cmd.OnuDeviceID)
3130 if onu == nil {
3131 return fmt.Errorf(fmt.Sprintf("catnnot-get-onu-device. device-id:%s", cmd.OnuDeviceID))
3132 } else if !(onu.(*L2oamOnuDevice)).Base.isActive() {
3133 logger.Debug(ctx, fmt.Sprintf("onu is not active. device-id:%s", cmd.OnuDeviceID))
3134 } else {
3135 logger.Debug(ctx, fmt.Sprintf("add-flow-for-onu. device-id:%s", cmd.OnuDeviceID))
3136
3137 oc := onu.getObjectContext()
3138 if oc == nil {
3139 logger.Error(ctx, fmt.Sprintf("catnnot-get-onu-object-context. device-id:%s", cmd.OnuDeviceID))
3140 } else {
3141 getTrafficControl := onu.getReferenceTable()
3142 if getTrafficControl == nil {
3143 getTrafficControl = sendGetTrafficControlReferenceTable(ctx, d, oc)
3144 if getTrafficControl == nil {
3145 return errors.New("L2oamAddFlow() sendGetTrafficControlReferenceTable() error. ")
3146 }
3147 }
3148 downProfile, upProfile := onu.getProfile()
3149 // if profiles are created, remove these profiles.
3150 if downProfile != nil {
3151 if err := sendSetActionDelete(ctx, d, downProfile.GetTrafficProfile(), l2oam.ActionTypeTrafficProfile); err != nil {
3152 logger.Error(ctx,
3153 fmt.Sprintf("L2oamAddFlow() Generic/Action Delete(downstream) error. %v", err))
3154 }
3155 }
3156 if upProfile != nil {
3157 if err := sendSetActionDelete(ctx, d, upProfile.GetTrafficProfile(), l2oam.ActionTypeTrafficProfile); err != nil {
3158 logger.Error(ctx,
3159 fmt.Sprintf("L2oamAddFlow() Generic/Action Delete(upstream) error. %v", err))
3160 }
3161 }
3162 downProfile = sendSetGenericActionCreate(ctx, d, l2oam.ActionTypeTrafficProfile)
3163 if downProfile == nil {
3164 return errors.New("L2oamAddFlow() Generic/Action Create(downstream) error")
3165 }
3166 upProfile = sendSetGenericActionCreate(ctx, d, l2oam.ActionTypeTrafficProfile)
3167 if upProfile == nil {
3168 return errors.New("L2oamAddFlow() Generic/Action Create(upstream) error")
3169 }
3170 onu.setReferenceTable(getTrafficControl)
3171 onu.setProfile(downProfile, upProfile)
3172 onu.updateMap()
3173
3174 err01 := sendSetTrafficControl(ctx, d, getTrafficControl.GetReferenceControlDown(), downProfile.GetTrafficProfile())
3175 err02 := sendSetTrafficControl(ctx, d, getTrafficControl.GetReferenceControlUp(), upProfile.GetTrafficProfile())
3176 logger.Debug(ctx, fmt.Sprintf("traffic-control/traffic-profile results: %v, %v", err01, err02))
3177
3178 err03 := sendSetPriority(ctx, d, downProfile.GetTrafficProfile())
3179 err04 := sendSetGuranteedRate(ctx, d, cmd.Cir, downProfile.GetTrafficProfile())
3180 err05 := sendSetGuranteedRate(ctx, d, cmd.Cir, upProfile.GetTrafficProfile())
3181 err06 := sendSetBestEffortRate(ctx, d, cmd.Pir, downProfile.GetTrafficProfile())
3182 err07 := sendSetBestEffortRate(ctx, d, cmd.Pir, upProfile.GetTrafficProfile())
3183 logger.Debug(ctx, fmt.Sprintf("traffic-profile-settings-results: %v, %v, %v, %v, %v",
3184 err03, err04, err05, err06, err07))
3185 }
3186 }
3187
3188 return nil
3189}
3190
3191func (d *L2oamOltDevice) updateFlow(ctx context.Context, cmd *L2oamCmd) error {
3192 d.autonomousExecMutex.Lock()
3193 defer d.autonomousExecMutex.Unlock()
3194
3195 onuDeviceID := cmd.OnuDeviceID
3196 logger.Debugf(ctx, "updateFlow() Start. onu-device-id:%s, tpid:%x, vid%x",
3197 onuDeviceID, cmd.Tpid, cmd.Vid)
3198
3199 onu := FindL2oamDeviceByDeviceID(onuDeviceID)
3200 if onu == nil {
3201 return errors.New("L2oamUpdateFlow() FindL2oamDeviceByDeviceId() error. onu not found")
3202 }
3203 var action *l2oam.TomiObjectContext
3204 var err error
3205 onuID := onu.getObjectContext()
3206 for _, settings := range d.L2SwitchDomainMap {
3207 if _, exists := settings.Onus[onuDeviceID]; exists {
3208 if err = sendSetActionInletEntryUsDel(ctx,
3209 d, settings.OcAction, settings.Tpid, settings.Vid, onuID); err != nil {
3210 logger.Errorf(ctx, "error:%v", err)
3211 }
3212 delete(settings.Onus, onuDeviceID)
3213 }
3214 }
3215 vidValue := byte2Int(cmd.Vid)
3216 settings, exists := d.L2SwitchDomainMap[vidValue]
3217 if !exists {
3218 action, err = sendSetGenericActionCreateForDS(ctx, d)
3219 if err != nil {
3220 logger.Errorf(ctx, "error:%v", err)
3221 }
3222 settings = &l2SwitchDomain{
3223 OcAction: action,
3224 Tpid: cmd.Tpid,
3225 Vid: cmd.Vid,
3226 Onus: map[string]bool{},
3227 }
3228 d.L2SwitchDomainMap[vidValue] = settings
3229 if err := sendSetL2SwitchingDomainForDS(ctx, d, action, cmd.Tpid, cmd.Vid); err != nil {
3230 logger.Errorf(ctx, "error:%v", err)
3231 }
3232 } else {
3233 action = settings.OcAction
3234 }
3235 if err := sendSetDefaultOutlet(ctx, d, action, onuID); err != nil {
3236 logger.Errorf(ctx, "error:%v", err)
3237 }
3238 if err := sendSetL2SwitchingDomainForUS(ctx, d, action, cmd.Tpid, cmd.Vid, onuID); err != nil {
3239 logger.Errorf(ctx, "error:%v", err)
3240 }
3241 settings.Onus[onuDeviceID] = true
3242
3243 logger.Debugf(ctx, "updateFlow() end. onu-device-id:%s, tpid:%x, vid%x",
3244 onuDeviceID, cmd.Tpid, cmd.Vid)
3245
3246 return nil
3247}
3248
3249func (d *L2oamOltDevice) removeFlow(ctx context.Context) error {
3250 logger.Debugf(ctx, "removeFlow() Start. device-id:%s", d.Base.DeviceID)
3251
3252 for _, settings := range d.L2SwitchDomainMap {
3253 for onuDeviceID := range settings.Onus {
3254 onu := FindL2oamDeviceByDeviceID(onuDeviceID)
3255 if onu == nil {
3256 logger.Errorf(ctx, "onu not found. device-id:%s", onuDeviceID)
3257 continue
3258 }
3259 onuID := onu.getObjectContext()
3260 if err := sendSetActionInletEntryUsDel(ctx,
3261 d, settings.OcAction, settings.Tpid, settings.Vid, onuID); err != nil {
3262 logger.Errorf(ctx, "error:%v", err)
3263 }
3264 }
3265 settings.Onus = map[string]bool{}
3266
3267 if err := sendSetActionInletEntryDsDel(ctx, d, settings.OcAction, settings.Tpid, settings.Vid); err != nil {
3268 logger.Errorf(ctx, "error:%v", err)
3269 }
3270 if err := sendSetActionDeleteStream(ctx, d, settings.OcAction); err != nil {
3271 logger.Errorf(ctx, "error:%v", err)
3272 }
3273 }
3274 d.L2SwitchDomainMap = map[uint32]*l2SwitchDomain{}
3275
3276 return nil
3277}
3278
3279// L2oamOnuDevice =================================
3280// L2oamOnuDevice provides functions for OLT device
3281// ================================================
3282type L2oamOnuDevice struct {
3283 Base DeviceBase
3284 OnuID uint32
3285 ObjectContext *l2oam.TomiObjectContext
3286 ReferenceTable *l2oam.GetTrafficControlReferenceTableRes
3287 DownProfile *l2oam.SetGenericActionCreateRes
3288 UpProfile *l2oam.SetGenericActionCreateRes
3289 PkgType string
3290 keepAliveResponse chan string
3291 MacAddress string
3292}
3293
3294func (d *L2oamOnuDevice) getDeviceName() string {
3295 return d.Base.getDeviceName()
3296}
3297func (d *L2oamOnuDevice) send(message gopacket.SerializableLayer) error {
3298 return d.Base.send(message)
3299}
3300func (d *L2oamOnuDevice) waitResponse(timeoutSecond int) (*layers.Ethernet, error) {
3301 return d.Base.waitResponse(timeoutSecond)
3302}
3303func (d *L2oamOnuDevice) sendAndWait(message gopacket.SerializableLayer, timeoutSecond int) (*layers.Ethernet, error) {
3304 return d.Base.sendAndWait(message, timeoutSecond)
3305}
3306func (d *L2oamOnuDevice) recieve(etherPacket *layers.Ethernet) {
3307 d.Base.recieve(etherPacket)
3308}
3309func (d *L2oamOnuDevice) recieveKeepAlive(etherPacket *layers.Ethernet) {
3310 packet := &l2oam.OAMPDUInformation{}
3311 if err := packet.Decode(etherPacket.Payload); err != nil {
3312 return
3313 }
3314 if (l2oam.OnuPkgType == l2oam.OnuPkgTypeA) && (packet.IsOnuPkgA()) {
3315 logger.Info(context.Background(), fmt.Sprintf("[%s] recieveKeepAlive() Pkg type A.", d.getDeviceName()))
3316 if d.keepAliveResponse != nil {
3317 d.keepAliveResponse <- "PkgTypeError"
3318 }
3319 // d.Base.recieveKeepAlive(etherPacket)
3320 d.PkgType = l2oam.OnuPkgTypeA
3321 } else if (l2oam.OnuPkgType == l2oam.OnuPkgTypeB) && (packet.IsOnuPkgB()) {
3322 logger.Info(context.Background(), fmt.Sprintf("[%s] recieveKeepAlive() Pkg type B.", d.getDeviceName()))
3323 if d.keepAliveResponse != nil {
3324 d.keepAliveResponse <- "success"
3325 }
3326 d.Base.recieveKeepAlive(etherPacket)
3327 d.PkgType = l2oam.OnuPkgTypeB
3328 } else {
3329 logger.Error(context.Background(), fmt.Sprintf("[%s] recieveKeepAlive() Pkg type error. support type=%s, isOnuPkgA=%v, isOnuPkgB=%v", d.getDeviceName(), l2oam.OnuPkgType, packet.IsOnuPkgA(), packet.IsOnuPkgB()))
3330 if d.keepAliveResponse != nil {
3331 d.keepAliveResponse <- "PkgTypeError"
3332 }
3333 }
3334}
3335
3336func (d *L2oamOnuDevice) startKeepAlive() {
3337 d.Base.startKeepAlive()
3338}
3339func (d *L2oamOnuDevice) stopKeepAlive() {
3340 d.Base.stopKeepAlive()
3341}
3342func (d *L2oamOnuDevice) setActiveState(ctx context.Context, isActive bool) {
3343 d.Base.setActiveState(ctx, isActive)
3344}
3345func (d *L2oamOnuDevice) update(mac string, deviceID string, onuID uint32) {
3346 mapMutex.Lock()
3347 defer mapMutex.Unlock()
3348 d.OnuID = onuID
3349 d.Base.DeviceID = deviceID
3350 deviceMap[mac] = d
3351 deviceMacMap[deviceID] = mac
3352}
3353
3354func (d *L2oamOnuDevice) startMountSequence(ctx context.Context, pkgType string, cmd *L2oamCmd) {
3355 if pkgType == l2oam.OnuPkgTypeA {
3356 d.startMountSequencePkgA(ctx, pkgType, cmd)
3357 return
3358 }
3359 go func() {
3360 logger.Debug(ctx, fmt.Sprintf("[%s] startMountSequence(). MacAddress=%s", d.getDeviceName(), d.Base.DstMac))
3361 // wait until the onu keep-alive state transits to step3
3362 for {
3363 if d.Base.KeepAliveStatus != KeepAliveStep3 {
3364 time.Sleep(1 * time.Second)
3365 } else {
3366 logger.Debug(ctx, fmt.Sprintf("[%s] startMountSequence(). onu active status. start sequence. MacAddress=%s", d.getDeviceName(), d.Base.DstMac))
3367 break
3368 }
3369 }
3370
3371 // ONU System Info(get request)
3372 _, err := d.sendAndWait(l2oam.GenerateOnuSystemInfo(pkgType), ResponseTimer)
3373 if err != nil {
3374 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuSystemInfo() Send Error: %v", d.getDeviceName(), err))
3375 return
3376 }
3377 // ONU Config
3378 if pkgType == l2oam.OnuPkgTypeB {
3379 _, err = d.sendAndWait(l2oam.GenerateOnuConfig(pkgType), ResponseTimer)
3380 if err != nil {
3381 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuConfig() Send Error: %v", d.getDeviceName(), err))
3382 return
3383 }
3384 }
3385 // FEC Mode
3386 _, err = d.sendAndWait(l2oam.GenerateFecMode(pkgType), ResponseTimer)
3387 if err != nil {
3388 logger.Error(ctx, fmt.Sprintf("[%s] GenerateFecMode() Send Error: %v", d.getDeviceName(), err))
3389 return
3390 }
3391 // Encryption Mode
3392 max := 2
3393 if pkgType == l2oam.OnuPkgTypeB {
3394 max = 1
3395 }
3396 for index := 0; index < max; index++ {
3397 _, err = d.sendAndWait(l2oam.GenerateEncryptionMode(pkgType, index+1), ResponseTimer)
3398 if err != nil {
3399 logger.Error(ctx, fmt.Sprintf("[%s] GenerateEncryptionMode(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3400 return
3401 }
3402 }
3403
3404 // Dyn Learning Mode
3405 max = 3
3406 if pkgType == l2oam.OnuPkgTypeB {
3407 max = 1
3408 }
3409 for index := 0; index < max; index++ {
3410 _, err = d.sendAndWait(l2oam.GenerateDynLearningMode(pkgType, index+1), ResponseTimer)
3411 if err != nil {
3412 logger.Error(ctx, fmt.Sprintf("[%s] GenerateDynLearningMode(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3413 return
3414 }
3415 }
3416 // Ponp Temperature
3417 _, err = d.sendAndWait(l2oam.GeneratePonpTemperature(pkgType), ResponseTimer)
3418 if err != nil {
3419 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpTemperature() Send Error: %v", d.getDeviceName(), err))
3420 return
3421 }
3422 // Ponp Optical TRx Supply Voltage
3423 _, err = d.sendAndWait(l2oam.GeneratePonpOptTRxSupplyVoltage(pkgType), ResponseTimer)
3424 if err != nil {
3425 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptTRxSupplyVoltage() Send Error: %v", d.getDeviceName(), err))
3426 return
3427 }
3428 // Ponp Optical Tx Bias Current
3429 _, err = d.sendAndWait(l2oam.GeneratePonpOptTxBiasCurrent(pkgType), ResponseTimer)
3430 if err != nil {
3431 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptTxBiasCurrent() Send Error: %v", d.getDeviceName(), err))
3432 return
3433 }
3434 // Ponp Optical Tx Output Power
3435 _, err = d.sendAndWait(l2oam.GeneratePonpOptTxOutputPower(pkgType), ResponseTimer)
3436 if err != nil {
3437 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptTxOutputPower() Send Error: %v", d.getDeviceName(), err))
3438 return
3439 }
3440 // Ponp Optical Rx Output Power
3441 _, err = d.sendAndWait(l2oam.GeneratePonpOptRxInputPower(pkgType), ResponseTimer)
3442 if err != nil {
3443 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptRxInputPower() Send Error: %v", d.getDeviceName(), err))
3444 return
3445 }
3446
3447 // Onu Priority Queue Count
3448 max = 2
3449 if pkgType == l2oam.OnuPkgTypeB {
3450 max = 1
3451 }
3452 for index := 0; index < max; index++ {
3453 _, err = d.sendAndWait(l2oam.GenerateOnuPriorityQueueCount(pkgType, index+1), ResponseTimer)
3454 if err != nil {
3455 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuPriorityQueueCount(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3456 return
3457 }
3458 }
3459 // Unip Target Queue Priority
3460 if pkgType == l2oam.OnuPkgTypeB {
3461 _, err = d.sendAndWait(l2oam.GenerateUnipTargetQueuePriority(pkgType), ResponseTimer)
3462 if err != nil {
3463 logger.Error(ctx, fmt.Sprintf("[%s] GenerateUnipTargetQueuePriority() Send Error: %v", d.getDeviceName(), err))
3464 return
3465 }
3466 }
3467 // Vlan Pon VID Value
3468 max = 2
3469 if pkgType == l2oam.OnuPkgTypeB {
3470 max = 1
3471 }
3472 for index := 0; index < max; index++ {
3473 _, err = d.sendAndWait(l2oam.GenerateSetVlanPonVIDValue(pkgType, index+1, cmd.Itpid, cmd.Ivid), ResponseTimer)
3474 if err != nil {
3475 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetVlanPonVIDValue(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3476 return
3477 }
3478 }
3479 // Vlan Tag Filter
3480 max = 0
3481 if pkgType == l2oam.OnuPkgTypeB {
3482 max = 2
3483 }
3484 for index := 0; index < max; index++ {
3485 _, err = d.sendAndWait(l2oam.GenerateSetVlanTagFilter(pkgType, index+1, cmd.Itpid), ResponseTimer)
3486 if err != nil {
3487 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetVlanTagFilter(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3488 return
3489 }
3490 }
3491 // Frame Processing
3492 /*if pkgType == ONU_PKG_TYPE_A {
3493 _, err = d.sendAndWait(l2oam.GeneateSetFrameProcessing(pkgType), ResponseTimer)
3494 if err != nil {
3495 logger.Error(ctx, fmt.Sprintf("[%s] GeneateOnuSysInfo() Send Error: %v", d.getDeviceName(), err))
3496 return
3497 }
3498 }*/
3499 // Qos Policer Rate
3500 max = 1
3501 if pkgType == l2oam.OnuPkgTypeB {
3502 max = 1
3503 }
3504 for index := 0; index < max; index++ {
3505 _, err = d.sendAndWait(l2oam.GenerateSetQosPolicerRate(pkgType, index+1), ResponseTimer)
3506 if err != nil {
3507 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetQosPolicerRate(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3508 return
3509 }
3510 }
3511 // Qos Policer Burst
3512 if pkgType == l2oam.OnuPkgTypeB {
3513 _, err = d.sendAndWait(l2oam.GenerateSetQosPolicerBurst(pkgType), ResponseTimer)
3514 if err != nil {
3515 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetQosPolicerBurst() Send Error: %v", d.getDeviceName(), err))
3516 return
3517 }
3518 }
3519 // Unip Info
3520 _, err = d.sendAndWait(l2oam.GenerateGetUnipInfo(pkgType), ResponseTimer)
3521 if err != nil {
3522 logger.Error(ctx, fmt.Sprintf("[%s] GenerateGetUnipInfo() Send Error: %v", d.getDeviceName(), err))
3523 return
3524 }
3525 // Unip Link Mode
3526 _, err = d.sendAndWait(l2oam.GenerateSetUnipLinkMode(pkgType), ResponseTimer)
3527 if err != nil {
3528 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetUnipLinkMode() Send Error: %v", d.getDeviceName(), err))
3529 return
3530 }
3531 // Unip TOSCOS Conversion
3532 _, err = d.sendAndWait(l2oam.GenerateUnipTOSCOSConversion(pkgType), ResponseTimer)
3533 if err != nil {
3534 logger.Error(ctx, fmt.Sprintf("[%s] GenerateUnipTOSCOSConversion() Send Error: %v", d.getDeviceName(), err))
3535 return
3536 }
3537 // ONU Errored Frame Window
3538 _, err = d.sendAndWait(l2oam.GenerateOnuErroredFrameWindow(pkgType), ResponseTimer)
3539 if err != nil {
3540 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuErroredFrameWindow() Send Error: %v", d.getDeviceName(), err))
3541 return
3542 }
3543 // ONU Errord Frame Threshold
3544 _, err = d.sendAndWait(l2oam.GenerateOnuErroredFrameWindow(pkgType), ResponseTimer)
3545 if err != nil {
3546 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuErroredFrameWindow() Send Error: %v", d.getDeviceName(), err))
3547 return
3548 }
3549 logger.Debug(ctx, fmt.Sprintf("[%s] startMountSequence(). Normal End.", d.getDeviceName()))
3550 }()
3551}
3552func (d *L2oamOnuDevice) startMountSequencePkgA(ctx context.Context, pkgType string, cmd *L2oamCmd) {
3553 go func() {
3554 logger.Debug(ctx, fmt.Sprintf("[%s] startMountSequence(). MacAddress=%s", d.getDeviceName(), d.Base.DstMac))
3555 // wait until the onu keep-alive state transits to step3
3556 for {
3557 if d.Base.KeepAliveStatus != KeepAliveStep3 {
3558 time.Sleep(1 * time.Second)
3559 } else {
3560 logger.Debug(ctx, fmt.Sprintf("[%s] startMountSequence(). onu active status. start sequence. MacAddress=%s", d.getDeviceName(), d.Base.DstMac))
3561 break
3562 }
3563 }
3564
3565 // // Encryption Mode
3566 // _, err := d.sendAndWait(l2oam.GenerateEncryptionMode(pkgType, 1), ResponseTimer)
3567 // if err != nil {
3568 // logger.Error(ctx, fmt.Sprintf("[%s] GenerateEncryptionMode(%v) Send Error: %v", d.getDeviceName(), 1, err))
3569 // return
3570 // }
3571
3572 // ONU System Info(get request)
3573 _, err := d.sendAndWait(l2oam.GenerateOnuSystemInfo(pkgType), ResponseTimer)
3574 if err != nil {
3575 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuSystemInfo() Send Error: %v", d.getDeviceName(), err))
3576 return
3577 }
3578 // ONU Config
3579 if pkgType == l2oam.OnuPkgTypeB {
3580 _, err = d.sendAndWait(l2oam.GenerateOnuConfig(pkgType), ResponseTimer)
3581 if err != nil {
3582 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuConfig() Send Error: %v", d.getDeviceName(), err))
3583 return
3584 }
3585 }
3586 // FEC Mode
3587 _, err = d.sendAndWait(l2oam.GenerateFecMode(pkgType), ResponseTimer)
3588 if err != nil {
3589 logger.Error(ctx, fmt.Sprintf("[%s] GenerateFecMode() Send Error: %v", d.getDeviceName(), err))
3590 return
3591 }
3592 // Encryption Mode
3593 _, err = d.sendAndWait(l2oam.GenerateEncryptionMode(pkgType, 2), ResponseTimer)
3594 if err != nil {
3595 logger.Error(ctx, fmt.Sprintf("[%s] GenerateEncryptionMode(%v) Send Error: %v", d.getDeviceName(), 2, err))
3596 return
3597 }
3598
3599 // Dyn Learning Mode
3600 max := 3
3601 if pkgType == l2oam.OnuPkgTypeB {
3602 max = 1
3603 }
3604 for index := 0; index < max; index++ {
3605 _, err = d.sendAndWait(l2oam.GenerateDynLearningMode(pkgType, index+1), ResponseTimer)
3606 if err != nil {
3607 logger.Error(ctx, fmt.Sprintf("[%s] GenerateDynLearningMode(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3608 return
3609 }
3610 }
3611 // Ponp Temperature
3612 _, err = d.sendAndWait(l2oam.GeneratePonpTemperature(pkgType), ResponseTimer)
3613 if err != nil {
3614 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpTemperature() Send Error: %v", d.getDeviceName(), err))
3615 return
3616 }
3617 // Ponp Optical TRx Supply Voltage
3618 _, err = d.sendAndWait(l2oam.GeneratePonpOptTRxSupplyVoltage(pkgType), ResponseTimer)
3619 if err != nil {
3620 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptTRxSupplyVoltage() Send Error: %v", d.getDeviceName(), err))
3621 return
3622 }
3623 // Ponp Optical Tx Bias Current
3624 _, err = d.sendAndWait(l2oam.GeneratePonpOptTxBiasCurrent(pkgType), ResponseTimer)
3625 if err != nil {
3626 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptTxBiasCurrent() Send Error: %v", d.getDeviceName(), err))
3627 return
3628 }
3629 // Ponp Optical Tx Output Power
3630 _, err = d.sendAndWait(l2oam.GeneratePonpOptTxOutputPower(pkgType), ResponseTimer)
3631 if err != nil {
3632 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptTxOutputPower() Send Error: %v", d.getDeviceName(), err))
3633 return
3634 }
3635 // Ponp Optical Rx Output Power
3636 _, err = d.sendAndWait(l2oam.GeneratePonpOptRxInputPower(pkgType), ResponseTimer)
3637 if err != nil {
3638 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptRxInputPower() Send Error: %v", d.getDeviceName(), err))
3639 return
3640 }
3641
3642 // Onu Priority Queue Count
3643 max = 2
3644 if pkgType == l2oam.OnuPkgTypeB {
3645 max = 1
3646 }
3647 for index := 0; index < max; index++ {
3648 _, err = d.sendAndWait(l2oam.GenerateOnuPriorityQueueCount(pkgType, index+1), ResponseTimer)
3649 if err != nil {
3650 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuPriorityQueueCount(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3651 return
3652 }
3653 }
3654 // Unip Target Queue Priority
3655 if pkgType == l2oam.OnuPkgTypeB {
3656 _, err = d.sendAndWait(l2oam.GenerateUnipTargetQueuePriority(pkgType), ResponseTimer)
3657 if err != nil {
3658 logger.Error(ctx, fmt.Sprintf("[%s] GenerateUnipTargetQueuePriority() Send Error: %v", d.getDeviceName(), err))
3659 return
3660 }
3661 }
3662 // Vlan Pon VID Value
3663 max = 2
3664 if pkgType == l2oam.OnuPkgTypeB {
3665 max = 1
3666 }
3667 for index := 0; index < max; index++ {
3668 _, err = d.sendAndWait(l2oam.GenerateSetVlanPonVIDValue(pkgType, index+1, cmd.Itpid, cmd.Ivid), ResponseTimer)
3669 if err != nil {
3670 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetVlanPonVIDValue(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3671 return
3672 }
3673 }
3674 // Vlan Tag Filter
3675 max = 0
3676 if pkgType == l2oam.OnuPkgTypeB {
3677 max = 2
3678 }
3679 for index := 0; index < max; index++ {
3680 _, err = d.sendAndWait(l2oam.GenerateSetVlanTagFilter(pkgType, index+1, cmd.Itpid), ResponseTimer)
3681 if err != nil {
3682 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetVlanTagFilter(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3683 return
3684 }
3685 }
3686 // Frame Processing
3687 /*if pkgType == ONU_PKG_TYPE_A {
3688 _, err = d.sendAndWait(l2oam.GeneateSetFrameProcessing(pkgType), ResponseTimer)
3689 if err != nil {
3690 logger.Error(ctx, fmt.Sprintf("[%s] GeneateOnuSysInfo() Send Error: %v", d.getDeviceName(), err))
3691 return
3692 }
3693 }*/
3694 // Qos Policer Rate
3695 max = 1
3696 if pkgType == l2oam.OnuPkgTypeB {
3697 max = 1
3698 }
3699 for index := 0; index < max; index++ {
3700 _, err = d.sendAndWait(l2oam.GenerateSetQosPolicerRate(pkgType, index+1), ResponseTimer)
3701 if err != nil {
3702 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetQosPolicerRate(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3703 return
3704 }
3705 }
3706 // Qos Policer Burst
3707 if pkgType == l2oam.OnuPkgTypeB {
3708 _, err = d.sendAndWait(l2oam.GenerateSetQosPolicerBurst(pkgType), ResponseTimer)
3709 if err != nil {
3710 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetQosPolicerBurst() Send Error: %v", d.getDeviceName(), err))
3711 return
3712 }
3713 }
3714 // Unip Info
3715 _, err = d.sendAndWait(l2oam.GenerateGetUnipInfo(pkgType), ResponseTimer)
3716 if err != nil {
3717 logger.Error(ctx, fmt.Sprintf("[%s] GenerateGetUnipInfo() Send Error: %v", d.getDeviceName(), err))
3718 return
3719 }
3720 // Traffic Enable
3721 _, err = d.sendAndWait(l2oam.GenerateSetTrafficEnable(pkgType), ResponseTimer)
3722 if err != nil {
3723 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetTrafficEnable() Send Error: %v", d.getDeviceName(), err))
3724 return
3725 }
3726 logger.Debug(ctx, fmt.Sprintf("[%s] startMountSequence(). Normal End.", d.getDeviceName()))
3727 }()
3728}
3729
3730func (d *L2oamOnuDevice) reboot(ctx context.Context) {
3731 _, err := d.sendAndWait(l2oam.GenerateSetResetOnu(l2oam.OnuPkgType), ResponseTimer)
3732 if err != nil {
3733 logger.Error(ctx, fmt.Sprintf("[%s] reboot() Send Error: %v", d.getDeviceName(), err))
3734 return
3735 }
3736}
3737
3738func (d *L2oamOnuDevice) updateMap() {
3739 mapMutex.Lock()
3740 defer mapMutex.Unlock()
3741
3742 _, ok := deviceMap[d.Base.DstMac]
3743 if ok {
3744 deviceMap[d.Base.DstMac] = d
3745 }
3746}
3747func (d *L2oamOnuDevice) setL2oamCmd(cmd *L2oamCmd) {
3748}
3749func (d *L2oamOnuDevice) getL2oamCmd() *L2oamCmd {
3750 return nil
3751}
3752func (d *L2oamOnuDevice) setObjectContext(oc *l2oam.TomiObjectContext) {
3753 d.ObjectContext = oc
3754}
3755func (d *L2oamOnuDevice) getObjectContext() *l2oam.TomiObjectContext {
3756 return d.ObjectContext
3757}
3758func (d *L2oamOnuDevice) setReferenceTable(tbl *l2oam.GetTrafficControlReferenceTableRes) {
3759 d.ReferenceTable = tbl
3760}
3761func (d *L2oamOnuDevice) getReferenceTable() *l2oam.GetTrafficControlReferenceTableRes {
3762 return d.ReferenceTable
3763}
3764func (d *L2oamOnuDevice) setProfile(down *l2oam.SetGenericActionCreateRes, up *l2oam.SetGenericActionCreateRes) {
3765 d.DownProfile = down
3766 d.UpProfile = up
3767}
3768func (d *L2oamOnuDevice) getProfile() (*l2oam.SetGenericActionCreateRes, *l2oam.SetGenericActionCreateRes) {
3769 return d.DownProfile, d.UpProfile
3770}
3771func (d *L2oamOnuDevice) delete(ctx context.Context) {
3772 d.Base.delete(ctx)
3773}
3774func (d *L2oamOnuDevice) setDeleteFlag() {
3775 d.Base.setDeleteFlag()
3776}
3777func (d *L2oamOnuDevice) getDeleteFlag() bool {
3778 return d.Base.getDeleteFlag()
3779}
3780func (d *L2oamOnuDevice) setAutonomousFlag(flag bool) {
3781 d.Base.setAutonomousFlag(flag)
3782 d.updateMap()
3783}
3784func (d *L2oamOnuDevice) getAutonomousFlag() bool {
3785 return d.Base.getAutonomousFlag()
3786}
3787func (d *L2oamOnuDevice) receiveEapol(etherPacket *layers.Ethernet) {
3788 d.Base.receiveEapol(etherPacket)
3789}
3790func (d *L2oamOnuDevice) waitKeepALiveResponse() error {
3791 select {
3792 case result := <-d.keepAliveResponse:
3793 if result == "success" {
3794 return nil
3795 }
3796 return fmt.Errorf("waitKeepALiveResponse() error. reason=%s", result)
3797
3798 case <-time.After(ResponseTimer * time.Second):
3799 return fmt.Errorf("waitKeepALiveResponse() error. reason=%s", "timeout")
3800 }
3801}
3802
3803func (d *L2oamOnuDevice) addFlow(ctx context.Context, cmd *L2oamCmd) error {
3804 return errors.New("onu.addFlow: not implemented")
3805}
3806
3807func (d *L2oamOnuDevice) updateFlow(ctx context.Context, cmd *L2oamCmd) error {
3808 return errors.New("onu.updateFlow: not implemented")
3809}
3810
3811func (d *L2oamOnuDevice) removeFlow(ctx context.Context) error {
3812 return errors.New("onu.removeFlow: not implemented")
3813}
3814
3815// macAddress must not have colons
3816/*
3817func isOnuEnable(ctx context.Context, macAddress string) (bool, string) {
3818 mac := convertMacString(macAddress)
3819 onulist, err := l2oam.ReadOnuStatusList()
3820 if err != nil {
3821 return false, ""
3822 }
3823 for _, v := range onulist {
3824 if v.MacAddress == mac {
3825 if v.AdminState == "ENABLED" {
3826 return true, v.ID
3827 }
3828 }
3829 }
3830
3831 return false, ""
3832}
3833*/
3834
3835func updateOltActiveStatus(ctx context.Context, dh *DeviceHandler, isActive bool) {
3836 logger.Debug(ctx, fmt.Sprintf("updateOltActiveStatus() isActive=%v", isActive))
3837 if dh != nil && dh.coreProxy != nil {
3838 var err error
3839 if isActive {
3840 err = dh.coreProxy.DeviceStateUpdate(ctx, dh.device.Id, voltha.ConnectStatus_REACHABLE, voltha.OperStatus_ACTIVE)
3841 } else {
3842 err = dh.coreProxy.DeviceStateUpdate(ctx, dh.device.Id, voltha.ConnectStatus_UNREACHABLE, voltha.OperStatus_ACTIVATING)
3843 }
3844 if err != nil {
3845 logger.Debug(ctx, fmt.Sprintf("updateOltActiveStatus() error=%v", err))
3846 }
3847 } else {
3848 logger.Debug(ctx, fmt.Sprintf("updateOltActiveStatus() deviceId=%s, isActive=%v", dh.device.Id, isActive))
3849 }
3850}
3851
3852// macAddress must not have colons
3853/*
3854func updateOnuActiveStatus(ctx context.Context, macAddress string, isActive bool, dh *DeviceHandler) {
3855 mac := convertMacString(macAddress)
3856 onulist, err := l2oam.ReadOnuStatusList()
3857 logger.Debug(ctx, fmt.Sprintf("updateOnuActiveStatus() ReadOnuList() onulist=%v, err=%s, macAddress=%s, mac=%s, isActive=%v", onulist, err, macAddress, mac, isActive))
3858 if err != nil {
3859 return
3860 }
3861 for i, v := range onulist {
3862 if v.MacAddress == mac {
3863 if isActive {
3864 onulist[i].OpeState = "ACTIVE"
3865 onulist[i].ConnectState = "REACHABLE"
3866 dh.coreProxy.DeviceStateUpdate(ctx, v.ID, voltha.ConnectStatus_REACHABLE, voltha.OperStatus_ACTIVE)
3867 } else {
3868 onulist[i].OpeState = "FAILED"
3869 onulist[i].ConnectState = "UNREACHABLE"
3870 dh.coreProxy.DeviceStateUpdate(ctx, v.ID, voltha.ConnectStatus_UNREACHABLE, voltha.OperStatus_FAILED)
3871 }
3872 logger.Debug(ctx, fmt.Sprintf("updateOnuActiveStatus() WriteOnuList() macaddress=%s list=%v", mac, onulist))
3873 //l2oam.WriteOnuStatusList(onulist)
3874 break
3875 }
3876 }
3877}
3878*/
3879
3880func updateOnuActiveStatus2(ctx context.Context, dh *DeviceHandler, isActive bool, deviceID string) {
3881 logger.Debug(ctx, fmt.Sprintf("updateOnuActiveStatus2() deviceId=%s, isActive=%v", deviceID, isActive))
3882 if dh != nil && dh.coreProxy != nil {
3883 var err error
3884 if isActive {
3885 err = dh.coreProxy.DeviceStateUpdate(ctx, deviceID, voltha.ConnectStatus_REACHABLE, voltha.OperStatus_ACTIVE)
3886 } else {
3887 err = dh.coreProxy.DeviceStateUpdate(ctx, deviceID, voltha.ConnectStatus_UNREACHABLE, voltha.OperStatus_ACTIVATING)
3888 }
3889 if err != nil {
3890 logger.Debug(ctx, fmt.Sprintf("updateOnuActiveStatus2() error=%v", err))
3891 }
3892 } else {
3893 logger.Debug(ctx, fmt.Sprintf("updateOnuActiveStatus2() deviceId=%s, isActive=%v", deviceID, isActive))
3894 }
3895}
3896func convertMacString(mac string) string {
3897 macbytes := []byte(mac)
3898 colonbytes := []byte(":")
3899 colon := colonbytes[0]
3900
3901 resbytes := []byte{}
3902 resbytes = append(resbytes, macbytes[0])
3903 resbytes = append(resbytes, macbytes[1])
3904 resbytes = append(resbytes, colon)
3905 resbytes = append(resbytes, macbytes[2])
3906 resbytes = append(resbytes, macbytes[3])
3907 resbytes = append(resbytes, colon)
3908 resbytes = append(resbytes, macbytes[4])
3909 resbytes = append(resbytes, macbytes[5])
3910 resbytes = append(resbytes, colon)
3911 resbytes = append(resbytes, macbytes[6])
3912 resbytes = append(resbytes, macbytes[7])
3913 resbytes = append(resbytes, colon)
3914 resbytes = append(resbytes, macbytes[8])
3915 resbytes = append(resbytes, macbytes[9])
3916 resbytes = append(resbytes, colon)
3917 resbytes = append(resbytes, macbytes[10])
3918 resbytes = append(resbytes, macbytes[11])
3919 return string(resbytes)
3920
3921}
3922func monitoringOnuStatus() {
3923 go WatchStatus(context.Background(), nil)
3924}
3925func byte2Int(v []byte) uint32 {
3926 switch len(v) {
3927 case 1:
3928 return uint32(v[0])
3929 case 2:
3930 return uint32(binary.BigEndian.Uint16(v[:]))
3931 case 4:
3932 return binary.BigEndian.Uint32(v[:])
3933 default:
3934 return 0
3935 }
3936}