blob: 7ce362f441fe0f77d3b82a79f851f1ffc0d8f6ab [file] [log] [blame]
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +00001/*
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 */
16
17//Package adaptercoreonu provides the utility for onu devices, flows and statistics
18package adaptercoreonu
19
20import (
21 "context"
22 "errors"
mpagenkoaf801632020-07-03 10:00:42 +000023 "fmt"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000024 "strconv"
mpagenkoaf801632020-07-03 10:00:42 +000025 "strings"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000026
27 //"sync"
28 //"time"
29
30 //"github.com/opencord/voltha-lib-go/v3/pkg/kafka"
31 "github.com/opencord/voltha-lib-go/v3/pkg/log"
32 vc "github.com/opencord/voltha-protos/v3/go/common"
mpagenkoaf801632020-07-03 10:00:42 +000033 of "github.com/opencord/voltha-protos/v3/go/openflow_13"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000034 "github.com/opencord/voltha-protos/v3/go/voltha"
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000035)
36
37type UniPortType uint8
38
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000039// UniPPTP Interface type - re-use values from G.988 TP type definition (directly used in OMCI!)
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000040const (
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000041 // UniPPTP relates to PPTP
42 UniPPTP UniPortType = 1 // relates to PPTP
43 // UniPPTP relates to VEIP
44 UniVEIP UniPortType = 11 // relates to VEIP
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000045)
46
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000047//OnuUniPort structure holds information about the ONU attached Uni Ports
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000048type OnuUniPort struct {
49 enabled bool
50 name string
51 portNo uint32
52 portType UniPortType
53 ofpPortNo string
Himani Chawla26e555c2020-08-31 12:30:20 +053054 uniID uint8
Holger Hildebrandtdd23cc22020-05-19 13:32:18 +000055 macBpNo uint8
Himani Chawla26e555c2020-08-31 12:30:20 +053056 entityID uint16
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000057 adminState vc.AdminState_Types
58 operState vc.OperStatus_Types
59 pPort *voltha.Port
60}
61
62//NewOnuUniPort returns a new instance of a OnuUniPort
Himani Chawla26e555c2020-08-31 12:30:20 +053063func NewOnuUniPort(aUniID uint8, aPortNo uint32, aInstNo uint16,
64 aPortType UniPortType) *OnuUniPort {
65 logger.Infow("init-onuUniPort", log.Fields{"uniID": aUniID,
66 "portNo": aPortNo, "InstNo": aInstNo, "type": aPortType})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000067 var onuUniPort OnuUniPort
68 onuUniPort.enabled = false
Himani Chawla26e555c2020-08-31 12:30:20 +053069 onuUniPort.name = "uni-" + strconv.FormatUint(uint64(aPortNo), 10)
70 onuUniPort.portNo = aPortNo
71 onuUniPort.portType = aPortType
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000072 // so far it seems as here ofpPortNo/Name ist the same as the original port name ...??
73 onuUniPort.ofpPortNo = onuUniPort.name
Himani Chawla26e555c2020-08-31 12:30:20 +053074 onuUniPort.uniID = aUniID
75 onuUniPort.macBpNo = aUniID + 1 //ensure >0 instanceNo
76 onuUniPort.entityID = aInstNo
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +000077 onuUniPort.adminState = vc.AdminState_ENABLED //enabled per create
78 onuUniPort.operState = vc.OperStatus_UNKNOWN
79 onuUniPort.pPort = nil // to be set on create
80 return &onuUniPort
81}
82
mpagenkoaf801632020-07-03 10:00:42 +000083//CreateVolthaPort creates the Voltha port based on ONU UNI Port and informs the core about it
84func (oo *OnuUniPort) CreateVolthaPort(apDeviceHandler *DeviceHandler) error {
85 logger.Debugw("creating-voltha-uni-port", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +000086 "device-id": apDeviceHandler.device.Id, "portNo": oo.portNo})
mpagenkoaf801632020-07-03 10:00:42 +000087 //200630: per [VOL-3202] OF port info is now to be delivered within UniPort create
88 // not doing so crashes rw_core processing (at least still in 200630 version)
89 name := apDeviceHandler.device.SerialNumber + "-" + strconv.FormatUint(uint64(oo.macBpNo), 10)
90 var macOctets [6]uint8
91 macOctets[5] = 0x08
92 //ponPortNumber was copied from device.ParentPortNo
93 macOctets[4] = uint8(apDeviceHandler.ponPortNumber >> 8)
94 macOctets[3] = uint8(apDeviceHandler.ponPortNumber)
95 macOctets[2] = uint8(oo.portNo >> 16)
96 macOctets[1] = uint8(oo.portNo >> 8)
97 macOctets[0] = uint8(oo.portNo)
98 hwAddr := genMacFromOctets(macOctets)
99 ofHwAddr := macAddressToUint32Array(hwAddr)
100 capacity := uint32(of.OfpPortFeatures_OFPPF_1GB_FD | of.OfpPortFeatures_OFPPF_FIBER)
101 ofUniPortState := of.OfpPortState_OFPPS_LINK_DOWN
102 /* as the VOLTHA port create is only called directly after Uni Port create
103 the OfPortOperState is always Down
104 Note: this way the OfPortOperState won't ever change (directly in adapter)
105 maybe that was already always the case, but looks a bit weird - to be kept in mind ...
106 if pUniPort.operState == vc.OperStatus_ACTIVE {
107 ofUniPortState = of.OfpPortState_OFPPS_LIVE
108 }
109 */
110 logger.Debugw("ofPort values", log.Fields{
111 "forUniPortName": oo.name, "forMacBase": hwAddr,
112 "name": name, "hwAddr": ofHwAddr, "OperState": ofUniPortState})
113
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000114 pUniPort := &voltha.Port{
115 PortNo: oo.portNo,
116 Label: oo.name,
117 Type: voltha.Port_ETHERNET_UNI,
118 AdminState: oo.adminState,
119 OperStatus: oo.operState,
120 // obviously empty peer setting
mpagenkoaf801632020-07-03 10:00:42 +0000121 OfpPort: &of.OfpPort{
122 Name: name,
123 HwAddr: ofHwAddr,
124 Config: 0,
125 State: uint32(ofUniPortState),
126 Curr: capacity,
127 Advertised: capacity,
128 Peer: capacity,
129 CurrSpeed: uint32(of.OfpPortFeatures_OFPPF_1GB_FD),
130 MaxSpeed: uint32(of.OfpPortFeatures_OFPPF_1GB_FD),
131 },
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000132 }
133 if pUniPort != nil {
mpagenkoaf801632020-07-03 10:00:42 +0000134 if err := apDeviceHandler.coreProxy.PortCreated(context.TODO(),
135 apDeviceHandler.deviceID, pUniPort); err != nil {
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000136 logger.Fatalf("adding-uni-port: create-VOLTHA-Port-failed-%s", err)
137 return err
138 }
mpagenkoaf801632020-07-03 10:00:42 +0000139 logger.Infow("Voltha onuUniPort-added", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000140 "device-id": apDeviceHandler.device.Id, "PortNo": oo.portNo})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000141 oo.pPort = pUniPort
142 oo.operState = vc.OperStatus_DISCOVERED
143 } else {
mpagenkoaf801632020-07-03 10:00:42 +0000144 logger.Warnw("could not create Voltha UniPort", log.Fields{
divyadesai4d299552020-08-18 07:13:49 +0000145 "device-id": apDeviceHandler.device.Id, "PortNo": oo.portNo})
Holger Hildebrandt0f9b88d2020-04-20 13:33:25 +0000146 return errors.New("create Voltha UniPort failed")
147 }
148 return nil
149}
Holger Hildebrandt24d51952020-05-04 14:03:42 +0000150
mpagenkoaf801632020-07-03 10:00:42 +0000151//SetOperState modifies OperState of the the UniPort
152func (oo *OnuUniPort) SetOperState(aNewOperState vc.OperStatus_Types) {
153 oo.operState = aNewOperState
154}
155
156// uni port related utility functions (so far only used here)
157func genMacFromOctets(aOctets [6]uint8) string {
158 return fmt.Sprintf("%02x:%02x:%02x:%02x:%02x:%02x",
159 aOctets[5], aOctets[4], aOctets[3],
160 aOctets[2], aOctets[1], aOctets[0])
161}
162
163//copied from OLT Adapter: unify centrally ?
164func macAddressToUint32Array(mac string) []uint32 {
165 slist := strings.Split(mac, ":")
166 result := make([]uint32, len(slist))
167 var err error
168 var tmp int64
169 for index, val := range slist {
170 if tmp, err = strconv.ParseInt(val, 16, 32); err != nil {
171 return []uint32{1, 2, 3, 4, 5, 6}
172 }
173 result[index] = uint32(tmp)
174 }
175 return result
Holger Hildebrandt24d51952020-05-04 14:03:42 +0000176}