[SEBA-434] Replacing omci-sim with omci-lib-go
Change-Id: I499afc9ec49bb483467ea93bd6ce3077dd0ccc6e
diff --git a/internal/common/omci/get.go b/internal/common/omci/get.go
new file mode 100644
index 0000000..64a7968
--- /dev/null
+++ b/internal/common/omci/get.go
@@ -0,0 +1,344 @@
+/*
+ * Copyright 2018-present Open Networking Foundation
+
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+
+ * http://www.apache.org/licenses/LICENSE-2.0
+
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package omci
+
+import (
+ "encoding/hex"
+ "errors"
+ "fmt"
+ "github.com/google/gopacket"
+ "github.com/opencord/omci-lib-go"
+ me "github.com/opencord/omci-lib-go/generated"
+ log "github.com/sirupsen/logrus"
+ "strconv"
+)
+
+func ParseGetRequest(omciPkt gopacket.Packet) (*omci.GetRequest, error) {
+ msgLayer := omciPkt.Layer(omci.LayerTypeGetRequest)
+ if msgLayer == nil {
+ err := "omci Msg layer could not be detected for LayerTypeGetRequest"
+ omciLogger.Error(err)
+ return nil, errors.New(err)
+ }
+ msgObj, msgOk := msgLayer.(*omci.GetRequest)
+ if !msgOk {
+ err := "omci Msg layer could not be assigned for LayerTypeGetRequest"
+ omciLogger.Error(err)
+ return nil, errors.New(err)
+ }
+ return msgObj, nil
+}
+
+func CreateGetResponse(omciPkt gopacket.Packet, omciMsg *omci.OMCI) ([]byte, error) {
+
+ msgObj, err := ParseGetRequest(omciPkt)
+
+ if err != nil {
+ return nil, err
+ }
+
+ omciLogger.WithFields(log.Fields{
+ "EntityClass": msgObj.EntityClass,
+ "EntityInstance": msgObj.EntityInstance,
+ "AttributeMask": fmt.Sprintf("%x", msgObj.AttributeMask),
+ }).Trace("recevied-omci-get-request")
+
+ var response *omci.GetResponse
+ switch msgObj.EntityClass {
+ case me.Onu2GClassID:
+ response = createOnu2gResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+ case me.OnuGClassID:
+ response = createOnugResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+ case me.SoftwareImageClassID:
+ response = createSoftwareImageResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+ case me.IpHostConfigDataClassID:
+ response = createIpHostResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+ case me.UniGClassID:
+ response = createUnigResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+ case me.PhysicalPathTerminationPointEthernetUniClassID:
+ response = createPptpResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+ case me.AniGClassID:
+ response = createAnigResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+ case me.OnuDataClassID:
+ response = createOnuDataResponse(msgObj.AttributeMask, msgObj.EntityInstance)
+ default:
+ omciLogger.WithFields(log.Fields{
+ "EntityClass": msgObj.EntityClass,
+ "EntityInstance": msgObj.EntityInstance,
+ "AttributeMask": fmt.Sprintf("%x", msgObj.AttributeMask),
+ }).Warnf("do-not-know-how-to-handle-get-request-for-me-class")
+ return nil, nil
+ }
+
+ pkt, err := serialize(omci.GetResponseType, response, omciMsg.TransactionID)
+ if err != nil {
+ omciLogger.WithFields(log.Fields{
+ "Err": err,
+ "TxID": strconv.FormatInt(int64(omciMsg.TransactionID), 16),
+ }).Error("cannot-serialize-Onu2gResponse")
+ return nil, err
+ }
+
+ log.WithFields(log.Fields{
+ "TxID": strconv.FormatInt(int64(omciMsg.TransactionID), 16),
+ "pkt": hex.EncodeToString(pkt),
+ }).Trace("omci-get-response")
+
+ return pkt, nil
+}
+
+func createOnu2gResponse(attributeMask uint16, entityID uint16) *omci.GetResponse {
+
+ managedEntity, meErr := me.NewOnu2G(me.ParamData{
+ EntityID: entityID,
+ Attributes: me.AttributeValueMap{
+ "ManagedEntityId": entityID,
+ "EquipmentId": toOctets("BBSM", 20),
+ "OpticalNetworkUnitManagementAndControlChannelOmccVersion": 180,
+ "VendorProductCode": 0,
+ "SecurityCapability": 1,
+ "SecurityMode": 1,
+ "TotalPriorityQueueNumber": 1,
+ "TotalTrafficSchedulerNumber": 1,
+ "Deprecated": 1,
+ "TotalGemPortIdNumber": 32,
+ "Sysuptime": 319389947, // NOTE need to be smarter?
+ "ConnectivityCapability": 127,
+ "CurrentConnectivityMode": 5,
+ "QualityOfServiceQosConfigurationFlexibility": 48,
+ "PriorityQueueScaleFactor": 1,
+ },
+ })
+
+ if meErr.GetError() != nil {
+ omciLogger.Errorf("NewOnu2G %v", meErr.Error())
+ return nil
+ }
+
+ return &omci.GetResponse{
+ MeBasePacket: omci.MeBasePacket{
+ EntityClass: me.Onu2GClassID,
+ },
+ Attributes: managedEntity.GetAttributeValueMap(),
+ AttributeMask: attributeMask,
+ Result: me.Success,
+ }
+}
+
+func createOnugResponse(attributeMask uint16, entityID uint16) *omci.GetResponse {
+ return &omci.GetResponse{
+ MeBasePacket: omci.MeBasePacket{
+ EntityClass: me.OnuGClassID,
+ EntityInstance: entityID,
+ },
+ Attributes: me.AttributeValueMap{
+ "ManagedEntityId": entityID,
+ "VendorId": toOctets("BBSM", 4),
+ "Version": toOctets("v0.0.1", 14),
+ "SerialNumber": toOctets("QkJTTQAKAAE=", 8),
+ "TrafficManagementOption": 0,
+ "Deprecated": 0,
+ "BatteryBackup": 0,
+ "AdministrativeState": 0,
+ "OperationalState": 0,
+ "OnuSurvivalTime": 10,
+ "LogicalOnuId": toOctets("BBSM", 24),
+ "LogicalPassword": toOctets("BBSM", 12),
+ "CredentialsStatus": 0,
+ "ExtendedTcLayerOptions": 0,
+ },
+ Result: me.Success,
+ AttributeMask: attributeMask,
+ }
+}
+
+func createSoftwareImageResponse(attributeMask uint16, entityInstance uint16) *omci.GetResponse {
+ // NOTE that we need send the response for the correct ME Instance or the adapter won't process it
+ return &omci.GetResponse{
+ MeBasePacket: omci.MeBasePacket{
+ EntityClass: me.SoftwareImageClassID,
+ EntityInstance: entityInstance,
+ },
+ Attributes: me.AttributeValueMap{
+ "ManagedEntityId": 0,
+ "Version": toOctets("v0.0.1", 14),
+ "IsCommitted": 1,
+ "IsActive": 1,
+ "IsValid": 1,
+ "ProductCode": toOctets("product-code", 25),
+ "ImageHash": toOctets("broadband-sim", 16),
+ },
+ Result: me.Success,
+ AttributeMask: attributeMask,
+ }
+}
+
+func createIpHostResponse(attributeMask uint16, entityInstance uint16) *omci.GetResponse {
+ return &omci.GetResponse{
+ MeBasePacket: omci.MeBasePacket{
+ EntityClass: me.IpHostConfigDataClassID,
+ EntityInstance: entityInstance,
+ },
+ Attributes: me.AttributeValueMap{
+ "ManagedEntityId": 0,
+ "MacAddress": toOctets("aabbcc", 6),
+ },
+ Result: me.Success,
+ AttributeMask: attributeMask,
+ }
+}
+
+func createUnigResponse(attributeMask uint16, entityID uint16) *omci.GetResponse {
+ managedEntity, meErr := me.NewUniG(me.ParamData{
+ EntityID: entityID,
+ Attributes: me.AttributeValueMap{
+ "ManagedEntityId": entityID,
+ "Deprecated": 0,
+ "AdministrativeState": 0,
+ "ManagementCapability": 0,
+ "NonOmciManagementIdentifier": 1,
+ "RelayAgentOptions": 1,
+ },
+ })
+
+ if meErr.GetError() != nil {
+ omciLogger.Errorf("NewUniG %v", meErr.Error())
+ return nil
+ }
+
+ return &omci.GetResponse{
+ MeBasePacket: omci.MeBasePacket{
+ EntityClass: me.UniGClassID,
+ },
+ Attributes: managedEntity.GetAttributeValueMap(),
+ AttributeMask: attributeMask,
+ Result: me.Success,
+ }
+}
+
+func createPptpResponse(attributeMask uint16, entityID uint16) *omci.GetResponse {
+ managedEntity, meErr := me.NewPhysicalPathTerminationPointEthernetUni(me.ParamData{
+ EntityID: entityID,
+ Attributes: me.AttributeValueMap{
+ "ManagedEntityId": entityID,
+ "ExpectedType": 0,
+ "SensedType": 0,
+ "AutoDetectionConfiguration": 0,
+ "EthernetLoopbackConfiguration": 0,
+ "AdministrativeState": 0,
+ "OperationalState": 0,
+ "ConfigurationInd": 0,
+ "MaxFrameSize": 0,
+ "DteOrDceInd": 0,
+ "PauseTime": 0,
+ "BridgedOrIpInd": 0,
+ "Arc": 0,
+ "ArcInterval": 0,
+ "PppoeFilter": 0,
+ "PowerControl": 0,
+ },
+ })
+
+ if meErr.GetError() != nil {
+ omciLogger.Errorf("NewPhysicalPathTerminationPointEthernetUni %v", meErr.Error())
+ return nil
+ }
+
+ return &omci.GetResponse{
+ MeBasePacket: omci.MeBasePacket{
+ EntityClass: me.PhysicalPathTerminationPointEthernetUniClassID,
+ },
+ Attributes: managedEntity.GetAttributeValueMap(),
+ AttributeMask: attributeMask,
+ Result: me.Success,
+ }
+}
+
+func createAnigResponse(attributeMask uint16, entityID uint16) *omci.GetResponse {
+ managedEntity, meErr := me.NewAniG(me.ParamData{
+ EntityID: entityID,
+ Attributes: me.AttributeValueMap{
+ "ManagedEntityId": entityID,
+ "SrIndication": 0,
+ "TotalTcontNumber": 0,
+ "GemBlockLength": 0,
+ "PiggybackDbaReporting": 0,
+ "Deprecated": 0,
+ "SignalFailThreshold": 0,
+ "SignalDegradeThreshold": 0,
+ "Arc": 0,
+ "ArcInterval": 0,
+ "OpticalSignalLevel": 0,
+ "LowerOpticalThreshold": 0,
+ "UpperOpticalThreshold": 0,
+ "OnuResponseTime": 0,
+ "TransmitOpticalLevel": 0,
+ "LowerTransmitPowerThreshold": 0,
+ "UpperTransmitPowerThreshold": 0,
+ },
+ })
+
+ if meErr.GetError() != nil {
+ omciLogger.Errorf("NewAniG %v", meErr.Error())
+ return nil
+ }
+
+ return &omci.GetResponse{
+ MeBasePacket: omci.MeBasePacket{
+ EntityClass: me.AniGClassID,
+ },
+ Attributes: managedEntity.GetAttributeValueMap(),
+ AttributeMask: attributeMask,
+ Result: me.Success,
+ }
+}
+
+func createOnuDataResponse(attributeMask uint16, entityID uint16) *omci.GetResponse {
+ managedEntity, meErr := me.NewOnuData(me.ParamData{
+ EntityID: entityID,
+ Attributes: me.AttributeValueMap{
+ "ManagedEntityId": entityID,
+ "MibDataSync": 0,
+ },
+ })
+
+ if meErr.GetError() != nil {
+ omciLogger.Errorf("NewOnuData %v", meErr.Error())
+ return nil
+ }
+
+ return &omci.GetResponse{
+ MeBasePacket: omci.MeBasePacket{
+ EntityClass: me.OnuDataClassID,
+ },
+ Attributes: managedEntity.GetAttributeValueMap(),
+ AttributeMask: attributeMask,
+ Result: me.Success,
+ }
+}
+
+func toOctets(str string, size int) []byte {
+ asciiBytes := []byte(str)
+
+ if len(asciiBytes) < size {
+ missing := size - len(asciiBytes)
+ for i := 0; i < missing; i++ {
+ asciiBytes = append(asciiBytes, []byte{0x00}[0])
+ }
+ }
+ return asciiBytes
+}