From fa7c41e4fbf5354290de6e0ca664741c1d6a21f9 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 24 Jun 2022 16:08:20 +0800 Subject: [PATCH 01/17] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9Signal?= =?UTF-8?q?=E5=A6=82=E4=BD=95=E4=BD=BF=E7=94=A8=E7=9A=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/Signal2_test.go | 63 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 utils/Signal2_test.go diff --git a/utils/Signal2_test.go b/utils/Signal2_test.go new file mode 100644 index 0000000..19b65f9 --- /dev/null +++ b/utils/Signal2_test.go @@ -0,0 +1,63 @@ +// Package utils +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/6/24 12:05 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package utils + +import "testing" + +// +// TestSignalUsage +// @Description: 测试如何使用Signal +// @param t +// +func TestSignalUsage(t *testing.T) { + s := NewSignal() + + hit1 := 0 + + // 等待通知,被通知后,执行此函数 + func1 := func(args ...interface{}) { + hit1 += 1 + num := args[0].(int) + if num != 8106 { + panic("Test two arguments failed.") + } + num1 := args[1].(int) + if num1 != 8107 { + panic("Test two arguments failed.") + } + } + + // 建立执行函数与信号的联系 + conn := s.Connect(func1) + + // 信号发出,即通知出去 + s.Emit(8106, 8107) + + if hit1 != 1 { + t.Fatalf("ManualDisconnect failed.") + } + + if !conn.IsConnected() { + t.Fatalf("ManualDisconnect failed.") + } + + // 关闭与信号的联系 + conn.Disconnect() + + if conn.IsConnected() { + t.Fatalf("ManualDisconnect failed.") + } + + s.Emit() + if hit1 != 1 { + t.Fatalf("ManualDisconnect failed.") + } + + conn.Disconnect() +} From ab3f87bceed838810fc86a7c0368cc3038e09024 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 24 Jun 2022 20:27:43 +0800 Subject: [PATCH 02/17] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Lsdb=E4=B8=AD=E5=AF=B9?= =?UTF-8?q?=E4=BA=8Elsdb=E8=A2=AB=E4=BF=AE=E6=94=B9=E7=9A=84=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/Lsdb.go | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index 657f38f..59feb74 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -18,6 +18,7 @@ import ( "mlsr/communication" "mlsr/lsa" "mlsr/lsdb/LsaContainer" + "mlsr/utils" "time" ) @@ -60,6 +61,9 @@ type Lsdb struct { isBuildAdjLsaScheduled bool // 是否安排构建邻接LSA adjBuildCount uint64 // 邻接LSA的构建的统计数目 + + // 信号:用以通知“Lsdb被修改”这个事件的发生 + onLsdbModified *utils.Signal } func (l *Lsdb) Init(mc *common.MlsrConfig, ms *MlsrScheduler, @@ -102,6 +106,9 @@ func (l *Lsdb) Init(mc *common.MlsrConfig, ms *MlsrScheduler, // 构建并安装自己的名称LSA l.BuildAndInstallOwnNameLsa() + + // 信号初始化 + l.onLsdbModified = utils.NewSignal() } // @@ -303,8 +310,8 @@ func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { common2.LogError("Add Lsa error", lsa.ToString()) return } - // 2. 触发LSDB安装LSA的动作信号 - // todo: onLsdbModified(lsa, LsdbUpdate::INSTALLED, {}, {}); + // 2. 触发LSDB安装LSA的动作信号 onLsdbModified(lsa, LsdbUpdate::INSTALLED, {}, {}); + l.onLsdbModified.Emit(lsa, INSTALLED) // 3. 设置LSA超期时间事件 l.ScheduleLsaExpiration(lsa, timeToExpire) } else if lsaInDb.GetSeqNo() < lsa.GetSeqNo() { @@ -316,14 +323,32 @@ func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { common2.LogError("Add Lsa error", lsa.ToString()) return } - // 2. 触发LSDB更新LSA的动作信号 - // todo: onLsdbModified(lsa, LsdbUpdate::UPDATED, namesToAdd, namesToRemove); + // 2. 触发LSDB更新LSA的动作信号 onLsdbModified(lsa, LsdbUpdate::UPDATED, namesToAdd, namesToRemove); + // todo 实现该方法:对比两个lsa,将其不同的部分取出来 + updated, namesToAdd, namesToRemove := l.compareTwoLsa(lsaInDb, lsa) + if updated { + l.onLsdbModified.Emit(lsa, UPDATED, namesToAdd, namesToRemove) + } // 3. 设置LSA超期时间事件 l.ScheduleLsaExpiration(lsa, timeToExpire) common2.LogDebug("Updated Lsa ", lsa.ToString()) } } +// +// compareTwoLsa +// @Description: 对比两个lsa,将其不同的部分取出来 +// @receiver l +// @param lsaA +// @param lsaB +// @return bool +// @return []*component.Identifier +// @return []component.Identifier +// +func (l *Lsdb) compareTwoLsa(lsaA lsa.ILsa, lsaB lsa.ILsa) (bool, []*component.Identifier, []component.Identifier) { + return true, nil, nil +} + // // RemoveLsa // @Description: 从LSDB中删除LSA @@ -336,6 +361,7 @@ func (l *Lsdb) RemoveLsa(lsa lsa.ILsa) { common2.LogError("") return } + l.onLsdbModified.Emit(lsa, REMOVED) common2.LogDebug("Removed LSA: ", lsa.ToString()) } From ec747d1e91306f12bfefb75add513c392758a852 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 24 Jun 2022 21:26:54 +0800 Subject: [PATCH 03/17] =?UTF-8?q?=E5=A2=9E=E5=8A=A0Lsdb=E4=B8=AD=E5=AF=B9?= =?UTF-8?q?=E4=BA=8E=E8=B7=AF=E7=94=B1=E8=A1=A8=E8=A2=AB=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E4=BA=8B=E4=BB=B6=EF=BC=9B=E5=A2=9E=E5=8A=A0=E4=BA=8B?= =?UTF-8?q?=E4=BB=B6=E8=A7=A6=E5=8F=91=E6=8E=A5=E6=94=B6=E5=8A=A8=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/Lsdb.go | 14 ++++---- route/NamePrefixTable.go | 46 +++++++++++++++++++++++++ route/RoutingTable.go | 74 ++++++++++++++++++++++++++++++++++------ 3 files changed, 117 insertions(+), 17 deletions(-) diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index 59feb74..4227210 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -63,7 +63,7 @@ type Lsdb struct { adjBuildCount uint64 // 邻接LSA的构建的统计数目 // 信号:用以通知“Lsdb被修改”这个事件的发生 - onLsdbModified *utils.Signal + OnLsdbModified *utils.Signal } func (l *Lsdb) Init(mc *common.MlsrConfig, ms *MlsrScheduler, @@ -108,7 +108,7 @@ func (l *Lsdb) Init(mc *common.MlsrConfig, ms *MlsrScheduler, l.BuildAndInstallOwnNameLsa() // 信号初始化 - l.onLsdbModified = utils.NewSignal() + l.OnLsdbModified = utils.NewSignal() } // @@ -310,8 +310,8 @@ func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { common2.LogError("Add Lsa error", lsa.ToString()) return } - // 2. 触发LSDB安装LSA的动作信号 onLsdbModified(lsa, LsdbUpdate::INSTALLED, {}, {}); - l.onLsdbModified.Emit(lsa, INSTALLED) + // 2. 触发LSDB安装LSA的动作信号 OnLsdbModified(lsa, LsdbUpdate::INSTALLED, {}, {}); + l.OnLsdbModified.Emit(lsa, INSTALLED) // 3. 设置LSA超期时间事件 l.ScheduleLsaExpiration(lsa, timeToExpire) } else if lsaInDb.GetSeqNo() < lsa.GetSeqNo() { @@ -323,11 +323,11 @@ func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { common2.LogError("Add Lsa error", lsa.ToString()) return } - // 2. 触发LSDB更新LSA的动作信号 onLsdbModified(lsa, LsdbUpdate::UPDATED, namesToAdd, namesToRemove); + // 2. 触发LSDB更新LSA的动作信号 OnLsdbModified(lsa, LsdbUpdate::UPDATED, namesToAdd, namesToRemove); // todo 实现该方法:对比两个lsa,将其不同的部分取出来 updated, namesToAdd, namesToRemove := l.compareTwoLsa(lsaInDb, lsa) if updated { - l.onLsdbModified.Emit(lsa, UPDATED, namesToAdd, namesToRemove) + l.OnLsdbModified.Emit(lsa, UPDATED, namesToAdd, namesToRemove) } // 3. 设置LSA超期时间事件 l.ScheduleLsaExpiration(lsa, timeToExpire) @@ -361,7 +361,7 @@ func (l *Lsdb) RemoveLsa(lsa lsa.ILsa) { common2.LogError("") return } - l.onLsdbModified.Emit(lsa, REMOVED) + l.OnLsdbModified.Emit(lsa, REMOVED) common2.LogDebug("Removed LSA: ", lsa.ToString()) } diff --git a/route/NamePrefixTable.go b/route/NamePrefixTable.go index 09fd953..63cb50a 100644 --- a/route/NamePrefixTable.go +++ b/route/NamePrefixTable.go @@ -13,6 +13,7 @@ import ( "minlib/component" "mlsr/lsa" "mlsr/lsdb" + "mlsr/utils" ) // @@ -29,9 +30,54 @@ type NamePrefixTable struct { m_ownRouterName *component.Identifier // 路由表。包含路由计算器计算出来的每个路由表标识及其对应的下一跳列表 m_routingTable *RoutingTable + + // 信号接收器 + m_afterRoutingChangeConnection *utils.Connection + m_afterLsdbModified *utils.Connection + // todo fib } +// +// Init +// @Description: 名称前缀表初始化 +// @receiver t +// @param ownRouterName +// @param routingTable +// @param afterRoutingChangeSignal +// @param afterLsdbModifiedSignal +// +func (t *NamePrefixTable) Init(ownRouterName *component.Identifier, + routingTable *RoutingTable, afterRoutingChangeSignal *utils.Signal, + afterLsdbModifiedSignal *utils.Signal) { + // 赋值变量 + t.m_ownRouterName = ownRouterName + t.m_routingTable = routingTable + + // 监听路由表的修改,触发NPT表修改 + bindRoutingChangeFunc := func(args ...interface{}) { + entrys := args[0].([]*RoutingTableEntry) + t.UpdateWithNewRoute(entrys) + } + t.m_afterRoutingChangeConnection = afterRoutingChangeSignal.Connect(bindRoutingChangeFunc) + + // 监听LSDB修改,触发NPT表修改 + bindLsdbModifiedFunc := func(args ...interface{}) { + // 获取四个参数 + ilsa := args[0].(lsa.ILsa) + updateType := args[1].(lsdb.LsdbUpdate) + var namesToAdd []*component.Identifier + var namesToRemove []*component.Identifier + if updateType == lsdb.REMOVED { + namesToAdd = args[2].([]*component.Identifier) + namesToRemove = args[3].([]*component.Identifier) + } + // 执行更新操作 + t.UpdateFromLsdb(ilsa, updateType, namesToAdd, namesToRemove) + } + t.m_afterLsdbModified = afterLsdbModifiedSignal.Connect(bindLsdbModifiedFunc) +} + // // UpdateFromLsdb // @Description: 根据lsdb的更新,对名称进行增加、更新或移除 diff --git a/route/RoutingTable.go b/route/RoutingTable.go index 1958963..36d1978 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -17,6 +17,7 @@ import ( "mlsr/extensions" "mlsr/lsa" "mlsr/lsdb" + "mlsr/utils" "time" ) @@ -39,6 +40,11 @@ type RoutingTable struct { // 当前路由器的邻接LSA是否存在 m_ownAdjLsaExist bool + // 通知路由表更改的信号 + afterRoutingChange *utils.Signal + // 监听Lsdb被修改的信号接收器 + m_afterLsdbModified *utils.Connection + // 双曲坐标状态 => 暂时用不到 m_hyperbolicState uint32 } @@ -66,16 +72,64 @@ func (t *RoutingTable) Init(mc *common.MlsrConfig, t.m_isRoutingTableCalculating = false t.m_isRouteCalculationScheduled = false - // todo 事件监听:如果监听到了传来的删除本地邻接LSA操作 + // 初始化信号 + t.afterRoutingChange = utils.NewSignal() - // todo 事件监听:如果监听到了传来的安装本地邻接LSA操作 - t.m_ownAdjLsaExist = true + bindFunc := func(args ...interface{}) { + // 获取四个参数 + ilsa := args[0].(lsa.ILsa) + updateType := args[1].(lsdb.LsdbUpdate) + //var namesToAdd []*component.Identifier + //var namesToRemove []*component.Identifier + //if updateType == lsdb.REMOVED { + // namesToAdd = args[2].([]*component.Identifier) + // namesToRemove = args[3].([]*component.Identifier) + //} - // todo 事件监听:如果监听到了传来的安装或更新本地邻接LSA操作 - //err := t.ScheduleRoutingTableCalculation() - //if err != nil { - // common2.LogError("RoutingTable.Init ScheduleRoutingTableCalculation error.") - //} + // 根据四个参数做进一步的信息获取 + lsaType := ilsa.GetType() + updateForOwnAdjacencyLsa := false + if ilsa.GetOriginRouter().ToUri() == t.mlsrConfig.GetRouterPrefix().ToUri() && + lsaType == lsa.LsaADJACENCYType { + updateForOwnAdjacencyLsa = true + } + + // 事件监听:如果监听到了传来的删除本地邻接LSA操作 + if updateType == lsdb.REMOVED && updateForOwnAdjacencyLsa { + // 如果删除了自己的邻接LSA,那么我们就没有活动邻居。 + //(永远不会删除自身坐标LSA。但路由表计算在HelloProtocol中安排。HR的路由表计算器会考虑链路的非活动状态) + common2.LogDebug("No Adj LSA of router itself, routing table can not be calculated :(") + t.clearRoutingTable() + common2.LogDebug("Calling Update NPT With new Route") + // todo 触发改变 afterRoutingChange(m_rTable); + t.afterRoutingChange.Emit(t.rTable) + t.m_ownAdjLsaExist = false + } + + // 事件监听:如果监听到了传来的安装本地邻接LSA操作 + if updateType == lsdb.INSTALLED && updateForOwnAdjacencyLsa { + t.m_ownAdjLsaExist = true + } + + scheduleCalculation := false + + // 事件监听:如果监听到了传来的安装或更新本地邻接LSA操作 + // 不要在移除时做任何事情,等待Hello协议去确认,然后做出响应 + if updateType == lsdb.INSTALLED || updateType == lsdb.UPDATED { + if lsaType == lsa.LsaADJACENCYType { + scheduleCalculation = true + } + } + + if scheduleCalculation { + err := t.ScheduleRoutingTableCalculation() + if err != nil { + common2.LogError("RoutingTable.Init ScheduleRoutingTableCalculation error.") + } + } + } + + t.m_afterLsdbModified = t.lsdb.OnLsdbModified.Connect(bindFunc) } // @@ -208,9 +262,9 @@ func (t *RoutingTable) calculateLsRoutingTable() { t.AddNextHop(routers[i], nexthops[i]) } - // todo: 开始根据新计算的路由去更新NPT表 + // 开始根据新计算的路由去更新NPT表 common2.LogInfo("Calling Update NPT With new Route") - //todo + t.afterRoutingChange.Emit(t.rTable) } // From 645e5936ef1829f99715aedc1873e02008072a17 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 24 Jun 2022 21:30:55 +0800 Subject: [PATCH 04/17] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8F=82=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E5=90=8D=E7=A7=B0=E9=A6=96=E5=AD=97=E6=AF=8D=E5=A4=A7?= =?UTF-8?q?=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/RoutingTable.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/route/RoutingTable.go b/route/RoutingTable.go index 36d1978..7250cf5 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -41,7 +41,7 @@ type RoutingTable struct { m_ownAdjLsaExist bool // 通知路由表更改的信号 - afterRoutingChange *utils.Signal + AfterRoutingChange *utils.Signal // 监听Lsdb被修改的信号接收器 m_afterLsdbModified *utils.Connection @@ -73,7 +73,7 @@ func (t *RoutingTable) Init(mc *common.MlsrConfig, t.m_isRouteCalculationScheduled = false // 初始化信号 - t.afterRoutingChange = utils.NewSignal() + t.AfterRoutingChange = utils.NewSignal() bindFunc := func(args ...interface{}) { // 获取四个参数 @@ -101,8 +101,8 @@ func (t *RoutingTable) Init(mc *common.MlsrConfig, common2.LogDebug("No Adj LSA of router itself, routing table can not be calculated :(") t.clearRoutingTable() common2.LogDebug("Calling Update NPT With new Route") - // todo 触发改变 afterRoutingChange(m_rTable); - t.afterRoutingChange.Emit(t.rTable) + // todo 触发改变 AfterRoutingChange(m_rTable); + t.AfterRoutingChange.Emit(t.rTable) t.m_ownAdjLsaExist = false } @@ -264,7 +264,7 @@ func (t *RoutingTable) calculateLsRoutingTable() { // 开始根据新计算的路由去更新NPT表 common2.LogInfo("Calling Update NPT With new Route") - t.afterRoutingChange.Emit(t.rTable) + t.AfterRoutingChange.Emit(t.rTable) } // From 96c60a5caeff29ba4314bb94dfe9da2cf9455186 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 24 Jun 2022 21:49:51 +0800 Subject: [PATCH 05/17] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E8=A1=A8=E7=BC=93=E5=AD=98=E6=9D=A1=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NamePrefixTableEntry_test.go | 15 ++++++++++ route/RoutingTablePoolEntry_test.go | 45 +++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) create mode 100644 route/NamePrefixTableEntry_test.go create mode 100644 route/RoutingTablePoolEntry_test.go diff --git a/route/NamePrefixTableEntry_test.go b/route/NamePrefixTableEntry_test.go new file mode 100644 index 0000000..06d5b07 --- /dev/null +++ b/route/NamePrefixTableEntry_test.go @@ -0,0 +1,15 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/6/24 21:33 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import "testing" + +func TestNamePrefixTable_AddEntry(t *testing.T) { + +} \ No newline at end of file diff --git a/route/RoutingTablePoolEntry_test.go b/route/RoutingTablePoolEntry_test.go new file mode 100644 index 0000000..ba66ff6 --- /dev/null +++ b/route/RoutingTablePoolEntry_test.go @@ -0,0 +1,45 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/6/24 21:44 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import ( + "fmt" + "minlib/component" + "testing" +) + +// +// TestRoutingTablePoolEntry_Init +// @Description: 测试初始化 +// @param t +// +func TestRoutingTablePoolEntry_Init(t *testing.T) { + iden, _ := component.CreateIdentifierByString("/ifIhaveAnotherChance") + rtpe := new(RoutingTablePoolEntry) + rtpe.Init(iden) + + // 打印 + fmt.Println(rtpe.m_useCount) + fmt.Println(rtpe.m_destination.ToUri()) +} + +// +// TestRoutingTablePoolEntry_InitDest +// @Description: 测试初始化 +// @param t +// +func TestRoutingTablePoolEntry_InitDest(t *testing.T) { + iden, _ := component.CreateIdentifierByString("/ifIhaveAnotherChance") + rtpe := new(RoutingTablePoolEntry) + rtpe.InitDest(iden, 123) + + // 打印 + fmt.Println(rtpe.m_useCount) + fmt.Println(rtpe.m_destination.ToUri()) +} From 261cbd72ec47012d08ab4a0b3c5b08aa17348f69 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 30 Jun 2022 16:46:14 +0800 Subject: [PATCH 06/17] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dlsdb=E4=B8=AD=E4=BF=A1?= =?UTF-8?q?=E5=8F=B7=E6=8A=A5=E9=94=99=EF=BC=8C=E4=BF=A1=E5=8F=B7=E7=9A=84?= =?UTF-8?q?=E5=A3=B0=E6=98=8E=E9=9C=80=E8=A6=81=E5=9C=A8=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E5=8C=96=E8=AF=AD=E5=8F=A5=E7=9A=84=E6=9C=80=E5=89=8D=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/Lsdb.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index 4227210..ed74ef5 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -68,6 +68,9 @@ type Lsdb struct { func (l *Lsdb) Init(mc *common.MlsrConfig, ms *MlsrScheduler, _face *logicface.LogicFace) { + // 信号初始化 + l.OnLsdbModified = utils.NewSignal() + // 配置项 l.mlsrConfig = mc // 调度器 @@ -106,9 +109,6 @@ func (l *Lsdb) Init(mc *common.MlsrConfig, ms *MlsrScheduler, // 构建并安装自己的名称LSA l.BuildAndInstallOwnNameLsa() - - // 信号初始化 - l.OnLsdbModified = utils.NewSignal() } // @@ -311,7 +311,9 @@ func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { return } // 2. 触发LSDB安装LSA的动作信号 OnLsdbModified(lsa, LsdbUpdate::INSTALLED, {}, {}); - l.OnLsdbModified.Emit(lsa, INSTALLED) + if !l.OnLsdbModified.IsEmpty() { + l.OnLsdbModified.Emit(lsa, INSTALLED) + } // 3. 设置LSA超期时间事件 l.ScheduleLsaExpiration(lsa, timeToExpire) } else if lsaInDb.GetSeqNo() < lsa.GetSeqNo() { @@ -326,7 +328,7 @@ func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { // 2. 触发LSDB更新LSA的动作信号 OnLsdbModified(lsa, LsdbUpdate::UPDATED, namesToAdd, namesToRemove); // todo 实现该方法:对比两个lsa,将其不同的部分取出来 updated, namesToAdd, namesToRemove := l.compareTwoLsa(lsaInDb, lsa) - if updated { + if updated && !l.OnLsdbModified.IsEmpty() { l.OnLsdbModified.Emit(lsa, UPDATED, namesToAdd, namesToRemove) } // 3. 设置LSA超期时间事件 From cd7ec6bf556bd9a4c35e0fd672cabff7dff95f98 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 1 Jul 2022 11:56:45 +0800 Subject: [PATCH 07/17] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E8=A1=A8=E6=B7=BB=E5=8A=A0=E8=A1=A8=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NextHop.go | 10 ++++++++++ route/RoutingTable.go | 23 ++++++++++++++++++++++- route/RoutingTable_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 70 insertions(+), 1 deletion(-) diff --git a/route/NextHop.go b/route/NextHop.go index 07854d9..f281227 100644 --- a/route/NextHop.go +++ b/route/NextHop.go @@ -41,6 +41,16 @@ func NewNextHop(uri string, cost uint64) (*NextHop, error) { return nextHop, nil } +// +// Init +// @Description: 参数初始化 +// @receiver l +// +func (l *NextHop) Init(faceUri string, cost uint64) { + l.SetLogicFaceUri(faceUri) + l.SetRouteCost(cost) +} + // // WireEncode // @Description: 线速编码 diff --git a/route/RoutingTable.go b/route/RoutingTable.go index 7250cf5..cd5a3f7 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -10,6 +10,7 @@ package route import ( "errors" + "fmt" common2 "minlib/common" "minlib/component" "minlib/encoding" @@ -49,6 +50,24 @@ type RoutingTable struct { m_hyperbolicState uint32 } +// +// PrintSelf +// @Description: 打印状态,用于测试 +// @receiver t +// +func (t *RoutingTable) PrintSelf() { + fmt.Println("----------- Table beg ---------") + fmt.Println("len: ", len(t.rTable)) + for i := 0; i < len(t.rTable); i++ { + fmt.Println(t.rTable[i].ToString()) + } + fmt.Println("----------- Table end ---------") + fmt.Println("路由计算间隔: ", t.m_routingCalcInterval.String()) + fmt.Println("是否正在计算: ", t.m_isRoutingTableCalculating) + fmt.Println("是否安排计算: ", t.m_isRouteCalculationScheduled) + fmt.Println("本机路由器邻接lsa存在状态: ", t.m_ownAdjLsaExist) +} + // // Init // @Description: 初始化 @@ -79,6 +98,8 @@ func (t *RoutingTable) Init(mc *common.MlsrConfig, // 获取四个参数 ilsa := args[0].(lsa.ILsa) updateType := args[1].(lsdb.LsdbUpdate) + common2.LogInfo("RoutingTable.bindFunc: ", + ilsa.GetOriginRouter().ToUri(), " ", updateType) //var namesToAdd []*component.Identifier //var namesToRemove []*component.Identifier //if updateType == lsdb.REMOVED { @@ -172,11 +193,11 @@ func (t *RoutingTable) AddNextHop(destRouter *component.Identifier, hop *NextHop // 如果没有这条表项,则构建并加入 if rte == nil { rte = new(RoutingTableEntry) + rte.SetDestination(destRouter) rte.AddNextHop(hop) t.rTable = append(t.rTable, rte) } else { // 如果有,则直接编辑该条目,增加一个下一跳. - // todo: 这块需要测试,是否在go中可以直接根据引用进行表项的修改 rte.AddNextHop(hop) } } diff --git a/route/RoutingTable_test.go b/route/RoutingTable_test.go index 74ec4f6..4007629 100644 --- a/route/RoutingTable_test.go +++ b/route/RoutingTable_test.go @@ -10,6 +10,7 @@ package route import ( common2 "minlib/common" + "minlib/component" "minlib/logicface" "mlsr/common" "mlsr/lsdb" @@ -48,6 +49,43 @@ func TestRoutingTable_Init(t *testing.T) { // @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) + // 2. 路由表初始化 + 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() } // From caa6df19b71011ce203809d96c430c7b56e04881 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 1 Jul 2022 13:03:12 +0800 Subject: [PATCH 08/17] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E9=80=9A=E8=BF=87?= =?UTF-8?q?=EF=BC=9A=E8=B7=AF=E7=94=B1=E8=A1=A8=E8=AE=A1=E7=AE=97=20&=20?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E8=A1=A8=E4=B8=ADsignal=E8=A7=A6=E5=8F=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/Lsdb_test.go | 10 +-- route/RoutingTable.go | 3 +- route/RoutingTable_test.go | 174 ++++++++++++++++++++++++++++++++++++- 3 files changed, 178 insertions(+), 9 deletions(-) diff --git a/lsdb/Lsdb_test.go b/lsdb/Lsdb_test.go index f1a3855..b03c65d 100644 --- a/lsdb/Lsdb_test.go +++ b/lsdb/Lsdb_test.go @@ -212,18 +212,18 @@ func TestName_BuildAndInstallAdjLsa(t *testing.T) { // LogicFace初始化(假设初始化,暂时用不到) face := new(logicface.LogicFace) // LSDB初始化 - lsdb := new(Lsdb) - lsdb.Init(mlsrConfig, sche, face) + mlsdb := new(Lsdb) + mlsdb.Init(mlsrConfig, sche, face) // 2. 安装本机adjlsa - lsdb.BuildAndInstallOwnAdjLsa() + mlsdb.BuildAndInstallOwnAdjLsa() // 3. 打印lsdb中所有本机lsa - lsas, _ := lsdb.LsaContainer.GetLSAsByType(lsa.LsaADJACENCYType) + lsas, _ := mlsdb.LsaContainer.GetLSAsByType(lsa.LsaADJACENCYType) for i := 0; i < len(lsas); i++ { common2.LogInfo(lsas[i].ToString()) } - lsas, _ = lsdb.LsaContainer.GetLSAsByType(lsa.LsaNAMEType) + lsas, _ = mlsdb.LsaContainer.GetLSAsByType(lsa.LsaNAMEType) for i := 0; i < len(lsas); i++ { common2.LogInfo(lsas[i].ToString()) } diff --git a/route/RoutingTable.go b/route/RoutingTable.go index cd5a3f7..65c1bfa 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -143,6 +143,7 @@ func (t *RoutingTable) Init(mc *common.MlsrConfig, } if scheduleCalculation { + common2.LogInfo("Is Schedule RoutingTable Calculation...") err := t.ScheduleRoutingTableCalculation() if err != nil { common2.LogError("RoutingTable.Init ScheduleRoutingTableCalculation error.") @@ -166,7 +167,7 @@ func (t *RoutingTable) Calculate() { // 做邻接路由计算 t.calculateLsRoutingTable() - // 恢复计算状态 + // 恢复到可以被安排做路由计算的状态 t.m_isRouteCalculationScheduled = false t.m_isRoutingTableCalculating = false } else { diff --git a/route/RoutingTable_test.go b/route/RoutingTable_test.go index 4007629..fbf7e70 100644 --- a/route/RoutingTable_test.go +++ b/route/RoutingTable_test.go @@ -9,12 +9,15 @@ package route import ( + "fmt" common2 "minlib/common" "minlib/component" "minlib/logicface" "mlsr/common" + "mlsr/lsa" "mlsr/lsdb" "testing" + "time" ) // @@ -63,7 +66,20 @@ func TestRoutingTable_AddNextHop(t *testing.T) { // LSDB初始化 mlsdb := new(lsdb.Lsdb) mlsdb.Init(mlsrConfig, sche, face) - // 2. 路由表初始化 + // 安装本机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) @@ -89,19 +105,171 @@ func TestRoutingTable_AddNextHop(t *testing.T) { } // -// TestRoutingTable_Calculate +// TestRoutingTable_calculateLsRoutingTable // @Description: 测试计算 // @param t // -func TestRoutingTable_Calculate(t *testing.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() + } } From 70414c2c6f626a73d2785920f63b876d6c52f7e6 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 1 Jul 2022 17:10:10 +0800 Subject: [PATCH 09/17] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=9F=BA=E6=9C=AC?= =?UTF-8?q?=E9=80=9A=E8=BF=87=EF=BC=9ARoutingTablePoolEntry=20&=20NamePref?= =?UTF-8?q?ixTableEntry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NamePrefixTableEntry.go | 28 ++++++++++++++++- route/NamePrefixTableEntry_test.go | 47 +++++++++++++++++++++++++++-- route/RoutingTablePoolEntry.go | 21 +++++++++++++ route/RoutingTablePoolEntry_test.go | 24 +++++++++++++++ 4 files changed, 117 insertions(+), 3 deletions(-) diff --git a/route/NamePrefixTableEntry.go b/route/NamePrefixTableEntry.go index 020111e..ddd196c 100644 --- a/route/NamePrefixTableEntry.go +++ b/route/NamePrefixTableEntry.go @@ -21,7 +21,7 @@ type NamePrefixTableEntry struct { // 名称前缀 m_namePrefix *component.Identifier - // 保存路由表池项的切片。切片真好用。 + // 保存路由表池项的切片。go语言切片真好用。 // 这是因为,由于支持网内缓存,一个名称前缀可能对应多个路由器标识符。 // 名称前缀标项,和路由表项,是多对多的关系。 m_rteList []*RoutingTablePoolEntry @@ -29,6 +29,32 @@ type NamePrefixTableEntry struct { NextHopList } +// +// ToString +// @Description: 转string,用于测试 +// @receiver e +// +func (e *NamePrefixTableEntry) ToString() string { + str := "-------名称前缀表项 Start:" + e.m_namePrefix.ToUri() + "------------\n" + for i := 0; i < len(e.m_rteList); i++ { + str += e.m_rteList[i].ToString() + } + str += "下一跳列表:\n" + str += e.NextHopList.ToString() + str += "-------名称前缀表项 End :" + e.m_namePrefix.ToUri() + "------------\n" + return str +} + +// +// Init +// @Description: 初始化参数 +// @receiver e +// @param namePrefix +// +func (e *NamePrefixTableEntry) Init(namePrefix *component.Identifier) { + e.m_namePrefix = namePrefix +} + // // GetNamePrefix // @Description: 获取所表示的名称前缀 diff --git a/route/NamePrefixTableEntry_test.go b/route/NamePrefixTableEntry_test.go index 06d5b07..945d135 100644 --- a/route/NamePrefixTableEntry_test.go +++ b/route/NamePrefixTableEntry_test.go @@ -8,8 +8,51 @@ package route -import "testing" +import ( + "fmt" + "minlib/component" + "testing" +) +// +// TestNamePrefixTable_AddEntry +// @Description: 名称前缀表,增加条目 +// @param t +// func TestNamePrefixTable_AddEntry(t *testing.T) { + // 第一个RTPE + iden, _ := component.CreateIdentifierByString("/RouterC") + rtpe := new(RoutingTablePoolEntry) + rtpe.InitDest(iden, 123) + hop := new(NextHop) + hop.Init("tcp://1.1.1.1", 1) + rtpe.AddNextHop(hop) -} \ No newline at end of file + // 名称前缀 + namePrefix, _ := component.CreateIdentifierByString("/pku/pdf") + npte := new(NamePrefixTableEntry) + npte.Init(namePrefix) + // 打印该名称前缀 + fmt.Println("名称前缀: ", npte.GetNamePrefix().ToUri()) + + // 增加rtpe + npte.AddRoutingTableEntry(rtpe) + fmt.Println(npte.ToString()) + + // 第二个rtpe + iden2, _ := component.CreateIdentifierByString("/RouterB") + rtpe2 := new(RoutingTablePoolEntry) + rtpe2.InitDest(iden2, 12) + hop2 := new(NextHop) + hop2.Init("tcp://1.1.1.0", 1) + rtpe2.AddNextHop(hop2) + npte.AddRoutingTableEntry(rtpe2) + + // 生成下一跳列表 + npte.GenerateNhlfromRteList() + fmt.Println(npte.ToString()) + + // 删除某个rtpe + npte.RemoveRoutingTableEntry(rtpe2) + fmt.Println(npte.ToString()) +} diff --git a/route/RoutingTablePoolEntry.go b/route/RoutingTablePoolEntry.go index 2fbc287..371aaf0 100644 --- a/route/RoutingTablePoolEntry.go +++ b/route/RoutingTablePoolEntry.go @@ -10,6 +10,7 @@ package route import ( "minlib/component" + "strconv" ) // @@ -23,6 +24,26 @@ type RoutingTablePoolEntry struct { m_useCount uint64 // 记录本条目被多少条名称前缀所使用 } +// +// ToString +// @Description: 转string,用于测试 +// @receiver pe +// @return string +// +func (pe *RoutingTablePoolEntry) ToString() string { + str := "-------RoutingTablePoolEntry Start--------\n" + str += "use Count: " + strconv.FormatUint(pe.m_useCount, 10) + "\n" + str += pe.RoutingTableEntry.ToString() + str += "entries len: " + strconv.Itoa(len(pe.NamePrefixTableEntries)) + "\n" + str += "NamePrefixTableEntries: " + for prefix, _ := range pe.NamePrefixTableEntries { + str += prefix + " " + } + str += "\n" + str += "-------RoutingTablePoolEntry End --------\n" + return str +} + // // Init // @Description: 初始化目的路由器 diff --git a/route/RoutingTablePoolEntry_test.go b/route/RoutingTablePoolEntry_test.go index ba66ff6..db7e56c 100644 --- a/route/RoutingTablePoolEntry_test.go +++ b/route/RoutingTablePoolEntry_test.go @@ -43,3 +43,27 @@ func TestRoutingTablePoolEntry_InitDest(t *testing.T) { fmt.Println(rtpe.m_useCount) fmt.Println(rtpe.m_destination.ToUri()) } + +// +// TestRoutingTablePoolEntry_IsEqual +// @Description: 测试两个rtpe是否相等 +// @param t +// +func TestRoutingTablePoolEntry_IsEqual(t *testing.T) { + // 第一个 + iden, _ := component.CreateIdentifierByString("/ifIhaveAnotherChance") + rtpe := new(RoutingTablePoolEntry) + rtpe.InitDest(iden, 123) + hop := new(NextHop) + hop.Init("/f", 1) + rtpe.AddNextHop(hop) + + iden2, _ := component.CreateIdentifierByString("/ifIhaveAnotherChance") + rtpe2 := new(RoutingTablePoolEntry) + rtpe2.InitDest(iden2, 123) + hop2 := new(NextHop) + hop2.Init("/f", 2) + rtpe2.AddNextHop(hop2) + + fmt.Println("是否相等: ", rtpe.IsEqual(rtpe2)) +} From 2ae8a6beae41464eadaae37a7972107ca259610d Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 1 Jul 2022 21:03:04 +0800 Subject: [PATCH 10/17] =?UTF-8?q?=E8=A7=84=E8=8C=83=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E5=89=8D=E7=BC=80=E8=A1=A8=E6=B5=8B=E8=AF=95=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NamePrefixTable.go | 7 +- route/NamePrefixTableEntry_test.go | 2 +- route/NamePrefixTable_test.go | 151 +++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 3 deletions(-) create mode 100644 route/NamePrefixTable_test.go diff --git a/route/NamePrefixTable.go b/route/NamePrefixTable.go index 63cb50a..e639fb0 100644 --- a/route/NamePrefixTable.go +++ b/route/NamePrefixTable.go @@ -63,11 +63,14 @@ func (t *NamePrefixTable) Init(ownRouterName *component.Identifier, // 监听LSDB修改,触发NPT表修改 bindLsdbModifiedFunc := func(args ...interface{}) { + common2.LogInfo("NamePrefixTable bindLsdbModifiedFunc.") // 获取四个参数 ilsa := args[0].(lsa.ILsa) updateType := args[1].(lsdb.LsdbUpdate) - var namesToAdd []*component.Identifier - var namesToRemove []*component.Identifier + common2.LogInfo("NamePrefixTable bindLsdbModifiedFunc lsa: ", ilsa.GetOriginRouter().ToUri()) + common2.LogInfo("NamePrefixTable bindLsdbModifiedFunc updateType: ", updateType) + namesToAdd := []*component.Identifier{} + namesToRemove := []*component.Identifier{} if updateType == lsdb.REMOVED { namesToAdd = args[2].([]*component.Identifier) namesToRemove = args[3].([]*component.Identifier) diff --git a/route/NamePrefixTableEntry_test.go b/route/NamePrefixTableEntry_test.go index 945d135..fff3bc7 100644 --- a/route/NamePrefixTableEntry_test.go +++ b/route/NamePrefixTableEntry_test.go @@ -19,7 +19,7 @@ import ( // @Description: 名称前缀表,增加条目 // @param t // -func TestNamePrefixTable_AddEntry(t *testing.T) { +func TestNamePrefixTableEntry_AddEntry(t *testing.T) { // 第一个RTPE iden, _ := component.CreateIdentifierByString("/RouterC") rtpe := new(RoutingTablePoolEntry) diff --git a/route/NamePrefixTable_test.go b/route/NamePrefixTable_test.go new file mode 100644 index 0000000..eb06a7f --- /dev/null +++ b/route/NamePrefixTable_test.go @@ -0,0 +1,151 @@ +// 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/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_AddEntry(t *testing.T) { + +} + +// +// TestNamePrefixTable_RemoveEntry +// @Description: 测试删除条目 +// @param t +// +func TestNamePrefixTable_RemoveEntry(t *testing.T) { + +} + +// +// TestNamePrefixTable_UpdateFromLsdb +// @Description: 测试根据Lsdb的变化而更新名称前缀表 +// @param t +// +func TestNamePrefixTable_UpdateFromLsdb(t *testing.T) { + +} + +// +// TestNamePrefixTable_UpdateWithNewRoute +// @Description: 测试根据路由变化而更新名称前缀表 +// @param t +// +func TestNamePrefixTable_UpdateWithNewRoute(t *testing.T) { + +} From f48521d5349da0383a18c7df94dfc97a8551718d Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Sun, 3 Jul 2022 16:52:11 +0800 Subject: [PATCH 11/17] =?UTF-8?q?gomod=E4=B8=AD=E7=89=88=E6=9C=AC=E5=8F=B7?= =?UTF-8?q?=E6=9B=B4=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index b7fd07b..85c3c2e 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module mlsr -go 1.16 +go 1.18 require ( //github.com/rakanalh/scheduler v0.1 From 7c5ecb3a924cc72656e0a62728a87c6200adadc0 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 6 Jul 2022 15:14:54 +0800 Subject: [PATCH 12/17] =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=89=8D=E7=BC=80?= =?UTF-8?q?=E8=A1=A8=E5=8F=8ARTPE=E4=B8=AD=E7=9A=84map=E5=BF=85=E9=A1=BB?= =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=88=86=E9=85=8D=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=90=8E=E6=89=8D=E8=83=BD=E4=BD=BF=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 22 +++++++++++++++++++--- go.sum | 1 - route/NamePrefixTable.go | 2 ++ route/RoutingTablePoolEntry.go | 6 ++++++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 85c3c2e..e53019b 100644 --- a/go.mod +++ b/go.mod @@ -6,12 +6,28 @@ require ( //github.com/rakanalh/scheduler v0.1 github.com/go-co-op/gocron v1.13.0 github.com/liyue201/gostl v1.0.1 - github.com/smartystreets/goconvey v1.7.2 // indirect - github.com/tidwall/btree v1.2.1 // indirect github.com/tidwall/buntdb v1.2.9 - github.com/tidwall/gjson v1.14.0 // indirect gopkg.in/ini.v1 v1.62.0 minlib v0.0.0 ) +require ( + github.com/klauspost/cpuid/v2 v2.0.9 // indirect + github.com/mutecomm/go-sqlcipher/v4 v4.4.2 // indirect + github.com/robfig/cron/v3 v3.0.1 // indirect + github.com/sirupsen/logrus v1.8.1 // indirect + github.com/smartystreets/goconvey v1.7.2 // indirect + github.com/tidwall/btree v1.2.1 // indirect + github.com/tidwall/gjson v1.14.0 // indirect + github.com/tidwall/grect v0.1.4 // indirect + github.com/tidwall/match v1.1.1 // indirect + github.com/tidwall/pretty v1.2.0 // indirect + github.com/tidwall/rtred v0.1.2 // indirect + github.com/tidwall/tinyqueue v0.1.1 // indirect + github.com/tylertreat/BoomFilters v0.0.0-20210315201527-1a82519a3e43 // indirect + github.com/zeebo/xxh3 v1.0.1 // indirect + golang.org/x/sync v0.0.0-20210220032951-036812b2e83c // indirect + golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 // indirect +) + replace minlib v0.0.0 => ../minlib diff --git a/go.sum b/go.sum index 4583ce7..d68ad99 100644 --- a/go.sum +++ b/go.sum @@ -78,4 +78,3 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/route/NamePrefixTable.go b/route/NamePrefixTable.go index e639fb0..fbcb221 100644 --- a/route/NamePrefixTable.go +++ b/route/NamePrefixTable.go @@ -50,6 +50,8 @@ type NamePrefixTable struct { func (t *NamePrefixTable) Init(ownRouterName *component.Identifier, routingTable *RoutingTable, afterRoutingChangeSignal *utils.Signal, afterLsdbModifiedSignal *utils.Signal) { + // 初始化数据结构 + t.m_rtpool = make(map[string]*RoutingTablePoolEntry) // 赋值变量 t.m_ownRouterName = ownRouterName t.m_routingTable = routingTable diff --git a/route/RoutingTablePoolEntry.go b/route/RoutingTablePoolEntry.go index 371aaf0..50734b2 100644 --- a/route/RoutingTablePoolEntry.go +++ b/route/RoutingTablePoolEntry.go @@ -53,6 +53,8 @@ func (pe *RoutingTablePoolEntry) ToString() string { func (pe *RoutingTablePoolEntry) Init(dest *component.Identifier) { pe.m_destination = dest pe.m_useCount = 1 + // map 初始化 + pe.NamePrefixTableEntries = make(map[string]*NamePrefixTableEntry) } // @@ -66,6 +68,8 @@ func (pe *RoutingTablePoolEntry) InitRTE(rte *RoutingTableEntry, useCount uint64 pe.m_destination = rte.m_destination pe.nextHops = rte.GetNextHops() pe.m_useCount = useCount + // map 初始化 + pe.NamePrefixTableEntries = make(map[string]*NamePrefixTableEntry) } // @@ -78,6 +82,8 @@ func (pe *RoutingTablePoolEntry) InitRTE(rte *RoutingTableEntry, useCount uint64 func (pe *RoutingTablePoolEntry) InitDest(dest *component.Identifier, useCount uint64) { pe.m_destination = dest pe.m_useCount = useCount + // map 初始化 + pe.NamePrefixTableEntries = make(map[string]*NamePrefixTableEntry) } // From e2803e573acc727053a442720697742e65dfeed6 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 6 Jul 2022 16:18:47 +0800 Subject: [PATCH 13/17] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E5=89=8D=E7=BC=80=E8=A1=A8=E7=9A=84=E6=89=93=E5=8D=B0=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E5=87=BD=E6=95=B0=EF=BC=9B=E6=9B=B4=E6=96=B0Lsdb?= =?UTF-8?q?=E4=B8=AD=E5=85=B3=E4=BA=8E=E8=A7=A6=E5=8F=91=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=9A=84=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/Lsdb.go | 46 ++++++++++++++++++++++++++++++++--- route/NamePrefixTable.go | 25 ++++++++++++++++++- route/NamePrefixTable_test.go | 35 ++++++++++++++++++++++++++ route/RoutingTable.go | 4 +-- 4 files changed, 103 insertions(+), 7 deletions(-) diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index ed74ef5..fe26c28 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -326,7 +326,6 @@ func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { return } // 2. 触发LSDB更新LSA的动作信号 OnLsdbModified(lsa, LsdbUpdate::UPDATED, namesToAdd, namesToRemove); - // todo 实现该方法:对比两个lsa,将其不同的部分取出来 updated, namesToAdd, namesToRemove := l.compareTwoLsa(lsaInDb, lsa) if updated && !l.OnLsdbModified.IsEmpty() { l.OnLsdbModified.Emit(lsa, UPDATED, namesToAdd, namesToRemove) @@ -343,12 +342,51 @@ func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { // @receiver l // @param lsaA // @param lsaB -// @return bool +// @return bool 如果有不同,就返回true // @return []*component.Identifier // @return []component.Identifier // -func (l *Lsdb) compareTwoLsa(lsaA lsa.ILsa, lsaB lsa.ILsa) (bool, []*component.Identifier, []component.Identifier) { - return true, nil, nil +func (l *Lsdb) compareTwoLsa(lsaA lsa.ILsa, lsaB lsa.ILsa) (bool, []*component.Identifier, []*component.Identifier) { + namesToAdd := []*component.Identifier{} + namesToRemove := []*component.Identifier{} + // 前置判断,确定两个都是名称Lsa + if lsaA.GetType() != lsa.LsaNAMEType || lsaB.GetType() != lsa.LsaNAMEType { + return false, namesToAdd, namesToRemove + } + // 转换为名称Lsa + lsa1 := lsaA.(*lsa.NameLsa) + lsa2 := lsaB.(*lsa.NameLsa) + lsaPrefixs1 := lsa1.GetNamePrefixes() + lsaPrefixs2 := lsa2.GetNamePrefixes() + // lsa2有而lsa1没的,则为要添加的 + for i := 0; i < len(lsaPrefixs2); i++ { + if !existsIdentifier(lsaPrefixs2[i], lsaPrefixs1) { + namesToAdd = append(namesToAdd, lsaPrefixs2[i]) + } + } + // lsa1有而lsa2没的,则为要删除的 + for i := 0; i < len(lsaPrefixs1); i++ { + if !existsIdentifier(lsaPrefixs1[i], lsaPrefixs2) { + namesToRemove = append(namesToRemove, lsaPrefixs1[i]) + } + } + return true, namesToAdd, namesToRemove +} + +// +// existsIdentifier +// @Description: 判断是否有某个identifier +// @param target +// @param identifiers +// @return bool +// +func existsIdentifier(target *component.Identifier, identifiers []*component.Identifier) bool { + for i := 0; i < len(identifiers); i++ { + if identifiers[i].ToUri() == target.ToUri() { + return true + } + } + return false } // diff --git a/route/NamePrefixTable.go b/route/NamePrefixTable.go index fbcb221..1d5d649 100644 --- a/route/NamePrefixTable.go +++ b/route/NamePrefixTable.go @@ -9,6 +9,7 @@ package route import ( + "fmt" common2 "minlib/common" "minlib/component" "mlsr/lsa" @@ -38,6 +39,28 @@ type NamePrefixTable struct { // todo fib } +// +// PrintSelf +// @Description: 打印名称前缀表的状态。用于测试。 +// @receiver t +// +func (t *NamePrefixTable) PrintSelf() { + fmt.Println("------------------- Name Prefix Table begin: " + t.m_ownRouterName.ToUri() + " -----------------") + fmt.Println("-----------------" + " 1.路由表项池 begin " + "-----------------") + fmt.Println("路由表项池大小:", len(t.m_rtpool)) + for _, rtpe := range t.m_rtpool { + fmt.Println(rtpe.ToString()) + } + fmt.Println("-----------------" + " 1.路由表项池 end " + "-----------------") + fmt.Println("----------------" + " 2.名称前缀列表 start " + "----------------") + for i := 0; i < len(t.nptEntryList); i++ { + fmt.Println(t.nptEntryList[i].ToString()) + } + fmt.Println("----------------" + " 2.名称前缀列表 end " + "----------------") + t.m_routingTable.PrintSelf() + fmt.Println("------------------- Name Prefix Table end: " + t.m_ownRouterName.ToUri() + " -----------------") +} + // // Init // @Description: 名称前缀表初始化 @@ -73,7 +96,7 @@ func (t *NamePrefixTable) Init(ownRouterName *component.Identifier, common2.LogInfo("NamePrefixTable bindLsdbModifiedFunc updateType: ", updateType) namesToAdd := []*component.Identifier{} namesToRemove := []*component.Identifier{} - if updateType == lsdb.REMOVED { + if updateType == lsdb.UPDATED { namesToAdd = args[2].([]*component.Identifier) namesToRemove = args[3].([]*component.Identifier) } diff --git a/route/NamePrefixTable_test.go b/route/NamePrefixTable_test.go index eb06a7f..973054d 100644 --- a/route/NamePrefixTable_test.go +++ b/route/NamePrefixTable_test.go @@ -120,7 +120,42 @@ func TestNamePrefixTable_FinalTest(t *testing.T) { // @param t // func TestNamePrefixTable_AddEntry(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() } // diff --git a/route/RoutingTable.go b/route/RoutingTable.go index 65c1bfa..4c4db2b 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -56,16 +56,16 @@ type RoutingTable struct { // @receiver t // func (t *RoutingTable) PrintSelf() { - fmt.Println("----------- Table beg ---------") + fmt.Println("----------- Routing Table begin ---------") fmt.Println("len: ", len(t.rTable)) for i := 0; i < len(t.rTable); i++ { fmt.Println(t.rTable[i].ToString()) } - fmt.Println("----------- Table end ---------") fmt.Println("路由计算间隔: ", t.m_routingCalcInterval.String()) fmt.Println("是否正在计算: ", t.m_isRoutingTableCalculating) fmt.Println("是否安排计算: ", t.m_isRouteCalculationScheduled) fmt.Println("本机路由器邻接lsa存在状态: ", t.m_ownAdjLsaExist) + fmt.Println("----------- Routing Table end ---------") } // From 0ebdc4e51d193ec715b90e2485547e4810bae25e Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 6 Jul 2022 18:10:43 +0800 Subject: [PATCH 14/17] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E5=89=8D=E7=BC=80=E8=A1=A8=E7=9A=84=E5=A2=9E=E5=8A=A0=E6=9D=A1?= =?UTF-8?q?=E7=9B=AE=EF=BC=9A=E4=BF=AE=E5=A4=8D=E5=A2=9E=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=A4=9A=E8=B7=AF=E7=94=B1=E5=99=A8=E4=B8=8A=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E6=8B=A5=E6=9C=89=E7=9A=84=E8=B5=84=E6=BA=90=E5=89=8D?= =?UTF-8?q?=E7=BC=80=E6=97=B6=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NamePrefixTable.go | 1 + route/NamePrefixTableEntry.go | 2 +- route/NamePrefixTable_test.go | 67 +++++++++++++++++++++++++++++++++++ route/NextHopList.go | 23 ++++++++++-- 4 files changed, 90 insertions(+), 3 deletions(-) diff --git a/route/NamePrefixTable.go b/route/NamePrefixTable.go index 1d5d649..dd24fd5 100644 --- a/route/NamePrefixTable.go +++ b/route/NamePrefixTable.go @@ -53,6 +53,7 @@ func (t *NamePrefixTable) PrintSelf() { } fmt.Println("-----------------" + " 1.路由表项池 end " + "-----------------") fmt.Println("----------------" + " 2.名称前缀列表 start " + "----------------") + fmt.Println("名称前缀列表大小:", len(t.nptEntryList)) for i := 0; i < len(t.nptEntryList); i++ { fmt.Println(t.nptEntryList[i].ToString()) } diff --git a/route/NamePrefixTableEntry.go b/route/NamePrefixTableEntry.go index ddd196c..1b0b981 100644 --- a/route/NamePrefixTableEntry.go +++ b/route/NamePrefixTableEntry.go @@ -119,7 +119,7 @@ func (e *NamePrefixTableEntry) GenerateNhlfromRteList() { for i := 0; i < len(e.m_rteList); i++ { // 遍历路由表条目的下一跳列表 for j := 0; j < e.m_rteList[i].NextHopList.Size(); j++ { - e.NextHopList.AddNextHop(e.m_rteList[i].nextHops[j]) + e.NextHopList.AddNextHopBySmallerPriciple(e.m_rteList[i].nextHops[j]) } } } diff --git a/route/NamePrefixTable_test.go b/route/NamePrefixTable_test.go index 973054d..451f7ce 100644 --- a/route/NamePrefixTable_test.go +++ b/route/NamePrefixTable_test.go @@ -11,6 +11,7 @@ package route import ( "fmt" common2 "minlib/common" + "minlib/component" "minlib/logicface" "mlsr/common" "mlsr/lsa" @@ -156,6 +157,72 @@ func TestNamePrefixTable_AddEntry(t *testing.T) { // 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() } // diff --git a/route/NextHopList.go b/route/NextHopList.go index e904b4b..364fc88 100644 --- a/route/NextHopList.go +++ b/route/NextHopList.go @@ -88,7 +88,7 @@ func (l *NextHopList) findSameNextHop(hop *NextHop) int { // // AddNextHop -// @Description: 增加一个下一跳表项。1. 如果不存在同uri,则插入;2. 如果存在,但cost不同,则更新它 +// @Description: 增加一个下一跳表项。1. 如果不存在同uri,则插入;2. 如果存在,但cost不同,则按照新的下一跳来更新它 // @receiver l // @param hop // @@ -97,7 +97,26 @@ func (l *NextHopList) AddNextHop(hop *NextHop) { if index < 0 { l.nextHops = append(l.nextHops, hop) } else if l.nextHops[index].RouteCost.RouteCost() != hop.RouteCost.RouteCost() { - l.nextHops[index].RouteCost.SetRouteCost(hop.RouteCost.RouteCost()) + // 注意,这里必须先删掉旧的,再加入新的;如果直接修改旧的nextHop,则可能导致该nextHop所属的另一个NextHopList属性被改变 + l.RemoveNextHop(l.nextHops[index]) + l.nextHops = append(l.nextHops, hop) + } +} + +// +// AddNextHopBySmallerPriciple +// @Description: 在加入重合下一跳时,按照取较小开销的下一跳原则,进行更新 +// @receiver l +// @param hop +// +func (l *NextHopList) AddNextHopBySmallerPriciple(hop *NextHop) { + index := l.findSameUriNextHop(hop) + if index < 0 { + l.nextHops = append(l.nextHops, hop) + } else if l.nextHops[index].RouteCost.RouteCost() > hop.RouteCost.RouteCost() { + // 注意,这里必须先删掉旧的,再加入新的;如果直接修改旧的nextHop,则可能导致该nextHop所属的另一个NextHopList属性被改变 + l.RemoveNextHop(l.nextHops[index]) + l.nextHops = append(l.nextHops, hop) } } From 1e6b81c3c678d53509fdf756653bc5c5a807ca94 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 7 Jul 2022 15:49:47 +0800 Subject: [PATCH 15/17] =?UTF-8?q?=E8=AF=95=E5=9B=BE=E6=B6=88=E9=99=A4BUG?= =?UTF-8?q?=EF=BC=9A=E6=9C=AA=E8=BF=90=E8=A1=8C=E4=BB=BB=E4=BD=95=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NamePrefixTable.go | 5 +- route/NamePrefixTable_test.go | 120 ++++++++++++++++++++++++++++++++++ route/RoutingTable.go | 9 +-- 3 files changed, 128 insertions(+), 6 deletions(-) diff --git a/route/NamePrefixTable.go b/route/NamePrefixTable.go index dd24fd5..54f90fe 100644 --- a/route/NamePrefixTable.go +++ b/route/NamePrefixTable.go @@ -15,6 +15,7 @@ import ( "mlsr/lsa" "mlsr/lsdb" "mlsr/utils" + "strconv" ) // @@ -47,13 +48,13 @@ type NamePrefixTable struct { func (t *NamePrefixTable) PrintSelf() { fmt.Println("------------------- Name Prefix Table begin: " + t.m_ownRouterName.ToUri() + " -----------------") fmt.Println("-----------------" + " 1.路由表项池 begin " + "-----------------") - fmt.Println("路由表项池大小:", len(t.m_rtpool)) + fmt.Println("路由表项池大小:" + strconv.Itoa(len(t.m_rtpool))) for _, rtpe := range t.m_rtpool { fmt.Println(rtpe.ToString()) } fmt.Println("-----------------" + " 1.路由表项池 end " + "-----------------") fmt.Println("----------------" + " 2.名称前缀列表 start " + "----------------") - fmt.Println("名称前缀列表大小:", len(t.nptEntryList)) + fmt.Println("名称前缀列表大小:" + strconv.Itoa(len(t.nptEntryList))) for i := 0; i < len(t.nptEntryList); i++ { fmt.Println(t.nptEntryList[i].ToString()) } diff --git a/route/NamePrefixTable_test.go b/route/NamePrefixTable_test.go index 451f7ce..f07ff67 100644 --- a/route/NamePrefixTable_test.go +++ b/route/NamePrefixTable_test.go @@ -231,7 +231,127 @@ func TestNamePrefixTable_AddEntry(t *testing.T) { // @param t // func TestNamePrefixTable_RemoveEntry(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() + fmt.Println("") + + // 10.1 删除一个虚空资源 + fmt.Println("111") + npt.RemoveEntry(name, route) + fmt.Println("222") + 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() } // diff --git a/route/RoutingTable.go b/route/RoutingTable.go index 4c4db2b..a577bcc 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -19,6 +19,7 @@ import ( "mlsr/lsa" "mlsr/lsdb" "mlsr/utils" + "strconv" "time" ) @@ -57,13 +58,13 @@ type RoutingTable struct { // func (t *RoutingTable) PrintSelf() { fmt.Println("----------- Routing Table begin ---------") - fmt.Println("len: ", len(t.rTable)) + fmt.Println("len: " + strconv.Itoa(len(t.rTable))) for i := 0; i < len(t.rTable); i++ { fmt.Println(t.rTable[i].ToString()) } - fmt.Println("路由计算间隔: ", t.m_routingCalcInterval.String()) - fmt.Println("是否正在计算: ", t.m_isRoutingTableCalculating) - fmt.Println("是否安排计算: ", t.m_isRouteCalculationScheduled) + fmt.Println("路由计算间隔: " + t.m_routingCalcInterval.String()) + fmt.Println("是否正在计算: " + strconv.FormatBool(t.m_isRoutingTableCalculating)) + fmt.Println("是否安排计算: " + strconv.FormatBool(t.m_isRouteCalculationScheduled)) fmt.Println("本机路由器邻接lsa存在状态: ", t.m_ownAdjLsaExist) fmt.Println("----------- Routing Table end ---------") } From ab9765b271b5f00740f9cdd7eaa1a76e594d7964 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 7 Jul 2022 17:31:49 +0800 Subject: [PATCH 16/17] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E7=94=B1lsdb=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E6=9B=B4=E6=96=B0=E6=93=8D=E4=BD=9C=20&=20=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E5=99=A8=E9=87=8D=E6=96=B0=E8=AE=A1=E7=AE=97=20?= =?UTF-8?q?=E5=AF=BC=E8=87=B4=E7=9A=84=E5=90=8D=E7=A7=B0=E5=89=8D=E7=BC=80?= =?UTF-8?q?=E8=A1=A8=E6=9B=B4=E6=96=B0=EF=BC=9B=E4=BF=AE=E5=A4=8D=E7=94=B1?= =?UTF-8?q?Lsdb.Update(=E9=82=BB=E6=8E=A5LSA)=E6=B2=A1=E6=9C=89=E5=AF=BC?= =?UTF-8?q?=E8=87=B4=E6=9B=B4=E6=96=B0=E7=9A=84BUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsa/AdjLsa.go | 15 ++ lsdb/Lsdb.go | 72 +++++-- route/NamePrefixTable_test.go | 354 +++++++++++++++++++++++----------- 3 files changed, 306 insertions(+), 135 deletions(-) diff --git a/lsa/AdjLsa.go b/lsa/AdjLsa.go index bd38ef1..178bbd2 100644 --- a/lsa/AdjLsa.go +++ b/lsa/AdjLsa.go @@ -165,6 +165,21 @@ func (a *AdjLsa) GetAdjList() []*AdjLsaAdjacencyInfo { return a.AdjLsaAdjacenctList.GetAdjList() } +// +// GetAdjRouterPrefixList +// @Description: 获取邻接信息中的邻接路由器标识符 +// @receiver a +// @return []*component.Identifier +// +func (a *AdjLsa) GetAdjRouterPrefixList() []*component.Identifier { + adjRouterPrefixs := []*component.Identifier{} + adjList := a.AdjLsaAdjacenctList.GetAdjList() + for i := 0; i < len(adjList); i++ { + adjRouterPrefixs = append(adjRouterPrefixs, adjList[i].lsaNeighborRouterIdentifier) + } + return adjRouterPrefixs +} + // // AddAdjacencyInfo // @Description: 增加一条邻接信息 diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index fe26c28..c7dde56 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -328,6 +328,7 @@ func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { // 2. 触发LSDB更新LSA的动作信号 OnLsdbModified(lsa, LsdbUpdate::UPDATED, namesToAdd, namesToRemove); updated, namesToAdd, namesToRemove := l.compareTwoLsa(lsaInDb, lsa) if updated && !l.OnLsdbModified.IsEmpty() { + common2.LogDebug("l.OnLsdbModified.Emit(lsa, UPDATED, namesToAdd, namesToRemove) ") l.OnLsdbModified.Emit(lsa, UPDATED, namesToAdd, namesToRemove) } // 3. 设置LSA超期时间事件 @@ -349,28 +350,59 @@ func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { func (l *Lsdb) compareTwoLsa(lsaA lsa.ILsa, lsaB lsa.ILsa) (bool, []*component.Identifier, []*component.Identifier) { namesToAdd := []*component.Identifier{} namesToRemove := []*component.Identifier{} - // 前置判断,确定两个都是名称Lsa - if lsaA.GetType() != lsa.LsaNAMEType || lsaB.GetType() != lsa.LsaNAMEType { + // 前置判断,确定两个都是名称Lsa时,执行相应操作 + if lsaA.GetType() == lsa.LsaNAMEType && lsaB.GetType() == lsa.LsaNAMEType { + // 转换为名称Lsa + lsa1 := lsaA.(*lsa.NameLsa) + lsa2 := lsaB.(*lsa.NameLsa) + lsaPrefixs1 := lsa1.GetNamePrefixes() + lsaPrefixs2 := lsa2.GetNamePrefixes() + // lsa2有而lsa1没的,则为要添加的 + for i := 0; i < len(lsaPrefixs2); i++ { + if !existsIdentifier(lsaPrefixs2[i], lsaPrefixs1) { + namesToAdd = append(namesToAdd, lsaPrefixs2[i]) + } + } + // lsa1有而lsa2没的,则为要删除的 + for i := 0; i < len(lsaPrefixs1); i++ { + if !existsIdentifier(lsaPrefixs1[i], lsaPrefixs2) { + namesToRemove = append(namesToRemove, lsaPrefixs1[i]) + } + } + // 有变化,则true;一毛一样,则false + if len(namesToAdd) > 0 || len(namesToRemove) > 0 { + return true, namesToAdd, namesToRemove + } else { + return false, namesToAdd, namesToRemove + } + } else if lsaA.GetType() == lsa.LsaADJACENCYType && lsaB.GetType() == lsa.LsaADJACENCYType { + // 两个都是邻接的情况 + // 转换为邻接Lsa + lsa1 := lsaA.(*lsa.AdjLsa) + lsa2 := lsaB.(*lsa.AdjLsa) + lsaPrefixs1 := lsa1.GetAdjRouterPrefixList() + lsaPrefixs2 := lsa2.GetAdjRouterPrefixList() + // lsa2有而lsa1没的,则为要添加的 + for i := 0; i < len(lsaPrefixs2); i++ { + if !existsIdentifier(lsaPrefixs2[i], lsaPrefixs1) { + namesToAdd = append(namesToAdd, lsaPrefixs2[i]) + } + } + // lsa1有而lsa2没的,则为要删除的 + for i := 0; i < len(lsaPrefixs1); i++ { + if !existsIdentifier(lsaPrefixs1[i], lsaPrefixs2) { + namesToRemove = append(namesToRemove, lsaPrefixs1[i]) + } + } + // 有变化,则true;一毛一样,则false + if len(namesToAdd) > 0 || len(namesToRemove) > 0 { + return true, namesToAdd, namesToRemove + } else { + return false, namesToAdd, namesToRemove + } + } else { return false, namesToAdd, namesToRemove } - // 转换为名称Lsa - lsa1 := lsaA.(*lsa.NameLsa) - lsa2 := lsaB.(*lsa.NameLsa) - lsaPrefixs1 := lsa1.GetNamePrefixes() - lsaPrefixs2 := lsa2.GetNamePrefixes() - // lsa2有而lsa1没的,则为要添加的 - for i := 0; i < len(lsaPrefixs2); i++ { - if !existsIdentifier(lsaPrefixs2[i], lsaPrefixs1) { - namesToAdd = append(namesToAdd, lsaPrefixs2[i]) - } - } - // lsa1有而lsa2没的,则为要删除的 - for i := 0; i < len(lsaPrefixs1); i++ { - if !existsIdentifier(lsaPrefixs1[i], lsaPrefixs2) { - namesToRemove = append(namesToRemove, lsaPrefixs1[i]) - } - } - return true, namesToAdd, namesToRemove } // diff --git a/route/NamePrefixTable_test.go b/route/NamePrefixTable_test.go index f07ff67..5cc12fb 100644 --- a/route/NamePrefixTable_test.go +++ b/route/NamePrefixTable_test.go @@ -120,7 +120,7 @@ func TestNamePrefixTable_FinalTest(t *testing.T) { // @Description: 测试增加一个条目 // @param t // -func TestNamePrefixTable_AddEntry(t *testing.T) { +func TestNamePrefixTable_AddEntryAndRemoveEntry(t *testing.T) { // 1. 建立前置结构体(lsdb等) // 配置文件初始化 mlsrConfig, err := common.ParseConfig(testConfigPath) @@ -223,122 +223,9 @@ func TestNamePrefixTable_AddEntry(t *testing.T) { npt.AddEntry(nameC, routeB) fmt.Println("将路由C之上的真实资源同时加在路由器B上") npt.PrintSelf() -} - -// -// TestNamePrefixTable_RemoveEntry -// @Description: 测试删除条目 -// @param t -// -func TestNamePrefixTable_RemoveEntry(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() - fmt.Println("") // 10.1 删除一个虚空资源 - fmt.Println("111") npt.RemoveEntry(name, route) - fmt.Println("222") fmt.Println("---------- 删除一个虚空资源 -----------") npt.PrintSelf() @@ -360,14 +247,251 @@ func TestNamePrefixTable_RemoveEntry(t *testing.T) { // @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: 测试根据路由变化而更新名称前缀表 +// @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() } From 92cb88862c01dca074fe9ff7bad05cfcabed418b Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 7 Jul 2022 17:32:01 +0800 Subject: [PATCH 17/17] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=B8=80=E6=9D=A1?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=BE=93=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NamePrefixTable.go | 1 + 1 file changed, 1 insertion(+) diff --git a/route/NamePrefixTable.go b/route/NamePrefixTable.go index 54f90fe..029c13a 100644 --- a/route/NamePrefixTable.go +++ b/route/NamePrefixTable.go @@ -83,6 +83,7 @@ func (t *NamePrefixTable) Init(ownRouterName *component.Identifier, // 监听路由表的修改,触发NPT表修改 bindRoutingChangeFunc := func(args ...interface{}) { + common2.LogInfo("NamePrefixTable bindRoutingChangeFunc.") entrys := args[0].([]*RoutingTableEntry) t.UpdateWithNewRoute(entrys) }