From 2a60b650785c02232a3048d7212a3cab68a4f658 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Sat, 7 May 2022 19:51:19 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=AE=9E=E7=8E=B0RoutingTabl?= =?UTF-8?q?eEntry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++ extensions/TlvMlsrExtention.go | 2 + route/RoutingTableEntry.go | 121 ++++++++++++++++++++++++++++++++- 3 files changed, 131 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 39dd4eb..42ae0c0 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,16 @@ MLSR(MIN Link State Routing Protocol,多标识网络链路状态路由协议 MLSR支持推式传输和拉式传输下的路由寻址。 +## 功能模块简述 + +### LSA模块 + +### LSDB模块 + +### 路由表模块 + +### NPT模块 + ## 开发规范 ### 注释规范 * 源代码文件抬头注明开发者、时间、版本、组织等信息,请参考较早提交的代码文件。 diff --git a/extensions/TlvMlsrExtention.go b/extensions/TlvMlsrExtention.go index 1bad1f4..7c8bc92 100644 --- a/extensions/TlvMlsrExtention.go +++ b/extensions/TlvMlsrExtention.go @@ -38,5 +38,7 @@ const ( TlvMlsrRouteCost = 442 TlvMlsrNextHop = 443 TlvMlsrNextHopList = 444 + TlvMlsrRoutingTableEntry = 445 + ) diff --git a/route/RoutingTableEntry.go b/route/RoutingTableEntry.go index b5623f0..67de72c 100644 --- a/route/RoutingTableEntry.go +++ b/route/RoutingTableEntry.go @@ -8,9 +8,126 @@ package route -import "minlib/component" +import ( + "minlib/component" + "minlib/encoding" + "mlsr/extensions" +) +// +// RoutingTableEntry +// @Description: 路由表条目 +// type RoutingTableEntry struct { m_destination *component.Identifier - + NextHopList } + +// +// NewRoutingTableEntry +// @Description: 新建一个路由表条目 +// @param dest +// @return *RoutingTableEntry +// @return error +// +func NewRoutingTableEntry(dest *component.Identifier) (*RoutingTableEntry,error) { + // todo: 判断dest是否格式有效 + rte := new(RoutingTableEntry) + rte.m_destination=dest + return rte,nil +} + +// +// GetDestination +// @Description: 获取目的路由器 +// @receiver e +// @return *component.Identifier +// +func (e *RoutingTableEntry) GetDestination(dest *component.Identifier) *component.Identifier { + return e.m_destination +} + +// +// SetDestination +// @Description: 设置目的路由器 +// @receiver e +// @param dest +// +func (e *RoutingTableEntry) SetDestination(dest *component.Identifier) { + e.m_destination=dest +} + +// +// WireEncode +// @Description: 线速编码 +// @receiver l +// @param encoder +// @return int +// @return error +// +func (e *RoutingTableEntry) WireEncode(encoder *encoding.Encoder) (int,error) { + totalLength := 0 + // TLV-Value + tmpLen,err := e.NextHopList.WireEncode(encoder) + if err != nil { + return 0, err + } + totalLength += tmpLen + tmpLen,err = e.m_destination.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.TlvMlsrRoutingTableEntry) + if err != nil { + return 0, err + } + totalLength += tmpLen + + return totalLength,nil +} + +// +// WireDecode +// @Description: 线速解码 +// @receiver l +// @param block +// @return error +// +func (e *RoutingTableEntry) WireDecode(block *encoding.Block) error { + // 检查 TLV-TYPE 是否正确 + if err := encoding.ExpectType(block.GetType(), extensions.TlvMlsrRoutingTableEntry); 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 + } + e.m_destination = &iden + case extensions.TlvMlsrNextHopList: + if err:= e.NextHopList.WireDecode(parameter); err != nil { + return err + } + } + } + return nil +} \ No newline at end of file