mirror of
https://gitee.com/willfree/mlsr.git
synced 2026-06-18 14:06:06 +08:00
补充实现RoutingTableEntry
This commit is contained in:
@@ -4,6 +4,16 @@ MLSR(MIN Link State Routing Protocol,多标识网络链路状态路由协议
|
||||
|
||||
MLSR支持推式传输和拉式传输下的路由寻址。
|
||||
|
||||
## 功能模块简述
|
||||
|
||||
### LSA模块
|
||||
|
||||
### LSDB模块
|
||||
|
||||
### 路由表模块
|
||||
|
||||
### NPT模块
|
||||
|
||||
## 开发规范
|
||||
### 注释规范
|
||||
* 源代码文件抬头注明开发者、时间、版本、组织等信息,请参考较早提交的代码文件。
|
||||
|
||||
@@ -38,5 +38,7 @@ const (
|
||||
TlvMlsrRouteCost = 442
|
||||
TlvMlsrNextHop = 443
|
||||
TlvMlsrNextHopList = 444
|
||||
TlvMlsrRoutingTableEntry = 445
|
||||
|
||||
)
|
||||
|
||||
|
||||
+119
-2
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user