mirror of
https://gitee.com/willfree/mlsr.git
synced 2026-06-15 18:44:53 +08:00
初始化RoutingTable结构体的参数及其方法
This commit is contained in:
@@ -39,6 +39,7 @@ const (
|
||||
TlvMlsrNextHop = 443
|
||||
TlvMlsrNextHopList = 444
|
||||
TlvMlsrRoutingTableEntry = 445
|
||||
TlvMlsrRoutingTable = 446
|
||||
|
||||
)
|
||||
|
||||
|
||||
@@ -0,0 +1,165 @@
|
||||
// Package route
|
||||
// @Author: Wang Feng
|
||||
// @Description:
|
||||
// @Version: 0.1.0
|
||||
// @Date: 2022/5/9 16:53
|
||||
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
||||
//
|
||||
|
||||
package route
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"minlib/component"
|
||||
"minlib/encoding"
|
||||
"mlsr/common"
|
||||
"mlsr/extensions"
|
||||
"mlsr/lsdb"
|
||||
"time"
|
||||
)
|
||||
|
||||
type RoutingTable struct {
|
||||
// lsa存储库
|
||||
lsdb *lsdb.Lsdb
|
||||
// 配置参数
|
||||
mlsrConfig *common.MlsrConfig
|
||||
|
||||
// 路由条目列表
|
||||
rTable []*RoutingTableEntry
|
||||
// 路由计算间隔时间
|
||||
m_routingCalcInterval *time.Duration
|
||||
// 路由表是否正在计算
|
||||
m_isRoutingTableCalculating bool
|
||||
// 是否已经安排了路由计算
|
||||
m_isRouteCalculationScheduled bool
|
||||
// 当前路由器的邻接LSA是否存在
|
||||
m_ownAdjLsaExist bool
|
||||
|
||||
// 双曲坐标状态 => 暂时用不到
|
||||
m_hyperbolicState uint32
|
||||
}
|
||||
|
||||
//
|
||||
// Calculate
|
||||
// @Description: 计算网络中每个路由器的下一个跃点列表。
|
||||
// @receiver t
|
||||
//
|
||||
func (t *RoutingTable) Calculate() {
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
// AddNextHop
|
||||
// @Description: 向路由表条目添加下一个跃点。
|
||||
// @receiver t
|
||||
// @param destRouter 要修改其RTE的目标路由器。
|
||||
// @param hop 要添加到RTE的下一个跃点。
|
||||
//
|
||||
func (t *RoutingTable) AddNextHop(destRouter *component.Identifier,hop *NextHop) {
|
||||
|
||||
}
|
||||
|
||||
func (t *RoutingTable) FindRoutingTableEntry(destRouter *component.Identifier) *RoutingTableEntry {
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
// ScheduleRoutingTableCalculation
|
||||
// @Description: 仅当尚未计划计算事件时,才在事件计划程序中计划计算事件。
|
||||
// @receiver t
|
||||
//
|
||||
func (t *RoutingTable) ScheduleRoutingTableCalculation() {
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
// calculateLsRoutingTable
|
||||
// @Description: 计算链路状态路由表。
|
||||
// @receiver t
|
||||
//
|
||||
func (t *RoutingTable) calculateLsRoutingTable() {
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
// clearRoutingTable
|
||||
// @Description: 清空路由表
|
||||
// @receiver t
|
||||
//
|
||||
func (t *RoutingTable) clearRoutingTable() {
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
// WireEncode
|
||||
// @Description: 线速编码
|
||||
// @receiver l
|
||||
// @param encoder
|
||||
// @return int
|
||||
// @return error
|
||||
//
|
||||
func (t *RoutingTable) WireEncode(encoder *encoding.Encoder) (int, error) {
|
||||
// 判断列表长度,为0则抛出错误
|
||||
if len(t.rTable) == 0 {
|
||||
return 0, errors.New("Invalid RoutingTable, expect at least one RoutingTableEntry!")
|
||||
}
|
||||
totalLength := 0
|
||||
// 编码 TLV-VALUE
|
||||
// 反向遍历,可以保证解码的时候正向输出
|
||||
for i := len(t.rTable) - 1; i >= 0; i-- {
|
||||
if t.rTable[i] == nil {
|
||||
continue
|
||||
}
|
||||
tmpLen, err := t.rTable[i].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.TlvMlsrRoutingTable)
|
||||
if err != nil {
|
||||
return 0, err
|
||||
}
|
||||
totalLength += tmpLen
|
||||
|
||||
return totalLength, nil
|
||||
}
|
||||
|
||||
//
|
||||
// WireDecode
|
||||
// @Description: 线速解码
|
||||
// @receiver l
|
||||
// @param block
|
||||
// @return error
|
||||
//
|
||||
func (t *RoutingTable) WireDecode(block *encoding.Block) error {
|
||||
// 检查 TLV-TYPE 是否正确
|
||||
if err := encoding.ExpectType(block.GetType(), extensions.TlvMlsrRoutingTable); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 解析子 TLV
|
||||
if err := block.ParseSubElements(); err != nil {
|
||||
return err
|
||||
}
|
||||
tableEntries := make([]*RoutingTableEntry, len(block.GetSubElements()))
|
||||
for index, element := range block.GetSubElements() {
|
||||
var tableEntry RoutingTableEntry
|
||||
err := tableEntry.WireDecode(element)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
tableEntries[index] = &tableEntry
|
||||
}
|
||||
t.rTable = tableEntries
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user