mirror of
https://gitee.com/willfree/mlsr.git
synced 2026-06-16 16:28:01 +08:00
196 lines
4.1 KiB
Go
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
|
|
} |