mirror of
https://gitee.com/willfree/mlsr.git
synced 2026-06-18 14:46:06 +08:00
134 lines
2.6 KiB
Go
134 lines
2.6 KiB
Go
// Package lsa
|
|
// @Author: Wang Feng
|
|
// @Description:
|
|
// @Version: 0.1.0
|
|
// @Date: 2022/3/9 22:13
|
|
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
|
//
|
|
|
|
package lsa
|
|
|
|
import (
|
|
"minlib/encoding"
|
|
"mlsr/extensions"
|
|
)
|
|
|
|
type AdjLsa struct {
|
|
encoding.SelfEncodingBase
|
|
LsaBase
|
|
AdjLsaAdjacenctList
|
|
}
|
|
|
|
//
|
|
// GetAdjList
|
|
// @Description: 获取邻接信息表
|
|
// @receiver a
|
|
// @return []*AdjLsaAdjacencyInfo
|
|
//
|
|
func (a *AdjLsa) GetAdjList() []*AdjLsaAdjacencyInfo {
|
|
return a.AdjLsaAdjacenctList.GetAdjList()
|
|
}
|
|
|
|
//
|
|
// AddAdjacencyInfo
|
|
// @Description: 增加一条邻接信息
|
|
// @receiver a
|
|
// @param info
|
|
//
|
|
func (a *AdjLsa) AddAdjacencyInfo(info *AdjLsaAdjacencyInfo) {
|
|
a.Insert(info)
|
|
}
|
|
|
|
//
|
|
// IsEqualContent
|
|
// @Description: 判断是否与另一个AdjLsa中的邻接表相同
|
|
// @receiver a
|
|
// @param aLsa
|
|
// @return bool
|
|
//
|
|
func (a *AdjLsa) IsEqualContent(aLsa *AdjLsa) bool {
|
|
panic("")
|
|
}
|
|
|
|
//
|
|
// ToString
|
|
// @Description: 将Lsa转字符串,方便调试程序
|
|
// @receiver a
|
|
// @return string
|
|
//
|
|
func (a *AdjLsa) ToString() string {
|
|
panic("")
|
|
}
|
|
|
|
//
|
|
// WireEncode
|
|
// @Description: 线速编码
|
|
// @receiver a
|
|
// @param encoder
|
|
// @return int
|
|
// @return error
|
|
//
|
|
func (a *AdjLsa) WireEncode(encoder *encoding.Encoder) (int,error) {
|
|
totalLength := 0
|
|
// TLV-Value
|
|
tmpLen,err := a.AdjLsaAdjacenctList.WireEncode(encoder)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
totalLength+=tmpLen
|
|
tmpLen,err = a.LsaBase.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.TlvMlsrLsaAdjacency)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
totalLength += tmpLen
|
|
|
|
return totalLength,nil
|
|
}
|
|
|
|
//
|
|
// WireDecode
|
|
// @Description: 线速解码
|
|
// @receiver a
|
|
// @param block
|
|
// @return error
|
|
//
|
|
func (a *AdjLsa) WireDecode(block *encoding.Block) error {
|
|
// 检查 TLV-TYPE 是否正确
|
|
if err := encoding.ExpectType(block.GetType(), extensions.TlvMlsrLsaAdjacency); err != nil {
|
|
return err
|
|
}
|
|
|
|
// 首先解析子Block
|
|
if err := block.ParseSubElements(); err != nil {
|
|
return err
|
|
}
|
|
|
|
// 提取参数
|
|
for _, parameter := range block.GetSubElements(){
|
|
switch parameter.GetType() {
|
|
case extensions.TlvMlsrLsaBase:
|
|
if err:= a.LsaBase.WireDecode(parameter); err != nil {
|
|
return err
|
|
}
|
|
case extensions.TlvMlsrAdjLsaAdjacencyList:
|
|
if err:= a.AdjLsaAdjacenctList.WireDecode(parameter); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
return nil
|
|
} |