1
0
mirror of https://gitee.com/willfree/mlsr.git synced 2026-06-16 16:28:01 +08:00
Files
mlsr/lsa/LsaBase.go
T

196 lines
4.1 KiB
Go

// Package lsa
// @Author: Wang Feng
// @Description:
// @Version: 0.1.0
// @Date: 2022/3/9 21:22
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
//
package lsa
import (
"minlib/component"
"minlib/encoding"
"mlsr/extensions"
"strconv"
)
type LsaType int
const (
LsaBaseType LsaType = 0
LsaADJACENCYType LsaType = 1
LsaNAMEType LsaType = 2
LsaCOORDINATEType LsaType = 3
)
type LsaBase struct {
encoding.SelfEncodingBase
LsaExpirationTime // LSA超时时间
LsaSequenceNumber // LSA序列号
LsaOriginRouterIdentifier *component.Identifier // 源路由
}
func (l *LsaBase) GetType() LsaType {
return LsaBaseType
}
//
// GetSeqNo
// @Description: 获取序列号
// @receiver l
// @return uint64
//
func (l *LsaBase) GetSeqNo() uint64 {
return l.LsaSequenceNumber.Value()
}
//
// SetSeqNo
// @Description: 设置序列号
// @receiver l
// @param seq
//
func (l *LsaBase) SetSeqNo(seq uint64) {
l.LsaSequenceNumber.SetValue(seq)
}
//
// GetOriginRouter
// @Description: 获取LSA源路由器标识
// @receiver l
// @return *component.Identifier
//
func (l *LsaBase) GetOriginRouter() *component.Identifier {
return l.LsaOriginRouterIdentifier
}
//
// SetOriginRouter
// @Description: 设置LSA源路由器标识
// @receiver l
// @param routerIdentifier
//
func (l *LsaBase) SetOriginRouter(routerIdentifier *component.Identifier) {
l.LsaOriginRouterIdentifier=routerIdentifier
}
//
// GetExpirationTime
// @Description: 获取LSA超时时间
// @receiver l
// @return uint64
//
func (l *LsaBase) GetExpirationTime() uint64 {
return l.LsaExpirationTime.Value()
}
//
// SetExpirationTime
// @Description: 设置LSA超时时间
// @receiver l
// @param time
//
func (l *LsaBase) SetExpirationTime(time uint64) {
l.LsaExpirationTime.SetLsaExpirationTime(time)
}
func (l *LsaBase) ToString() string {
var res string = ""
res += "{ "
res += "LsaOriginRouter: "
res += l.LsaOriginRouterIdentifier.ToUri()
res += ", "
res += "LsaSequenceNumber: "
res += strconv.FormatUint(l.LsaSequenceNumber.LsaSequenceNumber(), 10)
res += ", "
res += "LsaExpirationTime: "
res += strconv.FormatUint(l.LsaExpirationTime.LsaExpirationTime(), 10)
res += " }"
return res
}
//
// WireEncode
// @Description: 线速编码
// @receiver l
// @param encoder
// @return int
// @return error
//
func (l *LsaBase) WireEncode(encoder *encoding.Encoder) (int,error) {
totalLength := 0
// TLV-Value
tmpLen,err := l.LsaExpirationTime.WireEncode(encoder)
if err != nil {
return 0, err
}
totalLength += tmpLen
tmpLen,err = l.LsaSequenceNumber.WireEncode(encoder)
if err != nil {
return 0, err
}
totalLength += tmpLen
tmpLen,err = l.LsaOriginRouterIdentifier.WireEncode(encoder)
if err != nil {
return 0, err
}
totalLength += tmpLen
// TLV-Length
tmpLen,err = encoder.PrependVarNumber(encoding.VlInt(totalLength))
if err != nil {
return 0, err
}
totalLength += tmpLen
// TLV-Type
tmpLen, err = encoder.PrependVarNumber(extensions.TlvMlsrLsaBase)
if err != nil {
return 0, err
}
totalLength += tmpLen
return totalLength,nil
}
//
// WireDecode
// @Description: 线速解码
// @receiver l
// @param block
// @return error
//
func (l *LsaBase) WireDecode(block *encoding.Block) error {
// 检查 TLV-TYPE 是否正确
if err := encoding.ExpectType(block.GetType(), extensions.TlvMlsrLsaBase); err != nil {
return err
}
// 首先解析子Block
if err := block.ParseSubElements(); err != nil {
return err
}
// 提取参数
for _, parameter := range block.GetSubElements(){
switch parameter.GetType() {
case encoding.TlvIdentifier:
iden:=component.Identifier{}
if err:= iden.WireDecode(parameter); err != nil {
return err
}
l.LsaOriginRouterIdentifier=&iden
case extensions.TlvMlsrLsaSequenceNumber:
if err:= l.LsaSequenceNumber.WireDecode(parameter); err != nil {
return err
}
case extensions.TlvMlsrLsaExpirationTime:
if err:= l.LsaExpirationTime.WireDecode(parameter); err != nil {
return err
}
}
}
return nil
}