mirror of
https://gitee.com/willfree/mlsr.git
synced 2026-06-16 21:07:59 +08:00
177 lines
3.6 KiB
Go
177 lines
3.6 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"
|
|
)
|
|
|
|
type LsaType int
|
|
|
|
const (
|
|
LsaADJACENCYType LsaType = 1
|
|
LsaNAMEType LsaType = 2
|
|
LsaCOORDINATEType LsaType = 3
|
|
)
|
|
|
|
type LsaBase struct {
|
|
encoding.SelfEncodingBase
|
|
LsaExpirationTime // LSA超时时间
|
|
LsaSequenceNumber // LSA序列号
|
|
|
|
LsaOriginRouterIdentifier *component.Identifier // 源路由
|
|
}
|
|
|
|
//
|
|
// 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.SetExpirationTime(time)
|
|
}
|
|
|
|
func (l *LsaBase) ToString() string {
|
|
panic("")
|
|
}
|
|
|
|
//
|
|
// 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:
|
|
if err:= l.LsaOriginRouterIdentifier.WireDecode(parameter); err != nil {
|
|
return err
|
|
}
|
|
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
|
|
} |