mirror of
https://gitee.com/willfree/mlsr.git
synced 2026-06-06 22:29:28 +08:00
276 lines
7.8 KiB
Go
276 lines
7.8 KiB
Go
// Package route
|
|
// @Author: Wang Feng
|
|
// @Description:
|
|
// @Version: 0.1.0
|
|
// @Date: 2022/6/17 11:28
|
|
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
|
//
|
|
|
|
package route
|
|
|
|
import (
|
|
"fmt"
|
|
common2 "minlib/common"
|
|
"minlib/component"
|
|
"minlib/logicface"
|
|
"mlsr/common"
|
|
"mlsr/lsa"
|
|
"mlsr/lsdb"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
//
|
|
// TestRoutingTable_Init
|
|
// @Description: 测试初始化
|
|
// @param t
|
|
//
|
|
func TestRoutingTable_Init(t *testing.T) {
|
|
// 1. 组件初始化
|
|
// 配置文件初始化
|
|
mlsrConfig, err := common.ParseConfig(testConfigPath)
|
|
if err != nil {
|
|
common2.LogInfo("配置文件解析错误")
|
|
}
|
|
// 调度器初始化
|
|
sche := new(lsdb.MlsrScheduler)
|
|
sche.Init()
|
|
// LogicFace初始化(假设初始化,暂时用不到)
|
|
face := new(logicface.LogicFace)
|
|
// LSDB初始化
|
|
mlsdb := new(lsdb.Lsdb)
|
|
mlsdb.Init(mlsrConfig, sche, face)
|
|
|
|
// 2. 路由表初始化
|
|
rt := new(RoutingTable)
|
|
rt.Init(mlsrConfig, sche, mlsdb)
|
|
}
|
|
|
|
//
|
|
// TestRoutingTable_AddNextHop
|
|
// @Description: 测试构造路由表及其拓扑
|
|
// @param t
|
|
//
|
|
func TestRoutingTable_AddNextHop(t *testing.T) {
|
|
// 1. 组件初始化
|
|
// 配置文件初始化
|
|
mlsrConfig, err := common.ParseConfig(testConfigPath)
|
|
if err != nil {
|
|
common2.LogInfo("配置文件解析错误")
|
|
}
|
|
// 调度器初始化
|
|
sche := new(lsdb.MlsrScheduler)
|
|
sche.Init()
|
|
// LogicFace初始化(假设初始化,暂时用不到)
|
|
face := new(logicface.LogicFace)
|
|
// LSDB初始化
|
|
mlsdb := new(lsdb.Lsdb)
|
|
mlsdb.Init(mlsrConfig, sche, face)
|
|
// 安装本机adjlsa
|
|
mlsdb.BuildAndInstallOwnAdjLsa()
|
|
|
|
// 2. 打印lsdb中所有本机lsa
|
|
lsas, _ := mlsdb.LsaContainer.GetLSAsByType(lsa.LsaADJACENCYType)
|
|
for i := 0; i < len(lsas); i++ {
|
|
common2.LogInfo(lsas[i].ToString())
|
|
}
|
|
lsas, _ = mlsdb.LsaContainer.GetLSAsByType(lsa.LsaNAMEType)
|
|
for i := 0; i < len(lsas); i++ {
|
|
common2.LogInfo(lsas[i].ToString())
|
|
}
|
|
|
|
// 3. 路由表初始化
|
|
rt := new(RoutingTable)
|
|
rt.Init(mlsrConfig, sche, mlsdb)
|
|
|
|
// 加入一个新的条目
|
|
iden, _ := component.CreateIdentifierByString("/pkuiswhat")
|
|
hop := new(NextHop)
|
|
hop.Init("tcp://1.1.1.1", 77)
|
|
rt.AddNextHop(iden, hop)
|
|
// 打印
|
|
rt.PrintSelf()
|
|
|
|
// 加入一个旧条目
|
|
hopOld := new(NextHop)
|
|
hopOld.Init("udp://1.1.1.12", 88)
|
|
rt.AddNextHop(iden, hopOld)
|
|
// 打印
|
|
rt.PrintSelf()
|
|
|
|
// 再加一遍
|
|
rt.AddNextHop(iden, hopOld)
|
|
// 打印
|
|
rt.PrintSelf()
|
|
}
|
|
|
|
//
|
|
// TestRoutingTable_calculateLsRoutingTable
|
|
// @Description: 测试计算
|
|
// @param t
|
|
//
|
|
func TestRoutingTable_calculateLsRoutingTable(t *testing.T) {
|
|
// 1. 组件初始化
|
|
// 配置文件初始化
|
|
mlsrConfig, err := common.ParseConfig(testConfigPath)
|
|
if err != nil {
|
|
common2.LogInfo("配置文件解析错误")
|
|
}
|
|
// 调度器初始化
|
|
sche := new(lsdb.MlsrScheduler)
|
|
sche.Init()
|
|
// LogicFace初始化(假设初始化,暂时用不到)
|
|
face := new(logicface.LogicFace)
|
|
// LSDB初始化
|
|
mlsdb := new(lsdb.Lsdb)
|
|
mlsdb.Init(mlsrConfig, sche, face)
|
|
|
|
// 2. 打印lsdb中所有本机lsa
|
|
lsas, _ := mlsdb.LsaContainer.GetLSAsByType(lsa.LsaADJACENCYType)
|
|
for i := 0; i < len(lsas); i++ {
|
|
common2.LogInfo(lsas[i].ToString())
|
|
}
|
|
lsas, _ = mlsdb.LsaContainer.GetLSAsByType(lsa.LsaNAMEType)
|
|
for i := 0; i < len(lsas); i++ {
|
|
common2.LogInfo(lsas[i].ToString())
|
|
}
|
|
fmt.Println("lsdb是否正在忙于构建lsdb: ", mlsdb.GetIsBuildAdjLsaScheduled())
|
|
|
|
// 3. 路由表初始化
|
|
rt := new(RoutingTable)
|
|
rt.Init(mlsrConfig, sche, mlsdb)
|
|
|
|
// 安装本机adjlsa
|
|
mlsdb.BuildAndInstallOwnAdjLsa()
|
|
|
|
fmt.Println("路由表是否已经知道lsdb成功构建了邻接Lsa: ", rt.m_ownAdjLsaExist)
|
|
|
|
// 4. 安装其它路由器的邻接lsa
|
|
// 传入一些其它虚拟lsa,这些lsa与本机lsa共同形成一个小型路由拓扑
|
|
// 路由器B
|
|
adjLsaB := testCreateAdjLsa("/routerB")
|
|
adjInfoBA := testCreateAdjInfo(10, "/min/pkusz/routerA")
|
|
adjInfoBE := testCreateAdjInfo(50, "/routerE")
|
|
adjLsaB.Insert(adjInfoBA)
|
|
adjLsaB.Insert(adjInfoBE)
|
|
// 路由器C
|
|
adjLsaC := testCreateAdjLsa("/routerC")
|
|
adjInfoCA := testCreateAdjInfo(100, "/min/pkusz/routerA")
|
|
adjInfoCE := testCreateAdjInfo(10, "/routerE")
|
|
adjInfoCD := testCreateAdjInfo(60, "/routerD")
|
|
adjLsaC.Insert(adjInfoCA)
|
|
adjLsaC.Insert(adjInfoCD)
|
|
adjLsaC.Insert(adjInfoCE)
|
|
// 路由器E
|
|
adjLsaE := testCreateAdjLsa("/routerE")
|
|
adjInfoEB := testCreateAdjInfo(50, "/routerB")
|
|
adjInfoEC := testCreateAdjInfo(10, "/routerC")
|
|
adjInfoED := testCreateAdjInfo(20, "/routerD")
|
|
adjLsaE.Insert(adjInfoEB)
|
|
adjLsaE.Insert(adjInfoEC)
|
|
adjLsaE.Insert(adjInfoED)
|
|
// 路由器D
|
|
adjLsaD := testCreateAdjLsa("/routerD")
|
|
adjInfoDA := testCreateAdjInfo(30, "/min/pkusz/routerA")
|
|
adjInfoDC := testCreateAdjInfo(60, "/routerC")
|
|
adjInfoDE := testCreateAdjInfo(20, "/routerE")
|
|
adjLsaD.Insert(adjInfoDA)
|
|
adjLsaD.Insert(adjInfoDC)
|
|
adjLsaD.Insert(adjInfoDE)
|
|
mlsdb.InstallLsa(adjLsaB)
|
|
mlsdb.InstallLsa(adjLsaC)
|
|
mlsdb.InstallLsa(adjLsaD)
|
|
mlsdb.InstallLsa(adjLsaE)
|
|
|
|
// 5. 调用计算路由函数,并打印路由表
|
|
rt.calculateLsRoutingTable()
|
|
rt.PrintSelf()
|
|
}
|
|
|
|
//
|
|
// TestRoutingTable_ScheduleRoutingTableCalculation
|
|
// @Description: 测试安排路由计算
|
|
// 由于RT会在监听到邻接lsa改变时被直接安排做计算,因此,这里只需要等待其触发就好。触发间隔为15s。
|
|
// @param t
|
|
//
|
|
func TestRoutingTable_ScheduleRoutingTableCalculation(t *testing.T) {
|
|
// 1. 组件初始化
|
|
// 配置文件初始化
|
|
mlsrConfig, err := common.ParseConfig(testConfigPath)
|
|
if err != nil {
|
|
common2.LogInfo("配置文件解析错误")
|
|
}
|
|
// 调度器初始化
|
|
sche := new(lsdb.MlsrScheduler)
|
|
sche.Init()
|
|
// LogicFace初始化(假设初始化,暂时用不到)
|
|
face := new(logicface.LogicFace)
|
|
// LSDB初始化
|
|
mlsdb := new(lsdb.Lsdb)
|
|
mlsdb.Init(mlsrConfig, sche, face)
|
|
|
|
// 2. 打印lsdb中所有本机lsa
|
|
lsas, _ := mlsdb.LsaContainer.GetLSAsByType(lsa.LsaADJACENCYType)
|
|
for i := 0; i < len(lsas); i++ {
|
|
common2.LogInfo(lsas[i].ToString())
|
|
}
|
|
lsas, _ = mlsdb.LsaContainer.GetLSAsByType(lsa.LsaNAMEType)
|
|
for i := 0; i < len(lsas); i++ {
|
|
common2.LogInfo(lsas[i].ToString())
|
|
}
|
|
fmt.Println("lsdb是否正在忙于构建lsdb: ", mlsdb.GetIsBuildAdjLsaScheduled())
|
|
|
|
// 3. 路由表初始化
|
|
rt := new(RoutingTable)
|
|
rt.Init(mlsrConfig, sche, mlsdb)
|
|
|
|
// 安装本机adjlsa
|
|
mlsdb.BuildAndInstallOwnAdjLsa()
|
|
|
|
fmt.Println("路由表是否已经知道lsdb成功构建了邻接Lsa: ", rt.m_ownAdjLsaExist)
|
|
|
|
// 4. 安装其它路由器的邻接lsa
|
|
// 传入一些其它虚拟lsa,这些lsa与本机lsa共同形成一个小型路由拓扑
|
|
// 路由器B
|
|
adjLsaB := testCreateAdjLsa("/routerB")
|
|
adjInfoBA := testCreateAdjInfo(10, "/min/pkusz/routerA")
|
|
adjInfoBE := testCreateAdjInfo(50, "/routerE")
|
|
adjLsaB.Insert(adjInfoBA)
|
|
adjLsaB.Insert(adjInfoBE)
|
|
// 路由器C
|
|
adjLsaC := testCreateAdjLsa("/routerC")
|
|
adjInfoCA := testCreateAdjInfo(100, "/min/pkusz/routerA")
|
|
adjInfoCE := testCreateAdjInfo(10, "/routerE")
|
|
adjInfoCD := testCreateAdjInfo(60, "/routerD")
|
|
adjLsaC.Insert(adjInfoCA)
|
|
adjLsaC.Insert(adjInfoCD)
|
|
adjLsaC.Insert(adjInfoCE)
|
|
// 路由器E
|
|
adjLsaE := testCreateAdjLsa("/routerE")
|
|
adjInfoEB := testCreateAdjInfo(50, "/routerB")
|
|
adjInfoEC := testCreateAdjInfo(10, "/routerC")
|
|
adjInfoED := testCreateAdjInfo(20, "/routerD")
|
|
adjLsaE.Insert(adjInfoEB)
|
|
adjLsaE.Insert(adjInfoEC)
|
|
adjLsaE.Insert(adjInfoED)
|
|
// 路由器D
|
|
adjLsaD := testCreateAdjLsa("/routerD")
|
|
adjInfoDA := testCreateAdjInfo(30, "/min/pkusz/routerA")
|
|
adjInfoDC := testCreateAdjInfo(60, "/routerC")
|
|
adjInfoDE := testCreateAdjInfo(20, "/routerE")
|
|
adjLsaD.Insert(adjInfoDA)
|
|
adjLsaD.Insert(adjInfoDC)
|
|
adjLsaD.Insert(adjInfoDE)
|
|
mlsdb.InstallLsa(adjLsaB)
|
|
mlsdb.InstallLsa(adjLsaC)
|
|
mlsdb.InstallLsa(adjLsaD)
|
|
mlsdb.InstallLsa(adjLsaE)
|
|
|
|
// 5. 只是等待。并打印路由表
|
|
for i := 0; i < 60; i++ {
|
|
time.Sleep(time.Second)
|
|
fmt.Println(i+1, " seconds later...")
|
|
rt.PrintSelf()
|
|
}
|
|
}
|