1
0
mirror of https://gitee.com/willfree/mlsr.git synced 2026-06-18 14:46:06 +08:00
Files
mlsr/lsa/AdjLsa.go
T
2022-03-16 12:01:51 +08:00

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
}