blob: 8d891dc48ea58ceb6403c7781f76b3d416d6b82f [file] [log] [blame]
/*
* 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 core
import (
"gerrit.opencord.org/voltha-bbsim/common/logger"
)
type OmciMsg struct {
IntfId uint32
OnuId uint32
Pkt []byte
}
const NumMibUploads byte = 9
type OnuKey struct {
IntfId, OnuId uint32
}
type OnuState struct {
mibUploadCtr uint16
uniGInstance uint8
pptpInstance uint8
}
func OmciRun(omciOut chan OmciMsg, omciIn chan OmciMsg) {
onus := make(map[OnuKey]*OnuState)
for {
var resp OmciMsg
m := <-omciOut
msgType, transactionId, meClass, meInstance := ParsePkt(m.Pkt)
logger.Debug("OmciRun - transactionId: %d msgType: %d, ME Class: %d, ME Instance: %d",
transactionId, msgType, meClass, meInstance)
key := OnuKey{m.IntfId, m.OnuId}
if _, ok := onus[key]; !ok {
onus[key] = NewOnuState()
}
switch msgType {
case 15:
resp.Pkt = MibReset()
case 13:
resp.Pkt = MibUpload()
case 14:
resp.Pkt = MibUploadNext(onus[key])
case 8:
resp.Pkt = Set()
case 4:
resp.Pkt = Create()
case 9:
resp.Pkt = Get()
default:
logger.Warn("Omci msg type not handled: %d", msgType)
continue
}
resp.Pkt[0] = byte(transactionId >> 8)
resp.Pkt[1] = byte(transactionId & 0xFF)
resp.IntfId = m.IntfId
resp.OnuId = m.OnuId
omciIn <- resp
}
}
func ParsePkt(pkt []byte) (byte, uint16, uint16, uint16) {
p := make([]byte, len(pkt)/2)
for i, j := 0, 0; i < len(pkt); i, j = i+2, j+1 {
u := (pkt[i] & 15) + (pkt[i]>>6)*9
l := (pkt[i+1] & 15) + (pkt[i+1]>>6)*9
p[j] = u<<4 + l
}
logger.Debug("Omci decoded: %x.", p)
msgType := p[2] & 0x0F
transactionId := (uint16(p[0]) << 8) | uint16(p[1])
meClass := (uint16(p[4]) << 8) | uint16(p[5])
meInstance := (uint16(p[6]) << 8) | uint16(p[7])
return msgType, transactionId, meClass, meInstance
}
func NewOnuState() *OnuState {
return &OnuState{mibUploadCtr: 0, uniGInstance: 1, pptpInstance: 1}
}
func MibReset() []byte {
var pkt []byte
logger.Debug("Omci MibReset")
pkt = []byte{
0x00, 0x01, 0x2f, 0x0a, 0x00, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x28, 0x1f, 0x75, 0x69, 0xaa}
return pkt
}
func MibUpload() []byte {
var pkt []byte
logger.Debug("Omci MibUpload")
pkt = []byte{
0x00, 0x02, 0x2d, 0x0a, 0x00, 0x02, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x28, 0x0c, 0x63, 0x21, 0x65}
pkt[9] = NumMibUploads // Number of subsequent MibUploadNext cmds
return pkt
}
func MibUploadNext(state *OnuState) []byte {
var pkt []byte
logger.Debug("Omci MibUploadNext")
switch state.mibUploadCtr {
case 0:
// ANI-G
pkt = []byte{
0x00, 0x03, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
0x01, 0x07, 0x80, 0x01, 0xff, 0xff, 0x01, 0x00,
0x08, 0x00, 0x30, 0x00, 0x00, 0x05, 0x09, 0x00,
0x00, 0xe0, 0x54, 0xff, 0xff, 0x00, 0x00, 0x0c,
0x63, 0x81, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x28, 0x2c, 0x4d, 0xa9, 0xc8}
case 1, 2, 3, 4:
// UNI-G
pkt = []byte{
0x00, 0x04, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
0x01, 0x08, 0x01, 0x01, 0xf8, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x28, 0x05, 0x19, 0xae, 0x66}
pkt[11] = state.uniGInstance // ME Instance
state.uniGInstance++
case 5, 6, 7, 8:
pkt = []byte{
0x00, 0x16, 0x2e, 0x0a, 0x00, 0x02, 0x00, 0x00,
0x00, 0x0b, 0x01, 0x01, 0xff, 0xfe, 0x00, 0x2f,
0x00, 0x00, 0x00, 0x00, 0x03, 0x05, 0xee, 0x00,
0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x28, 0x6f, 0x10, 0x9b, 0x27}
pkt[11] = state.pptpInstance // ME Instance
state.pptpInstance++
default:
logger.Error("Invalid MibUpload request %d", state.mibUploadCtr)
}
state.mibUploadCtr++
return pkt
}
func Set() []byte {
var pkt []byte
pkt = []byte{
0x01, 0x15, 0x28, 0x0a, 0x01, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x28, 0x41, 0xb3, 0x95, 0x12}
logger.Debug("Omci Set")
return pkt
}
func Create() []byte {
var pkt []byte
pkt = []byte{
0x01, 0x17, 0x24, 0x0a, 0x01, 0x10, 0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x28, 0x85, 0xcb, 0x98, 0x86}
logger.Debug("Omci Create")
return pkt
}
func Get() []byte {
var pkt []byte
pkt = []byte{
0x01, 0x26, 0x29, 0x0a, 0x00, 0x2d, 0x02, 0x01,
0x00, 0x20, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x28, 0xbc, 0x0c, 0xa4, 0x18}
logger.Debug("Omci Get")
return pkt
}