diff --git a/extensions/TlvMlsrExtention.go b/extensions/TlvMlsrExtention.go index 7c8bc92..aa37d9f 100644 --- a/extensions/TlvMlsrExtention.go +++ b/extensions/TlvMlsrExtention.go @@ -39,6 +39,7 @@ const ( TlvMlsrNextHop = 443 TlvMlsrNextHopList = 444 TlvMlsrRoutingTableEntry = 445 + TlvMlsrRoutingTable = 446 ) diff --git a/route/RoutingTable.go b/route/RoutingTable.go new file mode 100644 index 0000000..7246aac --- /dev/null +++ b/route/RoutingTable.go @@ -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 +} \ No newline at end of file