mirror of
https://gitee.com/willfree/mlsr.git
synced 2026-06-15 19:24:47 +08:00
498 lines
17 KiB
Go
498 lines
17 KiB
Go
// Package route
|
|
// @Author: Wang Feng
|
|
// @Description:
|
|
// @Version: 0.1.0
|
|
// @Date: 2022/7/1 17:12
|
|
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
|
//
|
|
|
|
package route
|
|
|
|
import (
|
|
"fmt"
|
|
common2 "minlib/common"
|
|
"minlib/component"
|
|
"minlib/logicface"
|
|
"mlsr/common"
|
|
"mlsr/lsa"
|
|
"mlsr/lsdb"
|
|
"testing"
|
|
"time"
|
|
)
|
|
|
|
//
|
|
// TestNamePrefixTable_FinalTest
|
|
// @Description: 终极测试
|
|
// 先初始化Lsdb、配置项等结构体,再初始化路由表,并将lsdb传入路由表;
|
|
// 然后构建五节点邻接拓扑(这块在mlsr完全开发完成之后,将是通过hello和sync来触发更新的),
|
|
// 这个时候应触发路由表的路由计算功能。
|
|
// 之后再给每个路由器分配一些名称前缀,这个时候应触发名称前缀表的前缀更新下一跳功能。
|
|
// 最后,打印输出路由表所有参数,以及名称前缀表所有参数,手动查看是否与预期值相同。
|
|
// @param t
|
|
//
|
|
func TestNamePrefixTable_FinalTest(t *testing.T) {
|
|
// 1. 建立前置结构体(lsdb等)
|
|
// 配置文件初始化
|
|
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)
|
|
|
|
// 4. 名称前缀表初始化
|
|
npt := new(NamePrefixTable)
|
|
npt.Init(mlsrConfig.GetRouterPrefix(), rt, rt.AfterRoutingChange, mlsdb.OnLsdbModified)
|
|
|
|
// 5. 安装本机adjlsa => 将触发两个事件:A. 安排15s后做路由表计算;B.触发名称前缀表更新(本机lsa不做更新)
|
|
mlsdb.BuildAndInstallOwnAdjLsa()
|
|
|
|
fmt.Println("路由表是否已经知道lsdb成功构建了邻接Lsa: ", rt.m_ownAdjLsaExist)
|
|
|
|
// 6. 安装其它路由器的邻接lsa => A. 安排15s后做路由表计算;B.触发名称前缀表更新(邻接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)
|
|
|
|
// 7. 只是等待。并打印路由表
|
|
for i := 0; i < 30; i++ {
|
|
time.Sleep(time.Second)
|
|
fmt.Println(i+1, " seconds later...")
|
|
rt.PrintSelf()
|
|
}
|
|
}
|
|
|
|
//
|
|
// TestNamePrefixTable_AddEntry
|
|
// @Description: 测试增加一个条目
|
|
// @param t
|
|
//
|
|
func TestNamePrefixTable_AddEntryAndRemoveEntry(t *testing.T) {
|
|
// 1. 建立前置结构体(lsdb等)
|
|
// 配置文件初始化
|
|
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)
|
|
|
|
// 4. 名称前缀表初始化
|
|
npt := new(NamePrefixTable)
|
|
npt.Init(mlsrConfig.GetRouterPrefix(), rt, rt.AfterRoutingChange, mlsdb.OnLsdbModified)
|
|
|
|
// 5. 安装本机adjlsa => 将触发两个事件:A. 安排15s后做路由表计算;B.触发名称前缀表更新(本机lsa不做更新)
|
|
mlsdb.BuildAndInstallOwnAdjLsa()
|
|
// 看看npt
|
|
fmt.Println("光秃秃啥也没有:")
|
|
npt.PrintSelf()
|
|
|
|
// 6. 插入一个条目:目的路由器没有在路由表中
|
|
name, _ := component.CreateIdentifierByString("/someSourceNames")
|
|
route, _ := component.CreateIdentifierByString("/routeAAA")
|
|
npt.AddEntry(name, route)
|
|
fmt.Println("加了一个虚空资源")
|
|
npt.PrintSelf()
|
|
|
|
// 7. 加入五星拓扑
|
|
// 安装其它路由器的邻接lsa => A. 安排15s后做路由表计算;B.触发名称前缀表更新(邻接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)
|
|
for i := 0; i < 15; i++ {
|
|
time.Sleep(time.Second)
|
|
fmt.Println(i+1, " seconds later...")
|
|
}
|
|
fmt.Println("五星拓扑构建完成.")
|
|
|
|
// 8. 加入一个拓扑之上的资源
|
|
nameC, _ := component.CreateIdentifierByString("/realSourcesInRouterC")
|
|
routeC, _ := component.CreateIdentifierByString("/routerC")
|
|
npt.AddEntry(nameC, routeC)
|
|
fmt.Println("加了一个真实资源在路由器C上")
|
|
npt.PrintSelf()
|
|
|
|
// 9. 加入一个拓扑之上的资源,该资源被允许存在在两个路由器之上
|
|
routeB, _ := component.CreateIdentifierByString("/routerB")
|
|
npt.AddEntry(nameC, routeB)
|
|
fmt.Println("将路由C之上的真实资源同时加在路由器B上")
|
|
npt.PrintSelf()
|
|
|
|
// 10.1 删除一个虚空资源
|
|
npt.RemoveEntry(name, route)
|
|
fmt.Println("---------- 删除一个虚空资源 -----------")
|
|
npt.PrintSelf()
|
|
|
|
// 10.2 删除一个在两个路由器上的资源标识,只删除某个路由器上的该资源
|
|
npt.RemoveEntry(nameC, routeB)
|
|
fmt.Println("--------------- 删除一个在两个路由器上的资源标识 ------------------")
|
|
npt.PrintSelf()
|
|
|
|
// 10.3 删除一个路由器标识
|
|
routeE, _ := component.CreateIdentifierByString("/routerE")
|
|
npt.RemoveEntry(routeE, routeE)
|
|
fmt.Println("---------- 删除一个路由器标识: routerE -----------")
|
|
npt.PrintSelf()
|
|
}
|
|
|
|
//
|
|
// TestNamePrefixTable_UpdateFromLsdb
|
|
// @Description: 测试根据Lsdb的变化而更新名称前缀表
|
|
// @param t
|
|
//
|
|
func TestNamePrefixTable_UpdateFromLsdb(t *testing.T) {
|
|
// 1. 建立前置结构体(lsdb等)
|
|
// 配置文件初始化
|
|
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)
|
|
|
|
// 4. 名称前缀表初始化
|
|
npt := new(NamePrefixTable)
|
|
npt.Init(mlsrConfig.GetRouterPrefix(), rt, rt.AfterRoutingChange, mlsdb.OnLsdbModified)
|
|
|
|
// 5. 安装本机adjlsa => 将触发两个事件:A. 安排15s后做路由表计算;B.触发名称前缀表更新(本机lsa不做更新)
|
|
mlsdb.BuildAndInstallOwnAdjLsa()
|
|
// 看看npt
|
|
fmt.Println("光秃秃啥也没有:")
|
|
npt.PrintSelf()
|
|
|
|
// 6. 插入一个条目:目的路由器没有在路由表中
|
|
name, _ := component.CreateIdentifierByString("/someSourceNames")
|
|
route, _ := component.CreateIdentifierByString("/routeAAA")
|
|
npt.AddEntry(name, route)
|
|
fmt.Println("加了一个虚空资源")
|
|
npt.PrintSelf()
|
|
|
|
// 7. 加入五星拓扑
|
|
// 安装其它路由器的邻接lsa => A. 安排15s后做路由表计算;B.触发名称前缀表更新(邻接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)
|
|
for i := 0; i < 15; i++ {
|
|
time.Sleep(time.Second)
|
|
fmt.Println(i+1, " seconds later...")
|
|
}
|
|
fmt.Println("五星拓扑构建完成.")
|
|
|
|
// 8. 加入一个拓扑之上的资源
|
|
nameC, _ := component.CreateIdentifierByString("/realSourcesInRouterC")
|
|
routeC, _ := component.CreateIdentifierByString("/routerC")
|
|
npt.AddEntry(nameC, routeC)
|
|
fmt.Println("加了一个真实资源在路由器C上")
|
|
npt.PrintSelf()
|
|
|
|
// 9. 加入一个拓扑之上的资源,该资源被允许存在在两个路由器之上
|
|
routeB, _ := component.CreateIdentifierByString("/routerB")
|
|
npt.AddEntry(nameC, routeB)
|
|
fmt.Println("将路由C之上的真实资源同时加在路由器B上")
|
|
npt.PrintSelf()
|
|
|
|
// 10. 将五拓扑中的 D->E 这条链路给切断:以重新install LSA的形式。
|
|
// 路由器E
|
|
adjNewLsaE := testCreateAdjLsa("/routerE")
|
|
adjNewLsaE.SetSeqNo(22222)
|
|
adjNewLsaE.Insert(adjInfoEB)
|
|
adjNewLsaE.Insert(adjInfoEC)
|
|
// 路由器D
|
|
adjNewLsaD := testCreateAdjLsa("/routerD")
|
|
adjNewLsaD.SetSeqNo(22222)
|
|
adjNewLsaD.Insert(adjInfoDA)
|
|
adjNewLsaD.Insert(adjInfoDC)
|
|
// 将两者重新安装
|
|
mlsdb.InstallLsa(adjNewLsaE)
|
|
mlsdb.InstallLsa(adjNewLsaD)
|
|
|
|
// 静候下一个路由计算间隔
|
|
for i := 0; i < 15; i++ {
|
|
time.Sleep(time.Second)
|
|
fmt.Println(i+1, " seconds later...")
|
|
}
|
|
|
|
// 观察触发的双表变化
|
|
npt.PrintSelf()
|
|
}
|
|
|
|
//
|
|
// TestNamePrefixTable_UpdateWithNewRoute
|
|
// @Description: 测试根据路由变化而更新名称前缀表.
|
|
// 当路由表更新时,名称前缀表应随之更新。如,路由表被清空,则名称前缀表对应前缀的下一跳也应随之清空。
|
|
// @param t
|
|
//
|
|
func TestNamePrefixTable_UpdateWithNewRoute(t *testing.T) {
|
|
// 1. 建立前置结构体(lsdb等)
|
|
// 配置文件初始化
|
|
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)
|
|
|
|
// 4. 名称前缀表初始化
|
|
npt := new(NamePrefixTable)
|
|
npt.Init(mlsrConfig.GetRouterPrefix(), rt, rt.AfterRoutingChange, mlsdb.OnLsdbModified)
|
|
|
|
// 5. 安装本机adjlsa => 将触发两个事件:A. 安排15s后做路由表计算;B.触发名称前缀表更新(本机lsa不做更新)
|
|
mlsdb.BuildAndInstallOwnAdjLsa()
|
|
// 看看npt
|
|
fmt.Println("光秃秃啥也没有:")
|
|
npt.PrintSelf()
|
|
|
|
// 6. 插入一个条目:目的路由器没有在路由表中
|
|
name, _ := component.CreateIdentifierByString("/someSourceNames")
|
|
route, _ := component.CreateIdentifierByString("/routeAAA")
|
|
npt.AddEntry(name, route)
|
|
fmt.Println("加了一个虚空资源")
|
|
npt.PrintSelf()
|
|
|
|
// 7. 加入五星拓扑
|
|
// 安装其它路由器的邻接lsa => A. 安排15s后做路由表计算;B.触发名称前缀表更新(邻接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)
|
|
for i := 0; i < 15; i++ {
|
|
time.Sleep(time.Second)
|
|
fmt.Println(i+1, " seconds later...")
|
|
}
|
|
fmt.Println("五星拓扑构建完成.")
|
|
|
|
// 8. 加入一个拓扑之上的资源
|
|
nameC, _ := component.CreateIdentifierByString("/realSourcesInRouterC")
|
|
routeC, _ := component.CreateIdentifierByString("/routerC")
|
|
npt.AddEntry(nameC, routeC)
|
|
fmt.Println("加了一个真实资源在路由器C上")
|
|
npt.PrintSelf()
|
|
|
|
// 9. 加入一个拓扑之上的资源,该资源被允许存在在两个路由器之上
|
|
routeB, _ := component.CreateIdentifierByString("/routerB")
|
|
npt.AddEntry(nameC, routeB)
|
|
fmt.Println("将路由C之上的真实资源同时加在路由器B上")
|
|
npt.PrintSelf()
|
|
|
|
// 根据配置文件,构造本机的名称LSA
|
|
adjLsa := new(lsa.AdjLsa)
|
|
adjLsa.SetOriginRouter(mlsrConfig.GetRouterPrefix())
|
|
adjLsa.SetSeqNo(11022) // 序列号
|
|
adjLsa.SetLsaExpirationTime(1283719) // 超期时间
|
|
adjLsa.AdjLsaAdjacenctList.InsertAdjacenctList(mlsrConfig.GetAdjacencyList()) // 名称前缀列表
|
|
// 10. 从Lsdb中删除该lsa,以观察触发路由更改,由此触发路由表清零,从而触发所有与之相关的名称前缀列表的更新
|
|
mlsdb.RemoveLsa(adjLsa)
|
|
npt.PrintSelf()
|
|
}
|