blob: 6e1455ba5959666ee34678c9787a6af881a777f3 [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 {
Kengof20xx05d74022020-12-21 11:56:38 +09003317 //d.keepAliveResponse <- "PkgTypeError"
3318 d.keepAliveResponse <- "success"
Takahiro Suzukid7bf8202020-12-17 20:21:59 +09003319 }
Kengof20xx05d74022020-12-21 11:56:38 +09003320 d.Base.recieveKeepAlive(etherPacket)
Takahiro Suzukid7bf8202020-12-17 20:21:59 +09003321 d.PkgType = l2oam.OnuPkgTypeA
3322 } else if (l2oam.OnuPkgType == l2oam.OnuPkgTypeB) && (packet.IsOnuPkgB()) {
3323 logger.Info(context.Background(), fmt.Sprintf("[%s] recieveKeepAlive() Pkg type B.", d.getDeviceName()))
3324 if d.keepAliveResponse != nil {
3325 d.keepAliveResponse <- "success"
3326 }
3327 d.Base.recieveKeepAlive(etherPacket)
3328 d.PkgType = l2oam.OnuPkgTypeB
3329 } else {
3330 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()))
3331 if d.keepAliveResponse != nil {
3332 d.keepAliveResponse <- "PkgTypeError"
3333 }
3334 }
3335}
3336
3337func (d *L2oamOnuDevice) startKeepAlive() {
3338 d.Base.startKeepAlive()
3339}
3340func (d *L2oamOnuDevice) stopKeepAlive() {
3341 d.Base.stopKeepAlive()
3342}
3343func (d *L2oamOnuDevice) setActiveState(ctx context.Context, isActive bool) {
3344 d.Base.setActiveState(ctx, isActive)
3345}
3346func (d *L2oamOnuDevice) update(mac string, deviceID string, onuID uint32) {
3347 mapMutex.Lock()
3348 defer mapMutex.Unlock()
3349 d.OnuID = onuID
3350 d.Base.DeviceID = deviceID
3351 deviceMap[mac] = d
3352 deviceMacMap[deviceID] = mac
3353}
3354
3355func (d *L2oamOnuDevice) startMountSequence(ctx context.Context, pkgType string, cmd *L2oamCmd) {
3356 if pkgType == l2oam.OnuPkgTypeA {
3357 d.startMountSequencePkgA(ctx, pkgType, cmd)
3358 return
3359 }
3360 go func() {
3361 logger.Debug(ctx, fmt.Sprintf("[%s] startMountSequence(). MacAddress=%s", d.getDeviceName(), d.Base.DstMac))
3362 // wait until the onu keep-alive state transits to step3
3363 for {
3364 if d.Base.KeepAliveStatus != KeepAliveStep3 {
3365 time.Sleep(1 * time.Second)
3366 } else {
3367 logger.Debug(ctx, fmt.Sprintf("[%s] startMountSequence(). onu active status. start sequence. MacAddress=%s", d.getDeviceName(), d.Base.DstMac))
3368 break
3369 }
3370 }
3371
3372 // ONU System Info(get request)
3373 _, err := d.sendAndWait(l2oam.GenerateOnuSystemInfo(pkgType), ResponseTimer)
3374 if err != nil {
3375 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuSystemInfo() Send Error: %v", d.getDeviceName(), err))
3376 return
3377 }
3378 // ONU Config
3379 if pkgType == l2oam.OnuPkgTypeB {
3380 _, err = d.sendAndWait(l2oam.GenerateOnuConfig(pkgType), ResponseTimer)
3381 if err != nil {
3382 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuConfig() Send Error: %v", d.getDeviceName(), err))
3383 return
3384 }
3385 }
3386 // FEC Mode
3387 _, err = d.sendAndWait(l2oam.GenerateFecMode(pkgType), ResponseTimer)
3388 if err != nil {
3389 logger.Error(ctx, fmt.Sprintf("[%s] GenerateFecMode() Send Error: %v", d.getDeviceName(), err))
3390 return
3391 }
3392 // Encryption Mode
3393 max := 2
3394 if pkgType == l2oam.OnuPkgTypeB {
3395 max = 1
3396 }
3397 for index := 0; index < max; index++ {
3398 _, err = d.sendAndWait(l2oam.GenerateEncryptionMode(pkgType, index+1), ResponseTimer)
3399 if err != nil {
3400 logger.Error(ctx, fmt.Sprintf("[%s] GenerateEncryptionMode(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3401 return
3402 }
3403 }
3404
3405 // Dyn Learning Mode
3406 max = 3
3407 if pkgType == l2oam.OnuPkgTypeB {
3408 max = 1
3409 }
3410 for index := 0; index < max; index++ {
3411 _, err = d.sendAndWait(l2oam.GenerateDynLearningMode(pkgType, index+1), ResponseTimer)
3412 if err != nil {
3413 logger.Error(ctx, fmt.Sprintf("[%s] GenerateDynLearningMode(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3414 return
3415 }
3416 }
3417 // Ponp Temperature
3418 _, err = d.sendAndWait(l2oam.GeneratePonpTemperature(pkgType), ResponseTimer)
3419 if err != nil {
3420 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpTemperature() Send Error: %v", d.getDeviceName(), err))
3421 return
3422 }
3423 // Ponp Optical TRx Supply Voltage
3424 _, err = d.sendAndWait(l2oam.GeneratePonpOptTRxSupplyVoltage(pkgType), ResponseTimer)
3425 if err != nil {
3426 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptTRxSupplyVoltage() Send Error: %v", d.getDeviceName(), err))
3427 return
3428 }
3429 // Ponp Optical Tx Bias Current
3430 _, err = d.sendAndWait(l2oam.GeneratePonpOptTxBiasCurrent(pkgType), ResponseTimer)
3431 if err != nil {
3432 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptTxBiasCurrent() Send Error: %v", d.getDeviceName(), err))
3433 return
3434 }
3435 // Ponp Optical Tx Output Power
3436 _, err = d.sendAndWait(l2oam.GeneratePonpOptTxOutputPower(pkgType), ResponseTimer)
3437 if err != nil {
3438 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptTxOutputPower() Send Error: %v", d.getDeviceName(), err))
3439 return
3440 }
3441 // Ponp Optical Rx Output Power
3442 _, err = d.sendAndWait(l2oam.GeneratePonpOptRxInputPower(pkgType), ResponseTimer)
3443 if err != nil {
3444 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptRxInputPower() Send Error: %v", d.getDeviceName(), err))
3445 return
3446 }
3447
3448 // Onu Priority Queue Count
3449 max = 2
3450 if pkgType == l2oam.OnuPkgTypeB {
3451 max = 1
3452 }
3453 for index := 0; index < max; index++ {
3454 _, err = d.sendAndWait(l2oam.GenerateOnuPriorityQueueCount(pkgType, index+1), ResponseTimer)
3455 if err != nil {
3456 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuPriorityQueueCount(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3457 return
3458 }
3459 }
3460 // Unip Target Queue Priority
3461 if pkgType == l2oam.OnuPkgTypeB {
3462 _, err = d.sendAndWait(l2oam.GenerateUnipTargetQueuePriority(pkgType), ResponseTimer)
3463 if err != nil {
3464 logger.Error(ctx, fmt.Sprintf("[%s] GenerateUnipTargetQueuePriority() Send Error: %v", d.getDeviceName(), err))
3465 return
3466 }
3467 }
3468 // Vlan Pon VID Value
3469 max = 2
3470 if pkgType == l2oam.OnuPkgTypeB {
3471 max = 1
3472 }
3473 for index := 0; index < max; index++ {
3474 _, err = d.sendAndWait(l2oam.GenerateSetVlanPonVIDValue(pkgType, index+1, cmd.Itpid, cmd.Ivid), ResponseTimer)
3475 if err != nil {
3476 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetVlanPonVIDValue(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3477 return
3478 }
3479 }
3480 // Vlan Tag Filter
3481 max = 0
3482 if pkgType == l2oam.OnuPkgTypeB {
3483 max = 2
3484 }
3485 for index := 0; index < max; index++ {
3486 _, err = d.sendAndWait(l2oam.GenerateSetVlanTagFilter(pkgType, index+1, cmd.Itpid), ResponseTimer)
3487 if err != nil {
3488 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetVlanTagFilter(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3489 return
3490 }
3491 }
3492 // Frame Processing
3493 /*if pkgType == ONU_PKG_TYPE_A {
3494 _, err = d.sendAndWait(l2oam.GeneateSetFrameProcessing(pkgType), ResponseTimer)
3495 if err != nil {
3496 logger.Error(ctx, fmt.Sprintf("[%s] GeneateOnuSysInfo() Send Error: %v", d.getDeviceName(), err))
3497 return
3498 }
3499 }*/
3500 // Qos Policer Rate
3501 max = 1
3502 if pkgType == l2oam.OnuPkgTypeB {
3503 max = 1
3504 }
3505 for index := 0; index < max; index++ {
3506 _, err = d.sendAndWait(l2oam.GenerateSetQosPolicerRate(pkgType, index+1), ResponseTimer)
3507 if err != nil {
3508 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetQosPolicerRate(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3509 return
3510 }
3511 }
3512 // Qos Policer Burst
3513 if pkgType == l2oam.OnuPkgTypeB {
3514 _, err = d.sendAndWait(l2oam.GenerateSetQosPolicerBurst(pkgType), ResponseTimer)
3515 if err != nil {
3516 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetQosPolicerBurst() Send Error: %v", d.getDeviceName(), err))
3517 return
3518 }
3519 }
3520 // Unip Info
3521 _, err = d.sendAndWait(l2oam.GenerateGetUnipInfo(pkgType), ResponseTimer)
3522 if err != nil {
3523 logger.Error(ctx, fmt.Sprintf("[%s] GenerateGetUnipInfo() Send Error: %v", d.getDeviceName(), err))
3524 return
3525 }
3526 // Unip Link Mode
3527 _, err = d.sendAndWait(l2oam.GenerateSetUnipLinkMode(pkgType), ResponseTimer)
3528 if err != nil {
3529 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetUnipLinkMode() Send Error: %v", d.getDeviceName(), err))
3530 return
3531 }
3532 // Unip TOSCOS Conversion
3533 _, err = d.sendAndWait(l2oam.GenerateUnipTOSCOSConversion(pkgType), ResponseTimer)
3534 if err != nil {
3535 logger.Error(ctx, fmt.Sprintf("[%s] GenerateUnipTOSCOSConversion() Send Error: %v", d.getDeviceName(), err))
3536 return
3537 }
3538 // ONU Errored Frame Window
3539 _, err = d.sendAndWait(l2oam.GenerateOnuErroredFrameWindow(pkgType), ResponseTimer)
3540 if err != nil {
3541 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuErroredFrameWindow() Send Error: %v", d.getDeviceName(), err))
3542 return
3543 }
3544 // ONU Errord Frame Threshold
3545 _, err = d.sendAndWait(l2oam.GenerateOnuErroredFrameWindow(pkgType), ResponseTimer)
3546 if err != nil {
3547 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuErroredFrameWindow() Send Error: %v", d.getDeviceName(), err))
3548 return
3549 }
3550 logger.Debug(ctx, fmt.Sprintf("[%s] startMountSequence(). Normal End.", d.getDeviceName()))
3551 }()
3552}
3553func (d *L2oamOnuDevice) startMountSequencePkgA(ctx context.Context, pkgType string, cmd *L2oamCmd) {
3554 go func() {
3555 logger.Debug(ctx, fmt.Sprintf("[%s] startMountSequence(). MacAddress=%s", d.getDeviceName(), d.Base.DstMac))
3556 // wait until the onu keep-alive state transits to step3
3557 for {
3558 if d.Base.KeepAliveStatus != KeepAliveStep3 {
3559 time.Sleep(1 * time.Second)
3560 } else {
3561 logger.Debug(ctx, fmt.Sprintf("[%s] startMountSequence(). onu active status. start sequence. MacAddress=%s", d.getDeviceName(), d.Base.DstMac))
3562 break
3563 }
3564 }
3565
3566 // // Encryption Mode
3567 // _, err := d.sendAndWait(l2oam.GenerateEncryptionMode(pkgType, 1), ResponseTimer)
3568 // if err != nil {
3569 // logger.Error(ctx, fmt.Sprintf("[%s] GenerateEncryptionMode(%v) Send Error: %v", d.getDeviceName(), 1, err))
3570 // return
3571 // }
3572
3573 // ONU System Info(get request)
3574 _, err := d.sendAndWait(l2oam.GenerateOnuSystemInfo(pkgType), ResponseTimer)
3575 if err != nil {
3576 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuSystemInfo() Send Error: %v", d.getDeviceName(), err))
3577 return
3578 }
3579 // ONU Config
3580 if pkgType == l2oam.OnuPkgTypeB {
3581 _, err = d.sendAndWait(l2oam.GenerateOnuConfig(pkgType), ResponseTimer)
3582 if err != nil {
3583 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuConfig() Send Error: %v", d.getDeviceName(), err))
3584 return
3585 }
3586 }
3587 // FEC Mode
3588 _, err = d.sendAndWait(l2oam.GenerateFecMode(pkgType), ResponseTimer)
3589 if err != nil {
3590 logger.Error(ctx, fmt.Sprintf("[%s] GenerateFecMode() Send Error: %v", d.getDeviceName(), err))
3591 return
3592 }
3593 // Encryption Mode
3594 _, err = d.sendAndWait(l2oam.GenerateEncryptionMode(pkgType, 2), ResponseTimer)
3595 if err != nil {
3596 logger.Error(ctx, fmt.Sprintf("[%s] GenerateEncryptionMode(%v) Send Error: %v", d.getDeviceName(), 2, err))
3597 return
3598 }
3599
3600 // Dyn Learning Mode
3601 max := 3
3602 if pkgType == l2oam.OnuPkgTypeB {
3603 max = 1
3604 }
3605 for index := 0; index < max; index++ {
3606 _, err = d.sendAndWait(l2oam.GenerateDynLearningMode(pkgType, index+1), ResponseTimer)
3607 if err != nil {
3608 logger.Error(ctx, fmt.Sprintf("[%s] GenerateDynLearningMode(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3609 return
3610 }
3611 }
3612 // Ponp Temperature
3613 _, err = d.sendAndWait(l2oam.GeneratePonpTemperature(pkgType), ResponseTimer)
3614 if err != nil {
3615 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpTemperature() Send Error: %v", d.getDeviceName(), err))
3616 return
3617 }
3618 // Ponp Optical TRx Supply Voltage
3619 _, err = d.sendAndWait(l2oam.GeneratePonpOptTRxSupplyVoltage(pkgType), ResponseTimer)
3620 if err != nil {
3621 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptTRxSupplyVoltage() Send Error: %v", d.getDeviceName(), err))
3622 return
3623 }
3624 // Ponp Optical Tx Bias Current
3625 _, err = d.sendAndWait(l2oam.GeneratePonpOptTxBiasCurrent(pkgType), ResponseTimer)
3626 if err != nil {
3627 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptTxBiasCurrent() Send Error: %v", d.getDeviceName(), err))
3628 return
3629 }
3630 // Ponp Optical Tx Output Power
3631 _, err = d.sendAndWait(l2oam.GeneratePonpOptTxOutputPower(pkgType), ResponseTimer)
3632 if err != nil {
3633 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptTxOutputPower() Send Error: %v", d.getDeviceName(), err))
3634 return
3635 }
3636 // Ponp Optical Rx Output Power
3637 _, err = d.sendAndWait(l2oam.GeneratePonpOptRxInputPower(pkgType), ResponseTimer)
3638 if err != nil {
3639 logger.Error(ctx, fmt.Sprintf("[%s] GeneratePonpOptRxInputPower() Send Error: %v", d.getDeviceName(), err))
3640 return
3641 }
3642
3643 // Onu Priority Queue Count
3644 max = 2
3645 if pkgType == l2oam.OnuPkgTypeB {
3646 max = 1
3647 }
3648 for index := 0; index < max; index++ {
3649 _, err = d.sendAndWait(l2oam.GenerateOnuPriorityQueueCount(pkgType, index+1), ResponseTimer)
3650 if err != nil {
3651 logger.Error(ctx, fmt.Sprintf("[%s] GenerateOnuPriorityQueueCount(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3652 return
3653 }
3654 }
3655 // Unip Target Queue Priority
3656 if pkgType == l2oam.OnuPkgTypeB {
3657 _, err = d.sendAndWait(l2oam.GenerateUnipTargetQueuePriority(pkgType), ResponseTimer)
3658 if err != nil {
3659 logger.Error(ctx, fmt.Sprintf("[%s] GenerateUnipTargetQueuePriority() Send Error: %v", d.getDeviceName(), err))
3660 return
3661 }
3662 }
3663 // Vlan Pon VID Value
3664 max = 2
3665 if pkgType == l2oam.OnuPkgTypeB {
3666 max = 1
3667 }
3668 for index := 0; index < max; index++ {
3669 _, err = d.sendAndWait(l2oam.GenerateSetVlanPonVIDValue(pkgType, index+1, cmd.Itpid, cmd.Ivid), ResponseTimer)
3670 if err != nil {
3671 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetVlanPonVIDValue(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3672 return
3673 }
3674 }
3675 // Vlan Tag Filter
3676 max = 0
3677 if pkgType == l2oam.OnuPkgTypeB {
3678 max = 2
3679 }
3680 for index := 0; index < max; index++ {
3681 _, err = d.sendAndWait(l2oam.GenerateSetVlanTagFilter(pkgType, index+1, cmd.Itpid), ResponseTimer)
3682 if err != nil {
3683 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetVlanTagFilter(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3684 return
3685 }
3686 }
3687 // Frame Processing
3688 /*if pkgType == ONU_PKG_TYPE_A {
3689 _, err = d.sendAndWait(l2oam.GeneateSetFrameProcessing(pkgType), ResponseTimer)
3690 if err != nil {
3691 logger.Error(ctx, fmt.Sprintf("[%s] GeneateOnuSysInfo() Send Error: %v", d.getDeviceName(), err))
3692 return
3693 }
3694 }*/
3695 // Qos Policer Rate
3696 max = 1
3697 if pkgType == l2oam.OnuPkgTypeB {
3698 max = 1
3699 }
3700 for index := 0; index < max; index++ {
3701 _, err = d.sendAndWait(l2oam.GenerateSetQosPolicerRate(pkgType, index+1), ResponseTimer)
3702 if err != nil {
3703 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetQosPolicerRate(%v) Send Error: %v", d.getDeviceName(), index+1, err))
3704 return
3705 }
3706 }
3707 // Qos Policer Burst
3708 if pkgType == l2oam.OnuPkgTypeB {
3709 _, err = d.sendAndWait(l2oam.GenerateSetQosPolicerBurst(pkgType), ResponseTimer)
3710 if err != nil {
3711 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetQosPolicerBurst() Send Error: %v", d.getDeviceName(), err))
3712 return
3713 }
3714 }
3715 // Unip Info
3716 _, err = d.sendAndWait(l2oam.GenerateGetUnipInfo(pkgType), ResponseTimer)
3717 if err != nil {
3718 logger.Error(ctx, fmt.Sprintf("[%s] GenerateGetUnipInfo() Send Error: %v", d.getDeviceName(), err))
3719 return
3720 }
3721 // Traffic Enable
3722 _, err = d.sendAndWait(l2oam.GenerateSetTrafficEnable(pkgType), ResponseTimer)
3723 if err != nil {
3724 logger.Error(ctx, fmt.Sprintf("[%s] GenerateSetTrafficEnable() Send Error: %v", d.getDeviceName(), err))
3725 return
3726 }
3727 logger.Debug(ctx, fmt.Sprintf("[%s] startMountSequence(). Normal End.", d.getDeviceName()))
3728 }()
3729}
3730
3731func (d *L2oamOnuDevice) reboot(ctx context.Context) {
3732 _, err := d.sendAndWait(l2oam.GenerateSetResetOnu(l2oam.OnuPkgType), ResponseTimer)
3733 if err != nil {
3734 logger.Error(ctx, fmt.Sprintf("[%s] reboot() Send Error: %v", d.getDeviceName(), err))
3735 return
3736 }
3737}
3738
3739func (d *L2oamOnuDevice) updateMap() {
3740 mapMutex.Lock()
3741 defer mapMutex.Unlock()
3742
3743 _, ok := deviceMap[d.Base.DstMac]
3744 if ok {
3745 deviceMap[d.Base.DstMac] = d
3746 }
3747}
3748func (d *L2oamOnuDevice) setL2oamCmd(cmd *L2oamCmd) {
3749}
3750func (d *L2oamOnuDevice) getL2oamCmd() *L2oamCmd {
3751 return nil
3752}
3753func (d *L2oamOnuDevice) setObjectContext(oc *l2oam.TomiObjectContext) {
3754 d.ObjectContext = oc
3755}
3756func (d *L2oamOnuDevice) getObjectContext() *l2oam.TomiObjectContext {
3757 return d.ObjectContext
3758}
3759func (d *L2oamOnuDevice) setReferenceTable(tbl *l2oam.GetTrafficControlReferenceTableRes) {
3760 d.ReferenceTable = tbl
3761}
3762func (d *L2oamOnuDevice) getReferenceTable() *l2oam.GetTrafficControlReferenceTableRes {
3763 return d.ReferenceTable
3764}
3765func (d *L2oamOnuDevice) setProfile(down *l2oam.SetGenericActionCreateRes, up *l2oam.SetGenericActionCreateRes) {
3766 d.DownProfile = down
3767 d.UpProfile = up
3768}
3769func (d *L2oamOnuDevice) getProfile() (*l2oam.SetGenericActionCreateRes, *l2oam.SetGenericActionCreateRes) {
3770 return d.DownProfile, d.UpProfile
3771}
3772func (d *L2oamOnuDevice) delete(ctx context.Context) {
3773 d.Base.delete(ctx)
3774}
3775func (d *L2oamOnuDevice) setDeleteFlag() {
3776 d.Base.setDeleteFlag()
3777}
3778func (d *L2oamOnuDevice) getDeleteFlag() bool {
3779 return d.Base.getDeleteFlag()
3780}
3781func (d *L2oamOnuDevice) setAutonomousFlag(flag bool) {
3782 d.Base.setAutonomousFlag(flag)
3783 d.updateMap()
3784}
3785func (d *L2oamOnuDevice) getAutonomousFlag() bool {
3786 return d.Base.getAutonomousFlag()
3787}
3788func (d *L2oamOnuDevice) receiveEapol(etherPacket *layers.Ethernet) {
3789 d.Base.receiveEapol(etherPacket)
3790}
3791func (d *L2oamOnuDevice) waitKeepALiveResponse() error {
3792 select {
3793 case result := <-d.keepAliveResponse:
3794 if result == "success" {
3795 return nil
3796 }
3797 return fmt.Errorf("waitKeepALiveResponse() error. reason=%s", result)
3798
3799 case <-time.After(ResponseTimer * time.Second):
3800 return fmt.Errorf("waitKeepALiveResponse() error. reason=%s", "timeout")
3801 }
3802}
3803
3804func (d *L2oamOnuDevice) addFlow(ctx context.Context, cmd *L2oamCmd) error {
3805 return errors.New("onu.addFlow: not implemented")
3806}
3807
3808func (d *L2oamOnuDevice) updateFlow(ctx context.Context, cmd *L2oamCmd) error {
3809 return errors.New("onu.updateFlow: not implemented")
3810}
3811
3812func (d *L2oamOnuDevice) removeFlow(ctx context.Context) error {
3813 return errors.New("onu.removeFlow: not implemented")
3814}
3815
3816// macAddress must not have colons
3817/*
3818func isOnuEnable(ctx context.Context, macAddress string) (bool, string) {
3819 mac := convertMacString(macAddress)
3820 onulist, err := l2oam.ReadOnuStatusList()
3821 if err != nil {
3822 return false, ""
3823 }
3824 for _, v := range onulist {
3825 if v.MacAddress == mac {
3826 if v.AdminState == "ENABLED" {
3827 return true, v.ID
3828 }
3829 }
3830 }
3831
3832 return false, ""
3833}
3834*/
3835
3836func updateOltActiveStatus(ctx context.Context, dh *DeviceHandler, isActive bool) {
3837 logger.Debug(ctx, fmt.Sprintf("updateOltActiveStatus() isActive=%v", isActive))
3838 if dh != nil && dh.coreProxy != nil {
3839 var err error
3840 if isActive {
3841 err = dh.coreProxy.DeviceStateUpdate(ctx, dh.device.Id, voltha.ConnectStatus_REACHABLE, voltha.OperStatus_ACTIVE)
3842 } else {
3843 err = dh.coreProxy.DeviceStateUpdate(ctx, dh.device.Id, voltha.ConnectStatus_UNREACHABLE, voltha.OperStatus_ACTIVATING)
3844 }
3845 if err != nil {
3846 logger.Debug(ctx, fmt.Sprintf("updateOltActiveStatus() error=%v", err))
3847 }
3848 } else {
3849 logger.Debug(ctx, fmt.Sprintf("updateOltActiveStatus() deviceId=%s, isActive=%v", dh.device.Id, isActive))
3850 }
3851}
3852
3853// macAddress must not have colons
3854/*
3855func updateOnuActiveStatus(ctx context.Context, macAddress string, isActive bool, dh *DeviceHandler) {
3856 mac := convertMacString(macAddress)
3857 onulist, err := l2oam.ReadOnuStatusList()
3858 logger.Debug(ctx, fmt.Sprintf("updateOnuActiveStatus() ReadOnuList() onulist=%v, err=%s, macAddress=%s, mac=%s, isActive=%v", onulist, err, macAddress, mac, isActive))
3859 if err != nil {
3860 return
3861 }
3862 for i, v := range onulist {
3863 if v.MacAddress == mac {
3864 if isActive {
3865 onulist[i].OpeState = "ACTIVE"
3866 onulist[i].ConnectState = "REACHABLE"
3867 dh.coreProxy.DeviceStateUpdate(ctx, v.ID, voltha.ConnectStatus_REACHABLE, voltha.OperStatus_ACTIVE)
3868 } else {
3869 onulist[i].OpeState = "FAILED"
3870 onulist[i].ConnectState = "UNREACHABLE"
3871 dh.coreProxy.DeviceStateUpdate(ctx, v.ID, voltha.ConnectStatus_UNREACHABLE, voltha.OperStatus_FAILED)
3872 }
3873 logger.Debug(ctx, fmt.Sprintf("updateOnuActiveStatus() WriteOnuList() macaddress=%s list=%v", mac, onulist))
3874 //l2oam.WriteOnuStatusList(onulist)
3875 break
3876 }
3877 }
3878}
3879*/
3880
3881func updateOnuActiveStatus2(ctx context.Context, dh *DeviceHandler, isActive bool, deviceID string) {
3882 logger.Debug(ctx, fmt.Sprintf("updateOnuActiveStatus2() deviceId=%s, isActive=%v", deviceID, isActive))
3883 if dh != nil && dh.coreProxy != nil {
3884 var err error
3885 if isActive {
3886 err = dh.coreProxy.DeviceStateUpdate(ctx, deviceID, voltha.ConnectStatus_REACHABLE, voltha.OperStatus_ACTIVE)
3887 } else {
3888 err = dh.coreProxy.DeviceStateUpdate(ctx, deviceID, voltha.ConnectStatus_UNREACHABLE, voltha.OperStatus_ACTIVATING)
3889 }
3890 if err != nil {
3891 logger.Debug(ctx, fmt.Sprintf("updateOnuActiveStatus2() error=%v", err))
3892 }
3893 } else {
3894 logger.Debug(ctx, fmt.Sprintf("updateOnuActiveStatus2() deviceId=%s, isActive=%v", deviceID, isActive))
3895 }
3896}
3897func convertMacString(mac string) string {
3898 macbytes := []byte(mac)
3899 colonbytes := []byte(":")
3900 colon := colonbytes[0]
3901
3902 resbytes := []byte{}
3903 resbytes = append(resbytes, macbytes[0])
3904 resbytes = append(resbytes, macbytes[1])
3905 resbytes = append(resbytes, colon)
3906 resbytes = append(resbytes, macbytes[2])
3907 resbytes = append(resbytes, macbytes[3])
3908 resbytes = append(resbytes, colon)
3909 resbytes = append(resbytes, macbytes[4])
3910 resbytes = append(resbytes, macbytes[5])
3911 resbytes = append(resbytes, colon)
3912 resbytes = append(resbytes, macbytes[6])
3913 resbytes = append(resbytes, macbytes[7])
3914 resbytes = append(resbytes, colon)
3915 resbytes = append(resbytes, macbytes[8])
3916 resbytes = append(resbytes, macbytes[9])
3917 resbytes = append(resbytes, colon)
3918 resbytes = append(resbytes, macbytes[10])
3919 resbytes = append(resbytes, macbytes[11])
3920 return string(resbytes)
3921
3922}
3923func monitoringOnuStatus() {
3924 go WatchStatus(context.Background(), nil)
3925}
3926func byte2Int(v []byte) uint32 {
3927 switch len(v) {
3928 case 1:
3929 return uint32(v[0])
3930 case 2:
3931 return uint32(binary.BigEndian.Uint16(v[:]))
3932 case 4:
3933 return binary.BigEndian.Uint32(v[:])
3934 default:
3935 return 0
3936 }
3937}