1
0
mirror of https://gitee.com/willfree/mlsr.git synced 2026-06-18 14:06:06 +08:00

补充实现RoutingTableEntry

This commit is contained in:
free will
2022-05-07 19:51:19 +08:00
parent c745ba56e6
commit 2a60b65078
3 changed files with 131 additions and 2 deletions
+10
View File
@@ -4,6 +4,16 @@ MLSRMIN Link State Routing Protocol,多标识网络链路状态路由协议
MLSR支持推式传输和拉式传输下的路由寻址。
## 功能模块简述
### LSA模块
### LSDB模块
### 路由表模块
### NPT模块
## 开发规范
### 注释规范
* 源代码文件抬头注明开发者、时间、版本、组织等信息,请参考较早提交的代码文件。
+2
View File
@@ -38,5 +38,7 @@ const (
TlvMlsrRouteCost = 442
TlvMlsrNextHop = 443
TlvMlsrNextHopList = 444
TlvMlsrRoutingTableEntry = 445
)
+119 -2
View File
@@ -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
}