From da39825c6c5e8fbd7fceb045eca3fcbba9f5523d Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 11 Mar 2022 23:16:37 +0800 Subject: [PATCH] amost finish adjacencylist --- extensions/TlvNlsrExtention.go | 19 +- lsa/AdjLsaAdjacencyInfo.go | 84 ++++++++- lsa/AdjLsaAdjacencyList.go | 329 ++++++++++++++++++++++++++++++++- 3 files changed, 420 insertions(+), 12 deletions(-) diff --git a/extensions/TlvNlsrExtention.go b/extensions/TlvNlsrExtention.go index e1d1c02..e9f250c 100644 --- a/extensions/TlvNlsrExtention.go +++ b/extensions/TlvNlsrExtention.go @@ -12,13 +12,16 @@ package extensions const ( // TlvMlsrLsa for MLSR - TlvMlsrLsaAdjacency = 401 // 表示MIR之间邻接关系信息的LSA - TlvMlsrLsaContent = 402 // 表示内容标识信息的LSA - TlvMlsrHeader = 410 // 表示LSA最基本信息:源MIR、序列号、过期时间 - TlvMlsrLsaExpirationTime = 420 // LSA过期时间 - TlvMlsrLsaSequenceNumber = 421 // LSA序列号 - TlvMlsrAdjLsaLogicFaceId = 422 // logicfaceId - TlvMlsrAdjLsaLinkCost = 423 // 链路开销 - TlvMlsrAdjLsaLogicFaceUri = 424 // LogicFace前缀 + TlvMlsrLsaAdjacency = 401 // 表示MIR之间邻接关系信息的LSA + TlvMlsrLsaContent = 402 // 表示内容标识信息的LSA + + TlvMlsrHeader = 410 // 表示LSA最基本信息:源MIR、序列号、过期时间 + TlvMlsrLsaExpirationTime = 420 // LSA过期时间 + TlvMlsrLsaSequenceNumber = 421 // LSA序列号 + + TlvMlsrAdjLsaLogicFaceId = 422 // logicfaceId + TlvMlsrAdjLsaLinkCost = 423 // 链路开销 + TlvMlsrAdjLsaLogicFaceUri = 424 // LogicFace前缀 + TlvMlsrAdjLsaAdjacencyInfo = 425 // 单条邻接LSA信息 ) diff --git a/lsa/AdjLsaAdjacencyInfo.go b/lsa/AdjLsaAdjacencyInfo.go index 2c47b91..de1771e 100644 --- a/lsa/AdjLsaAdjacencyInfo.go +++ b/lsa/AdjLsaAdjacencyInfo.go @@ -1,6 +1,6 @@ // Package lsa // @Author: Wang Feng -// @Description: +// @Description: 单条邻接的链路信息 // @Version: 0.1.0 // @Date: 2022/3/9 22:28 // @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 @@ -8,7 +8,11 @@ package lsa -import "minlib/component" +import ( + "minlib/component" + "minlib/encoding" + "mlsr/extensions" +) const ( STATUS_UNKNOWN = -1 @@ -122,6 +126,80 @@ func (l *AdjLsaAdjacencyInfo) CompareLogicFaceId(faceId uint64) bool { return false } -func (l *AdjLsaAdjacencyInfo) WireEncode() { +// +// WireEncode +// @Description: 线速编码 +// @receiver l +// @param encoder +// @return int +// @return error +// +func (l *AdjLsaAdjacencyInfo) WireEncode(encoder *encoding.Encoder) (int,error) { + totalLength := 0 + // TLV-Value + if tmpLen,err := l.AdjLsaLinkCost.WireEncode(encoder); err!=nil{ + return 0, err + }else{ + totalLength += tmpLen + } + if tmpLen,err := l.AdjLsaLogicFaceUri.WireEncode(encoder); err!=nil{ + return 0, err + }else{ + totalLength += tmpLen + } + if tmpLen,err := l.lsaNeighborRouterIdentifier.WireEncode(encoder); err!=nil{ + return 0, err + }else{ + totalLength += tmpLen + } + + // TLV-Length + if tmpLen,err := encoder.PrependVarNumber(encoding.VlInt(totalLength)); err!=nil{ + return 0, err + }else{ + totalLength += tmpLen + } + + // TLV-Type + if tmpLen,err := encoder.PrependVarNumber(extensions.TlvMlsrAdjLsaAdjacencyInfo); err!=nil{ + return 0, err + }else{ + totalLength += tmpLen + } + + return totalLength,nil +} + +// +// WireDecode +// @Description: 线速解码 +// @receiver l +// @param block +// @return error +// +func (l *AdjLsaAdjacencyInfo) WireDecode(block *encoding.Block) error { + // 首先解析子Block + if err := block.ParseSubElements(); err != nil { + return err + } + + // 提取参数 + for _, parameter := range block.GetSubElements(){ + switch parameter.GetType() { + case encoding.TlvIdentifier: + if err:= l.lsaNeighborRouterIdentifier.WireDecode(parameter); err != nil { + return err + } + case extensions.TlvMlsrAdjLsaLogicFaceUri: + if err:= l.AdjLsaLogicFaceUri.WireDecode(parameter); err != nil { + return err + } + case extensions.TlvMlsrAdjLsaLinkCost: + if err:= l.AdjLsaLinkCost.WireDecode(parameter); err != nil { + return err + } + } + } + return nil } \ No newline at end of file diff --git a/lsa/AdjLsaAdjacencyList.go b/lsa/AdjLsaAdjacencyList.go index aeb20e4..2bfbfa3 100644 --- a/lsa/AdjLsaAdjacencyList.go +++ b/lsa/AdjLsaAdjacencyList.go @@ -8,11 +8,338 @@ package lsa -import "minlib/encoding" +import ( + "errors" + "minlib/component" + "minlib/encoding" +) +// 为邻接信息的数组起一个别称 type LsaAdjacencyContainer []*AdjLsaAdjacencyInfo +// +// AdjLsaAdjacenctList +// @Description: 保存邻接信息的列表 +// type AdjLsaAdjacenctList struct { encoding.SelfEncodingBase lsaAdjacencys LsaAdjacencyContainer } + +// +// insert +// @Description: 插入一条邻接信息 +// @receiver l +// @param info +// +func (l *AdjLsaAdjacenctList) Insert(info *AdjLsaAdjacencyInfo) { + l.lsaAdjacencys = append(l.lsaAdjacencys, info) +} + +// +// getAdjList +// @Description: 获取包含所有邻接信息的邻接表 +// @receiver l +// @return []*AdjLsaAdjacencyInfo +// +func (l *AdjLsaAdjacenctList) GetAdjList() []*AdjLsaAdjacencyInfo { + return l.lsaAdjacencys +} + +// +// isNeighbor +// @Description: 判断某个MIR标识符是否是邻居MIR +// @receiver l +// @param routerIdentifier +// @return bool +// +func (l *AdjLsaAdjacenctList) IsNeighbor(routerIdentifier *component.Identifier) bool { + for i:=0; i