From f826b85e2b3ec1006e4a45a8cbe9b7b68289d30d Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 27 Apr 2022 16:33:17 +0800 Subject: [PATCH 01/70] =?UTF-8?q?=E6=B5=8B=E8=AF=95adjInfo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsa/AdjLsaAdjacencyInfo.go | 58 +++++++++++++- lsa/AdjLsaAdjacencyInfo_test.go | 130 ++++++++++++++++++++++++++++++++ lsa/AdjLsaAdjacencyList_test.go | 15 ++++ lsa/AdjLsa_test.go | 9 +++ 4 files changed, 208 insertions(+), 4 deletions(-) create mode 100644 lsa/AdjLsaAdjacencyInfo_test.go create mode 100644 lsa/AdjLsaAdjacencyList_test.go create mode 100644 lsa/AdjLsa_test.go diff --git a/lsa/AdjLsaAdjacencyInfo.go b/lsa/AdjLsaAdjacencyInfo.go index 68842b4..332f8bb 100644 --- a/lsa/AdjLsaAdjacencyInfo.go +++ b/lsa/AdjLsaAdjacencyInfo.go @@ -12,6 +12,7 @@ import ( "minlib/component" "minlib/encoding" "mlsr/extensions" + "strconv" ) const ( @@ -41,13 +42,37 @@ type AdjLsaAdjacencyInfo struct { // @return *AdjLsaAdjacencyInfo // func NewAdjLsaAdjacencyInfo(adjLsaLinkCost AdjLsaLinkCost, adjLsaLogicFaceUri AdjLsaLogicFaceUri, - m_lsaNeighborRouterIdentifier *component.Identifier, m_interestTimedOutNo uint32, - m_status int) *AdjLsaAdjacencyInfo { + faceId AdjLsaLogicFaceId, m_lsaNeighborRouterIdentifier *component.Identifier, + m_interestTimedOutNo uint32, m_status int) *AdjLsaAdjacencyInfo { return &AdjLsaAdjacencyInfo{AdjLsaLinkCost: adjLsaLinkCost, AdjLsaLogicFaceUri: adjLsaLogicFaceUri, - lsaNeighborRouterIdentifier: m_lsaNeighborRouterIdentifier, + AdjLsaLogicFaceId: faceId,lsaNeighborRouterIdentifier: m_lsaNeighborRouterIdentifier, InterestTimedOutNo: m_interestTimedOutNo, Status: m_status} } +// +// NewAdjLsaAdjacencyInfoByInstance +// @Description: 根据已有的结构体实例,创建邻接信息结构体 +// @param adjLsaLinkCost +// @param adjLsaLogicFaceUri +// @param faceId +// @param m_lsaNeighborRouterIdentifier +// @param m_interestTimedOutNo +// @param m_status +// @return *AdjLsaAdjacencyInfo +// +func NewAdjLsaAdjacencyInfoByInstance(adjLsaLinkCost *AdjLsaLinkCost, adjLsaLogicFaceUri *AdjLsaLogicFaceUri, + faceId *AdjLsaLogicFaceId, m_lsaNeighborRouterIdentifier *component.Identifier, + m_interestTimedOutNo uint32, m_status int) *AdjLsaAdjacencyInfo { + adjRes := AdjLsaAdjacencyInfo{} + adjRes.SetLinkCost(adjLsaLinkCost.LinkCost()) + adjRes.setLogicFaceUri(adjLsaLogicFaceUri.LogicFaceUri()) + adjRes.SetLogicFaceId(faceId.LogicFaceId()) + adjRes.SetNeighborRouterIdentifier(m_lsaNeighborRouterIdentifier) + adjRes.InterestTimedOutNo = m_interestTimedOutNo + adjRes.Status = m_status + return &adjRes +} + // // GetNeighborRouterIdentidier // @Description: 获取相邻路由器的标识 @@ -126,6 +151,29 @@ func (l *AdjLsaAdjacencyInfo) CompareLogicFaceId(faceId uint64) bool { return false } +// +// ToString +// @Description: 转string +// @receiver l +// +func (l *AdjLsaAdjacencyInfo) ToString() string { + var resString string + resString += "{ LinkCost: " + resString += strconv.FormatUint(l.LinkCost(), 10) + resString += ", LogicFaceUri: " + resString += l.LogicFaceUri() + resString += ", LogicFaceId: " + resString += strconv.FormatUint(l.LogicFaceId(),10) + resString += ", NeighborRouterIdentifier: " + resString += l.lsaNeighborRouterIdentifier.ToUri() + resString += ", InterestTimedOutNo: " + resString += strconv.Itoa(int(l.InterestTimedOutNo)) + resString += ", Status: " + resString += strconv.Itoa(l.Status) + resString += " }" + return resString +} + // // WireEncode // @Description: 线速编码 @@ -193,9 +241,11 @@ func (l *AdjLsaAdjacencyInfo) WireDecode(block *encoding.Block) error { for _, parameter := range block.GetSubElements(){ switch parameter.GetType() { case encoding.TlvIdentifier: - if err:= l.lsaNeighborRouterIdentifier.WireDecode(parameter); err != nil { + iden:=component.Identifier{} + if err:= iden.WireDecode(parameter); err != nil { return err } + l.lsaNeighborRouterIdentifier = &iden case extensions.TlvMlsrAdjLsaLogicFaceUri: if err:= l.AdjLsaLogicFaceUri.WireDecode(parameter); err != nil { return err diff --git a/lsa/AdjLsaAdjacencyInfo_test.go b/lsa/AdjLsaAdjacencyInfo_test.go new file mode 100644 index 0000000..cf7dc21 --- /dev/null +++ b/lsa/AdjLsaAdjacencyInfo_test.go @@ -0,0 +1,130 @@ +// Package lsa +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/4/22 11:01 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package lsa + +import ( + "fmt" + "minlib/component" + "minlib/encoding" + "testing" +) + +// +// TestNewAdjLsaAdjacencyInfo +// @Description: 测试构造一条邻接信息 +// @param t +// +func TestNewAdjLsaAdjacencyInfo(t *testing.T) { + linkCost :=AdjLsaLinkCost{} + linkCost.SetLinkCost(100) + faceUri := AdjLsaLogicFaceUri{} + faceUri.setLogicFaceUri("uri") + faceId :=AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden,_ := component.CreateIdentifierByString("/pku/router") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + fmt.Println("cost: ",adjInfo.LinkCost()) + fmt.Println("uri: ",adjInfo.LogicFaceUri()) + fmt.Println("id: ",adjInfo.LogicFaceId()) + fmt.Println("identifier: ",iden.ToUri()) + fmt.Println(adjInfo.ToString()) +} + +// +// TestAdjLsaAdjacencyInfo_Compare +// @Description: 测试一些比较函数 +// @param t +// +func TestAdjLsaAdjacencyInfo_Compare(t *testing.T) { + // 先构造 + linkCost :=AdjLsaLinkCost{} + linkCost.SetLinkCost(100) + faceUri := AdjLsaLogicFaceUri{} + faceUri.setLogicFaceUri("uri") + faceId :=AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden,_ := component.CreateIdentifierByString("/pku/router") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + // 再测试:全部为true则pass + iden2,_ := component.CreateIdentifierByString("/pku/router") + fmt.Println(adjInfo.Compare(iden2)) + fmt.Println(adjInfo.CompareLogicFaceId(77)) + fmt.Println(adjInfo.CompareLogicFaceUriString("uri")) + fmt.Println(adjInfo.CompareLogicFaceUri(&faceUri)) +} + +// +// TestAdjLsaAdjacencyInfo_WireEncode +// @Description: 测试编码 +// @param t +// +func TestAdjLsaAdjacencyInfo_WireEncode(t *testing.T) { + // 先构造 + linkCost :=AdjLsaLinkCost{} + linkCost.SetLinkCost(100) + faceUri := AdjLsaLogicFaceUri{} + faceUri.setLogicFaceUri("uri") + faceId :=AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden,_ := component.CreateIdentifierByString("/pku/router") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + + // 构造编码器 + encoder := encoding.Encoder{} + err := encoder.EncoderReset(encoding.MaxPacketSize, 0) + if err != nil { + fmt.Println("encoder reset失败 ", err.Error()) + return + } + + // 编码并打印 + cnt, err := adjInfo.WireEncode(&encoder) + if err != nil { + fmt.Println("AdjInfo 线速编码失败 ", err.Error()) + return + } + res, err := encoder.GetBuffer() + if err != nil { + fmt.Println("获取编码结果失败 ", err.Error()) + return + } + fmt.Println(cnt) + for i:=0;i < len(res);i++{ + fmt.Print(res[i],", ") + } + fmt.Println() + // 241, 1, 169, 33, 101, 19, 100, 2, 0, 47, 100, 4, 0, 112, 107, 117, 100, 7, 0, 114, 111, 117, 116, 101, 114, 241, 1, 168, 3, 117, 114, 105, 241, 1, 167, 1, 100, +} + +// +// TestAdjLsaAdjacencyInfo_WireDecode +// @Description: 测试线速解码 +// 注意,编码解码目前只作用于三个信息项目:链路开销、faceuri、邻接路预期标识符三个信息项 +// @param t +// +func TestAdjLsaAdjacencyInfo_WireDecode(t *testing.T) { + // 由数组构建block + var buf = [37]byte{241, 1, 169, 33, 101, 19, 100, 2, 0, 47, 100, 4, 0, 112, 107, + 117, 100, 7, 0, 114, 111, 117, 116, + 101, 114, 241, 1, 168, 3, 117, 114, 105, 241, 1, 167, 1, 100} + block, err := encoding.CreateBlockByBuffer(buf[:], true) + if err != nil { + fmt.Println("创建block失败 ", err.Error()) + return + } + + // 由Block构建结构体,并打印变量 + adjInfo := new(AdjLsaAdjacencyInfo) + err = adjInfo.WireDecode(block) + if err != nil { + fmt.Println("线性解码失败 ", err.Error()) + return + } + fmt.Println(adjInfo.ToString()) +} \ No newline at end of file diff --git a/lsa/AdjLsaAdjacencyList_test.go b/lsa/AdjLsaAdjacencyList_test.go new file mode 100644 index 0000000..7733099 --- /dev/null +++ b/lsa/AdjLsaAdjacencyList_test.go @@ -0,0 +1,15 @@ +// Package lsa +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/4/22 0:15 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package lsa + +import "testing" + +func TestAdjLsaAdjacenctList_GetAdjList(t *testing.T) { + +} diff --git a/lsa/AdjLsa_test.go b/lsa/AdjLsa_test.go new file mode 100644 index 0000000..38a9c62 --- /dev/null +++ b/lsa/AdjLsa_test.go @@ -0,0 +1,9 @@ +// Package lsa +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/4/22 11:01 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package lsa From d650b6c3ba3f1720df90deb260347755f0a8dfe2 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 27 Apr 2022 17:14:43 +0800 Subject: [PATCH 02/70] =?UTF-8?q?=E6=B5=8B=E8=AF=95adjInfoList?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsa/AdjLsaAdjacencyList.go | 19 +++ lsa/AdjLsaAdjacencyList_test.go | 223 +++++++++++++++++++++++++++++++- 2 files changed, 241 insertions(+), 1 deletion(-) diff --git a/lsa/AdjLsaAdjacencyList.go b/lsa/AdjLsaAdjacencyList.go index d7b4c85..2defaac 100644 --- a/lsa/AdjLsaAdjacencyList.go +++ b/lsa/AdjLsaAdjacencyList.go @@ -47,6 +47,25 @@ func (l *AdjLsaAdjacenctList) GetAdjList() []*AdjLsaAdjacencyInfo { return l.lsaAdjacencys } +// +// ToString +// @Description: 转string +// @receiver l +// @return string +// +func (l *AdjLsaAdjacenctList) ToString() string { + var resString string + resString += "[ " + for i := 0; i < l.Size(); i++ { + resString += l.GetAdjList()[i].ToString() + if i < (l.Size()-1){ + resString += ", " + } + } + resString += " ]" + return resString +} + // // isNeighbor // @Description: 判断某个MIR标识符是否是邻居MIR diff --git a/lsa/AdjLsaAdjacencyList_test.go b/lsa/AdjLsaAdjacencyList_test.go index 7733099..5753de3 100644 --- a/lsa/AdjLsaAdjacencyList_test.go +++ b/lsa/AdjLsaAdjacencyList_test.go @@ -8,8 +8,229 @@ package lsa -import "testing" +import ( + "fmt" + "minlib/component" + "minlib/encoding" + "testing" +) +// +// TestAdjLsaAdjacenctList_GetAdjList +// @Description: 测试构造、打印 +// @param t +// func TestAdjLsaAdjacenctList_GetAdjList(t *testing.T) { + // 先构造一个info + linkCost :=AdjLsaLinkCost{} + linkCost.SetLinkCost(100) + faceUri := AdjLsaLogicFaceUri{} + faceUri.setLogicFaceUri("uri") + faceId :=AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden,_ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + // 构造Info列表 + adjInfoList := new(AdjLsaAdjacenctList) + adjInfoList.Insert(adjInfo) + + // 再加第二个info + iden2,_ := component.CreateIdentifierByString("/pku/router2") + adjInfo.SetNeighborRouterIdentifier(iden2) + adjInfoList.Insert(adjInfo) + + // 测试输出 + fmt.Println(adjInfoList.ToString()) } + +// +// TestAdjLsaAdjacenctList_IsNeighbor +// @Description: 测试是否是邻居路由器 +// @param t +// +func TestAdjLsaAdjacenctList_IsNeighbor(t *testing.T) { + // 先构造一个info + linkCost :=AdjLsaLinkCost{} + linkCost.SetLinkCost(100) + faceUri := AdjLsaLogicFaceUri{} + faceUri.setLogicFaceUri("uri") + faceId :=AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden,_ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + adjInfoList := new(AdjLsaAdjacenctList) + adjInfoList.Insert(adjInfo) + + // 测试某路由器是否是邻居节点 + fmt.Println(adjInfoList.IsNeighbor(iden)) + iden2,_ := component.CreateIdentifierByString("/pku/router2") + fmt.Println(adjInfoList.IsNeighbor(iden2)) +} + +// +// TestAdjLsaAdjacenctList_IncrementTimedOutInterestCount +// @Description: 测试增加、设置、获取已经失败的hello兴趣包的数目 +// @param t +// +func TestAdjLsaAdjacenctList_IncrementTimedOutInterestCount(t *testing.T) { + // 先构造一个info + linkCost :=AdjLsaLinkCost{} + linkCost.SetLinkCost(100) + faceUri := AdjLsaLogicFaceUri{} + faceUri.setLogicFaceUri("uri") + faceId :=AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden,_ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + adjInfoList := new(AdjLsaAdjacenctList) + adjInfoList.Insert(adjInfo) + + // 测试增加已经失败的hello兴趣包的数目 + _ = adjInfoList.IncrementTimedOutInterestCount(iden) + fmt.Println(adjInfoList.ToString()) + + // 测试设置 + _ = adjInfoList.SetTimedOutInterestCount(iden, 10) + fmt.Println(adjInfoList.ToString()) + + // 测试获取 + fmt.Println(adjInfoList.GetTimedOutInterestCount(iden)) +} + +// +// TestAdjLsaAdjacenctList_GetStatusOfNeighbor +// @Description: 测试操作邻居路由器的状态 +// @param t +// +func TestAdjLsaAdjacenctList_GetStatusOfNeighbor(t *testing.T) { + // 先构造一个info + linkCost :=AdjLsaLinkCost{} + linkCost.SetLinkCost(100) + faceUri := AdjLsaLogicFaceUri{} + faceUri.setLogicFaceUri("uri") + faceId :=AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden,_ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + adjInfoList := new(AdjLsaAdjacenctList) + adjInfoList.Insert(adjInfo) + + // 测试获取状态 + fmt.Println(adjInfoList.GetStatusOfNeighbor(iden)) + + // 设置再获取 + adjInfoList.SetStatusOfNeighbor(iden,2) + fmt.Println(adjInfoList.GetStatusOfNeighbor(iden)) +} + +// +// TestAdjLsaAdjacenctList_FindAdjacencyByRouterIdentifier +// @Description: 测试获取邻接信息 +// @param t +// +func TestAdjLsaAdjacenctList_FindAdjacencyByRouterIdentifier(t *testing.T) { + // 先构造一个info + linkCost :=AdjLsaLinkCost{} + linkCost.SetLinkCost(100) + faceUri := AdjLsaLogicFaceUri{} + faceUri.setLogicFaceUri("uri") + faceId :=AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden,_ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + adjInfoList := new(AdjLsaAdjacenctList) + adjInfoList.Insert(adjInfo) + + // 获取 + fmt.Println(adjInfoList.FindAdjacencyByRouterIdentifier(iden)[0].ToString()) + //fmt.Println(adjInfoList.FindAdjacencyByRouterIdentifier(iden)[1].ToString()) + fmt.Println(adjInfoList.FindAdjacencyByLogicFaceId(&faceId)[0].ToString()) + fmt.Println(adjInfoList.FindAdjacencyByLogicFaceUri(&faceUri)[0].ToString()) +} + +// +// TestAdjLsaAdjacenctList_WireEncode +// @Description: 测试编码 +// @param t +// +func TestAdjLsaAdjacenctList_WireEncode(t *testing.T) { + // 先构造一个info + linkCost :=AdjLsaLinkCost{} + linkCost.SetLinkCost(100) + faceUri := AdjLsaLogicFaceUri{} + faceUri.setLogicFaceUri("uri") + faceId :=AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden,_ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + // 构造Info列表 + adjInfoList := new(AdjLsaAdjacenctList) + adjInfoList.Insert(adjInfo) + // 再加第二个info + iden2,_ := component.CreateIdentifierByString("/pku/router2") + adjInfo2 := AdjLsaAdjacencyInfo{ + AdjLsaLinkCost: adjInfo.AdjLsaLinkCost, + AdjLsaLogicFaceUri: adjInfo.AdjLsaLogicFaceUri, + AdjLsaLogicFaceId: adjInfo.AdjLsaLogicFaceId, + lsaNeighborRouterIdentifier: iden2, + InterestTimedOutNo: 111, + Status: 0, + } + adjInfoList.Insert(&adjInfo2) + fmt.Println(adjInfoList.ToString()) + + // 构造编码器 + encoder := encoding.Encoder{} + err := encoder.EncoderReset(encoding.MaxPacketSize, 0) + if err != nil { + fmt.Println("encoder reset失败 ", err.Error()) + return + } + + // 编码并打印 + cnt, err := adjInfoList.WireEncode(&encoder) + if err != nil { + fmt.Println("LsaBase 线速编码失败 ", err.Error()) + return + } + res, err := encoder.GetBuffer() + if err != nil { + fmt.Println("获取编码结果失败 ", err.Error()) + return + } + fmt.Println(cnt) + for i:=0;i < len(res);i++{ + fmt.Print(res[i],", ") + } + fmt.Println() +} + +// +// TestAdjLsaAdjacenctList_WireDecode +// @Description: 测试解码 +// @param t +// +func TestAdjLsaAdjacenctList_WireDecode(t *testing.T) { + // 由数组构建block + var buf = [80]byte{241, 1, 170, 76, 241, 1, 169, 34, 101, 20, 100, 2, + 0, 47, 100, 4, 0, 112, 107, 117, 100, 8, 0, 114, 111, 117, 116, + 101, 114, 49, 241, 1, 168, 3, 117, 114, 105, 241, 1, 167, 1, 100, + 241, 1, 169, 34, 101, 20, 100, 2, 0, 47, 100, 4, 0, 112, 107, 117, + 100, 8, 0, 114, 111, 117, 116, 101, 114, 50, + 241, 1, 168, 3, 117, 114, 105, 241, 1, 167, 1, 100} + block, err := encoding.CreateBlockByBuffer(buf[:], true) + if err != nil { + fmt.Println("创建block失败 ", err.Error()) + return + } + + // 由Block构建结构体,并打印变量 + base := new(AdjLsaAdjacenctList) + err = base.WireDecode(block) + if err != nil { + fmt.Println("线性解码失败 ", err.Error()) + return + } + fmt.Println(base.ToString()) +} \ No newline at end of file From e533f8185fc222c904950650e1664a73c127eb89 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 27 Apr 2022 17:24:41 +0800 Subject: [PATCH 03/70] =?UTF-8?q?=E6=B5=8B=E8=AF=95adjLsa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsa/AdjLsa.go | 9 ++- lsa/AdjLsa_test.go | 137 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 144 insertions(+), 2 deletions(-) diff --git a/lsa/AdjLsa.go b/lsa/AdjLsa.go index 57c2547..4ebd8dc 100644 --- a/lsa/AdjLsa.go +++ b/lsa/AdjLsa.go @@ -72,8 +72,13 @@ func (a *AdjLsa) IsEqualContent(aLsa *AdjLsa) bool { // @return string // func (a *AdjLsa) ToString() string { - // todo - return "" + var res = "" + res += "{ " + res += a.LsaBase.ToString() + res += ", " + res += a.AdjLsaAdjacenctList.ToString() + res += " }" + return res } // diff --git a/lsa/AdjLsa_test.go b/lsa/AdjLsa_test.go index 38a9c62..6a36a6d 100644 --- a/lsa/AdjLsa_test.go +++ b/lsa/AdjLsa_test.go @@ -7,3 +7,140 @@ // package lsa + +import ( + "fmt" + "minlib/component" + "minlib/encoding" + "testing" +) + +// +// TestAdjLsa_New +// @Description: 构造 +// @param t +// +func TestAdjLsa_New(t *testing.T) { + // 构造基本部分 + base := new(AdjLsa) + base.SetLsaExpirationTime(2000) + base.SetLsaSequenceNumber(1234) + base.LsaOriginRouterIdentifier,_ = component.CreateIdentifierByString("/min/pku") + // 构造邻接信息部分 + // 先构造一个info + linkCost :=AdjLsaLinkCost{} + linkCost.SetLinkCost(100) + faceUri := AdjLsaLogicFaceUri{} + faceUri.setLogicFaceUri("uri") + faceId :=AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden,_ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + base.Insert(adjInfo) + // 再加第二个info + iden2,_ := component.CreateIdentifierByString("/pku/router2") + adjInfo2 := AdjLsaAdjacencyInfo{ + AdjLsaLinkCost: adjInfo.AdjLsaLinkCost, + AdjLsaLogicFaceUri: adjInfo.AdjLsaLogicFaceUri, + AdjLsaLogicFaceId: adjInfo.AdjLsaLogicFaceId, + lsaNeighborRouterIdentifier: iden2, + InterestTimedOutNo: 111, + Status: 0, + } + base.Insert(&adjInfo2) + + // 打印该adjlsa + fmt.Println(base.ToString()) +} + +// +// TestAdjLsa_WireEncode +// @Description: 测试线速编码 +// @param t +// +func TestAdjLsa_WireEncode(t *testing.T) { + // 构造LSA + base := new(AdjLsa) + base.SetLsaExpirationTime(2000) + base.SetLsaSequenceNumber(1234) + base.LsaOriginRouterIdentifier,_ = component.CreateIdentifierByString("/min/pku") + // 构造邻接信息部分 + // 先构造一个info + linkCost :=AdjLsaLinkCost{} + linkCost.SetLinkCost(100) + faceUri := AdjLsaLogicFaceUri{} + faceUri.setLogicFaceUri("uri") + faceId :=AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden,_ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + base.Insert(adjInfo) + // 再加第二个info + iden2,_ := component.CreateIdentifierByString("/pku/router2") + adjInfo2 := AdjLsaAdjacencyInfo{ + AdjLsaLinkCost: adjInfo.AdjLsaLinkCost, + AdjLsaLogicFaceUri: adjInfo.AdjLsaLogicFaceUri, + AdjLsaLogicFaceId: adjInfo.AdjLsaLogicFaceId, + lsaNeighborRouterIdentifier: iden2, + InterestTimedOutNo: 111, + Status: 0, + } + base.Insert(&adjInfo2) + + // 构造编码器 + encoder := encoding.Encoder{} + err := encoder.EncoderReset(encoding.MaxPacketSize, 0) + if err != nil { + fmt.Println("encoder reset失败 ", err.Error()) + return + } + + // 编码并打印 + cnt, err := base.WireEncode(&encoder) + if err != nil { + fmt.Println("LsaBase 线速编码失败 ", err.Error()) + return + } + res, err := encoder.GetBuffer() + if err != nil { + fmt.Println("获取编码结果失败 ", err.Error()) + return + } + fmt.Println(cnt) + for i:=0;i < len(res);i++{ + fmt.Print(res[i],", ") + } + fmt.Println() +} + +// +// TestAdjLsa_WireDecode +// @Description: 测试线速解码 +// @param t +// +func TestAdjLsa_WireDecode(t *testing.T) { + // 由数组构建block + var buf = [118]byte{241, 1, 145, 114, 241, 1, 154, 30, 101, 16, 100, + 2, 0, 47, 100, 4, 0, 109, 105, 110, 100, 4, 0, 112, 107, 117, + 241, 1, 165, 2, 4, 210, 241, 1, 164, 2, 7, 208, 241, 1, 170, + 76, 241, 1, 169, 34, 101, 20, 100, 2, 0, 47, 100, 4, 0, 112, + 107, 117, 100, 8, 0, 114, 111, 117, 116, 101, 114, 49, 241, + 1, 168, 3, 117, 114, 105, 241, 1, 167, 1, 100, 241, 1, 169, + 34, 101, 20, 100, 2, 0, 47, 100, 4, 0, 112, 107, 117, 100, + 8, 0, 114, 111, 117, 116, 101, 114, 50, + 241, 1, 168, 3, 117, 114, 105, 241, 1, 167, 1, 100} + block, err := encoding.CreateBlockByBuffer(buf[:], true) + if err != nil { + fmt.Println("创建block失败 ", err.Error()) + return + } + + // 由Block构建结构体,并打印变量 + base := new(AdjLsa) + err = base.WireDecode(block) + if err != nil { + fmt.Println("线性解码失败 ", err.Error()) + return + } + fmt.Println(base.ToString()) +} \ No newline at end of file From d3e1278a1a45bd69ab03acc327498f05836df573 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 5 May 2022 21:19:09 +0800 Subject: [PATCH 04/70] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E8=A1=A8=E6=A8=A1=E5=9D=97=EF=BC=9ANextHop=20RouteCost=20FaceU?= =?UTF-8?q?ri?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/TlvMlsrExtention.go | 5 ++ route/ConnectingLogicFaceUri.go | 71 ++++++++++++++++++++ route/NextHop.go | 114 ++++++++++++++++++++++++++++++++ route/NextHopList.go | 9 +++ route/RouteCost.go | 71 ++++++++++++++++++++ route/RoutingTableEntry.go | 16 +++++ 6 files changed, 286 insertions(+) create mode 100644 route/ConnectingLogicFaceUri.go create mode 100644 route/NextHop.go create mode 100644 route/NextHopList.go create mode 100644 route/RouteCost.go create mode 100644 route/RoutingTableEntry.go diff --git a/extensions/TlvMlsrExtention.go b/extensions/TlvMlsrExtention.go index 62a2749..254c152 100644 --- a/extensions/TlvMlsrExtention.go +++ b/extensions/TlvMlsrExtention.go @@ -32,5 +32,10 @@ const ( TlvMlsrNameLsaNamePrefixSource = 427 // 名称前缀的来源 TlvMlsrNameLsaNamePrefixInfo = 428 // 单条名称前缀信息 TlvMlsrNameLsaNamePrefixList = 429 // 一个名称LSA包含的所有名称前缀信息 + + // route模块涉及到的组件 + TlvMlsrConnectingLogicFaceUri = 441 + TlvMlsrRouteCost = 442 + TlvMlsrNextHop = 443 ) diff --git a/route/ConnectingLogicFaceUri.go b/route/ConnectingLogicFaceUri.go new file mode 100644 index 0000000..e765fa0 --- /dev/null +++ b/route/ConnectingLogicFaceUri.go @@ -0,0 +1,71 @@ +// Package lsa +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/5 10:38 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import ( + "minlib/component" + "minlib/encoding" + "mlsr/extensions" +) + +// +// ConnectingLogicFaceUri +// @Description: MIR层级对LogicFace的描述。例子:udp://1.0.0.2 +// +type ConnectingLogicFaceUri struct { + component.CommonString +} + +// +// LogicFaceUri +// @Description: 获取LogicFaceUri +// @receiver l +// @return string +// +func (l *ConnectingLogicFaceUri) LogicFaceUri() string { + return l.CommonString.Value() +} + +// +// setLogicFaceUri +// @Description: 设置LogicFaceUri +// @receiver l +// @param logicFaceUri +// +func (l *ConnectingLogicFaceUri) setLogicFaceUri(logicFaceUri string) { + l.CommonString.SetValue(logicFaceUri) +} + +// +// WireEncode +// @Description: 线速编码 +// @receiver l +// @param encoder +// @return int +// @return error +// +func (l *ConnectingLogicFaceUri) WireEncode(encoder *encoding.Encoder) (int,error) { + l.CommonString.SetTlvType(extensions.TlvMlsrConnectingLogicFaceUri) + return l.CommonString.WireEncode(encoder) +} + +// +// WireDecode +// @Description: 线速解码 +// @receiver l +// @param block +// @return error +// +func (l *ConnectingLogicFaceUri) WireDecode(block *encoding.Block) error { + // 检查type是否正确 + if err := encoding.ExpectType(block.GetType(),extensions.TlvMlsrConnectingLogicFaceUri); err!=nil { + return err + } + return l.CommonString.WireDecode(block) +} diff --git a/route/NextHop.go b/route/NextHop.go new file mode 100644 index 0000000..038778f --- /dev/null +++ b/route/NextHop.go @@ -0,0 +1,114 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/5 20:45 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import ( + "minlib/encoding" + "mlsr/extensions" +) + +// +// NextHop +// @Description: 下一跳 +// +type NextHop struct { + ConnectingLogicFaceUri // 指示接口 + RouteCost // 路由开销 + IsHyperbolic bool // 是不是双曲路由(v0.1暂时用不到) +} + +// +// NewNextHop +// @Description: 新建一个下一跳结构体 +// @param uri +// @param cost +// @return *NextHop +// @return error +// +func NewNextHop(uri string,cost uint64) (*NextHop,error) { + // todo 检查传入的参数格式是否有效 + nextHop := new(NextHop) + nextHop.IsHyperbolic = false + nextHop.setLogicFaceUri(uri) + nextHop.SetRouteCost(cost) + return nextHop,nil +} + +// +// WireEncode +// @Description: 线速编码 +// @receiver l +// @param encoder +// @return int +// @return error +// +func (l *NextHop) WireEncode(encoder *encoding.Encoder) (int,error) { + totalLength := 0 + // TLV-Value + tmpLen,err := l.ConnectingLogicFaceUri.WireEncode(encoder) + if err != nil { + return 0, err + } + totalLength += tmpLen + tmpLen,err = l.RouteCost.WireEncode(encoder) + if err != nil { + return 0, err + } + totalLength += tmpLen + + // TLV-Length + tmpLen,err = encoder.PrependVarNumber(encoding.VlInt(totalLength)) + if err != nil { + return 0, err + } + totalLength += tmpLen + + // TLV-Type + tmpLen, err = encoder.PrependVarNumber(extensions.TlvMlsrNextHop) + if err != nil { + return 0, err + } + totalLength += tmpLen + + return totalLength,nil +} + +// +// WireDecode +// @Description: 线速解码 +// @receiver l +// @param block +// @return error +// +func (l *NextHop) WireDecode(block *encoding.Block) error { + // 检查 TLV-TYPE 是否正确 + if err := encoding.ExpectType(block.GetType(), extensions.TlvMlsrNextHop); err != nil { + return err + } + + // 首先解析子Block + if err := block.ParseSubElements(); err != nil { + return err + } + + // 提取参数 + for _, parameter := range block.GetSubElements(){ + switch parameter.GetType() { + case extensions.TlvMlsrConnectingLogicFaceUri: + if err:= l.ConnectingLogicFaceUri.WireDecode(parameter); err != nil { + return err + } + case extensions.TlvMlsrRouteCost: + if err:= l.RouteCost.WireDecode(parameter); err != nil { + return err + } + } + } + return nil +} \ No newline at end of file diff --git a/route/NextHopList.go b/route/NextHopList.go new file mode 100644 index 0000000..7e4a0ad --- /dev/null +++ b/route/NextHopList.go @@ -0,0 +1,9 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/5 20:44 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route diff --git a/route/RouteCost.go b/route/RouteCost.go new file mode 100644 index 0000000..4062baa --- /dev/null +++ b/route/RouteCost.go @@ -0,0 +1,71 @@ +// Package lsa +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/3/10 10:39 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import ( + "minlib/component" + "minlib/encoding" + "mlsr/extensions" +) + +// +// RouteCost +// @Description: 链路开销 +// +type RouteCost struct { + component.CommonUint64 +} + +// +// RouteCost +// @Description: 获取开销 +// @receiver l +// @return uint64 +// +func (l *RouteCost) RouteCost() uint64 { + return l.CommonUint64.Value() +} + +// +// SetRouteCost +// @Description: 设置开销 +// @receiver l +// @param linkCost +// +func (l *RouteCost) SetRouteCost(linkCost uint64) { + l.CommonUint64.SetValue(linkCost) +} + +// +// WireEncode +// @Description: 线速编码 +// @receiver l +// @param encoder +// @return int +// @return error +// +func (l *RouteCost) WireEncode(encoder *encoding.Encoder) (int, error) { + l.CommonUint64.SetTlvType(extensions.TlvMlsrRouteCost) + return l.CommonUint64.WireEncode(encoder) +} + +// +// WireDecode +// @Description: 线速解码 +// @receiver l +// @param block +// @return error +// +func (l *RouteCost) WireDecode(block *encoding.Block) error { + // 检查type是否正确 + if err := encoding.ExpectType(block.GetType(),extensions.TlvMlsrRouteCost); err!=nil { + return err + } + return l.CommonUint64.WireDecode(block) +} diff --git a/route/RoutingTableEntry.go b/route/RoutingTableEntry.go new file mode 100644 index 0000000..b5623f0 --- /dev/null +++ b/route/RoutingTableEntry.go @@ -0,0 +1,16 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/5 20:41 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import "minlib/component" + +type RoutingTableEntry struct { + m_destination *component.Identifier + +} From c6e5e034a9b2bbc7e50a354121d39e4345b54121 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 5 May 2022 21:51:20 +0800 Subject: [PATCH 05/70] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E8=A1=A8=E6=A8=A1=E5=9D=97=EF=BC=9ANextHopList?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/TlvMlsrExtention.go | 1 + route/NextHop.go | 1 + route/NextHopList.go | 182 +++++++++++++++++++++++++++++++++ 3 files changed, 184 insertions(+) diff --git a/extensions/TlvMlsrExtention.go b/extensions/TlvMlsrExtention.go index 254c152..1bad1f4 100644 --- a/extensions/TlvMlsrExtention.go +++ b/extensions/TlvMlsrExtention.go @@ -37,5 +37,6 @@ const ( TlvMlsrConnectingLogicFaceUri = 441 TlvMlsrRouteCost = 442 TlvMlsrNextHop = 443 + TlvMlsrNextHopList = 444 ) diff --git a/route/NextHop.go b/route/NextHop.go index 038778f..1fb4b02 100644 --- a/route/NextHop.go +++ b/route/NextHop.go @@ -18,6 +18,7 @@ import ( // @Description: 下一跳 // type NextHop struct { + encoding.SelfEncodingBase ConnectingLogicFaceUri // 指示接口 RouteCost // 路由开销 IsHyperbolic bool // 是不是双曲路由(v0.1暂时用不到) diff --git a/route/NextHopList.go b/route/NextHopList.go index 7e4a0ad..2602725 100644 --- a/route/NextHopList.go +++ b/route/NextHopList.go @@ -7,3 +7,185 @@ // package route + +import ( + "golang.org/x/tools/go/ssa/interp/testdata/src/errors" + "minlib/encoding" + "mlsr/extensions" +) + +type NextHopContainer []*NextHop + +// +// NextHopList +// @Description: 下一跳列表 +// +type NextHopList struct { + encoding.SelfEncodingBase + nextHops NextHopContainer +} + +// +// GetNextHops +// @Description: 获取下一跳列表 +// @receiver l +// @return []*NextHop +// +func (l *NextHopList) GetNextHops() []*NextHop { + return l.nextHops +} + +// +// findSameUriNextHop +// @Description: 找到uri一致的下一跳表项 +// @receiver l +// @param hop +// @return int 找不到时,返回-1 +// +func (l *NextHopList) findSameUriNextHop(hop *NextHop) int { + for i := 0; i < len(l.nextHops); i++ { + if l.nextHops[i].LogicFaceUri() == hop.LogicFaceUri(){ + return i + } + } + return -1 +} + +// +// findSameNextHop +// @Description: 找到uri和cost都一致的下一跳表项 +// @receiver l +// @param hop +// @return int 找不到,返回-1 +// +func (l *NextHopList) findSameNextHop(hop *NextHop) int { + for i := 0; i < len(l.nextHops); i++ { + if (l.nextHops[i].LogicFaceUri() == hop.LogicFaceUri()) && + (l.nextHops[i].RouteCost.RouteCost() == hop.RouteCost.RouteCost()){ + return i + } + } + return -1 +} + +// +// AddNextHop +// @Description: 增加一个下一跳表项。1. 如果不存在同uri,则插入;2. 如果存在,但cost不同,则更新它 +// @receiver l +// @param hop +// +func (l *NextHopList) AddNextHop(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(){ + l.nextHops[index].RouteCost.SetRouteCost(hop.RouteCost.RouteCost()) + } +} + +// +// RemoveNextHop +// @Description: 删除一个下一跳表项。 +// @receiver l +// @param hop +// +func (l *NextHopList) RemoveNextHop(hop *NextHop) { + // 查找该条目索引 + index := l.findSameUriNextHop(hop) + if index>0 { + l.nextHops = append(l.nextHops[:index],l.nextHops[index+1:]...) + } +} + +// +// Size +// @Description: 返回表项数目 +// @receiver l +// @return int +// +func (l *NextHopList) Size() int { + return len(l.nextHops) +} + +// +// Clear +// @Description: 清空列表 +// @receiver l +// +func (l *NextHopList) Clear() { + l.nextHops=[]*NextHop{} +} + +// +// WireEncode +// @Description: 线速编码 +// @receiver l +// @param encoder +// @return int +// @return error +// +func (l *NextHopList) WireEncode(encoder *encoding.Encoder) (int, error) { + // 判断列表长度,为0则抛出错误 + if len(l.nextHops) == 0 { + return 0, errors.New("Invalid NextHopList, expect at least one NextHop!") + } + totalLength := 0 + // 编码 TLV-VALUE + // 反向遍历,可以保证解码的时候正向输出 + for i := len(l.nextHops) - 1; i >= 0; i-- { + if l.nextHops[i] == nil { + continue + } + tmpLen, err := l.nextHops[i].WireEncode(encoder) + if err != nil { + return 0, err + } + totalLength += tmpLen + } + + // 编码 TLV-LENGTH + tmpLen, err := encoder.PrependVarNumber(encoding.VlInt(totalLength)) + if err != nil { + return 0, err + } + totalLength += tmpLen + + // 编码 TLV-TYPE + tmpLen, err = encoder.PrependVarNumber(extensions.TlvMlsrNextHopList) + if err != nil { + return 0, err + } + totalLength += tmpLen + + return totalLength, nil +} + +// +// WireDecode +// @Description: 线速解码 +// @receiver l +// @param block +// @return error +// +func (l *NextHopList) WireDecode(block *encoding.Block) error { + // 检查 TLV-TYPE 是否正确 + if err := encoding.ExpectType(block.GetType(), extensions.TlvMlsrNextHopList); err != nil { + return err + } + + // 解析子 TLV + if err := block.ParseSubElements(); err != nil { + return err + } + hopContainer := make(NextHopContainer, len(block.GetSubElements())) + for index, element := range block.GetSubElements() { + var nextHop NextHop + err := nextHop.WireDecode(element) + if err != nil { + return err + } + hopContainer[index] = &nextHop + } + l.nextHops = hopContainer + return nil +} \ No newline at end of file From e521d89d9d5b3dc4159df005c6057a1700a19ae3 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 5 May 2022 21:52:41 +0800 Subject: [PATCH 06/70] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug=EF=BC=9A=E6=94=B9?= =?UTF-8?q?=E4=B8=BA=E6=99=AE=E9=80=9Aerror?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NextHopList.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/route/NextHopList.go b/route/NextHopList.go index 2602725..5c74356 100644 --- a/route/NextHopList.go +++ b/route/NextHopList.go @@ -9,7 +9,7 @@ package route import ( - "golang.org/x/tools/go/ssa/interp/testdata/src/errors" + "errors" "minlib/encoding" "mlsr/extensions" ) From c745ba56e6356d14a865e7d6091ddee34c9c34bb Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 6 May 2022 12:07:54 +0800 Subject: [PATCH 07/70] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=A1=A5=E5=85=85ReadM?= =?UTF-8?q?e.md=E6=96=87=E4=BB=B6=E5=86=85=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/README.md b/README.md index e69de29..39dd4eb 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,33 @@ +# MLSR +## 介绍 +MLSR(MIN Link State Routing Protocol,多标识网络链路状态路由协议)是MIN(Mutil-Identifier Network,多标识网络)中的基本路由协议。 + +MLSR支持推式传输和拉式传输下的路由寻址。 + +## 开发规范 +### 注释规范 +* 源代码文件抬头注明开发者、时间、版本、组织等信息,请参考较早提交的代码文件。 +* 结构体及函数需注明其作用,请参考较早提交的代码文件。 + +### 代码规范 +* 函数之间留有确定行数的空行。 +* 复杂函数内部可根据逻辑关系,用空行分割为若干块,并加入注释予以解释。 + + +## 开发环境及依赖 +### 开发环境 + +| 环境项 | 信息 | +| :----: | :----: | +| Golang | go 1.18 | +| IDE推荐 | GoLand | + +### 软件依赖 +minlib +注:请将minlib放置在与mlsr同目录下,注意,不是mlsr目录之下,是平行关系。 + +## 联系我们 +MIN-Group +国家重大科技基础设施——未来网络北大实验室 +深圳市信息论与未来网络重点实验室 +开发者邮箱:wefree@stu.pku.edu.cn \ No newline at end of file From 2a60b650785c02232a3048d7212a3cab68a4f658 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Sat, 7 May 2022 19:51:19 +0800 Subject: [PATCH 08/70] =?UTF-8?q?=E8=A1=A5=E5=85=85=E5=AE=9E=E7=8E=B0Routi?= =?UTF-8?q?ngTableEntry?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 10 +++ extensions/TlvMlsrExtention.go | 2 + route/RoutingTableEntry.go | 121 ++++++++++++++++++++++++++++++++- 3 files changed, 131 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 39dd4eb..42ae0c0 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,16 @@ MLSR(MIN Link State Routing Protocol,多标识网络链路状态路由协议 MLSR支持推式传输和拉式传输下的路由寻址。 +## 功能模块简述 + +### LSA模块 + +### LSDB模块 + +### 路由表模块 + +### NPT模块 + ## 开发规范 ### 注释规范 * 源代码文件抬头注明开发者、时间、版本、组织等信息,请参考较早提交的代码文件。 diff --git a/extensions/TlvMlsrExtention.go b/extensions/TlvMlsrExtention.go index 1bad1f4..7c8bc92 100644 --- a/extensions/TlvMlsrExtention.go +++ b/extensions/TlvMlsrExtention.go @@ -38,5 +38,7 @@ const ( TlvMlsrRouteCost = 442 TlvMlsrNextHop = 443 TlvMlsrNextHopList = 444 + TlvMlsrRoutingTableEntry = 445 + ) diff --git a/route/RoutingTableEntry.go b/route/RoutingTableEntry.go index b5623f0..67de72c 100644 --- a/route/RoutingTableEntry.go +++ b/route/RoutingTableEntry.go @@ -8,9 +8,126 @@ package route -import "minlib/component" +import ( + "minlib/component" + "minlib/encoding" + "mlsr/extensions" +) +// +// RoutingTableEntry +// @Description: 路由表条目 +// type RoutingTableEntry struct { m_destination *component.Identifier - + NextHopList } + +// +// NewRoutingTableEntry +// @Description: 新建一个路由表条目 +// @param dest +// @return *RoutingTableEntry +// @return error +// +func NewRoutingTableEntry(dest *component.Identifier) (*RoutingTableEntry,error) { + // todo: 判断dest是否格式有效 + rte := new(RoutingTableEntry) + rte.m_destination=dest + return rte,nil +} + +// +// GetDestination +// @Description: 获取目的路由器 +// @receiver e +// @return *component.Identifier +// +func (e *RoutingTableEntry) GetDestination(dest *component.Identifier) *component.Identifier { + return e.m_destination +} + +// +// SetDestination +// @Description: 设置目的路由器 +// @receiver e +// @param dest +// +func (e *RoutingTableEntry) SetDestination(dest *component.Identifier) { + e.m_destination=dest +} + +// +// WireEncode +// @Description: 线速编码 +// @receiver l +// @param encoder +// @return int +// @return error +// +func (e *RoutingTableEntry) WireEncode(encoder *encoding.Encoder) (int,error) { + totalLength := 0 + // TLV-Value + tmpLen,err := e.NextHopList.WireEncode(encoder) + if err != nil { + return 0, err + } + totalLength += tmpLen + tmpLen,err = e.m_destination.WireEncode(encoder) + if err != nil { + return 0, err + } + totalLength += tmpLen + + // TLV-Length + tmpLen,err = encoder.PrependVarNumber(encoding.VlInt(totalLength)) + if err != nil { + return 0, err + } + totalLength += tmpLen + + // TLV-Type + tmpLen, err = encoder.PrependVarNumber(extensions.TlvMlsrRoutingTableEntry) + if err != nil { + return 0, err + } + totalLength += tmpLen + + return totalLength,nil +} + +// +// WireDecode +// @Description: 线速解码 +// @receiver l +// @param block +// @return error +// +func (e *RoutingTableEntry) WireDecode(block *encoding.Block) error { + // 检查 TLV-TYPE 是否正确 + if err := encoding.ExpectType(block.GetType(), extensions.TlvMlsrRoutingTableEntry); err != nil { + return err + } + + // 首先解析子Block + if err := block.ParseSubElements(); err != nil { + return err + } + + // 提取参数 + for _, parameter := range block.GetSubElements(){ + switch parameter.GetType() { + case encoding.TlvIdentifier: + iden:=component.Identifier{} + if err:= iden.WireDecode(parameter); err != nil { + return err + } + e.m_destination = &iden + case extensions.TlvMlsrNextHopList: + if err:= e.NextHopList.WireDecode(parameter); err != nil { + return err + } + } + } + return nil +} \ No newline at end of file From 840140b43eef003ec92176be637d2aa1ef0ca54c Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Mon, 9 May 2022 17:25:58 +0800 Subject: [PATCH 09/70] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96RoutingTable?= =?UTF-8?q?=E7=BB=93=E6=9E=84=E4=BD=93=E7=9A=84=E5=8F=82=E6=95=B0=E5=8F=8A?= =?UTF-8?q?=E5=85=B6=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/TlvMlsrExtention.go | 1 + route/RoutingTable.go | 165 +++++++++++++++++++++++++++++++++ 2 files changed, 166 insertions(+) create mode 100644 route/RoutingTable.go diff --git a/extensions/TlvMlsrExtention.go b/extensions/TlvMlsrExtention.go index 7c8bc92..aa37d9f 100644 --- a/extensions/TlvMlsrExtention.go +++ b/extensions/TlvMlsrExtention.go @@ -39,6 +39,7 @@ const ( TlvMlsrNextHop = 443 TlvMlsrNextHopList = 444 TlvMlsrRoutingTableEntry = 445 + TlvMlsrRoutingTable = 446 ) diff --git a/route/RoutingTable.go b/route/RoutingTable.go new file mode 100644 index 0000000..7246aac --- /dev/null +++ b/route/RoutingTable.go @@ -0,0 +1,165 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/9 16:53 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import ( + "errors" + "minlib/component" + "minlib/encoding" + "mlsr/common" + "mlsr/extensions" + "mlsr/lsdb" + "time" +) + +type RoutingTable struct { + // lsa存储库 + lsdb *lsdb.Lsdb + // 配置参数 + mlsrConfig *common.MlsrConfig + + // 路由条目列表 + rTable []*RoutingTableEntry + // 路由计算间隔时间 + m_routingCalcInterval *time.Duration + // 路由表是否正在计算 + m_isRoutingTableCalculating bool + // 是否已经安排了路由计算 + m_isRouteCalculationScheduled bool + // 当前路由器的邻接LSA是否存在 + m_ownAdjLsaExist bool + + // 双曲坐标状态 => 暂时用不到 + m_hyperbolicState uint32 +} + +// +// Calculate +// @Description: 计算网络中每个路由器的下一个跃点列表。 +// @receiver t +// +func (t *RoutingTable) Calculate() { + +} + +// +// AddNextHop +// @Description: 向路由表条目添加下一个跃点。 +// @receiver t +// @param destRouter 要修改其RTE的目标路由器。 +// @param hop 要添加到RTE的下一个跃点。 +// +func (t *RoutingTable) AddNextHop(destRouter *component.Identifier,hop *NextHop) { + +} + +func (t *RoutingTable) FindRoutingTableEntry(destRouter *component.Identifier) *RoutingTableEntry { + +} + +// +// ScheduleRoutingTableCalculation +// @Description: 仅当尚未计划计算事件时,才在事件计划程序中计划计算事件。 +// @receiver t +// +func (t *RoutingTable) ScheduleRoutingTableCalculation() { + +} + +// +// calculateLsRoutingTable +// @Description: 计算链路状态路由表。 +// @receiver t +// +func (t *RoutingTable) calculateLsRoutingTable() { + +} + +// +// clearRoutingTable +// @Description: 清空路由表 +// @receiver t +// +func (t *RoutingTable) clearRoutingTable() { + +} + +// +// WireEncode +// @Description: 线速编码 +// @receiver l +// @param encoder +// @return int +// @return error +// +func (t *RoutingTable) WireEncode(encoder *encoding.Encoder) (int, error) { + // 判断列表长度,为0则抛出错误 + if len(t.rTable) == 0 { + return 0, errors.New("Invalid RoutingTable, expect at least one RoutingTableEntry!") + } + totalLength := 0 + // 编码 TLV-VALUE + // 反向遍历,可以保证解码的时候正向输出 + for i := len(t.rTable) - 1; i >= 0; i-- { + if t.rTable[i] == nil { + continue + } + tmpLen, err := t.rTable[i].WireEncode(encoder) + if err != nil { + return 0, err + } + totalLength += tmpLen + } + + // 编码 TLV-LENGTH + tmpLen, err := encoder.PrependVarNumber(encoding.VlInt(totalLength)) + if err != nil { + return 0, err + } + totalLength += tmpLen + + // 编码 TLV-TYPE + tmpLen, err = encoder.PrependVarNumber(extensions.TlvMlsrRoutingTable) + if err != nil { + return 0, err + } + totalLength += tmpLen + + return totalLength, nil +} + +// +// WireDecode +// @Description: 线速解码 +// @receiver l +// @param block +// @return error +// +func (t *RoutingTable) WireDecode(block *encoding.Block) error { + // 检查 TLV-TYPE 是否正确 + if err := encoding.ExpectType(block.GetType(), extensions.TlvMlsrRoutingTable); err != nil { + return err + } + + // 解析子 TLV + if err := block.ParseSubElements(); err != nil { + return err + } + tableEntries := make([]*RoutingTableEntry, len(block.GetSubElements())) + for index, element := range block.GetSubElements() { + var tableEntry RoutingTableEntry + err := tableEntry.WireDecode(element) + if err != nil { + return err + } + tableEntries[index] = &tableEntry + } + t.rTable = tableEntries + return nil +} \ No newline at end of file From 9ae32147f0098e4d31137a3fb191c1351e55e94d Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Mon, 9 May 2022 17:42:21 +0800 Subject: [PATCH 10/70] =?UTF-8?q?=E6=AD=A3=E5=9C=A8=E5=86=99RoutingTableCa?= =?UTF-8?q?lculator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LinkStateRoutingTableCalculator.go | 17 ++++ route/Calculator/RoutingTableCalculator.go | 81 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 route/Calculator/LinkStateRoutingTableCalculator.go create mode 100644 route/Calculator/RoutingTableCalculator.go diff --git a/route/Calculator/LinkStateRoutingTableCalculator.go b/route/Calculator/LinkStateRoutingTableCalculator.go new file mode 100644 index 0000000..e52c546 --- /dev/null +++ b/route/Calculator/LinkStateRoutingTableCalculator.go @@ -0,0 +1,17 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/9 17:31 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package Calculator + +type LinkStateRoutingTableCalculator struct { + RoutingTableCalculator +} + +func (c *LinkStateRoutingTableCalculator) name() { + c.testCCC() +} \ No newline at end of file diff --git a/route/Calculator/RoutingTableCalculator.go b/route/Calculator/RoutingTableCalculator.go new file mode 100644 index 0000000..3b150cc --- /dev/null +++ b/route/Calculator/RoutingTableCalculator.go @@ -0,0 +1,81 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/9 17:30 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package Calculator + +type RoutingTableCalculator struct { + adjMatrix [][]uint64 + m_nRouters uint64 + + vNoLink int + links []int + linkCosts []uint64 +} + +// +// allocateAdjMatrix +// @Description: 给邻接矩阵分配所需的空间 +// @receiver c +// +func (c *RoutingTableCalculator) allocateAdjMatrix() { + +} + +// +// initMatrix +// @Description: 为矩阵的每个单元设置非邻接成本(NON_ADJACENT_COST,如-12345),以确保内存安全。 +// @receiver c +// +func (c *RoutingTableCalculator) initMatrix() { + +} + +func (c *RoutingTableCalculator) makeAdjMatrix() { + +} + +func (c *RoutingTableCalculator) writeAdjMatrixLog() { + +} + +func (c *RoutingTableCalculator) getNumOfLinkfromAdjMatrix() { + +} + +func (c *RoutingTableCalculator) freeAdjMatrix() { + +} + +func (c *RoutingTableCalculator) adjustAdMatrix() { + +} + +func (c *RoutingTableCalculator) getLinksFromAdjMatrix() { + +} + +func (c *RoutingTableCalculator) allocateLinks() { + +} + +func (c *RoutingTableCalculator) allocateLinkCosts() { + +} + +func (c *RoutingTableCalculator) freeLinks() { + +} + +func (c *RoutingTableCalculator) freeLinksCosts() { + +} + +func (c *RoutingTableCalculator) setNoLink() { + +} + From e687b3e3707225b41fc81d4be470b2cad9f36cf3 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Tue, 10 May 2022 11:55:27 +0800 Subject: [PATCH 11/70] =?UTF-8?q?=E6=AD=A3=E5=9C=A8=E5=86=99RoutingTableCa?= =?UTF-8?q?lculator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LinkStateRoutingTableCalculator.go | 2 +- route/Calculator/RoutingTableCalculator.go | 77 ++++++++++++++++--- route/RouteCost.go | 6 ++ utils/Numbers.go | 13 ++++ 4 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 utils/Numbers.go diff --git a/route/Calculator/LinkStateRoutingTableCalculator.go b/route/Calculator/LinkStateRoutingTableCalculator.go index e52c546..d600f28 100644 --- a/route/Calculator/LinkStateRoutingTableCalculator.go +++ b/route/Calculator/LinkStateRoutingTableCalculator.go @@ -13,5 +13,5 @@ type LinkStateRoutingTableCalculator struct { } func (c *LinkStateRoutingTableCalculator) name() { - c.testCCC() + } \ No newline at end of file diff --git a/route/Calculator/RoutingTableCalculator.go b/route/Calculator/RoutingTableCalculator.go index 3b150cc..4c90a98 100644 --- a/route/Calculator/RoutingTableCalculator.go +++ b/route/Calculator/RoutingTableCalculator.go @@ -8,9 +8,17 @@ package Calculator +import ( + "mlsr/lsdb" + "mlsr/route" + "sync" +) + type RoutingTableCalculator struct { + // 邻接矩阵 adjMatrix [][]uint64 - m_nRouters uint64 + // 路由器数目 + m_nRouters int vNoLink int links []int @@ -23,7 +31,11 @@ type RoutingTableCalculator struct { // @receiver c // func (c *RoutingTableCalculator) allocateAdjMatrix() { - + c.adjMatrix=make([][]uint64,c.m_nRouters) + // 根据路由器的数目,确定邻接矩阵的长度 + for i := 0; i < c.m_nRouters; i++ { + c.adjMatrix[i]=make([]uint64,c.m_nRouters) + } } // @@ -32,18 +44,38 @@ func (c *RoutingTableCalculator) allocateAdjMatrix() { // @receiver c // func (c *RoutingTableCalculator) initMatrix() { + c.adjMatrix[0][0]=route.NON_ADJACENT_COST +} + +// +// makeAdjMatrix +// @Description: 构建一个要去计算的邻接矩阵 +// @receiver c +// @param lsdb +// @param p +// +func (c *RoutingTableCalculator) makeAdjMatrix(lsdb *lsdb.Lsdb, + p *sync.Map) { } -func (c *RoutingTableCalculator) makeAdjMatrix() { +// +// writeAdjMatrixLog +// @Description: 将格式化的邻接矩阵写入调试日志 +// @receiver c 包含邻接矩阵数据的映射 +// @param p +// +func (c *RoutingTableCalculator) writeAdjMatrixLog(p *sync.Map) { } -func (c *RoutingTableCalculator) writeAdjMatrixLog() { - -} - -func (c *RoutingTableCalculator) getNumOfLinkfromAdjMatrix() { +// +// getNumOfLinkfromAdjMatrix +// @Description: 返回矩阵中一个路由器的邻接数 +// @receiver c +// @param sRouter 计算邻接数的路由器 +// +func (c *RoutingTableCalculator) getNumOfLinkfromAdjMatrix(sRouter int) { } @@ -51,14 +83,39 @@ func (c *RoutingTableCalculator) freeAdjMatrix() { } -func (c *RoutingTableCalculator) adjustAdMatrix() { +// +// adjustAdMatrix +// @Description: 在邻接矩阵中调整链路成本 +// @receiver c +// @param source 要调整其邻接的源路由器 +// @param link 要调整的源的邻接 +// @param linkCost 更改为的成本 +// +func (c *RoutingTableCalculator) adjustAdMatrix(source int,link int,linkCost uint64) { } -func (c *RoutingTableCalculator) getLinksFromAdjMatrix() { +// +// getLinksFromAdjMatrix +// @Description: 用一些路由器的链路成本填充临时变量 +// 获取一些路由器的邻接和链路开销的稀疏列表。 +// 由于这是稀疏的,这意味着在生成这些数组时,如果矩阵中i处没有邻接, +// 这些临时变量将不会在i处包含非邻接代价(NON_ADJACENT_COST,-12345),而是包含下一个有效邻接的值。 +// @receiver c +// @param links 链接映射号的一个整数数组 +// @param linkCosts 存储链路开销的一个双指针数组 +// @param source 被调整值的路由器 +// +func (c *RoutingTableCalculator) getLinksFromAdjMatrix( + links []int,linkCosts []uint64,source int) { } +// +// allocateLinks +// @Description: 分配一个足以容纳多路径计算临时值的数组 +// @receiver c +// func (c *RoutingTableCalculator) allocateLinks() { } diff --git a/route/RouteCost.go b/route/RouteCost.go index 4062baa..e061b28 100644 --- a/route/RouteCost.go +++ b/route/RouteCost.go @@ -9,11 +9,17 @@ package route import ( + "math" "minlib/component" "minlib/encoding" "mlsr/extensions" ) +const ( + DEFAULT_LINK_COST = 10 + NON_ADJACENT_COST = math.MaxUint64 +) + // // RouteCost // @Description: 链路开销 diff --git a/utils/Numbers.go b/utils/Numbers.go new file mode 100644 index 0000000..3a7f588 --- /dev/null +++ b/utils/Numbers.go @@ -0,0 +1,13 @@ +// Package utils +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/10 11:48 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package utils + +const ( +) + From 06c7ed9df1c4f9397bbc3e177c67c34e17170c2d Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Tue, 10 May 2022 17:41:45 +0800 Subject: [PATCH 12/70] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=B9=B6=E6=B5=8B?= =?UTF-8?q?=E8=AF=95RouterMap=EF=BC=8C=E5=8A=9F=E8=83=BD=E6=98=AF=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=B0=86=E8=B7=AF=E7=94=B1=E5=99=A8=E6=A0=87=E8=AF=86?= =?UTF-8?q?=E6=98=A0=E5=B0=84=E5=88=B0Calculator=E4=B8=AD=E9=82=BB?= =?UTF-8?q?=E6=8E=A5=E7=9F=A9=E9=98=B5=E7=9A=84=E7=B4=A2=E5=BC=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/LsaContainer/LsaContainer.go | 4 +- lsdb/Lsdb.go | 2 +- route/Calculator/RouterMap.go | 122 +++++++++++++++++++++ route/Calculator/RouterMap_test.go | 63 +++++++++++ route/Calculator/RoutingTableCalculator.go | 19 +++- route/RoutingTable.go | 3 +- 6 files changed, 207 insertions(+), 6 deletions(-) create mode 100644 route/Calculator/RouterMap.go create mode 100644 route/Calculator/RouterMap_test.go diff --git a/lsdb/LsaContainer/LsaContainer.go b/lsdb/LsaContainer/LsaContainer.go index a2c0e80..3b57556 100644 --- a/lsdb/LsaContainer/LsaContainer.go +++ b/lsdb/LsaContainer/LsaContainer.go @@ -8,6 +8,8 @@ package LsaContainer +import "mlsr/lsdb/LsaContainer/buntdb" + // // LsaContainer // @Description: @@ -15,5 +17,5 @@ package LsaContainer // 2. 其它索引键:Type() // type LsaContainer struct { - + buntdb.LsaContainer_BuntDB } diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index d99c15c..8542a62 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -34,7 +34,7 @@ type Lsdb struct { sync *communication.SyncLogicHandler // LSA容器 - lsaContainer *LsaContainer.LsaContainer + LsaContainer.LsaContainer lsaRefreshTime *time.Duration // lsa刷新时间 adjLsaBuildInterval *time.Duration // 邻接LSA构建间隔 diff --git a/route/Calculator/RouterMap.go b/route/Calculator/RouterMap.go new file mode 100644 index 0000000..44b77ea --- /dev/null +++ b/route/Calculator/RouterMap.go @@ -0,0 +1,122 @@ +// Package route +// @Author: Wang Feng +// @Description: +// 参考博文:https://www.zhaoyanchang.com/detail/31.html +// @Version: 0.1.0 +// @Date: 2022/5/10 15:26 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package Calculator + +import ( + "minlib/component" + "sync" +) + +// +// RouterMap +// @Description: 给每个路由器标识分配一个索引号 +// +type RouterMap struct { + // 存储:路由器到索引值的映射 + routerToNumberMap map[*component.Identifier]int + // 存储:索引值到路由器的映射 + numberToRouterMap map[int]*component.Identifier + // 初始值为0,每次加一递增 + mappingIndex int + + // 并发加锁 + mapLock *sync.RWMutex +} + +// +// Store +// @Description: 存入一个路由器标识 +// @receiver m +// @param routerName +// +func (m *RouterMap) Store(routerName *component.Identifier) { + m.mapLock.Lock() + _,ok := m.routerToNumberMap[routerName] + if !ok{ + m.routerToNumberMap[routerName] = m.mappingIndex + m.numberToRouterMap[m.mappingIndex] = routerName + m.mappingIndex++ + } + m.mapLock.Unlock() +} + +// +// Delete +// @Description: 删除一个路由器标识。在实际使用中用不到,故先小写其字母。 +// @receiver m +// @param routerName +// +func (m *RouterMap) delete(routerName *component.Identifier) { + m.mapLock.Lock() + value,ok := m.routerToNumberMap[routerName] + if ok{ + delete(m.routerToNumberMap,routerName) + delete(m.numberToRouterMap,value) + } + m.mapLock.Unlock() +} + +// +// GetRouterNameByMappingNo +// @Description: 根据索引获取路由器标识 +// @receiver m +// @param index +// @return *component.Identifier +// @return bool +// +func (m *RouterMap) GetRouterNameByMappingNo(index int) (*component.Identifier,bool) { + m.mapLock.Lock() + defer m.mapLock.Unlock() + value,ok := m.numberToRouterMap[index] + return value,ok +} + +// +// GetMappingNoByRouterName +// @Description: 根据标识获取索引 +// @receiver m +// @param routerName +// @return int +// @return bool +// +func (m *RouterMap) GetMappingNoByRouterName(routerName *component.Identifier) (int,bool) { + m.mapLock.Lock() + defer m.mapLock.Unlock() + value,ok := m.routerToNumberMap[routerName] + return value,ok +} + +// +// GetMapSize +// @Description: 获取路由器数目 +// @receiver m +// @return int +// +func (m *RouterMap) GetMapSize() int { + m.Init() + return len(m.routerToNumberMap) +} + +// +// Init +// @Description: 必须先执行该函数,以初始化RouterMap +// @receiver m* +// +func (m* RouterMap) Init() { + if m.routerToNumberMap==nil{ + m.routerToNumberMap=make(map[*component.Identifier]int) + } + if m.numberToRouterMap==nil{ + m.numberToRouterMap=make(map[int]*component.Identifier) + } + if m.mapLock==nil{ + m.mapLock=new(sync.RWMutex) + } +} \ No newline at end of file diff --git a/route/Calculator/RouterMap_test.go b/route/Calculator/RouterMap_test.go new file mode 100644 index 0000000..f98ab67 --- /dev/null +++ b/route/Calculator/RouterMap_test.go @@ -0,0 +1,63 @@ +// Package Calculator +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/10 16:53 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package Calculator + +import ( + "fmt" + "minlib/component" + "testing" +) + +// +// TestRouterMap_Store +// @Description: 测试RouterMap +// @param t +// +func TestRouterMap_Store(t *testing.T) { + iden, _ := component.CreateIdentifierByString("/test/weforever") + iden1, _ := component.CreateIdentifierByString("/test/weforever1") + iden2, _ := component.CreateIdentifierByString("/test/weforever2") + // 存入 + rmap := new(RouterMap) + rmap.Init() + rmap.Store(iden) + rmap.Store(iden1) + rmap.Store(iden2) + + // 取出标识 + index,b := rmap.GetMappingNoByRouterName(iden2) + fmt.Println(index,b) + + // 取出一个同URI的标识 + idenNew2, _ := component.CreateIdentifierByString("/test/weforever2") + index,b = rmap.GetMappingNoByRouterName(idenNew2) + fmt.Println(index,b) + + // 取出Iden + idenCat,bb := rmap.GetRouterNameByMappingNo(0) + fmt.Println(idenCat.ToUri(),bb) + idenCat,bb = rmap.GetRouterNameByMappingNo(1) + fmt.Println(idenCat.ToUri(),bb) + idenCat,bb = rmap.GetRouterNameByMappingNo(2) + fmt.Println(idenCat.ToUri(),bb) + idenCat,bb = rmap.GetRouterNameByMappingNo(3) + fmt.Println(bb) + + // 查看map大小 + fmt.Println(rmap.GetMapSize()) + + // 删除后再查看 + rmap.delete(iden) + rmap.delete(idenNew2) + fmt.Println(rmap.GetMapSize()) + idenCat,bb = rmap.GetRouterNameByMappingNo(0) + fmt.Println(bb) + idenCat,bb = rmap.GetRouterNameByMappingNo(2) + fmt.Println(bb) +} diff --git a/route/Calculator/RoutingTableCalculator.go b/route/Calculator/RoutingTableCalculator.go index 4c90a98..455dacd 100644 --- a/route/Calculator/RoutingTableCalculator.go +++ b/route/Calculator/RoutingTableCalculator.go @@ -9,6 +9,8 @@ package Calculator import ( + //"errors" + //"mlsr/lsa" "mlsr/lsdb" "mlsr/route" "sync" @@ -44,7 +46,11 @@ func (c *RoutingTableCalculator) allocateAdjMatrix() { // @receiver c // func (c *RoutingTableCalculator) initMatrix() { - c.adjMatrix[0][0]=route.NON_ADJACENT_COST + for i := 0; i < c.m_nRouters; i++ { + for j := 0; j < c.m_nRouters; j++ { + c.adjMatrix[0][0]=route.NON_ADJACENT_COST + } + } } // @@ -55,8 +61,15 @@ func (c *RoutingTableCalculator) initMatrix() { // @param p // func (c *RoutingTableCalculator) makeAdjMatrix(lsdb *lsdb.Lsdb, - p *sync.Map) { - + p *sync.Map) error { + // 在Map中表示每个LSA + //lsas,err := lsdb.GetLSAsByType(lsa.LsaADJACENCYType) + //if err!=nil{ + // return errors.New("Get Lsa error, "+err.Error()) + //} + // + //todo + return nil } // diff --git a/route/RoutingTable.go b/route/RoutingTable.go index 7246aac..a1c96ef 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -60,7 +60,8 @@ func (t *RoutingTable) AddNextHop(destRouter *component.Identifier,hop *NextHop) } func (t *RoutingTable) FindRoutingTableEntry(destRouter *component.Identifier) *RoutingTableEntry { - + //todo + return nil } // From 955d9e51855c50500349a3323b7a51b2af6ca163 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 11 May 2022 10:30:07 +0800 Subject: [PATCH 13/70] =?UTF-8?q?=E4=BF=AE=E6=94=B9RouterMap=EF=BC=8C?= =?UTF-8?q?=E4=BD=BF=E5=85=B6=E5=B0=86=E7=9B=B8=E5=90=8CURI=E7=9A=84Identi?= =?UTF-8?q?fier=E8=A7=86=E4=B8=BA=E5=90=8C=E4=B8=80=E4=B8=AA=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E5=99=A8=E6=A0=87=E8=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/Calculator/RouterMap.go | 38 +++++++++++++++------- route/Calculator/RoutingTableCalculator.go | 25 +++++++++----- 2 files changed, 44 insertions(+), 19 deletions(-) diff --git a/route/Calculator/RouterMap.go b/route/Calculator/RouterMap.go index 44b77ea..7d03397 100644 --- a/route/Calculator/RouterMap.go +++ b/route/Calculator/RouterMap.go @@ -20,9 +20,12 @@ import ( // type RouterMap struct { // 存储:路由器到索引值的映射 - routerToNumberMap map[*component.Identifier]int + routerToNumberMap map[string]int // 存储:索引值到路由器的映射 - numberToRouterMap map[int]*component.Identifier + numberToRouterMap map[int]string + // 存储:路由器URI到其路由器标识的映射 => 相同URI的路由器标识被视为同一个路由器标识 + uriToIdentifierMap map[string]*component.Identifier + // 初始值为0,每次加一递增 mappingIndex int @@ -38,10 +41,13 @@ type RouterMap struct { // func (m *RouterMap) Store(routerName *component.Identifier) { m.mapLock.Lock() - _,ok := m.routerToNumberMap[routerName] + uri := routerName.ToUri() + _,ok := m.uriToIdentifierMap[uri] if !ok{ - m.routerToNumberMap[routerName] = m.mappingIndex - m.numberToRouterMap[m.mappingIndex] = routerName + // 如果不存在,则将其存入三张map + m.uriToIdentifierMap[uri] = routerName + m.routerToNumberMap[uri] = m.mappingIndex + m.numberToRouterMap[m.mappingIndex] = uri m.mappingIndex++ } m.mapLock.Unlock() @@ -55,9 +61,12 @@ func (m *RouterMap) Store(routerName *component.Identifier) { // func (m *RouterMap) delete(routerName *component.Identifier) { m.mapLock.Lock() - value,ok := m.routerToNumberMap[routerName] + uri := routerName.ToUri() + value,ok := m.routerToNumberMap[uri] if ok{ - delete(m.routerToNumberMap,routerName) + // 如果存在,则将其从三张map中删除 + delete(m.uriToIdentifierMap,uri) + delete(m.routerToNumberMap,uri) delete(m.numberToRouterMap,value) } m.mapLock.Unlock() @@ -75,7 +84,11 @@ func (m *RouterMap) GetRouterNameByMappingNo(index int) (*component.Identifier,b m.mapLock.Lock() defer m.mapLock.Unlock() value,ok := m.numberToRouterMap[index] - return value,ok + if ok{ + idenValue := m.uriToIdentifierMap[value] + return idenValue,true + } + return nil,false } // @@ -89,7 +102,7 @@ func (m *RouterMap) GetRouterNameByMappingNo(index int) (*component.Identifier,b func (m *RouterMap) GetMappingNoByRouterName(routerName *component.Identifier) (int,bool) { m.mapLock.Lock() defer m.mapLock.Unlock() - value,ok := m.routerToNumberMap[routerName] + value,ok := m.routerToNumberMap[routerName.ToUri()] return value,ok } @@ -110,11 +123,14 @@ func (m *RouterMap) GetMapSize() int { // @receiver m* // func (m* RouterMap) Init() { + if m.uriToIdentifierMap==nil{ + m.uriToIdentifierMap=make(map[string]*component.Identifier) + } if m.routerToNumberMap==nil{ - m.routerToNumberMap=make(map[*component.Identifier]int) + m.routerToNumberMap=make(map[string]int) } if m.numberToRouterMap==nil{ - m.numberToRouterMap=make(map[int]*component.Identifier) + m.numberToRouterMap=make(map[int]string) } if m.mapLock==nil{ m.mapLock=new(sync.RWMutex) diff --git a/route/Calculator/RoutingTableCalculator.go b/route/Calculator/RoutingTableCalculator.go index 455dacd..582432d 100644 --- a/route/Calculator/RoutingTableCalculator.go +++ b/route/Calculator/RoutingTableCalculator.go @@ -9,6 +9,8 @@ package Calculator import ( + "errors" + "mlsr/lsa" //"errors" //"mlsr/lsa" "mlsr/lsdb" @@ -61,14 +63,21 @@ func (c *RoutingTableCalculator) initMatrix() { // @param p // func (c *RoutingTableCalculator) makeAdjMatrix(lsdb *lsdb.Lsdb, - p *sync.Map) error { - // 在Map中表示每个LSA - //lsas,err := lsdb.GetLSAsByType(lsa.LsaADJACENCYType) - //if err!=nil{ - // return errors.New("Get Lsa error, "+err.Error()) - //} - // - //todo + rp *RouterMap) error { + // 1. 在Map中表示每个LSA + // 先从Lsdb中取出邻接LSA + lsas,err := lsdb.GetLSAsByType(lsa.LsaADJACENCYType) + if err!=nil { + return errors.New("No Found adj lsa in LSDB. ") + } + // 2. 再对每个lsa进行操作 + for i := 0; i < len(lsas); i++ { + // 2.1 取出源路由器,找其索引值,作为邻接矩阵的行号 + //row,errInner := rp.GetMappingNoByRouterName(lsas[i].GetOriginRouter()) + //if errInner != nil { + // return errors.New("No Found adj lsa in LSDB. ") + //} + } return nil } From 9a28d46bd54fedb4ecab7099180590ab6fb04f12 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 11 May 2022 11:45:07 +0800 Subject: [PATCH 14/70] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=9E=E7=8E=B0Routi?= =?UTF-8?q?ngTableCalculator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/Calculator/RoutingTableCalculator.go | 105 +++++++++++++++++---- 1 file changed, 86 insertions(+), 19 deletions(-) diff --git a/route/Calculator/RoutingTableCalculator.go b/route/Calculator/RoutingTableCalculator.go index 582432d..eab789c 100644 --- a/route/Calculator/RoutingTableCalculator.go +++ b/route/Calculator/RoutingTableCalculator.go @@ -73,11 +73,33 @@ func (c *RoutingTableCalculator) makeAdjMatrix(lsdb *lsdb.Lsdb, // 2. 再对每个lsa进行操作 for i := 0; i < len(lsas); i++ { // 2.1 取出源路由器,找其索引值,作为邻接矩阵的行号 - //row,errInner := rp.GetMappingNoByRouterName(lsas[i].GetOriginRouter()) - //if errInner != nil { - // return errors.New("No Found adj lsa in LSDB. ") - //} + row,b := rp.GetMappingNoByRouterName(lsas[i].GetOriginRouter()) + if !b { + return errors.New("No Found origin router in routerMap. ") + } + // 2.2 依次取出该源路由器对应的所有邻接路由器标识,以及链路开销,来构建邻接矩阵 + adjlsa,ok := (lsas[i]).(*lsa.AdjLsa) + if !ok{ + return errors.New("Lsa from LSDB is not adjlsa. ") + } + adjs := adjlsa.GetAdjList() + for j := 0; j < len(adjs); j++ { + // 2.2.1 取列数 + col,b := rp.GetMappingNoByRouterName(adjs[j].GetNeighborRouterIdentifier()) + if !b { + return errors.New("No Found neighbor router in routerMap. ") + } + // 2.2.2 取开销 + linkCost := adjs[j].AdjLsaLinkCost.LinkCost() + // 2.2.3 将开销放入邻接矩阵 + if (row < c.m_nRouters) && (col < c.m_nRouters){ + c.adjMatrix[row][col] = linkCost + } + } } + + // todo 检查路由器A到路由器B的链路开销,若正向开销与反向开销不同,则两者均取较大值 + return nil } @@ -88,33 +110,50 @@ func (c *RoutingTableCalculator) makeAdjMatrix(lsdb *lsdb.Lsdb, // @param p // func (c *RoutingTableCalculator) writeAdjMatrixLog(p *sync.Map) { - + // todo 输出调试信息,验证功能是否正常运行 } // // getNumOfLinkfromAdjMatrix -// @Description: 返回矩阵中一个路由器的邻接数 +// @Description: 返回矩阵中一个路由器的邻接数(不包含其本身) // @receiver c // @param sRouter 计算邻接数的路由器 // -func (c *RoutingTableCalculator) getNumOfLinkfromAdjMatrix(sRouter int) { - +func (c *RoutingTableCalculator) getNumOfLinkfromAdjMatrix(sRouter int) int { + num := 0 + for i := 0; i < c.m_nRouters; i++ { + if (c.adjMatrix[sRouter][i]!=route.NON_ADJACENT_COST) && (i!=sRouter){ + num++ + } + } + return num } +// +// freeAdjMatrix +// @Description: 释放内存 +// @receiver c +// func (c *RoutingTableCalculator) freeAdjMatrix() { - + // todo 寄托于golang自己的GC机制 } // // adjustAdMatrix -// @Description: 在邻接矩阵中调整链路成本 +// @Description: 在邻接矩阵中调整链路成本。除要更改的链路外,该源路由器的其它链路全部设置为不可达 // @receiver c // @param source 要调整其邻接的源路由器 // @param link 要调整的源的邻接 -// @param linkCost 更改为的成本 +// @param linkCost 更改为的成本。 // func (c *RoutingTableCalculator) adjustAdMatrix(source int,link int,linkCost uint64) { - + for i := 0; i < c.m_nRouters; i++ { + if i==link{ + c.adjMatrix[source][i]=linkCost + }else{ + c.adjMatrix[source][i]=route.NON_ADJACENT_COST + } + } } // @@ -130,7 +169,14 @@ func (c *RoutingTableCalculator) adjustAdMatrix(source int,link int,linkCost uin // func (c *RoutingTableCalculator) getLinksFromAdjMatrix( links []int,linkCosts []uint64,source int) { - + index := 0 + for i := 0; i < c.m_nRouters; i++ { + if (c.adjMatrix[source][i]!=route.NON_ADJACENT_COST) && (i!=source){ + links[index] = i + linkCosts[index] = c.adjMatrix[source][i] + index++ + } + } } // @@ -139,22 +185,43 @@ func (c *RoutingTableCalculator) getLinksFromAdjMatrix( // @receiver c // func (c *RoutingTableCalculator) allocateLinks() { - + c.links = make([]int,c.vNoLink) } +// +// allocateLinkCosts +// @Description: 分配内存 +// @receiver c +// func (c *RoutingTableCalculator) allocateLinkCosts() { - + c.linkCosts = make([]uint64,c.vNoLink) } +// +// freeLinks +// @Description: 释放内存 +// @receiver c +// func (c *RoutingTableCalculator) freeLinks() { - + // todo 寄托于golang自己的GC机制 } +// +// freeLinksCosts +// @Description: 释放内存 +// @receiver c +// func (c *RoutingTableCalculator) freeLinksCosts() { - + // todo 寄托于golang自己的GC机制 } -func (c *RoutingTableCalculator) setNoLink() { - +// +// setNoLink +// @Description: 设置链路数,即多路径中的“多”所代指的个数 +// @receiver c +// @param nl +// +func (c *RoutingTableCalculator) setNoLink(nl int) { + c.vNoLink = nl } From 808e8648f4a87c89c149c24307894b111855a901 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 11 May 2022 12:22:11 +0800 Subject: [PATCH 15/70] =?UTF-8?q?=E5=88=9D=E6=AD=A5=E8=AE=BE=E8=AE=A1LinkS?= =?UTF-8?q?tateRoutingTableCalculator=E7=9A=84=E5=8F=98=E9=87=8F=E5=8F=8A?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LinkStateRoutingTableCalculator.go | 103 +++++++++++++++++- 1 file changed, 102 insertions(+), 1 deletion(-) diff --git a/route/Calculator/LinkStateRoutingTableCalculator.go b/route/Calculator/LinkStateRoutingTableCalculator.go index d600f28..460eca4 100644 --- a/route/Calculator/LinkStateRoutingTableCalculator.go +++ b/route/Calculator/LinkStateRoutingTableCalculator.go @@ -8,10 +8,111 @@ package Calculator +import ( + "mlsr/common" + "mlsr/lsa" + "mlsr/lsdb" + "mlsr/route" +) + +// +// LinkStateRoutingTableCalculator +// @Description: 邻接状态路由表计算器。路由计算的核心部分 +// type LinkStateRoutingTableCalculator struct { RoutingTableCalculator + NO_NEXT_HOP int + + // 私有变量区 + m_parent []int + m_distance []uint64 + + EMPTY_PARENT int + INF_DISTANCE uint64 + NO_MAPPING_NUM int } -func (c *LinkStateRoutingTableCalculator) name() { +// +// CalculatePath +// @Description: 计算可转发路径。路由计算里的唯一Public的接口 +// @receiver c +// @param routerMap +// @param rTable +// @param mConfig +// @param lsdb +// +func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, + rTable *route.RoutingTable,mConfig *common.MlsrConfig,lsdb *lsdb.Lsdb) { + +} + +// +// doDijkstraPathCalculation +// @Description: 在邻接矩阵基础上,针对源路由器,做迪吉斯特拉计算 +// @receiver c +// @param sourceRouter +// +func (c *LinkStateRoutingTableCalculator) doDijkstraPathCalculation(sourceRouter int) { + +} + +// +// sortQueueByDistance +// @Description: 对列表中的元素进行简单排序 +// @receiver c +// @param Q 要排序元素的数组 +// @param dist 包含距离的数组 +// @param start 列表中要排序的第一个元素 +// @param element 列表中要排序的最后一个元素 +// +func (c *LinkStateRoutingTableCalculator) sortQueueByDistance( + Q []int,dist []uint64,start int,element int) { + +} + +// +// isNotExplored +// @Description: 返回元素是否被访问 +// @receiver c +// @param Q 要查看的元素列表 +// @param u 要检查的元素 +// @param start 要查看的列表的开头 +// @param element 要查看的列表的结尾 +// +func (c *LinkStateRoutingTableCalculator) isNotExplored( + Q []int,u int,start int,element int) int { + +} + +func (c *LinkStateRoutingTableCalculator) addAllLsNextHopsToRoutingTable( + adjs *lsa.AdjLsaAdjacenctList,rTable *route.RoutingTable, + rMap *RouterMap,sourceRouter int) { + +} + +// +// getLsNextHop +// @Description: 决定一个目的地的下一跳 +// @receiver c +// @param dest 我们想要确定其下一跳的路由器 +// @param source 来确定下一跳路径的路由器 +// +func (c *LinkStateRoutingTableCalculator) getLsNextHop(dest int,source int) int { + +} + +func (c *LinkStateRoutingTableCalculator) allocateParent() { + +} + +func (c *LinkStateRoutingTableCalculator) allocateDistance() { + +} + +func (c *LinkStateRoutingTableCalculator) freeParent() { + +} + +func (c *LinkStateRoutingTableCalculator) freeDistance() { } \ No newline at end of file From 2966fa3a4296bfb17ca7a987c943ee473a02cd7c Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 12 May 2022 11:55:05 +0800 Subject: [PATCH 16/70] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=E8=BF=AA?= =?UTF-8?q?=E5=85=8B=E6=96=AF=E7=89=B9=E6=8B=89=E7=AE=97=E6=B3=95=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LinkStateRoutingTableCalculator.go | 95 ++++++++++++++++--- 1 file changed, 84 insertions(+), 11 deletions(-) diff --git a/route/Calculator/LinkStateRoutingTableCalculator.go b/route/Calculator/LinkStateRoutingTableCalculator.go index 460eca4..dbe3803 100644 --- a/route/Calculator/LinkStateRoutingTableCalculator.go +++ b/route/Calculator/LinkStateRoutingTableCalculator.go @@ -9,6 +9,7 @@ package Calculator import ( + "math" "mlsr/common" "mlsr/lsa" "mlsr/lsdb" @@ -24,14 +25,21 @@ type LinkStateRoutingTableCalculator struct { NO_NEXT_HOP int // 私有变量区 + // 表示源路由器想要到达某路由器,其最短路径上经过的上一个路由器。 m_parent []int + // 表示源路由器想要到达某路由器,其最短路径的距离 m_distance []uint64 - - EMPTY_PARENT int - INF_DISTANCE uint64 - NO_MAPPING_NUM int } +// 一些在最短路径计算时会用到的常量 +const ( + EMPTY_PARENT = -12345 // 没有父节点 -12345 + INF_DISTANCE = math.MaxUint64 // 无限距离 2147483647 + NO_MAPPING_NUM = -1 // 没有映射的点 -1 + // 公用常量 + NO_NEXT_HOP = -12345 // 没有下一跳 -12345 +) + // // CalculatePath // @Description: 计算可转发路径。路由计算里的唯一Public的接口 @@ -49,25 +57,85 @@ func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, // // doDijkstraPathCalculation // @Description: 在邻接矩阵基础上,针对源路由器,做迪吉斯特拉计算 +// 在注释中,“左集”表示已访问节点,“右集”表示未访问节点 // @receiver c // @param sourceRouter // func (c *LinkStateRoutingTableCalculator) doDijkstraPathCalculation(sourceRouter int) { - + // 尚未加入左集的最近元素(Q中右集最小元素) + var u int + // 每个单元代表具有该映射号的路由器。 + // Q是queue首字母,它按升序存储所有路由器 + Q := make([]int,c.m_nRouters) + // 尚未加入左集的最近元素在Q中的索引值 + head := 0 + // 初始化parent + for i := 0; i < c.m_nRouters; i++ { + // 每个点的最短路径上一点都初始化为空,即无法到达源路由器 + c.m_parent[i] = EMPTY_PARENT + // 数组中第i个元素存储的是:源路由器到映射号为i的路由器之间的距离。初始化为无穷大 + c.m_distance[i] = INF_DISTANCE + // 路由器队列初始化为按映射号排列 + Q[i] = i + } + if sourceRouter != NO_MAPPING_NUM{ + // 源路由器到其本身的距离为0 + c.m_distance[sourceRouter] = 0 + // 排序完毕,Q中第一个节点必然为源路由器 + c.sortQueueByDistance(Q,c.m_distance,head,c.m_nRouters) + // 当我们没有访问完每一个节点时,执行循环 + for head < c.m_nRouters { + // 将u设置为head当前指向的节点。“u,你就是天选之子!” + u = Q[head] + if c.m_distance[u] == INF_DISTANCE { + // 只有没有可访问的节点时,这里才会被执行。"天选之子是个废物,亡矣!" + break + } + // 对u的相邻节点进行迭代遍历。“朕要以你为衡,重设天下!” + for v := 0; v < c.m_nRouters; v++ { + // 如果u->v是可达的, + if c.adjMatrix[u][v] != route.NON_ADJACENT_COST{ + // 而且我们还没有访问过v,即v属于右集, + if c.isNotExplored(Q,v,head+1,c.m_nRouters){ + // 如果到这个节点的距离+从这个节点到v的距离, + // 小于我们在构建adj LSA时得到的从源节点到v的距离, + // 就更新为新距离【算法中的松弛操作】 + if c.m_distance[u]+c.adjMatrix[u][v] < c.m_distance[v] { + // 设置新距离 + c.m_distance[v]=c.m_distance[u]+c.adjMatrix[u][v] + // 设置parent,即我们如何到达v的 + c.m_parent[v]=u + } + } + } + } + // 右移head位置,从我们所在的位置按距离重新排序列表。"苍天已死,黄天当立!" + head++ + c.sortQueueByDistance(Q,c.m_distance,head,c.m_nRouters) + } + } } // // sortQueueByDistance -// @Description: 对列表中的元素进行简单排序 +// @Description: 对列表中的元素进行交换排序 // @receiver c // @param Q 要排序元素的数组 // @param dist 包含距离的数组 // @param start 列表中要排序的第一个元素 -// @param element 列表中要排序的最后一个元素 +// @param element 列表元素数目 // func (c *LinkStateRoutingTableCalculator) sortQueueByDistance( Q []int,dist []uint64,start int,element int) { - + for i := start; i < element; i++ { + for j := i+1; j < element; j++ { + if dist[Q[j]] < dist[Q[i]]{ + temp := Q[j] + Q[j] = Q[i] + Q[i] = temp + } + } + } } // @@ -77,11 +145,16 @@ func (c *LinkStateRoutingTableCalculator) sortQueueByDistance( // @param Q 要查看的元素列表 // @param u 要检查的元素 // @param start 要查看的列表的开头 -// @param element 要查看的列表的结尾 +// @param element 列表元素数 // func (c *LinkStateRoutingTableCalculator) isNotExplored( - Q []int,u int,start int,element int) int { - + Q []int,u int,start int,element int) bool { + for i := start; i < element; i++ { + if Q[i]==u { + return true + } + } + return false } func (c *LinkStateRoutingTableCalculator) addAllLsNextHopsToRoutingTable( From dd97958537650da74e0c6ac7c06d3e4f3716b146 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 12 May 2022 12:29:58 +0800 Subject: [PATCH 17/70] =?UTF-8?q?=E8=A1=A5=E5=85=85=E9=93=BE=E8=B7=AF?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E8=B7=AF=E7=94=B1=E8=A1=A8=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E5=99=A8ing?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LinkStateRoutingTableCalculator.go | 71 ++++++++++++++++--- 1 file changed, 61 insertions(+), 10 deletions(-) diff --git a/route/Calculator/LinkStateRoutingTableCalculator.go b/route/Calculator/LinkStateRoutingTableCalculator.go index dbe3803..e5e6731 100644 --- a/route/Calculator/LinkStateRoutingTableCalculator.go +++ b/route/Calculator/LinkStateRoutingTableCalculator.go @@ -51,7 +51,11 @@ const ( // func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, rTable *route.RoutingTable,mConfig *common.MlsrConfig,lsdb *lsdb.Lsdb) { - + c.allocateAdjMatrix() + c.initMatrix() + _ = c.makeAdjMatrix(lsdb, routerMap) + // 从配置文件中获取源路由器前缀,并根据routerMap获取其映射号 + sourceRouter := routerMap.GetMappingNoByRouterName(mConfig) } // @@ -160,32 +164,79 @@ func (c *LinkStateRoutingTableCalculator) isNotExplored( func (c *LinkStateRoutingTableCalculator) addAllLsNextHopsToRoutingTable( adjs *lsa.AdjLsaAdjacenctList,rTable *route.RoutingTable, rMap *RouterMap,sourceRouter int) { - + // 对于我们有的每个路由器 + for i := 0; i < c.m_nRouters; i++ { + if i!= sourceRouter{ + // 获取算法确定的下一跳 + nextHopRouter:=c.getLsNextHop(i,sourceRouter) + // 需要该路由器不至于没有对应的下一跳 + if nextHopRouter!= NO_NEXT_HOP{ + // 获取链路开销 + routeCost := c.m_distance[i] + // 根据map获取该路由器的真实名称 + nextHopRouterName,b := rMap.GetRouterNameByMappingNo(nextHopRouter) + if b{ + // 根据本地邻接LSA列表,获取该下一跳路由器所对应的face + nextHopFaces := adjs.FindAdjacencyByRouterIdentifier(nextHopRouterName) + // todo 将下一跳加入路由表 + } + } + } + } } // // getLsNextHop -// @Description: 决定一个目的地的下一跳 +// @Description: 决定到目的路由器的下一跳路由器 // @receiver c -// @param dest 我们想要确定其下一跳的路由器 -// @param source 来确定下一跳路径的路由器 +// @param dest 想要确定的目的路由器 +// @param source 源路由器 // func (c *LinkStateRoutingTableCalculator) getLsNextHop(dest int,source int) int { - + nextHop := NO_NEXT_HOP + // source的父节点是空节点,故遍历到source或某个断点,就停止循环 + for c.m_parent[dest] != EMPTY_PARENT { + nextHop = dest + dest = c.m_parent[dest] + } + if dest != source{ + nextHop = NO_NEXT_HOP + } + return nextHop } +// +// allocateParent +// @Description: 分配内存 +// @receiver c +// func (c *LinkStateRoutingTableCalculator) allocateParent() { - + c.m_parent = make([]int,c.m_nRouters) } +// +// allocateDistance +// @Description: 分配内存 +// @receiver c +// func (c *LinkStateRoutingTableCalculator) allocateDistance() { - + c.m_distance = make([]uint64,c.m_nRouters) } +// +// freeParent +// @Description: 释放内存 +// @receiver c +// func (c *LinkStateRoutingTableCalculator) freeParent() { - + // 依靠golang的gc机制 } +// +// freeDistance +// @Description: 释放内存 +// @receiver c +// func (c *LinkStateRoutingTableCalculator) freeDistance() { - + // 依靠golang的gc机制 } \ No newline at end of file From 9b4b068a89dd09e0b56e11af4a1567e531462c60 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 12 May 2022 16:56:04 +0800 Subject: [PATCH 18/70] =?UTF-8?q?=E4=B8=BB=E8=A6=81=E5=B0=86MlsrConfig?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E4=BA=86=E9=87=8D=E6=96=B0=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=EF=BC=8C=E6=94=AF=E6=8C=81=E4=BB=8EMlsrConfig=E4=B8=AD?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E8=8E=B7=E5=8F=96=E7=BB=93=E6=9E=84=E4=BD=93?= =?UTF-8?q?=E5=BD=A2=E5=BC=8F=E7=9A=84=E9=85=8D=E7=BD=AE=E5=8F=98=E9=87=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/MlsrConfig.go | 9 +- common/MlsrConfigParameters.go | 216 ++++++++++++++++++ .../LinkStateRoutingTableCalculator.go | 2 +- 3 files changed, 224 insertions(+), 3 deletions(-) create mode 100644 common/MlsrConfigParameters.go diff --git a/common/MlsrConfig.go b/common/MlsrConfig.go index af3e9b0..3a38714 100644 --- a/common/MlsrConfig.go +++ b/common/MlsrConfig.go @@ -27,6 +27,9 @@ type MlsrConfig struct { AdvertisingConfig `ini:"Advertising"` SecurityConfig `ini:"Security"` + // 获取值的接口 + MlsrConfigParameters + mlsrConfigPath string // 配置文件所在路径 neighbors []NeighborConfig // NeighborsConfig中的信息 } @@ -44,7 +47,7 @@ type GeneralConfig struct { RouterDeadInterval uint32 `ini:"RouterDeadInterval"` // 路由器判断死亡的时间间隔(必须大于LSA刷新时间) - LsaInterestLifetime int `ini:"LsaInterestLifetime"` // LSA兴趣包生存周期。当使用推式包时,此值无效 + LsaInterestLifetime int `ini:"LsaInterestLifetime"` // LSA兴趣包生存周期。当使用推式包时,此值无效【单位:毫秒】 SyncProtocol string `ini:"SyncProtocol"` // 同步协议 SyncInterestLifetime uint32 `ini:"SyncInterestLifetime"` // 同步协议兴趣包生命周期 @@ -61,7 +64,7 @@ type NeighborsConfig struct { AdjLsaBuildInterval uint32 `ini:"AdjLsaBuildInterval"` // 邻接LSA构建的时间间隔 LogicFaceDatasetFetchRetries uint32 `ini:"LogicFaceDatasetFetchRetries"` // 获取FaceStatus数据集的重试次数 - LogicFaceDatasetFetchInterval uint32 `ini:"LogicFaceDatasetFetchInterval"` // FaceStatus数据集获取尝试之间的间隔 + LogicFaceDatasetFetchInterval uint32 `ini:"LogicFaceDatasetFetchInterval"` // FaceStatus数据集获取尝试之间的间隔【单位:毫秒】 NeighborsInfo NeighborsJsonString `ini:"NeighborsInfo"` // 邻居路由器链路信息 } @@ -217,5 +220,7 @@ func ParseConfig(configPath string) (*MlsrConfig, error) { if mlsrConfig.NeighborsInfo!="" { mlsrConfig.neighbors, _ = parseJsonStringToNeighbors(mlsrConfig.NeighborsInfo) } + // 将配置中的参数进行初始化,以支持直接获取结构体形式的参数 + mlsrConfig.MlsrConfigParameters.Init(mlsrConfig) return mlsrConfig, nil } diff --git a/common/MlsrConfigParameters.go b/common/MlsrConfigParameters.go new file mode 100644 index 0000000..6dc56e5 --- /dev/null +++ b/common/MlsrConfigParameters.go @@ -0,0 +1,216 @@ +// Package common +// @Author: Wang Feng +// @Description: MlsrConfig的辅助类。MlsrConf中主要实现读写配置文件的操作, +// 本类则负责将配置参数转化为实际的结构体。 +// @Version: 0.1.0 +// @Date: 2022/5/12 15:29 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package common + +import ( + "minlib/component" + "strconv" + "time" +) + +// 同步协议版本号 +const SYNC_VERSION = 1 + +type MlsrConfigParameters struct { + // 元数据从配置文件中来 + mlsrconf *MlsrConfig + + // 名称前缀/名称标识 + m_routerName *component.Identifier + m_siteName *component.Identifier + m_network *component.Identifier + m_routerPrefix *component.Identifier + m_syncUserPrefix *component.Identifier + m_syncPrefix *component.Identifier + m_lsaPrefix *component.Identifier + + m_faceDatasetFetchInterval time.Duration + m_lsaInterestLifetime time.Duration + +} + +// MlsrConfig初始化 +func (mcp *MlsrConfigParameters) Init(config *MlsrConfig) { + mcp.setMetaData(config) + // 依次构建各个名称前缀/名称标识 + _ = mcp.build3Prefix() + _ = mcp.buildSyncAndLsaPrefix() + _ = mcp.buildRouterAndSyncUserPrefix() +} + +// +// setMetaData +// @Description: 设置mlsrconfig +// @receiver mcp +// @param config +// +func (mcp *MlsrConfigParameters) setMetaData(config *MlsrConfig) { + mcp.mlsrconf = config +} + +func (mcp *MlsrConfigParameters) genDurations() { + mcp.m_faceDatasetFetchInterval = + time.Duration(mcp.mlsrconf.LogicFaceDatasetFetchInterval) * time.Millisecond + mcp.m_lsaInterestLifetime = + time.Duration(mcp.mlsrconf.LsaInterestLifetime) * time.Millisecond +} + +// +// build3Prefix +// @Description: 构建了三个必要的名称组件,网络、网域/网站、路由器 +// @receiver mcp +// @return error +// +func (mcp *MlsrConfigParameters) build3Prefix() error { + var err error + mcp.m_network,err = component.CreateIdentifierByString(mcp.mlsrconf.Network) + if err != nil{ + return err + } + + mcp.m_siteName,err = component.CreateIdentifierByString(mcp.mlsrconf.Site) + if err != nil{ + return err + } + + mcp.m_routerName,err = component.CreateIdentifierByString(mcp.mlsrconf.Router) + if err != nil{ + return err + } + return nil +} + +func (mcp *MlsrConfigParameters) buildSyncAndLsaPrefix() error { + // 同步前缀 = "/localhop" + 网络字段 + "/mlsr/sync" + SYNC版本号 + syncPrefix := "/localhop"+mcp.mlsrconf.Network+"/mlsr/sync"+"/"+ strconv.Itoa(SYNC_VERSION) + var err error + mcp.m_syncPrefix,err = component.CreateIdentifierByString(syncPrefix) + if err != nil{ + return err + } + + // Lsa前缀 = "/localhop" + 网络字段 + "/sync/LSA" + lsaPrefix := "/localhop"+mcp.mlsrconf.Network+"/sync/LSA" + mcp.m_lsaPrefix,err = component.CreateIdentifierByString(lsaPrefix) + if err != nil{ + return err + } + return nil +} + +func (mcp *MlsrConfigParameters) buildRouterAndSyncUserPrefix() error { + // 路由器前缀 = 网络字段 + 网域字段 + 路由器字段 + prefix := mcp.mlsrconf.Network+mcp.mlsrconf.Site+mcp.mlsrconf.Router + var err error + mcp.m_routerPrefix,err = component.CreateIdentifierByString(prefix) + if err != nil{ + return err + } + + // 同步用户前缀 = Lsa前缀 + 网域字段 + 路由器字段 + syncUserPrefix := mcp.m_lsaPrefix.ToUri()+mcp.mlsrconf.Site+mcp.mlsrconf.Router + mcp.m_syncUserPrefix,err = component.CreateIdentifierByString(syncUserPrefix) + if err != nil{ + return err + } + return nil +} + +func (mcp *MlsrConfigParameters) GetNetwork() *component.Identifier { + return mcp.m_network +} + +func (mcp *MlsrConfigParameters) GetSiteName() *component.Identifier { + return mcp.m_siteName +} + +func (mcp *MlsrConfigParameters) GetRouterName() *component.Identifier { + return mcp.m_routerName +} + +func (mcp *MlsrConfigParameters) GetRouterPrefix() *component.Identifier { + return mcp.m_routerPrefix +} + +func (mcp *MlsrConfigParameters) GetSyncUserPrefix() *component.Identifier { + return mcp.m_syncUserPrefix +} + +func (mcp *MlsrConfigParameters) GetSyncPrefix() *component.Identifier { + return mcp.m_syncPrefix +} + +func (mcp *MlsrConfigParameters) GetLsaPrefix() *component.Identifier { + return mcp.m_lsaPrefix +} + +func (mcp *MlsrConfigParameters) GetSyncProtocol() { + // todo +} + +func (mcp *MlsrConfigParameters) GetLsaRefreshTime() uint32 { + return mcp.mlsrconf.LsaRefreshTime +} + +func (mcp *MlsrConfigParameters) GetLsaInterestLifetime() time.Duration { + return mcp.m_lsaInterestLifetime +} + +func (mcp *MlsrConfigParameters) GetAdjLsaBuildInterval() uint32 { + return mcp.mlsrconf.AdjLsaBuildInterval +} + +func (mcp *MlsrConfigParameters) GetRoutingCalcInterval() uint32 { + return mcp.mlsrconf.RoutingCalcInterval +} + +func (mcp *MlsrConfigParameters) GetRouterDeadInterval() uint32 { + return mcp.mlsrconf.RouterDeadInterval +} + +func (mcp *MlsrConfigParameters) GetFaceDatasetFetchTries() uint32 { + return mcp.mlsrconf.LogicFaceDatasetFetchRetries +} + +func (mcp *MlsrConfigParameters) GetFaceDatasetFetchInterval() time.Duration { + return mcp.m_faceDatasetFetchInterval +} + +func (mcp *MlsrConfigParameters) GetInterestRetryNumber() int { + return mcp.mlsrconf.HelloRetries +} + +func (mcp *MlsrConfigParameters) GetInterestResendTime() { + // todo +} + +func (mcp *MlsrConfigParameters) GetInfoInterestInterval() { + // todo +} + +func (mcp *MlsrConfigParameters) GetMaxFacesPerPrefix() int { + return mcp.mlsrconf.MaxLogicFacesPerPrefix +} + +func (mcp *MlsrConfigParameters) GetSyncInterestLifetime() uint32 { + return mcp.mlsrconf.SyncInterestLifetime +} + +func (mcp *MlsrConfigParameters) GetAdjacencyList() { + // todo +} + +func (mcp *MlsrConfigParameters) GetNamePrefixList() { + // todo +} + +func (mcp *MlsrConfigParameters) GetKeyChain() { + // todo +} diff --git a/route/Calculator/LinkStateRoutingTableCalculator.go b/route/Calculator/LinkStateRoutingTableCalculator.go index e5e6731..ad383f7 100644 --- a/route/Calculator/LinkStateRoutingTableCalculator.go +++ b/route/Calculator/LinkStateRoutingTableCalculator.go @@ -55,7 +55,7 @@ func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, c.initMatrix() _ = c.makeAdjMatrix(lsdb, routerMap) // 从配置文件中获取源路由器前缀,并根据routerMap获取其映射号 - sourceRouter := routerMap.GetMappingNoByRouterName(mConfig) + sourceRouter := routerMap.GetMappingNoByRouterName(mConfig.GeneralConfig.Router) } // From 4afc8e3f12624d172447240f33f6797b0d586983 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 12 May 2022 17:32:03 +0800 Subject: [PATCH 19/70] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E9=93=BE=E8=B7=AF=E7=8A=B6=E6=80=81=E8=B7=AF=E7=94=B1=E8=A1=A8?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/MlsrConfigParameters.go | 4 +- lsa/AdjLsaAdjacencyList.go | 13 ++++- lsa/AdjLsaAdjacencyList_test.go | 2 +- .../LinkStateRoutingTableCalculator.go | 52 +++++++++++++++++-- route/Calculator/RoutingTableCalculator.go | 7 ++- route/ConnectingLogicFaceUri.go | 2 +- 6 files changed, 66 insertions(+), 14 deletions(-) diff --git a/common/MlsrConfigParameters.go b/common/MlsrConfigParameters.go index 6dc56e5..65e02cd 100644 --- a/common/MlsrConfigParameters.go +++ b/common/MlsrConfigParameters.go @@ -11,6 +11,7 @@ package common import ( "minlib/component" + "mlsr/lsa" "strconv" "time" ) @@ -203,8 +204,9 @@ func (mcp *MlsrConfigParameters) GetSyncInterestLifetime() uint32 { return mcp.mlsrconf.SyncInterestLifetime } -func (mcp *MlsrConfigParameters) GetAdjacencyList() { +func (mcp *MlsrConfigParameters) GetAdjacencyList() *lsa.AdjLsaAdjacenctList { // todo + return nil } func (mcp *MlsrConfigParameters) GetNamePrefixList() { diff --git a/lsa/AdjLsaAdjacencyList.go b/lsa/AdjLsaAdjacencyList.go index 2defaac..da495ce 100644 --- a/lsa/AdjLsaAdjacencyList.go +++ b/lsa/AdjLsaAdjacencyList.go @@ -293,7 +293,7 @@ func (l *AdjLsaAdjacenctList) Reset() { } // -// FindAdjacencyByRouterIdentifier +// FindAdjacencysByRouterIdentifier // @Description: 获取指定路由器标识的所有邻接信息条目。 // 这就表明一个邻接表中可能有包含同一个MIR标识的多个邻接信息条目, // 前面的一些设置或获取操作均只对按序查到的第一个邻接信息条目进行操作。 @@ -302,7 +302,7 @@ func (l *AdjLsaAdjacenctList) Reset() { // @param routerIdentifier // @return []*AdjLsaAdjacencyInfo // -func (l *AdjLsaAdjacenctList) FindAdjacencyByRouterIdentifier(routerIdentifier *component.Identifier) []*AdjLsaAdjacencyInfo { +func (l *AdjLsaAdjacenctList) FindAdjacencysByRouterIdentifier(routerIdentifier *component.Identifier) []*AdjLsaAdjacencyInfo { var infos []*AdjLsaAdjacencyInfo for i:=0; i Date: Thu, 12 May 2022 18:20:26 +0800 Subject: [PATCH 20/70] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BA=86time=E5=BA=93?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=9A=E6=9B=B4?= =?UTF-8?q?=E6=96=B0goland=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 1 - 1 file changed, 1 deletion(-) diff --git a/go.mod b/go.mod index 45800ee..0629455 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,6 @@ require ( github.com/tidwall/buntdb v1.2.9 github.com/tidwall/gjson v1.14.0 // indirect gopkg.in/ini.v1 v1.62.0 - gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect minlib v0.0.0 ) From 2b0343493f3517a9bd128dbfd8fa3193b19b661c Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Mon, 16 May 2022 17:29:38 +0800 Subject: [PATCH 21/70] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=97=A5=E5=BF=97=E8=AE=B0=E5=BD=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/MlsrConfig.go | 118 ++++++++++++++++++++++++------------------ common/MlsrLogger.go | 25 +++++++++ route/RoutingTable.go | 27 +++++++--- 3 files changed, 114 insertions(+), 56 deletions(-) create mode 100644 common/MlsrLogger.go diff --git a/common/MlsrConfig.go b/common/MlsrConfig.go index 3a38714..eee6eb2 100644 --- a/common/MlsrConfig.go +++ b/common/MlsrConfig.go @@ -20,18 +20,19 @@ const DefaultConfFileName = "mlsrConf.ini" // @Description: MLSR 配置文件的配置。与mlsrConf.ini一一对应 // type MlsrConfig struct { - GeneralConfig `ini:"General"` - NeighborsConfig `ini:"Neighbors"` - HyperbolicConfig `ini:"Hyperbolic"` - FibConfig `ini:"Fib"` - AdvertisingConfig `ini:"Advertising"` - SecurityConfig `ini:"Security"` + GeneralConfig `ini:"General"` + LogConfig `ini:"Log"` + NeighborsConfig `ini:"Neighbors"` + HyperbolicConfig `ini:"Hyperbolic"` + FibConfig `ini:"Fib"` + AdvertisingConfig `ini:"Advertising"` + SecurityConfig `ini:"Security"` // 获取值的接口 MlsrConfigParameters - mlsrConfigPath string // 配置文件所在路径 - neighbors []NeighborConfig // NeighborsConfig中的信息 + mlsrConfigPath string // 配置文件所在路径 + neighbors []NeighborConfig // NeighborsConfig中的信息 } // @@ -39,18 +40,29 @@ type MlsrConfig struct { // @Description: 最基础配置信息:LSA、同步协议 // type GeneralConfig struct { - Network string `ini:"Network"` // 所属网络 - Site string `ini:"Site"` // 所属站点 - Router string `ini:"Router"` // 所属路由器 + Network string `ini:"Network"` // 所属网络 + Site string `ini:"Site"` // 所属站点 + Router string `ini:"Router"` // 所属路由器 - LsaRefreshTime uint32 `ini:"LsaRefreshTime"` // LSA刷新时间 + LsaRefreshTime uint32 `ini:"LsaRefreshTime"` // LSA刷新时间 - RouterDeadInterval uint32 `ini:"RouterDeadInterval"` // 路由器判断死亡的时间间隔(必须大于LSA刷新时间) + RouterDeadInterval uint32 `ini:"RouterDeadInterval"` // 路由器判断死亡的时间间隔(必须大于LSA刷新时间) - LsaInterestLifetime int `ini:"LsaInterestLifetime"` // LSA兴趣包生存周期。当使用推式包时,此值无效【单位:毫秒】 + LsaInterestLifetime int `ini:"LsaInterestLifetime"` // LSA兴趣包生存周期。当使用推式包时,此值无效【单位:毫秒】 - SyncProtocol string `ini:"SyncProtocol"` // 同步协议 - SyncInterestLifetime uint32 `ini:"SyncInterestLifetime"` // 同步协议兴趣包生命周期 + SyncProtocol string `ini:"SyncProtocol"` // 同步协议 + SyncInterestLifetime uint32 `ini:"SyncInterestLifetime"` // 同步协议兴趣包生命周期 +} + +// +// LogConfig +// @Description: 日志模块 +// +type LogConfig struct { + LogLevel string `ini:"LogLevel"` // 日志等级 + ReportCaller bool `ini:"ReportCaller"` // 日志输出时是否添加文件名和函数名 + LogFormat string `ini:"LogFormat"` // 输出日志的格式 "json" | "text" + LogFilePath string `ini:"LogFilePath"` // 日志输出文件路径,为空则输出至控制台 } // @@ -58,23 +70,23 @@ type GeneralConfig struct { // @Description: 邻居路由器相关配置 // type NeighborsConfig struct { - HelloRetries int `ini:"HelloRetries"` // hello协议探测最大次数 - HelloTimeout uint32 `ini:"HelloTimeout"` // hello协议中的超时时间 - HelloInterval uint32 `ini:"HelloInterval"` // 两个hello包之间的间隔时间 + HelloRetries int `ini:"HelloRetries"` // hello协议探测最大次数 + HelloTimeout uint32 `ini:"HelloTimeout"` // hello协议中的超时时间 + HelloInterval uint32 `ini:"HelloInterval"` // 两个hello包之间的间隔时间 - AdjLsaBuildInterval uint32 `ini:"AdjLsaBuildInterval"` // 邻接LSA构建的时间间隔 - LogicFaceDatasetFetchRetries uint32 `ini:"LogicFaceDatasetFetchRetries"` // 获取FaceStatus数据集的重试次数 - LogicFaceDatasetFetchInterval uint32 `ini:"LogicFaceDatasetFetchInterval"` // FaceStatus数据集获取尝试之间的间隔【单位:毫秒】 - - NeighborsInfo NeighborsJsonString `ini:"NeighborsInfo"` // 邻居路由器链路信息 + AdjLsaBuildInterval uint32 `ini:"AdjLsaBuildInterval"` // 邻接LSA构建的时间间隔 + LogicFaceDatasetFetchRetries uint32 `ini:"LogicFaceDatasetFetchRetries"` // 获取FaceStatus数据集的重试次数 + LogicFaceDatasetFetchInterval uint32 `ini:"LogicFaceDatasetFetchInterval"` // FaceStatus数据集获取尝试之间的间隔【单位:毫秒】 + + NeighborsInfo NeighborsJsonString `ini:"NeighborsInfo"` // 邻居路由器链路信息 } type NeighborsJsonString string type NeighborConfig struct { - NeighborName string `ini:"NeighborName"` // 邻居路由器的名称前缀 - LogicFaceUri string `ini:"LogicFaceUri"` // 连接该邻居路由器的LogicFace的URI - LinkCost uint64 `ini:"LinkCost"` // 链路开销(用uint64还是double待决) + NeighborName string `ini:"NeighborName"` // 邻居路由器的名称前缀 + LogicFaceUri string `ini:"LogicFaceUri"` // 连接该邻居路由器的LogicFace的URI + LinkCost uint64 `ini:"LinkCost"` // 链路开销(用uint64还是double待决) } // @@ -84,10 +96,10 @@ type NeighborConfig struct { // @return NeighborsJsonString // @return error // -func parseNeighborConfigToJsonString(neighbors []NeighborConfig) (NeighborsJsonString,error) { - bytes,err := json.Marshal(neighbors) - if err!= nil{ - return "",err +func parseNeighborConfigToJsonString(neighbors []NeighborConfig) (NeighborsJsonString, error) { + bytes, err := json.Marshal(neighbors) + if err != nil { + return "", err } return NeighborsJsonString(bytes), nil } @@ -100,11 +112,11 @@ func parseNeighborConfigToJsonString(neighbors []NeighborConfig) (NeighborsJsonS // @return []NeighborConfig // @return error // -func parseJsonStringToNeighbors(jsonString NeighborsJsonString) ([]NeighborConfig,error) { +func parseJsonStringToNeighbors(jsonString NeighborsJsonString) ([]NeighborConfig, error) { var neighbors []NeighborConfig err := json.Unmarshal([]byte(jsonString), &neighbors) - if err!= nil{ - return nil,err + if err != nil { + return nil, err } return neighbors, nil } @@ -121,12 +133,12 @@ type HyperbolicConfig struct { // @Description: 路由计算相关配置 // type FibConfig struct { - MaxLogicFacesPerPrefix int `ini:"MaxLogicFacesPerPrefix"` // 每个前缀对应的下一跳face列表的最大数目 - RoutingCalcInterval uint32 `ini:"RoutingCalcInterval"` // 两次路由计算的时间间隔 + MaxLogicFacesPerPrefix int `ini:"MaxLogicFacesPerPrefix"` // 每个前缀对应的下一跳face列表的最大数目 + RoutingCalcInterval uint32 `ini:"RoutingCalcInterval"` // 两次路由计算的时间间隔 } type AdvertisingConfig struct { - Prefixs []string `ini:"Prefixs"` // 需要广告给其他路由器的本机前缀 + Prefixs []string `ini:"Prefixs"` // 需要广告给其他路由器的本机前缀 } type SecurityConfig struct { @@ -137,24 +149,30 @@ type SecurityConfig struct { // @Description: 初始化配置,给所有的配置设置默认值 // @receiver c // -func (c *MlsrConfig) Init() { +func (c *MlsrConfig) Init() { // 通用配置参数 c.GeneralConfig.Network = "/min" c.GeneralConfig.Site = "/pkusz" c.GeneralConfig.Router = "/routerA" c.GeneralConfig.LsaRefreshTime = 1800 // 240-7200 - c.GeneralConfig.RouterDeadInterval = 2*c.GeneralConfig.LsaRefreshTime + c.GeneralConfig.RouterDeadInterval = 2 * c.GeneralConfig.LsaRefreshTime c.GeneralConfig.LsaInterestLifetime = 4 // 4-60 c.GeneralConfig.SyncProtocol = "min-sync" c.GeneralConfig.SyncInterestLifetime = 60000 // 1000-120000 + // Log + c.LogConfig.LogLevel = "INFO" + c.LogConfig.ReportCaller = true + c.LogConfig.LogFormat = "text" + c.LogConfig.LogFilePath = "" + // 邻居路由器配置参数 - c.NeighborsConfig.HelloRetries = 3 // 1-15 - c.NeighborsConfig.HelloTimeout = 1 // 1-15 - c.NeighborsConfig.HelloInterval = 60 // 30-90 - c.NeighborsConfig.AdjLsaBuildInterval = 10 // 5-30 - c.NeighborsConfig.LogicFaceDatasetFetchRetries = 3 // 1-10 - c.NeighborsConfig.LogicFaceDatasetFetchInterval = 3600 // 1800-5400 + c.NeighborsConfig.HelloRetries = 3 // 1-15 + c.NeighborsConfig.HelloTimeout = 1 // 1-15 + c.NeighborsConfig.HelloInterval = 60 // 30-90 + c.NeighborsConfig.AdjLsaBuildInterval = 10 // 5-30 + c.NeighborsConfig.LogicFaceDatasetFetchRetries = 3 // 1-10 + c.NeighborsConfig.LogicFaceDatasetFetchInterval = 3600 // 1800-5400 // 将邻居链路信息存储到配置文件中 todo:用于测试 neighborConfig1 := NeighborConfig{ NeighborName: "/routerB", @@ -169,14 +187,14 @@ func (c *MlsrConfig) Init() { //neighborsJsonString, _ := parseNeighborConfigToJsonString( // []NeighborConfig{neighborConfig1,neighborConfig2}) //c.NeighborsConfig.NeighborsInfo=neighborsJsonString - c.neighbors=[]NeighborConfig{neighborConfig1,neighborConfig2} + c.neighbors = []NeighborConfig{neighborConfig1, neighborConfig2} // 路由计算配置参数 c.FibConfig.MaxLogicFacesPerPrefix = 0 // 0-60 todo:为啥默认是0呢 c.FibConfig.RoutingCalcInterval = 15 // 0-15 // 广播本地前缀配置参数 - c.AdvertisingConfig.Prefixs=[]string{"/videos","/files","voices"} // todo:用于测试 + c.AdvertisingConfig.Prefixs = []string{"/videos", "/files", "voices"} // todo:用于测试 } // @@ -187,10 +205,10 @@ func (c *MlsrConfig) Init() { // func (c *MlsrConfig) Save() error { cfg := ini.Empty() - if len(c.neighbors)>0 { + if len(c.neighbors) > 0 { c.NeighborsInfo, _ = parseNeighborConfigToJsonString(c.neighbors) } - if err:= ini.ReflectFrom(cfg,c); err!= nil{ + if err := ini.ReflectFrom(cfg, c); err != nil { return err } return cfg.SaveTo(c.mlsrConfigPath) @@ -217,7 +235,7 @@ func ParseConfig(configPath string) (*MlsrConfig, error) { if err = cfg.MapTo(&mlsrConfig); err != nil { return nil, err } - if mlsrConfig.NeighborsInfo!="" { + if mlsrConfig.NeighborsInfo != "" { mlsrConfig.neighbors, _ = parseJsonStringToNeighbors(mlsrConfig.NeighborsInfo) } // 将配置中的参数进行初始化,以支持直接获取结构体形式的参数 diff --git a/common/MlsrLogger.go b/common/MlsrLogger.go new file mode 100644 index 0000000..06ed3d6 --- /dev/null +++ b/common/MlsrLogger.go @@ -0,0 +1,25 @@ +// Package common +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/16 17:03 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package common + +import "minlib/common" + +// InitLogger 日志模块初始化 +// +// @Description: +// @param config 配置文件 +// +func InitLogger(config *MlsrConfig) { + common.InitLogger(&common.LoggerParameters{ + ReportCaller: config.LogConfig.ReportCaller, + LogLevel: config.LogConfig.LogLevel, + LogFormat: config.LogConfig.LogFormat, + LogFilePath: config.LogConfig.LogFilePath, + }) +} diff --git a/route/RoutingTable.go b/route/RoutingTable.go index a1c96ef..2834851 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -44,8 +44,21 @@ type RoutingTable struct { // @Description: 计算网络中每个路由器的下一个跃点列表。 // @receiver t // -func (t *RoutingTable) Calculate() { +func (t *RoutingTable) Calculate() { + if !t.m_isRoutingTableCalculating { + // 先将状态改为正在做路由计算 + t.m_isRoutingTableCalculating = true + // 做邻接路由计算 + t.calculateLsRoutingTable() + + // 恢复计算状态 + t.m_isRouteCalculationScheduled = false + t.m_isRoutingTableCalculating = false + } else { + // 安排指定时间之后执行一个路由计算 + t.ScheduleRoutingTableCalculation() + } } // @@ -55,7 +68,7 @@ func (t *RoutingTable) Calculate() { // @param destRouter 要修改其RTE的目标路由器。 // @param hop 要添加到RTE的下一个跃点。 // -func (t *RoutingTable) AddNextHop(destRouter *component.Identifier,hop *NextHop) { +func (t *RoutingTable) AddNextHop(destRouter *component.Identifier, hop *NextHop) { } @@ -69,7 +82,7 @@ func (t *RoutingTable) FindRoutingTableEntry(destRouter *component.Identifier) * // @Description: 仅当尚未计划计算事件时,才在事件计划程序中计划计算事件。 // @receiver t // -func (t *RoutingTable) ScheduleRoutingTableCalculation() { +func (t *RoutingTable) ScheduleRoutingTableCalculation() { } @@ -78,8 +91,10 @@ func (t *RoutingTable) ScheduleRoutingTableCalculation() { // @Description: 计算链路状态路由表。 // @receiver t // -func (t *RoutingTable) calculateLsRoutingTable() { +func (t *RoutingTable) calculateLsRoutingTable() { + if t.lsdb.GetIsBuildAdjLsaScheduled() { + } } // @@ -87,7 +102,7 @@ func (t *RoutingTable) calculateLsRoutingTable() { // @Description: 清空路由表 // @receiver t // -func (t *RoutingTable) clearRoutingTable() { +func (t *RoutingTable) clearRoutingTable() { } @@ -163,4 +178,4 @@ func (t *RoutingTable) WireDecode(block *encoding.Block) error { } t.rTable = tableEntries return nil -} \ No newline at end of file +} From 853c6d679d3142fa07bf1b7e68fb3225d6f0a006 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Mon, 16 May 2022 17:37:51 +0800 Subject: [PATCH 22/70] =?UTF-8?q?=E5=A2=9E=E5=8A=A0main=E5=87=BD=E6=95=B0?= =?UTF-8?q?=EF=BC=8C=E4=BD=9C=E4=B8=BAmlsr=E4=B8=BB=E5=87=BD=E6=95=B0?= =?UTF-8?q?=E5=85=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main.go | 31 ------------------------------- mlsrcmd/mlsr/main.go | 26 ++++++++++++++++++++++++++ tests/main_test.go | 30 ++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+), 31 deletions(-) delete mode 100644 main.go create mode 100644 mlsrcmd/mlsr/main.go create mode 100644 tests/main_test.go diff --git a/main.go b/main.go deleted file mode 100644 index ba43540..0000000 --- a/main.go +++ /dev/null @@ -1,31 +0,0 @@ -package main - -import ( - "fmt" - "github.com/tidwall/buntdb" - "minlib/logicface" - "mlsr/lsa" -) - -func main() { - fmt.Println("abc") - s:=logicface.LogicFaceTypeEther - fmt.Println("def",s) - - ss:=lsa.AdjLsaAdjacencyInfo{} - ss.Status=1 - - TestBuntDb() -} - -func TestBuntDb() { - // https://github.com/tidwall/buntdb - db,err := buntdb.Open(":memory:") - if err!= nil{ - fmt.Println("bunt db open err") - } - _ = db.Close() - fmt.Println("bunt db closed") -} - - diff --git a/mlsrcmd/mlsr/main.go b/mlsrcmd/mlsr/main.go new file mode 100644 index 0000000..3a8b92c --- /dev/null +++ b/mlsrcmd/mlsr/main.go @@ -0,0 +1,26 @@ +// Package mlsr +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/16 17:32 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package mlsr + +import ( + "fmt" + "mlsr/common" +) + +func main() { + // 初始化配置文件 + testPath := "D:" + testPath += "\\" + testPath += common.DefaultConfFileName + fmt.Println("test mlsr conf path: " + testPath) + mlsrConfig, _ := common.ParseConfig(testPath) + + // 初始化日志模块 + common.InitLogger(mlsrConfig) +} diff --git a/tests/main_test.go b/tests/main_test.go new file mode 100644 index 0000000..784f64a --- /dev/null +++ b/tests/main_test.go @@ -0,0 +1,30 @@ +package tests + +import ( + "fmt" + "github.com/tidwall/buntdb" + "minlib/logicface" + "mlsr/lsa" + "testing" +) + +func TestName(t *testing.T) { + fmt.Println("abc") + s := logicface.LogicFaceTypeEther + fmt.Println("def", s) + + ss := lsa.AdjLsaAdjacencyInfo{} + ss.Status = 1 + + TestBuntDb(t) +} + +func TestBuntDb(t *testing.T) { + // https://github.com/tidwall/buntdb + db, err := buntdb.Open(":memory:") + if err != nil { + fmt.Println("bunt db open err") + } + _ = db.Close() + fmt.Println("bunt db closed") +} From 0da380c22fa0679f2a13d8470efb3d29523a2023 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 18 May 2022 17:01:33 +0800 Subject: [PATCH 23/70] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E8=A1=A8=E7=B1=BB=E4=B8=AD=E7=9A=84=E8=AE=A1=E7=AE=97=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E8=A1=A8=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/Calculator/RouterMap.go | 69 ++++++++++++-------- route/Calculator/RoutingTableCalculator.go | 73 ++++++++++++---------- route/RoutingTable.go | 44 ++++++++++++- 3 files changed, 125 insertions(+), 61 deletions(-) diff --git a/route/Calculator/RouterMap.go b/route/Calculator/RouterMap.go index 7d03397..6ebc902 100644 --- a/route/Calculator/RouterMap.go +++ b/route/Calculator/RouterMap.go @@ -11,6 +11,7 @@ package Calculator import ( "minlib/component" + "mlsr/lsa" "sync" ) @@ -39,11 +40,11 @@ type RouterMap struct { // @receiver m // @param routerName // -func (m *RouterMap) Store(routerName *component.Identifier) { +func (m *RouterMap) Store(routerName *component.Identifier) { m.mapLock.Lock() uri := routerName.ToUri() - _,ok := m.uriToIdentifierMap[uri] - if !ok{ + _, ok := m.uriToIdentifierMap[uri] + if !ok { // 如果不存在,则将其存入三张map m.uriToIdentifierMap[uri] = routerName m.routerToNumberMap[uri] = m.mappingIndex @@ -53,21 +54,35 @@ func (m *RouterMap) Store(routerName *component.Identifier) { m.mapLock.Unlock() } +func (m *RouterMap) CreateFromAdjLsdb(lsas []lsa.ILsa) error { + for i := 0; i < len(lsas); i++ { + // 1. 先将LSA解析为邻接LSA + adjLsa := (lsas[i]).(*lsa.AdjLsa) + // 2. 将每个邻接lsa的源路由,以及所有该源路由的邻接路由器,都加入到map中 + m.Store(adjLsa.GetOriginRouter()) + adjs := adjLsa.GetAdjList() + for j := 0; j < len(adjs); j++ { + m.Store(adjs[j].GetNeighborRouterIdentifier()) + } + } + return nil +} + // // Delete // @Description: 删除一个路由器标识。在实际使用中用不到,故先小写其字母。 // @receiver m // @param routerName // -func (m *RouterMap) delete(routerName *component.Identifier) { +func (m *RouterMap) delete(routerName *component.Identifier) { m.mapLock.Lock() uri := routerName.ToUri() - value,ok := m.routerToNumberMap[uri] - if ok{ + value, ok := m.routerToNumberMap[uri] + if ok { // 如果存在,则将其从三张map中删除 - delete(m.uriToIdentifierMap,uri) - delete(m.routerToNumberMap,uri) - delete(m.numberToRouterMap,value) + delete(m.uriToIdentifierMap, uri) + delete(m.routerToNumberMap, uri) + delete(m.numberToRouterMap, value) } m.mapLock.Unlock() } @@ -80,15 +95,15 @@ func (m *RouterMap) delete(routerName *component.Identifier) { // @return *component.Identifier // @return bool // -func (m *RouterMap) GetRouterNameByMappingNo(index int) (*component.Identifier,bool) { +func (m *RouterMap) GetRouterNameByMappingNo(index int) (*component.Identifier, bool) { m.mapLock.Lock() defer m.mapLock.Unlock() - value,ok := m.numberToRouterMap[index] - if ok{ + value, ok := m.numberToRouterMap[index] + if ok { idenValue := m.uriToIdentifierMap[value] - return idenValue,true + return idenValue, true } - return nil,false + return nil, false } // @@ -99,11 +114,11 @@ func (m *RouterMap) GetRouterNameByMappingNo(index int) (*component.Identifier,b // @return int // @return bool // -func (m *RouterMap) GetMappingNoByRouterName(routerName *component.Identifier) (int,bool) { +func (m *RouterMap) GetMappingNoByRouterName(routerName *component.Identifier) (int, bool) { m.mapLock.Lock() defer m.mapLock.Unlock() - value,ok := m.routerToNumberMap[routerName.ToUri()] - return value,ok + value, ok := m.routerToNumberMap[routerName.ToUri()] + return value, ok } // @@ -122,17 +137,17 @@ func (m *RouterMap) GetMapSize() int { // @Description: 必须先执行该函数,以初始化RouterMap // @receiver m* // -func (m* RouterMap) Init() { - if m.uriToIdentifierMap==nil{ - m.uriToIdentifierMap=make(map[string]*component.Identifier) +func (m *RouterMap) Init() { + if m.uriToIdentifierMap == nil { + m.uriToIdentifierMap = make(map[string]*component.Identifier) } - if m.routerToNumberMap==nil{ - m.routerToNumberMap=make(map[string]int) + if m.routerToNumberMap == nil { + m.routerToNumberMap = make(map[string]int) } - if m.numberToRouterMap==nil{ - m.numberToRouterMap=make(map[int]string) + if m.numberToRouterMap == nil { + m.numberToRouterMap = make(map[int]string) } - if m.mapLock==nil{ - m.mapLock=new(sync.RWMutex) + if m.mapLock == nil { + m.mapLock = new(sync.RWMutex) } -} \ No newline at end of file +} diff --git a/route/Calculator/RoutingTableCalculator.go b/route/Calculator/RoutingTableCalculator.go index 3733bb5..15ad3d5 100644 --- a/route/Calculator/RoutingTableCalculator.go +++ b/route/Calculator/RoutingTableCalculator.go @@ -24,21 +24,31 @@ type RoutingTableCalculator struct { // 路由器数目 m_nRouters int - vNoLink int - links []int + vNoLink int + links []int linkCosts []uint64 } +// +// SetRouterNum +// @Description: 设置路由器个数 +// @receiver c +// @param n +// +func (c *RoutingTableCalculator) SetRouterNum(n int) { + c.m_nRouters = n +} + // // allocateAdjMatrix // @Description: 给邻接矩阵分配所需的空间 // @receiver c // -func (c *RoutingTableCalculator) allocateAdjMatrix() { - c.adjMatrix=make([][]uint64,c.m_nRouters) +func (c *RoutingTableCalculator) allocateAdjMatrix() { + c.adjMatrix = make([][]uint64, c.m_nRouters) // 根据路由器的数目,确定邻接矩阵的长度 for i := 0; i < c.m_nRouters; i++ { - c.adjMatrix[i]=make([]uint64,c.m_nRouters) + c.adjMatrix[i] = make([]uint64, c.m_nRouters) } } @@ -47,10 +57,10 @@ func (c *RoutingTableCalculator) allocateAdjMatrix() { // @Description: 为矩阵的每个单元设置非邻接成本(NON_ADJACENT_COST,如-12345),以确保内存安全。 // @receiver c // -func (c *RoutingTableCalculator) initMatrix() { +func (c *RoutingTableCalculator) initMatrix() { for i := 0; i < c.m_nRouters; i++ { for j := 0; j < c.m_nRouters; j++ { - c.adjMatrix[0][0]=route.NON_ADJACENT_COST + c.adjMatrix[0][0] = route.NON_ADJACENT_COST } } } @@ -66,33 +76,33 @@ func (c *RoutingTableCalculator) makeAdjMatrix(lsdb *lsdb.Lsdb, rp *RouterMap) error { // 1. 在Map中表示每个LSA // 先从Lsdb中取出邻接LSA - lsas,err := lsdb.GetLSAsByType(lsa.LsaADJACENCYType) - if err!=nil { + lsas, err := lsdb.GetLSAsByType(lsa.LsaADJACENCYType) + if err != nil { return errors.New("No Found adj lsa in LSDB. ") } // 2. 再对每个lsa进行操作 for i := 0; i < len(lsas); i++ { // 2.1 取出源路由器,找其索引值,作为邻接矩阵的行号 - row,b := rp.GetMappingNoByRouterName(lsas[i].GetOriginRouter()) + row, b := rp.GetMappingNoByRouterName(lsas[i].GetOriginRouter()) if !b { return errors.New("No Found origin router in routerMap. ") } // 2.2 依次取出该源路由器对应的所有邻接路由器标识,以及链路开销,来构建邻接矩阵 - adjlsa,ok := (lsas[i]).(*lsa.AdjLsa) - if !ok{ + adjlsa, ok := (lsas[i]).(*lsa.AdjLsa) + if !ok { return errors.New("Lsa from LSDB is not adjlsa. ") } adjs := adjlsa.GetAdjList() for j := 0; j < len(adjs); j++ { // 2.2.1 取列数 - col,b := rp.GetMappingNoByRouterName(adjs[j].GetNeighborRouterIdentifier()) + col, b := rp.GetMappingNoByRouterName(adjs[j].GetNeighborRouterIdentifier()) if !b { return errors.New("No Found neighbor router in routerMap. ") } // 2.2.2 取开销 linkCost := adjs[j].AdjLsaLinkCost.LinkCost() // 2.2.3 将开销放入邻接矩阵 - if (row < c.m_nRouters) && (col < c.m_nRouters){ + if (row < c.m_nRouters) && (col < c.m_nRouters) { c.adjMatrix[row][col] = linkCost } } @@ -109,7 +119,7 @@ func (c *RoutingTableCalculator) makeAdjMatrix(lsdb *lsdb.Lsdb, // @receiver c 包含邻接矩阵数据的映射 // @param p // -func (c *RoutingTableCalculator) writeAdjMatrixLog(p *sync.Map) { +func (c *RoutingTableCalculator) writeAdjMatrixLog(p *sync.Map) { // todo 输出调试信息,验证功能是否正常运行 } @@ -122,7 +132,7 @@ func (c *RoutingTableCalculator) writeAdjMatrixLog(p *sync.Map) { func (c *RoutingTableCalculator) getNumOfLinkfromAdjMatrix(sRouter int) int { num := 0 for i := 0; i < c.m_nRouters; i++ { - if (c.adjMatrix[sRouter][i]!=route.NON_ADJACENT_COST) && (i!=sRouter){ + if (c.adjMatrix[sRouter][i] != route.NON_ADJACENT_COST) && (i != sRouter) { num++ } } @@ -134,7 +144,7 @@ func (c *RoutingTableCalculator) getNumOfLinkfromAdjMatrix(sRouter int) int { // @Description: 释放内存 // @receiver c // -func (c *RoutingTableCalculator) freeAdjMatrix() { +func (c *RoutingTableCalculator) freeAdjMatrix() { // todo 寄托于golang自己的GC机制 } @@ -146,12 +156,12 @@ func (c *RoutingTableCalculator) freeAdjMatrix() { // @param link 要调整的源的邻接 // @param linkCost 更改为的成本。 // -func (c *RoutingTableCalculator) adjustAdMatrix(source int,link int,linkCost uint64) { +func (c *RoutingTableCalculator) adjustAdMatrix(source int, link int, linkCost uint64) { for i := 0; i < c.m_nRouters; i++ { - if i==link{ - c.adjMatrix[source][i]=linkCost - }else{ - c.adjMatrix[source][i]=route.NON_ADJACENT_COST + if i == link { + c.adjMatrix[source][i] = linkCost + } else { + c.adjMatrix[source][i] = route.NON_ADJACENT_COST } } } @@ -167,10 +177,10 @@ func (c *RoutingTableCalculator) adjustAdMatrix(source int,link int,linkCost uin // @param linkCosts 存储链路开销的一个双指针数组 // @param source 被调整值的路由器 // -func (c *RoutingTableCalculator) getLinksFromAdjMatrix(source int) { +func (c *RoutingTableCalculator) getLinksFromAdjMatrix(source int) { index := 0 for i := 0; i < c.m_nRouters; i++ { - if (c.adjMatrix[source][i]!=route.NON_ADJACENT_COST) && (i!=source){ + if (c.adjMatrix[source][i] != route.NON_ADJACENT_COST) && (i != source) { c.links[index] = i c.linkCosts[index] = c.adjMatrix[source][i] index++ @@ -183,8 +193,8 @@ func (c *RoutingTableCalculator) getLinksFromAdjMatrix(source int) { // @Description: 分配一个足以容纳多路径计算临时值的数组 // @receiver c // -func (c *RoutingTableCalculator) allocateLinks() { - c.links = make([]int,c.vNoLink) +func (c *RoutingTableCalculator) allocateLinks() { + c.links = make([]int, c.vNoLink) } // @@ -192,8 +202,8 @@ func (c *RoutingTableCalculator) allocateLinks() { // @Description: 分配内存 // @receiver c // -func (c *RoutingTableCalculator) allocateLinkCosts() { - c.linkCosts = make([]uint64,c.vNoLink) +func (c *RoutingTableCalculator) allocateLinkCosts() { + c.linkCosts = make([]uint64, c.vNoLink) } // @@ -201,7 +211,7 @@ func (c *RoutingTableCalculator) allocateLinkCosts() { // @Description: 释放内存 // @receiver c // -func (c *RoutingTableCalculator) freeLinks() { +func (c *RoutingTableCalculator) freeLinks() { // todo 寄托于golang自己的GC机制 } @@ -210,7 +220,7 @@ func (c *RoutingTableCalculator) freeLinks() { // @Description: 释放内存 // @receiver c // -func (c *RoutingTableCalculator) freeLinksCosts() { +func (c *RoutingTableCalculator) freeLinksCosts() { // todo 寄托于golang自己的GC机制 } @@ -220,7 +230,6 @@ func (c *RoutingTableCalculator) freeLinksCosts() { // @receiver c // @param nl // -func (c *RoutingTableCalculator) setNoLink(nl int) { +func (c *RoutingTableCalculator) setNoLink(nl int) { c.vNoLink = nl } - diff --git a/route/RoutingTable.go b/route/RoutingTable.go index 2834851..aacee96 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -10,11 +10,14 @@ package route import ( "errors" + common2 "minlib/common" "minlib/component" "minlib/encoding" "mlsr/common" "mlsr/extensions" + "mlsr/lsa" "mlsr/lsdb" + "mlsr/route/Calculator" "time" ) @@ -83,7 +86,9 @@ func (t *RoutingTable) FindRoutingTableEntry(destRouter *component.Identifier) * // @receiver t // func (t *RoutingTable) ScheduleRoutingTableCalculation() { - + if !t.m_isRouteCalculationScheduled { + + } } // @@ -93,8 +98,43 @@ func (t *RoutingTable) ScheduleRoutingTableCalculation() { // func (t *RoutingTable) calculateLsRoutingTable() { if t.lsdb.GetIsBuildAdjLsaScheduled() { - + common2.LogFatal("Adjacency build is scheduled, routing table can not be calculated :(") + return } + + // 我们只在LS中检查这一点,因为我们从不移除自己的坐标LSA。而如果没有任何邻居,则移除自己的邻接LSA + if !t.m_ownAdjLsaExist { + return + } + + t.clearRoutingTable() + + // 构造路由映射表 + lsas, err := t.lsdb.GetLSAsByType(lsa.LsaADJACENCYType) + if err != nil { + common2.LogFatal("Get Lsa in calculateLsRoutingTable error, ", err) + } + rMap := new(Calculator.RouterMap) + rMap.Init() + err = rMap.CreateFromAdjLsdb(lsas) + if err != nil { + common2.LogFatal("create RouterMap from lsdb error in calculateLsRoutingTable error, ", err) + } + + nRouters := rMap.GetMapSize() + + // 构造路由计算器 + calculator := new(Calculator.LinkStateRoutingTableCalculator) + calculator.SetRouterNum(nRouters) + // 使用计算器去计算路由 + err = calculator.CalculatePath(rMap, t, t.mlsrConfig, t.lsdb) + if err != nil { + common2.LogFatal("CalculatePath in calculateLsRoutingTable error, ", err) + } + + // todo: 开始根据新计算的路由去更新NPT表 + common2.LogInfo("Calling Update NPT With new Route") + //todo } // From aa86d201919f1222fbd0cd210561f97256d8b1a5 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 18 May 2022 17:33:14 +0800 Subject: [PATCH 24/70] =?UTF-8?q?=E6=AD=A3=E5=9C=A8=E9=87=8D=E6=96=B0?= =?UTF-8?q?=E5=B0=81=E8=A3=85goCron...?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/goCron_test.go | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/tests/goCron_test.go b/tests/goCron_test.go index ab44355..df80a81 100644 --- a/tests/goCron_test.go +++ b/tests/goCron_test.go @@ -16,7 +16,7 @@ import ( ) func printHHH() { - println("hello,gocron.",time.Now().String()) + println("hello,gocron.", time.Now().String()) } // @@ -31,7 +31,7 @@ func Test_Loop(t *testing.T) { s := gocron.NewScheduler(time.UTC) // Job:只知道它提供的任务(task, go函数),因此只能执行与该任务相关的操作,例如防止自己超出需要很长时间的先前任务。 //j, _ := s.Every(10).Seconds().Do(func() { time.Sleep(2 * time.Second); printHHH()}) - j, _ := s.Every(1).Seconds().Do(func() { printHHH()}) + j, _ := s.Every(1).Seconds().Do(func() { printHHH() }) // Executor:顾名思义,executor 只负责调用Scheduler(调度程序)发送时,Job(作业)交给它的任务(go 函数)。 fmt.Println(j.IsRunning()) @@ -50,7 +50,7 @@ func Test_Loop(t *testing.T) { func Test_IsRunning(t *testing.T) { s := gocron.NewScheduler(time.UTC) // Job:只知道它提供的任务(task, go函数),因此只能执行与该任务相关的操作,例如防止自己超出需要很长时间的先前任务。 - j, _ := s.Every(10).Seconds().Do(func() { time.Sleep(2 * time.Second); printHHH()}) + j, _ := s.Every(10).Seconds().Do(func() { time.Sleep(2 * time.Second); printHHH() }) // Executor:顾名思义,executor 只负责调用Scheduler(调度程序)发送时,Job(作业)交给它的任务(go 函数)。 fmt.Println(j.IsRunning()) @@ -71,6 +71,29 @@ func Test_IsRunning(t *testing.T) { var task = func() {} +func Test_Run1Time(t *testing.T) { + // 触发时间设置到五秒后 + timeRun := time.Now() + //dur := 5 * time.Second + //timeRun.Add(dur) + + // 设置触发事件 + s := gocron.NewScheduler(time.UTC) + _, _ = s.At(timeRun).Do(printHHH) + //go func() { + // for { + // fmt.Println("Run count", job.RunCount()) + // time.Sleep(time.Second) + // } + //}() + s.StartAsync() + + // 保活 + for true { + time.Sleep(10 * time.Second) + } +} + // // Test_RunCount // @Description: 测试job.RunCount() @@ -141,7 +164,7 @@ func Test_LimitRunsTo(t *testing.T) { func Test_ScheduleAtTimes(t *testing.T) { // 设置一个触发时间 s := gocron.NewScheduler(time.UTC) - job, _ := s.Every(1).Day().At("20:02").Do(func() {printHHH()}) + job, _ := s.Every(1).Day().At("20:02").Do(func() { printHHH() }) s.StartAsync() fmt.Println(job.ScheduledAtTime()) @@ -179,4 +202,4 @@ func Test_SingletonMode(t *testing.T) { time.Sleep(3 * time.Second) fmt.Println("Last run:", job.LastRun()) } -} \ No newline at end of file +} From 3d9202994fa93904a8b32517ad20227ed8beb601 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 19 May 2022 11:43:50 +0800 Subject: [PATCH 25/70] =?UTF-8?q?=E5=B0=81=E8=A3=85goCron=E8=B0=83?= =?UTF-8?q?=E5=BA=A6=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/Scheduler.go | 83 ++++++++++++++++++++++++++++++++++++++++++-- tests/goCron_test.go | 60 +++++++++++++++++++++++--------- 2 files changed, 125 insertions(+), 18 deletions(-) diff --git a/lsdb/Scheduler.go b/lsdb/Scheduler.go index 9773a2e..c693f1d 100644 --- a/lsdb/Scheduler.go +++ b/lsdb/Scheduler.go @@ -8,10 +8,89 @@ package lsdb +import ( + "errors" + "github.com/go-co-op/gocron" + "time" +) + // // Scheduler -// @Description: 调度器 +// @Description: 封装了goCron的调度器 // -type Scheduler struct { +type MlsrScheduler struct { + sche *gocron.Scheduler +} +// +// Init +// @Description: 调度器初始化 +// @receiver s +// +func (s *MlsrScheduler) Init() { + s.sche = gocron.NewScheduler(time.UTC) +} + +// +// ScheduleTaskAfterDuration +// @Description: 安排任务在一定时间后触发,触发一次 +// @receiver s +// @param dur 时间间隔 +// @param jobFun +// @param params +// @return error +// +func (s *MlsrScheduler) ScheduleTaskAfterDuration(dur time.Duration, + jobFun interface{}, params ...interface{}) error { + timeRun := time.Now() + timeRun = timeRun.Add(dur) + err := s.ScheduleRecurringTaskAtTime(timeRun, 100, 1, jobFun, params) + if err != nil { + return err + } + return nil +} + +// +// ScheduleTaskAtTime +// @Description: 安排任务在某个时间执行一次 +// @receiver s +// @param timeRun 执行时间 +// @param jobFun 任务 +// @param params 任务参数 +// @return error +// +func (s *MlsrScheduler) ScheduleTaskAtTime(timeRun time.Time, + jobFun interface{}, params ...interface{}) error { + err := s.ScheduleRecurringTaskAtTime(timeRun, 100, 1, jobFun, params) + if err != nil { + return err + } + return nil +} + +// +// ScheduleRecurringTaskAtTime +// @Description: 安排执行某次循环性任务 +// @receiver s +// @param timeRun 首次执行时间 +// @param intervalSeconds 执行间隔(单位:秒) +// @param num 执行次数 +// @param jobFun 要执行的任务 +// @param params 任务参数 +// +func (s *MlsrScheduler) ScheduleRecurringTaskAtTime(timeRun time.Time, intervalSeconds int, num int, + jobFun interface{}, params ...interface{}) error { + // 判断调度器是否还在正常运行 + if (s.sche == nil) || (!s.sche.IsRunning()) { + s.Init() + } + // 安排任务执行 + job, err := s.sche.Every(intervalSeconds).Seconds().StartAt(timeRun).Do(jobFun, params) + if err != nil { + return errors.New("ScheduleRecurringTaskAtTime error, " + err.Error()) + } + job.LimitRunsTo(num) + s.sche.StartAsync() + return nil } diff --git a/tests/goCron_test.go b/tests/goCron_test.go index df80a81..e8d66dc 100644 --- a/tests/goCron_test.go +++ b/tests/goCron_test.go @@ -19,6 +19,10 @@ func printHHH() { println("hello,gocron.", time.Now().String()) } +func printHHHWithPara(s string) { + println("hello,gocron.", time.Now().String(), s) +} + // // Test_Loop // @Description: 测试循环执行某个函数 @@ -67,6 +71,10 @@ func Test_IsRunning(t *testing.T) { time.Sleep(1 * time.Second) fmt.Println(j.IsRunning()) + + for true { + time.Sleep(1 * time.Second) + } } var task = func() {} @@ -74,24 +82,28 @@ var task = func() {} func Test_Run1Time(t *testing.T) { // 触发时间设置到五秒后 timeRun := time.Now() - //dur := 5 * time.Second - //timeRun.Add(dur) + fmt.Println("run time: ", timeRun) + + dur := 5 * time.Second + timeRun = timeRun.Add(dur) + + fmt.Println("run time: ", timeRun) // 设置触发事件 s := gocron.NewScheduler(time.UTC) - _, _ = s.At(timeRun).Do(printHHH) + _, _ = s.At(timeRun).Do(printHHHWithPara, "xixixi") //go func() { // for { // fmt.Println("Run count", job.RunCount()) // time.Sleep(time.Second) // } //}() - s.StartAsync() + s.StartBlocking() // 保活 - for true { - time.Sleep(10 * time.Second) - } + //for true { + // time.Sleep(10 * time.Second) + //} } // @@ -101,14 +113,14 @@ func Test_Run1Time(t *testing.T) { // func Test_RunCount(t *testing.T) { s := gocron.NewScheduler(time.UTC) - job, _ := s.Every(1).Second().Do(task) + job, _ := s.Every(1).Second().Do(printHHHWithPara, "xxx") go func() { for { fmt.Println("Run count", job.RunCount()) time.Sleep(time.Second) } }() - s.StartAsync() + s.StartBlocking() // 保活 for true { @@ -146,7 +158,7 @@ func Test_LastRun_NextRun(t *testing.T) { func Test_LimitRunsTo(t *testing.T) { s := gocron.NewScheduler(time.UTC) job, _ := s.Every(1).Second().Do(printHHH) - job.LimitRunsTo(2) + job.LimitRunsTo(1) s.StartAsync() // 保活 @@ -158,24 +170,32 @@ func Test_LimitRunsTo(t *testing.T) { // // Test_ScheduleAtTimes -// @Description: 设置事件在指定时间节点被触发 +// @Description: 设置事件在指定时间节点被触发 => 常见用法 // @param t // func Test_ScheduleAtTimes(t *testing.T) { + // 触发时间设定在五秒后 + timeRun := time.Now() + fmt.Println("预定时间(假性):", timeRun) + dur := 4 * time.Second + timeRun = timeRun.Add(dur) + fmt.Println("预定时间:", timeRun) + // 设置一个触发时间 s := gocron.NewScheduler(time.UTC) - job, _ := s.Every(1).Day().At("20:02").Do(func() { printHHH() }) + job, _ := s.Every(100).Seconds().StartAt(timeRun).Do(printHHHWithPara, "heiheihei") + job.LimitRunsTo(3) s.StartAsync() - fmt.Println(job.ScheduledAtTime()) + fmt.Println("预定触发时间: ", job.ScheduledAtTime()) // 设置多个触发时间。当取时间时,返回最早的那个 - job1, _ := s.Every(1).Day().At("10:30;08:00").Do(task) - fmt.Println(job1.ScheduledAtTime()) + //job1, _ := s.Every(1).Day().At("10:30;08:00").Do(task) + //fmt.Println(job1.ScheduledAtTime()) // Output: // 10:30 // 8:0 // 当取所有时间时,返回一个时间列表 - fmt.Println(job1.ScheduledAtTimes()) + //fmt.Println(job1.ScheduledAtTimes()) // Output: // [8:0 10:30] @@ -203,3 +223,11 @@ func Test_SingletonMode(t *testing.T) { fmt.Println("Last run:", job.LastRun()) } } + +func Test_Running(t *testing.T) { + var s *gocron.Scheduler + if (s == nil) || (!s.IsRunning()) { + fmt.Println("hahhaha") + } + fmt.Println(s == nil) +} From 055e992766ece0520e56bcff1fbabe2c211a756c Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 19 May 2022 11:52:24 +0800 Subject: [PATCH 26/70] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E8=A1=A8=E4=B8=AD=E5=AF=B9=E4=BA=8E=E5=B0=9A=E6=9C=AA=E8=AE=A1?= =?UTF-8?q?=E5=88=92=E8=AE=A1=E7=AE=97=E4=BA=8B=E4=BB=B6=E7=9A=84=E5=A4=84?= =?UTF-8?q?=E7=90=86ScheduleRoutingTableCalculation?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/RoutingTable.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/route/RoutingTable.go b/route/RoutingTable.go index aacee96..75d908d 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -26,11 +26,13 @@ type RoutingTable struct { lsdb *lsdb.Lsdb // 配置参数 mlsrConfig *common.MlsrConfig + // 任务调度器 + scheduler *lsdb.MlsrScheduler // 路由条目列表 rTable []*RoutingTableEntry // 路由计算间隔时间 - m_routingCalcInterval *time.Duration + m_routingCalcInterval time.Duration // 路由表是否正在计算 m_isRoutingTableCalculating bool // 是否已经安排了路由计算 @@ -42,6 +44,12 @@ type RoutingTable struct { m_hyperbolicState uint32 } +func (t *RoutingTable) Init() { + // 初始化任务调度器 + t.scheduler = new(lsdb.MlsrScheduler) + t.scheduler.Init() +} + // // Calculate // @Description: 计算网络中每个路由器的下一个跃点列表。 @@ -85,10 +93,16 @@ func (t *RoutingTable) FindRoutingTableEntry(destRouter *component.Identifier) * // @Description: 仅当尚未计划计算事件时,才在事件计划程序中计划计算事件。 // @receiver t // -func (t *RoutingTable) ScheduleRoutingTableCalculation() { +func (t *RoutingTable) ScheduleRoutingTableCalculation() error { if !t.m_isRouteCalculationScheduled { - + common2.LogFatal("Scheduling routing table calculation in ", t.m_routingCalcInterval) + err := t.scheduler.ScheduleTaskAfterDuration(t.m_routingCalcInterval, t.Calculate) + if err != nil { + return err + } + t.m_isRouteCalculationScheduled = true } + return nil } // From 63cfa67b5013d32d6fefbf0219479dd8cc25170b Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 19 May 2022 15:47:47 +0800 Subject: [PATCH 27/70] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E8=A1=A8=E6=9F=A5=E8=A1=A8=E9=A1=B9=E3=80=81?= =?UTF-8?q?=E6=B8=85=E7=A9=BA=E8=A1=A8=E9=A1=B9=E7=AD=89=E5=87=A0=E4=B8=AA?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/Lsdb.go | 61 +++++++++++++++++++------------------- route/RoutingTable.go | 36 +++++++++++++++++++--- route/RoutingTableEntry.go | 30 +++++++++---------- 3 files changed, 77 insertions(+), 50 deletions(-) diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index 8542a62..b71e65d 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -21,9 +21,9 @@ import ( // Lsdb更新状态 const ( - INSTALLED = 0 // 已安装 - UPDATED = 1 // 已更新 - REMOVED = -1 // 已移除 + INSTALLED = 0 // 已安装 + UPDATED = 1 // 已更新 + REMOVED = -1 // 已移除 ) type Lsdb struct { @@ -36,22 +36,22 @@ type Lsdb struct { // LSA容器 LsaContainer.LsaContainer - lsaRefreshTime *time.Duration // lsa刷新时间 - adjLsaBuildInterval *time.Duration // 邻接LSA构建间隔 - thisRouterPrefix *component.Identifier // 当前路由器的标识 + lsaRefreshTime *time.Duration // lsa刷新时间 + adjLsaBuildInterval *time.Duration // 邻接LSA构建间隔 + thisRouterPrefix *component.Identifier // 当前路由器的标识 // 任务调度器 - scheduler *Scheduler + scheduler *MlsrScheduler // 将LSA的名称从sync映射到其已知的最高序列号; // 用于阻止MLSR尝试获取过时的LSA - highestSeqNo map[*component.Identifier] uint64 + highestSeqNo map[*component.Identifier]uint64 // 不同类型lsa的序列号管理器 sequencingManager *SequencingManager - isBuildAdjLsaScheduled bool // 是否安排构建邻接LSA - adjBuildCount uint64 // 邻接LSA的构建的统计数目 + isBuildAdjLsaScheduled bool // 是否安排构建邻接LSA + adjBuildCount uint64 // 邻接LSA的构建的统计数目 } // @@ -62,7 +62,7 @@ type Lsdb struct { // @param lsaType // @return bool // -func (l *Lsdb) DoesLsaExist(routerIdentifier *component.Identifier,lsaType int) bool { +func (l *Lsdb) DoesLsaExist(routerIdentifier *component.Identifier, lsaType int) bool { panic("implement me") } @@ -88,7 +88,7 @@ func (l *Lsdb) BuildAndInstallOwnCoordinateLsa() { // @Description: 安排LSA的构建 // @receiver l // -func (l *Lsdb) ScheduleAdjLsaBuild() { +func (l *Lsdb) ScheduleAdjLsaBuild() { } // @@ -102,10 +102,10 @@ func (l *Lsdb) ScheduleAdjLsaBuild() { // @receiver l // @param interest // -func (l *Lsdb) ProcessInterest(interest *packet.Interest) { +func (l *Lsdb) ProcessInterest(interest *packet.Interest) { } -func (l *Lsdb) ProcessGPPkt(pkt *packet.GPPkt) { +func (l *Lsdb) ProcessGPPkt(pkt *packet.GPPkt) { } // @@ -152,22 +152,22 @@ func (l *Lsdb) FindLsa(routerIdentifier *component.Identifier, // @return bool // func (l *Lsdb) IsLsaNew(routerIdentifier *component.Identifier, - lsaType lsa.LsaType,seqNo uint64) bool { - lsa := l.FindLsa(routerIdentifier,lsaType) - if lsa.GetSeqNo() >= seqNo{ + lsaType lsa.LsaType, seqNo uint64) bool { + lsa := l.FindLsa(routerIdentifier, lsaType) + if lsa.GetSeqNo() >= seqNo { return false } return true } -func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { +func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { } -func (l* Lsdb) RemoveLsa(routerIdentifier *component.Identifier, +func (l *Lsdb) RemoveLsa(routerIdentifier *component.Identifier, lsaType lsa.LsaType) { } -func (l* Lsdb) RemoveLsaByContainerIndex(index int) { +func (l *Lsdb) RemoveLsaByContainerIndex(index int) { } // @@ -176,7 +176,7 @@ func (l* Lsdb) RemoveLsaByContainerIndex(index int) { // 只有当路由器的所有邻居状态是已知的时,才可以构建它的邻接LSA。 // @receiver l // -func (l *Lsdb) BuildAdjLsa() { +func (l *Lsdb) BuildAdjLsa() { } // @@ -184,7 +184,7 @@ func (l *Lsdb) BuildAdjLsa() { // @Description: 为当前路由器构建并安装一个邻接LSA // @receiver l // -func (l *Lsdb) BuildAndInstallOwnAdjLsa() { +func (l *Lsdb) BuildAndInstallOwnAdjLsa() { } // @@ -192,19 +192,19 @@ func (l *Lsdb) BuildAndInstallOwnAdjLsa() { // @Description: 在调度器中安排一个刷新或过期事件 // @receiver l // -func (l *Lsdb) ScheduleLsaExpiration(lsa lsa.ILsa,duration *time.Duration) { +func (l *Lsdb) ScheduleLsaExpiration(lsa lsa.ILsa, duration *time.Duration) { } -func (l* Lsdb) ExpireOrRefreshLsa(lsa lsa.ILsa) { +func (l *Lsdb) ExpireOrRefreshLsa(lsa lsa.ILsa) { } func (l *Lsdb) ProcessInterestForLsa(interest *packet.Interest, - originRouterIdentifier *component.Identifier,lsaType lsa.LsaType,seqNo uint64) { + originRouterIdentifier *component.Identifier, lsaType lsa.LsaType, seqNo uint64) { } func (l *Lsdb) ExpressInterest(interestName *component.Identifier, - timeOut uint32,deadline *time.Time) { + timeOut uint32, deadline *time.Time) { } // @@ -219,9 +219,9 @@ func (l *Lsdb) ExpressInterest(interestName *component.Identifier, // @param lsaName // @param seqNo // -func (l *Lsdb) OnFetchLsaError(errorCode uint32,msg string, - interestName *component.Identifier,retransmitNo uint32, - deadline *time.Time,lsaName *component.Identifier,seqNo uint64) { +func (l *Lsdb) OnFetchLsaError(errorCode uint32, msg string, + interestName *component.Identifier, retransmitNo uint32, + deadline *time.Time, lsaName *component.Identifier, seqNo uint64) { } // @@ -233,11 +233,10 @@ func (l *Lsdb) OnFetchLsaError(errorCode uint32,msg string, // @param buffer // @param interestName // -func (l *Lsdb) AfterFetchLsa(buffer bytes.Buffer,interestName *component.Identifier) { +func (l *Lsdb) AfterFetchLsa(buffer bytes.Buffer, interestName *component.Identifier) { } func (l *Lsdb) getLsaExpirationTimePoint() time.Time { // todo return time.Time{} } - diff --git a/route/RoutingTable.go b/route/RoutingTable.go index 75d908d..d458d9b 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -68,7 +68,10 @@ func (t *RoutingTable) Calculate() { t.m_isRoutingTableCalculating = false } else { // 安排指定时间之后执行一个路由计算 - t.ScheduleRoutingTableCalculation() + err := t.ScheduleRoutingTableCalculation() + if err != nil { + common2.LogFatal("Calculate error,Schedule RoutingTableCalculation error, ", err) + } } } @@ -80,11 +83,36 @@ func (t *RoutingTable) Calculate() { // @param hop 要添加到RTE的下一个跃点。 // func (t *RoutingTable) AddNextHop(destRouter *component.Identifier, hop *NextHop) { + common2.LogInfo("Adding " + hop.LogicFaceUri() + " for destination " + destRouter.ToUri()) + // 查找路由表项 + rte := t.FindRoutingTableEntry(destRouter) + // 如果没有这条表项,则构建并加入 + if rte == nil { + rte = new(RoutingTableEntry) + rte.AddNextHop(hop) + t.rTable = append(t.rTable, rte) + } else { + // 如果有,则直接编辑该条目,增加一个下一跳. + // todo: 这块需要测试,是否在go中可以直接根据引用进行表项的修改 + rte.AddNextHop(hop) + } } +// +// FindRoutingTableEntry +// @Description: 根据某个目的路由器,查找对应的路由表项 +// @receiver t +// @param destRouter +// @return *RoutingTableEntry +// func (t *RoutingTable) FindRoutingTableEntry(destRouter *component.Identifier) *RoutingTableEntry { - //todo + uri := destRouter.ToUri() + for i := 0; i < len(t.rTable); i++ { + if t.rTable[i].GetDestination().ToUri() == uri { + return t.rTable[i] + } + } return nil } @@ -95,7 +123,7 @@ func (t *RoutingTable) FindRoutingTableEntry(destRouter *component.Identifier) * // func (t *RoutingTable) ScheduleRoutingTableCalculation() error { if !t.m_isRouteCalculationScheduled { - common2.LogFatal("Scheduling routing table calculation in ", t.m_routingCalcInterval) + common2.LogInfo("Scheduling routing table calculation in ", t.m_routingCalcInterval) err := t.scheduler.ScheduleTaskAfterDuration(t.m_routingCalcInterval, t.Calculate) if err != nil { return err @@ -157,7 +185,7 @@ func (t *RoutingTable) calculateLsRoutingTable() { // @receiver t // func (t *RoutingTable) clearRoutingTable() { - + t.rTable = []*RoutingTableEntry{} } // diff --git a/route/RoutingTableEntry.go b/route/RoutingTableEntry.go index 67de72c..ddc8eb3 100644 --- a/route/RoutingTableEntry.go +++ b/route/RoutingTableEntry.go @@ -30,11 +30,11 @@ type RoutingTableEntry struct { // @return *RoutingTableEntry // @return error // -func NewRoutingTableEntry(dest *component.Identifier) (*RoutingTableEntry,error) { +func NewRoutingTableEntry(dest *component.Identifier) (*RoutingTableEntry, error) { // todo: 判断dest是否格式有效 rte := new(RoutingTableEntry) - rte.m_destination=dest - return rte,nil + rte.m_destination = dest + return rte, nil } // @@ -43,7 +43,7 @@ func NewRoutingTableEntry(dest *component.Identifier) (*RoutingTableEntry,error) // @receiver e // @return *component.Identifier // -func (e *RoutingTableEntry) GetDestination(dest *component.Identifier) *component.Identifier { +func (e *RoutingTableEntry) GetDestination() *component.Identifier { return e.m_destination } @@ -54,7 +54,7 @@ func (e *RoutingTableEntry) GetDestination(dest *component.Identifier) *componen // @param dest // func (e *RoutingTableEntry) SetDestination(dest *component.Identifier) { - e.m_destination=dest + e.m_destination = dest } // @@ -65,22 +65,22 @@ func (e *RoutingTableEntry) SetDestination(dest *component.Identifier) { // @return int // @return error // -func (e *RoutingTableEntry) WireEncode(encoder *encoding.Encoder) (int,error) { +func (e *RoutingTableEntry) WireEncode(encoder *encoding.Encoder) (int, error) { totalLength := 0 // TLV-Value - tmpLen,err := e.NextHopList.WireEncode(encoder) + tmpLen, err := e.NextHopList.WireEncode(encoder) if err != nil { return 0, err } totalLength += tmpLen - tmpLen,err = e.m_destination.WireEncode(encoder) + tmpLen, err = e.m_destination.WireEncode(encoder) if err != nil { return 0, err } totalLength += tmpLen // TLV-Length - tmpLen,err = encoder.PrependVarNumber(encoding.VlInt(totalLength)) + tmpLen, err = encoder.PrependVarNumber(encoding.VlInt(totalLength)) if err != nil { return 0, err } @@ -93,7 +93,7 @@ func (e *RoutingTableEntry) WireEncode(encoder *encoding.Encoder) (int,error) { } totalLength += tmpLen - return totalLength,nil + return totalLength, nil } // @@ -115,19 +115,19 @@ func (e *RoutingTableEntry) WireDecode(block *encoding.Block) error { } // 提取参数 - for _, parameter := range block.GetSubElements(){ + for _, parameter := range block.GetSubElements() { switch parameter.GetType() { case encoding.TlvIdentifier: - iden:=component.Identifier{} - if err:= iden.WireDecode(parameter); err != nil { + iden := component.Identifier{} + if err := iden.WireDecode(parameter); err != nil { return err } e.m_destination = &iden case extensions.TlvMlsrNextHopList: - if err:= e.NextHopList.WireDecode(parameter); err != nil { + if err := e.NextHopList.WireDecode(parameter); err != nil { return err } } } return nil -} \ No newline at end of file +} From f37bcf46566d446490a666d05fdf82f51bd40f3c Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 19 May 2022 15:55:21 +0800 Subject: [PATCH 28/70] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E9=83=A8=E5=88=86=E5=86=85=E5=AD=98=E9=87=8A?= =?UTF-8?q?=E6=94=BE=E7=9A=84=E5=87=BD=E6=95=B0=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LinkStateRoutingTableCalculator.go | 92 +++++++++---------- route/Calculator/RoutingTableCalculator.go | 6 +- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/route/Calculator/LinkStateRoutingTableCalculator.go b/route/Calculator/LinkStateRoutingTableCalculator.go index a8f9198..da3fe49 100644 --- a/route/Calculator/LinkStateRoutingTableCalculator.go +++ b/route/Calculator/LinkStateRoutingTableCalculator.go @@ -34,11 +34,11 @@ type LinkStateRoutingTableCalculator struct { // 一些在最短路径计算时会用到的常量 const ( - EMPTY_PARENT = -12345 // 没有父节点 -12345 - INF_DISTANCE = math.MaxUint64 // 无限距离 2147483647 - NO_MAPPING_NUM = -1 // 没有映射的点 -1 + EMPTY_PARENT = -12345 // 没有父节点 -12345 + INF_DISTANCE = math.MaxUint64 // 无限距离 2147483647 + NO_MAPPING_NUM = -1 // 没有映射的点 -1 // 公用常量 - NO_NEXT_HOP = -12345 // 没有下一跳 -12345 + NO_NEXT_HOP = -12345 // 没有下一跳 -12345 ) // @@ -51,23 +51,23 @@ const ( // @param lsdb // func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, - rTable *route.RoutingTable,mConfig *common.MlsrConfig,lsdb *lsdb.Lsdb) error { + rTable *route.RoutingTable, mConfig *common.MlsrConfig, lsdb *lsdb.Lsdb) error { c.allocateAdjMatrix() c.initMatrix() _ = c.makeAdjMatrix(lsdb, routerMap) // 从配置文件中获取源路由器前缀,并根据routerMap获取其映射号 - sourceRouter,b := routerMap.GetMappingNoByRouterName(mConfig.GetRouterPrefix()) + sourceRouter, b := routerMap.GetMappingNoByRouterName(mConfig.GetRouterPrefix()) if !b { return errors.New("no found the source route in the router map, " + - "the source router prefix is: "+mConfig.GetRouterPrefix().ToUri()) + "the source router prefix is: " + mConfig.GetRouterPrefix().ToUri()) } // 判断是单路径计算,还是多路径计算 - if mConfig.GetMaxFacesPerPrefix()==1 { + if mConfig.GetMaxFacesPerPrefix() == 1 { // 在单路径的情况下,我们可以简单地运行Dijkstra算法。 c.doDijkstraPathCalculation(sourceRouter) // 将新的下一跳通知路由表。// todo: 注意,当前版本中,本机的邻接信息是从配置文件中读取出来的。 - c.addAllLsNextHopsToRoutingTable(mConfig.GetAdjacencyList(),rTable,routerMap,sourceRouter) - }else { + c.addAllLsNextHopsToRoutingTable(mConfig.GetAdjacencyList(), rTable, routerMap, sourceRouter) + } else { // 多路径计算 // 1. 先确定源路由器的邻居路由器数目 c.setNoLink(c.getNumOfLinkfromAdjMatrix(sourceRouter)) @@ -75,14 +75,14 @@ func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, c.allocateLinkCosts() // 2. 获取用于路径计算的稀疏邻接列表。具体操作是填充:c.links,c.linkCosts c.getLinksFromAdjMatrix(sourceRouter) - // + // for i := 0; i < c.vNoLink; i++ { // 模拟只有当前邻居i可以访问的情形。即:砍掉除当前邻居路由器外的其他邻接链路 - c.adjustAdMatrix(sourceRouter,c.links[i],c.linkCosts[i]) + c.adjustAdMatrix(sourceRouter, c.links[i], c.linkCosts[i]) // 以当前邻居为起点,执行Dijkstra算法。 c.doDijkstraPathCalculation(sourceRouter) // 用计算结果更新路由表。 - c.addAllLsNextHopsToRoutingTable(mConfig.GetAdjacencyList(),rTable,routerMap,sourceRouter) + c.addAllLsNextHopsToRoutingTable(mConfig.GetAdjacencyList(), rTable, routerMap, sourceRouter) } c.freeLinks() c.freeLinksCosts() @@ -100,12 +100,12 @@ func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, // @receiver c // @param sourceRouter // -func (c *LinkStateRoutingTableCalculator) doDijkstraPathCalculation(sourceRouter int) { +func (c *LinkStateRoutingTableCalculator) doDijkstraPathCalculation(sourceRouter int) { // 尚未加入左集的最近元素(Q中右集最小元素) var u int // 每个单元代表具有该映射号的路由器。 // Q是queue首字母,它按升序存储所有路由器 - Q := make([]int,c.m_nRouters) + Q := make([]int, c.m_nRouters) // 尚未加入左集的最近元素在Q中的索引值 head := 0 // 初始化parent @@ -117,11 +117,11 @@ func (c *LinkStateRoutingTableCalculator) doDijkstraPathCalculation(sourceRouter // 路由器队列初始化为按映射号排列 Q[i] = i } - if sourceRouter != NO_MAPPING_NUM{ + if sourceRouter != NO_MAPPING_NUM { // 源路由器到其本身的距离为0 c.m_distance[sourceRouter] = 0 // 排序完毕,Q中第一个节点必然为源路由器 - c.sortQueueByDistance(Q,c.m_distance,head,c.m_nRouters) + c.sortQueueByDistance(Q, c.m_distance, head, c.m_nRouters) // 当我们没有访问完每一个节点时,执行循环 for head < c.m_nRouters { // 将u设置为head当前指向的节点。“u,你就是天选之子!” @@ -133,24 +133,24 @@ func (c *LinkStateRoutingTableCalculator) doDijkstraPathCalculation(sourceRouter // 对u的相邻节点进行迭代遍历。“朕要以你为衡,重设天下!” for v := 0; v < c.m_nRouters; v++ { // 如果u->v是可达的, - if c.adjMatrix[u][v] != route.NON_ADJACENT_COST{ + if c.adjMatrix[u][v] != route.NON_ADJACENT_COST { // 而且我们还没有访问过v,即v属于右集, - if c.isNotExplored(Q,v,head+1,c.m_nRouters){ + if c.isNotExplored(Q, v, head+1, c.m_nRouters) { // 如果到这个节点的距离+从这个节点到v的距离, // 小于我们在构建adj LSA时得到的从源节点到v的距离, // 就更新为新距离【算法中的松弛操作】 if c.m_distance[u]+c.adjMatrix[u][v] < c.m_distance[v] { // 设置新距离 - c.m_distance[v]=c.m_distance[u]+c.adjMatrix[u][v] + c.m_distance[v] = c.m_distance[u] + c.adjMatrix[u][v] // 设置parent,即我们如何到达v的 - c.m_parent[v]=u + c.m_parent[v] = u } } } } // 右移head位置,从我们所在的位置按距离重新排序列表。"苍天已死,黄天当立!" head++ - c.sortQueueByDistance(Q,c.m_distance,head,c.m_nRouters) + c.sortQueueByDistance(Q, c.m_distance, head, c.m_nRouters) } } } @@ -165,10 +165,10 @@ func (c *LinkStateRoutingTableCalculator) doDijkstraPathCalculation(sourceRouter // @param element 列表元素数目 // func (c *LinkStateRoutingTableCalculator) sortQueueByDistance( - Q []int,dist []uint64,start int,element int) { + Q []int, dist []uint64, start int, element int) { for i := start; i < element; i++ { - for j := i+1; j < element; j++ { - if dist[Q[j]] < dist[Q[i]]{ + for j := i + 1; j < element; j++ { + if dist[Q[j]] < dist[Q[i]] { temp := Q[j] Q[j] = Q[i] Q[i] = temp @@ -187,9 +187,9 @@ func (c *LinkStateRoutingTableCalculator) sortQueueByDistance( // @param element 列表元素数 // func (c *LinkStateRoutingTableCalculator) isNotExplored( - Q []int,u int,start int,element int) bool { + Q []int, u int, start int, element int) bool { for i := start; i < element; i++ { - if Q[i]==u { + if Q[i] == u { return true } } @@ -197,23 +197,23 @@ func (c *LinkStateRoutingTableCalculator) isNotExplored( } func (c *LinkStateRoutingTableCalculator) addAllLsNextHopsToRoutingTable( - adjs *lsa.AdjLsaAdjacenctList,rTable *route.RoutingTable, - rMap *RouterMap,sourceRouter int) { + adjs *lsa.AdjLsaAdjacenctList, rTable *route.RoutingTable, + rMap *RouterMap, sourceRouter int) { // 对于我们有的每个路由器 for i := 0; i < c.m_nRouters; i++ { - if i!= sourceRouter{ + if i != sourceRouter { // 获取算法确定的下一跳 - nextHopRouter:=c.getLsNextHop(i,sourceRouter) + nextHopRouter := c.getLsNextHop(i, sourceRouter) // 需要该路由器不至于没有对应的下一跳 - if nextHopRouter!= NO_NEXT_HOP{ + if nextHopRouter != NO_NEXT_HOP { // 获取链路开销 routeCost := c.m_distance[i] // 根据map获取该路由器的真实名称 - nextHopRouterName,b := rMap.GetRouterNameByMappingNo(nextHopRouter) - if b{ + nextHopRouterName, b := rMap.GetRouterNameByMappingNo(nextHopRouter) + if b { // 根据本地邻接LSA列表,获取该下一跳路由器所对应的faceuri nextHopFace := adjs.FindAdjacencyByRouterIdentifier(nextHopRouterName) - if nextHopFace == nil{ + if nextHopFace == nil { continue } // 将下一跳加入路由表 @@ -234,14 +234,14 @@ func (c *LinkStateRoutingTableCalculator) addAllLsNextHopsToRoutingTable( // @param dest 想要确定的目的路由器 // @param source 源路由器 // -func (c *LinkStateRoutingTableCalculator) getLsNextHop(dest int,source int) int { +func (c *LinkStateRoutingTableCalculator) getLsNextHop(dest int, source int) int { nextHop := NO_NEXT_HOP // source的父节点是空节点,故遍历到source或某个断点,就停止循环 for c.m_parent[dest] != EMPTY_PARENT { nextHop = dest dest = c.m_parent[dest] } - if dest != source{ + if dest != source { nextHop = NO_NEXT_HOP } return nextHop @@ -252,8 +252,8 @@ func (c *LinkStateRoutingTableCalculator) getLsNextHop(dest int,source int) int // @Description: 分配内存 // @receiver c // -func (c *LinkStateRoutingTableCalculator) allocateParent() { - c.m_parent = make([]int,c.m_nRouters) +func (c *LinkStateRoutingTableCalculator) allocateParent() { + c.m_parent = make([]int, c.m_nRouters) } // @@ -261,8 +261,8 @@ func (c *LinkStateRoutingTableCalculator) allocateParent() { // @Description: 分配内存 // @receiver c // -func (c *LinkStateRoutingTableCalculator) allocateDistance() { - c.m_distance = make([]uint64,c.m_nRouters) +func (c *LinkStateRoutingTableCalculator) allocateDistance() { + c.m_distance = make([]uint64, c.m_nRouters) } // @@ -270,8 +270,8 @@ func (c *LinkStateRoutingTableCalculator) allocateDistance() { // @Description: 释放内存 // @receiver c // -func (c *LinkStateRoutingTableCalculator) freeParent() { - // 依靠golang的gc机制 +func (c *LinkStateRoutingTableCalculator) freeParent() { + c.m_parent = []int{} } // @@ -279,6 +279,6 @@ func (c *LinkStateRoutingTableCalculator) freeParent() { // @Description: 释放内存 // @receiver c // -func (c *LinkStateRoutingTableCalculator) freeDistance() { - // 依靠golang的gc机制 -} \ No newline at end of file +func (c *LinkStateRoutingTableCalculator) freeDistance() { + c.m_distance = []uint64{} +} diff --git a/route/Calculator/RoutingTableCalculator.go b/route/Calculator/RoutingTableCalculator.go index 15ad3d5..6c23fde 100644 --- a/route/Calculator/RoutingTableCalculator.go +++ b/route/Calculator/RoutingTableCalculator.go @@ -145,7 +145,7 @@ func (c *RoutingTableCalculator) getNumOfLinkfromAdjMatrix(sRouter int) int { // @receiver c // func (c *RoutingTableCalculator) freeAdjMatrix() { - // todo 寄托于golang自己的GC机制 + c.adjMatrix = [][]uint64{} } // @@ -212,7 +212,7 @@ func (c *RoutingTableCalculator) allocateLinkCosts() { // @receiver c // func (c *RoutingTableCalculator) freeLinks() { - // todo 寄托于golang自己的GC机制 + c.links = []int{} } // @@ -221,7 +221,7 @@ func (c *RoutingTableCalculator) freeLinks() { // @receiver c // func (c *RoutingTableCalculator) freeLinksCosts() { - // todo 寄托于golang自己的GC机制 + c.linkCosts = []uint64{} } // From 748e85c4de826cfad9e1a5298c6ec355b7b7a102 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 19 May 2022 17:42:17 +0800 Subject: [PATCH 29/70] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8F=B7=E7=AE=A1=E7=90=86=E5=99=A8=E7=9A=84=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E8=AF=BB=E5=BA=8F=E5=88=97=E5=8F=B7=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/Lsdb.go | 13 +++- lsdb/SequencingManager.go | 115 ++++++++++++++++++++++++--------- lsdb/SequencingManager_test.go | 16 +++++ utils/FileUtils.go | 90 ++++++++++++++++++++++++++ 4 files changed, 200 insertions(+), 34 deletions(-) create mode 100644 lsdb/SequencingManager_test.go create mode 100644 utils/FileUtils.go diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index b71e65d..b98575f 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -36,8 +36,8 @@ type Lsdb struct { // LSA容器 LsaContainer.LsaContainer - lsaRefreshTime *time.Duration // lsa刷新时间 - adjLsaBuildInterval *time.Duration // 邻接LSA构建间隔 + lsaRefreshTime time.Duration // lsa刷新时间 + adjLsaBuildInterval time.Duration // 邻接LSA构建间隔 thisRouterPrefix *component.Identifier // 当前路由器的标识 // 任务调度器 @@ -54,6 +54,15 @@ type Lsdb struct { adjBuildCount uint64 // 邻接LSA的构建的统计数目 } +func (l *Lsdb) Init(mc *common.MlsrConfig, ms *MlsrScheduler) { + // 配置项 + l.mlsrConfig = mc + // 调度器 + l.scheduler = ms + // 序列号管理器 + //l.sequencingManager = GetInstance() +} + // // DoesLsaExist // @Description: 返回LSDB是否存在某些LSA的查询结果 diff --git a/lsdb/SequencingManager.go b/lsdb/SequencingManager.go index 35319d3..2981244 100644 --- a/lsdb/SequencingManager.go +++ b/lsdb/SequencingManager.go @@ -10,21 +10,25 @@ package lsdb import ( "errors" - "minlib/common" + common2 "minlib/common" "mlsr/lsa" + "mlsr/utils" + "os" + "path" "strconv" + "strings" "sync" ) -var once sync.Once // 用以保证SequencingManager的使用是单例模式 -var instance *SequencingManager // 单例模式的序列号管理器 +var once sync.Once // 用以保证SequencingManager的使用是单例模式 +var instance *SequencingManager // 单例模式的序列号管理器 var seqFileName string = "mlsrSeqNo.txt" // 保存序列号的文件名 type SequencingManager struct { - adjLsaSeq uint64 - nameLsaSeq uint64 - corLsaSeq uint64 + adjLsaSeq uint64 + nameLsaSeq uint64 + corLsaSeq uint64 seqFileNameWithPath string } @@ -34,15 +38,19 @@ type SequencingManager struct { // @param filePath 序列号同步到本地文件的文件位置 // @return *SequencingManager // -func GetInstance(filePath string) *SequencingManager { +func GetInstance() *SequencingManager { once.Do(func() { - homePath, err := common.Home() + homePath, err := common2.Home() if err != nil { - common.LogFatal("Get current user home path failed!") + common2.LogFatal("Get current user home path failed!") } - instance = &SequencingManager{0,0,0, - homePath+"/"+seqFileName} - _ = instance.SetSeqFileDirectory(filePath) + // 生成序列号管理器文件路径,并日志记录下来 + filePath := path.Join(homePath, seqFileName) + common2.LogInfo("SequencingManager file path is " + filePath) + // 从文件中初始化该序列号管理器 + instance = &SequencingManager{0, 0, 0, + filePath} + _ = instance.setSeqFileDirectory(filePath) instance.InitiateSeqNoFromFile() }) return instance @@ -55,8 +63,8 @@ func GetInstance(filePath string) *SequencingManager { // @receiver s // @param filePath // -func (s *SequencingManager) SetSeqFileDirectory(filePath string) error { - //todo +func (s *SequencingManager) setSeqFileDirectory(filePath string) error { + s.seqFileNameWithPath = filePath return nil } @@ -65,7 +73,50 @@ func (s *SequencingManager) SetSeqFileDirectory(filePath string) error { // @Description: todo:从文件中初始化各种类型lsa的seq // @receiver s // -func (s *SequencingManager) InitiateSeqNoFromFile() { +func (s *SequencingManager) InitiateSeqNoFromFile() { + // 先判断文件是否存在,不存在,则初始化文件 + fileInfo, b := utils.IsExists(s.seqFileNameWithPath) + common2.LogInfo("seq file info is " + fileInfo.Name()) + if !b { + common2.LogFatal("sequencingManager File not exists, fileinfo is ", fileInfo) + homePath, err := common2.Home() + if err != nil { + common2.LogFatal("Get current user home path failed!") + } + // 生成序列号管理器文件,并日志记录下来 + filePath := path.Join(homePath, seqFileName) + _ = instance.setSeqFileDirectory(filePath) + _, err = os.Create(filePath) + if err != nil { + common2.LogFatal("create file failed![%v]\n", err) + } else { + common2.LogInfo("create sequencingManager file path successed, the path is" + filePath) + } + // 将序列号写入文件 + utils.WriteFile(filePath, "0 0 0") // 依次表示:邻接LSA序列号、名称LSA序列号、双曲LSA序列号 + } + // 并读取数据 + seqs, err := utils.ReadFromFile(s.seqFileNameWithPath) + if err != nil { + common2.LogFatal("read seqs from " + s.seqFileNameWithPath + " failed.") + return + } + // 读取邻接 + seqsArray := strings.Fields(seqs) + s.adjLsaSeq, err = strconv.ParseUint(seqsArray[0], 10, 64) + if err != nil { + common2.LogFatal("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) + } + // 读取名称 + s.nameLsaSeq, err = strconv.ParseUint(seqsArray[1], 10, 64) + if err != nil { + common2.LogFatal("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) + } + // 读取双曲 + s.corLsaSeq, err = strconv.ParseUint(seqsArray[2], 10, 64) + if err != nil { + common2.LogFatal("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) + } } // @@ -73,7 +124,7 @@ func (s *SequencingManager) InitiateSeqNoFromFile() { // @Description: todo:将当前seq写入文件 // @receiver s // -func (s SequencingManager) WriteSeqNoToFile() { +func (s SequencingManager) WriteSeqNoToFile() { } // @@ -83,14 +134,14 @@ func (s SequencingManager) WriteSeqNoToFile() { // @param seqNo // @param lsaType // -func (s *SequencingManager) SetLsaSeq(seqNo uint64,lsaType lsa.LsaType) { +func (s *SequencingManager) SetLsaSeq(seqNo uint64, lsaType lsa.LsaType) { switch lsaType { case lsa.LsaADJACENCYType: - s.adjLsaSeq=seqNo + s.adjLsaSeq = seqNo case lsa.LsaNAMEType: - s.nameLsaSeq=seqNo + s.nameLsaSeq = seqNo case lsa.LsaCOORDINATEType: - s.corLsaSeq=seqNo + s.corLsaSeq = seqNo } } @@ -102,16 +153,16 @@ func (s *SequencingManager) SetLsaSeq(seqNo uint64,lsaType lsa.LsaType) { // @return uint64 // @return error // -func (s *SequencingManager) GetLsaSeq(lsaType lsa.LsaType) (uint64,error) { +func (s *SequencingManager) GetLsaSeq(lsaType lsa.LsaType) (uint64, error) { switch lsaType { case lsa.LsaADJACENCYType: - return s.adjLsaSeq,nil + return s.adjLsaSeq, nil case lsa.LsaNAMEType: - return s.nameLsaSeq,nil + return s.nameLsaSeq, nil case lsa.LsaCOORDINATEType: - return s.corLsaSeq,nil + return s.corLsaSeq, nil } - return 0,errors.New("no found the lsaType: "+ strconv.Itoa(int(lsaType))) + return 0, errors.New("no found the lsaType: " + strconv.Itoa(int(lsaType))) } // @@ -131,7 +182,7 @@ func (s *SequencingManager) GetAdjLsaSeq() uint64 { // @param seq // func (s *SequencingManager) SetAdjLsaSeq(seq uint64) { - s.adjLsaSeq=seq + s.adjLsaSeq = seq } // @@ -151,7 +202,7 @@ func (s *SequencingManager) GetNameLsaSeq() uint64 { // @param seq // func (s *SequencingManager) SetNameLsaSeq(seq uint64) { - s.nameLsaSeq=seq + s.nameLsaSeq = seq } // @@ -171,7 +222,7 @@ func (s *SequencingManager) GetCorLsaSeq() uint64 { // @param seq // func (s *SequencingManager) SetCorLsaSeq(seq uint64) { - s.corLsaSeq=seq + s.corLsaSeq = seq } // @@ -179,7 +230,7 @@ func (s *SequencingManager) SetCorLsaSeq(seq uint64) { // @Description: 邻接LSA序列号加一 // @receiver s // -func (s *SequencingManager) IncreaseAdjLsaSeq() { +func (s *SequencingManager) IncreaseAdjLsaSeq() { s.adjLsaSeq++ } @@ -188,7 +239,7 @@ func (s *SequencingManager) IncreaseAdjLsaSeq() { // @Description: 名称LSA序列号加一 // @receiver s // -func (s *SequencingManager) IncreaseNameLsaSeq() { +func (s *SequencingManager) IncreaseNameLsaSeq() { s.nameLsaSeq++ } @@ -197,6 +248,6 @@ func (s *SequencingManager) IncreaseNameLsaSeq() { // @Description: 坐标LSA序列号加一 // @receiver s // -func (s *SequencingManager) IncreaseCorLsaSeq() { +func (s *SequencingManager) IncreaseCorLsaSeq() { s.corLsaSeq++ -} \ No newline at end of file +} diff --git a/lsdb/SequencingManager_test.go b/lsdb/SequencingManager_test.go new file mode 100644 index 0000000..ec00080 --- /dev/null +++ b/lsdb/SequencingManager_test.go @@ -0,0 +1,16 @@ +// Package lsdb +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/19 16:47 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package lsdb + +import "testing" + +// 测试从文件读写序列号管理器 +func TestSequencingManager_InitiateSeqNoFromFile(t *testing.T) { + +} diff --git a/utils/FileUtils.go b/utils/FileUtils.go new file mode 100644 index 0000000..50807e3 --- /dev/null +++ b/utils/FileUtils.go @@ -0,0 +1,90 @@ +// Package utils +// @Author: Jianming Que (阙建明) +// @Description: +// @Version: 1.0.0 +// @Date: 2021/4/26 11:27 上午 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// +package utils + +import ( + "fmt" + "io/ioutil" + "minlib/common" + "os" + "strings" +) + +func GetRelPath(path string) string { + if strings.HasPrefix(path, "~") { + homePath, err := common.Home() + if err != nil { + common.LogFatal("Get current user home path failed!") + } + return homePath + path[1:] + } else { + return path + } +} + +func ReadFromFile(path string) (string, error) { + file, err := os.Open(path) + if err != nil { + return "", err + } + defer file.Close() + if content, err := ioutil.ReadAll(file); err != nil { + return "", err + } else { + return string(content), nil + } +} + +// WriteFile 写入文件,文件不存在则创建,如在则追加内容 +func WriteFile(path string, str string) { + _, b := IsFile(path) + var f *os.File + var err error + if b { + //打开文件, + f, _ = os.OpenFile(path, os.O_APPEND, 0666) + } else { + //新建文件 + f, err = os.Create(path) + } + + //使用完毕,需要关闭文件 + defer func() { + err = f.Close() + if err != nil { + fmt.Println("err = ", err) + } + }() + + if err != nil { + fmt.Println("err = ", err) + return + } + _, err = f.WriteString(str) + if err != nil { + fmt.Println("err = ", err) + } +} + +// IsExists 判断路径是否存在 +func IsExists(path string) (os.FileInfo, bool) { + f, err := os.Stat(path) + return f, err == nil || os.IsExist(err) +} + +// IsDir 判断所给路径是否为文件夹 +func IsDir(path string) (os.FileInfo, bool) { + f, flag := IsExists(path) + return f, flag && f.IsDir() +} + +// IsFile 判断所给路径是否为文件 +func IsFile(path string) (os.FileInfo, bool) { + f, flag := IsExists(path) + return f, flag && !f.IsDir() +} From ed73702beb18fdc5d824a9c0302025a257dc9624 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 20 May 2022 12:00:54 +0800 Subject: [PATCH 30/70] =?UTF-8?q?=E5=B0=86seq=E5=86=99=E5=85=A5=E6=96=87?= =?UTF-8?q?=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/SequencingManager.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lsdb/SequencingManager.go b/lsdb/SequencingManager.go index 2981244..109f8d0 100644 --- a/lsdb/SequencingManager.go +++ b/lsdb/SequencingManager.go @@ -124,7 +124,11 @@ func (s *SequencingManager) InitiateSeqNoFromFile() { // @Description: todo:将当前seq写入文件 // @receiver s // -func (s SequencingManager) WriteSeqNoToFile() { +func (s *SequencingManager) WriteSeqNoToFile() { + // 将序列号写入文件。依次表示:邻接LSA序列号、名称LSA序列号、双曲LSA序列号 + utils.WriteFile(s.seqFileNameWithPath, strconv.FormatUint(s.adjLsaSeq, 10)+" "+ + strconv.FormatUint(s.nameLsaSeq, 10)+" "+ + strconv.FormatUint(s.corLsaSeq, 10)) } // From 2d74d1e27038d3c12030ee36695f0cfc54ea0436 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 20 May 2022 12:30:08 +0800 Subject: [PATCH 31/70] =?UTF-8?q?=E5=9C=A8seq=E6=9B=B4=E6=96=B0=E5=90=8E?= =?UTF-8?q?=EF=BC=8C=E9=83=BD=E6=89=A7=E8=A1=8C=E4=B8=80=E4=B8=8B=E6=9B=B4?= =?UTF-8?q?=E6=96=B0seq=E5=88=B0=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/SequencingManager.go | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/lsdb/SequencingManager.go b/lsdb/SequencingManager.go index 109f8d0..30e6c93 100644 --- a/lsdb/SequencingManager.go +++ b/lsdb/SequencingManager.go @@ -70,7 +70,7 @@ func (s *SequencingManager) setSeqFileDirectory(filePath string) error { // // InitiateSeqNoFromFile -// @Description: todo:从文件中初始化各种类型lsa的seq +// @Description: 从文件中初始化各种类型lsa的seq // @receiver s // func (s *SequencingManager) InitiateSeqNoFromFile() { @@ -121,10 +121,10 @@ func (s *SequencingManager) InitiateSeqNoFromFile() { // // WriteSeqNoToFile -// @Description: todo:将当前seq写入文件 +// @Description: 将当前seq写入文件 // @receiver s // -func (s *SequencingManager) WriteSeqNoToFile() { +func (s *SequencingManager) writeSeqNoToFile() { // 将序列号写入文件。依次表示:邻接LSA序列号、名称LSA序列号、双曲LSA序列号 utils.WriteFile(s.seqFileNameWithPath, strconv.FormatUint(s.adjLsaSeq, 10)+" "+ strconv.FormatUint(s.nameLsaSeq, 10)+" "+ @@ -147,6 +147,8 @@ func (s *SequencingManager) SetLsaSeq(seqNo uint64, lsaType lsa.LsaType) { case lsa.LsaCOORDINATEType: s.corLsaSeq = seqNo } + // 更新到文件 + s.writeSeqNoToFile() } // @@ -187,6 +189,8 @@ func (s *SequencingManager) GetAdjLsaSeq() uint64 { // func (s *SequencingManager) SetAdjLsaSeq(seq uint64) { s.adjLsaSeq = seq + // 更新到文件 + s.writeSeqNoToFile() } // @@ -207,6 +211,8 @@ func (s *SequencingManager) GetNameLsaSeq() uint64 { // func (s *SequencingManager) SetNameLsaSeq(seq uint64) { s.nameLsaSeq = seq + // 更新到文件 + s.writeSeqNoToFile() } // @@ -227,6 +233,8 @@ func (s *SequencingManager) GetCorLsaSeq() uint64 { // func (s *SequencingManager) SetCorLsaSeq(seq uint64) { s.corLsaSeq = seq + // 更新到文件 + s.writeSeqNoToFile() } // @@ -236,6 +244,8 @@ func (s *SequencingManager) SetCorLsaSeq(seq uint64) { // func (s *SequencingManager) IncreaseAdjLsaSeq() { s.adjLsaSeq++ + // 更新到文件 + s.writeSeqNoToFile() } // @@ -245,6 +255,8 @@ func (s *SequencingManager) IncreaseAdjLsaSeq() { // func (s *SequencingManager) IncreaseNameLsaSeq() { s.nameLsaSeq++ + // 更新到文件 + s.writeSeqNoToFile() } // @@ -254,4 +266,6 @@ func (s *SequencingManager) IncreaseNameLsaSeq() { // func (s *SequencingManager) IncreaseCorLsaSeq() { s.corLsaSeq++ + // 更新到文件 + s.writeSeqNoToFile() } From d6655648da29a3d5944526a66509441f4ea69fa5 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 20 May 2022 15:56:29 +0800 Subject: [PATCH 32/70] =?UTF-8?q?=E5=AF=B9=E5=BA=8F=E5=88=97=E5=8F=B7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=99=A8=E5=81=9A=E4=BA=86=E5=85=85=E5=88=86?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/SequencingManager.go | 49 +++++++++++++++++----------------- lsdb/SequencingManager_test.go | 18 ++++++++++++- route/RoutingTable.go | 10 +++---- utils/FileUtils.go | 31 +++++++++++++++++++++ 4 files changed, 77 insertions(+), 31 deletions(-) diff --git a/lsdb/SequencingManager.go b/lsdb/SequencingManager.go index 30e6c93..462a64a 100644 --- a/lsdb/SequencingManager.go +++ b/lsdb/SequencingManager.go @@ -13,7 +13,6 @@ import ( common2 "minlib/common" "mlsr/lsa" "mlsr/utils" - "os" "path" "strconv" "strings" @@ -23,12 +22,19 @@ import ( var once sync.Once // 用以保证SequencingManager的使用是单例模式 var instance *SequencingManager // 单例模式的序列号管理器 -var seqFileName string = "mlsrSeqNo.txt" // 保存序列号的文件名 +var seqFileName string = ".mlsrSeqNo.txt" // 保存序列号的文件名 +// +// SequencingManager +// @Description: 序列号管理器 +// type SequencingManager struct { - adjLsaSeq uint64 - nameLsaSeq uint64 - corLsaSeq uint64 + // 三种序列号 + adjLsaSeq uint64 + nameLsaSeq uint64 + corLsaSeq uint64 + + // 序列号保存到的文件路径 seqFileNameWithPath string } @@ -42,7 +48,7 @@ func GetInstance() *SequencingManager { once.Do(func() { homePath, err := common2.Home() if err != nil { - common2.LogFatal("Get current user home path failed!") + common2.LogError("Get current user home path failed!") } // 生成序列号管理器文件路径,并日志记录下来 filePath := path.Join(homePath, seqFileName) @@ -75,47 +81,40 @@ func (s *SequencingManager) setSeqFileDirectory(filePath string) error { // func (s *SequencingManager) InitiateSeqNoFromFile() { // 先判断文件是否存在,不存在,则初始化文件 - fileInfo, b := utils.IsExists(s.seqFileNameWithPath) - common2.LogInfo("seq file info is " + fileInfo.Name()) + _, b := utils.IsExists(s.seqFileNameWithPath) if !b { - common2.LogFatal("sequencingManager File not exists, fileinfo is ", fileInfo) + common2.LogInfo("sequencingManager file not exists, fileinfo is " + s.seqFileNameWithPath) homePath, err := common2.Home() if err != nil { - common2.LogFatal("Get current user home path failed!") + common2.LogError("Get current user home path failed!") } - // 生成序列号管理器文件,并日志记录下来 + // 生成序列号管理器文件,并将序列号写入文件 filePath := path.Join(homePath, seqFileName) - _ = instance.setSeqFileDirectory(filePath) - _, err = os.Create(filePath) - if err != nil { - common2.LogFatal("create file failed![%v]\n", err) - } else { - common2.LogInfo("create sequencingManager file path successed, the path is" + filePath) - } - // 将序列号写入文件 - utils.WriteFile(filePath, "0 0 0") // 依次表示:邻接LSA序列号、名称LSA序列号、双曲LSA序列号 + _ = s.setSeqFileDirectory(filePath) + utils.ClearAndWriteFile(filePath, "0 0 0") // 依次表示:邻接LSA序列号、名称LSA序列号、双曲LSA序列号 } // 并读取数据 seqs, err := utils.ReadFromFile(s.seqFileNameWithPath) + common2.LogInfo("读取数据成功,序列号为: " + seqs) if err != nil { - common2.LogFatal("read seqs from " + s.seqFileNameWithPath + " failed.") + common2.LogError("read seqs from " + s.seqFileNameWithPath + " failed.") return } // 读取邻接 seqsArray := strings.Fields(seqs) s.adjLsaSeq, err = strconv.ParseUint(seqsArray[0], 10, 64) if err != nil { - common2.LogFatal("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) + common2.LogError("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) } // 读取名称 s.nameLsaSeq, err = strconv.ParseUint(seqsArray[1], 10, 64) if err != nil { - common2.LogFatal("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) + common2.LogError("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) } // 读取双曲 s.corLsaSeq, err = strconv.ParseUint(seqsArray[2], 10, 64) if err != nil { - common2.LogFatal("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) + common2.LogError("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) } } @@ -126,7 +125,7 @@ func (s *SequencingManager) InitiateSeqNoFromFile() { // func (s *SequencingManager) writeSeqNoToFile() { // 将序列号写入文件。依次表示:邻接LSA序列号、名称LSA序列号、双曲LSA序列号 - utils.WriteFile(s.seqFileNameWithPath, strconv.FormatUint(s.adjLsaSeq, 10)+" "+ + utils.ClearAndWriteFile(s.seqFileNameWithPath, strconv.FormatUint(s.adjLsaSeq, 10)+" "+ strconv.FormatUint(s.nameLsaSeq, 10)+" "+ strconv.FormatUint(s.corLsaSeq, 10)) } diff --git a/lsdb/SequencingManager_test.go b/lsdb/SequencingManager_test.go index ec00080..a94cf26 100644 --- a/lsdb/SequencingManager_test.go +++ b/lsdb/SequencingManager_test.go @@ -8,9 +8,25 @@ package lsdb -import "testing" +import ( + "fmt" + "mlsr/lsa" + "testing" +) // 测试从文件读写序列号管理器 func TestSequencingManager_InitiateSeqNoFromFile(t *testing.T) { + // 构建序列号管理器 + seqManager := GetInstance() + fmt.Println("path: ", seqManager.seqFileNameWithPath) + // 增加邻接序列号 + seqManager.IncreaseAdjLsaSeq() + + // 设置,获取指定lsa序列号 + seqManager.SetLsaSeq(9999, lsa.LsaNAMEType) + seq1 := seqManager.GetNameLsaSeq() + seq2 := seqManager.GetAdjLsaSeq() + seq3, _ := seqManager.GetLsaSeq(lsa.LsaCOORDINATEType) + fmt.Println(seq1, seq2, seq3) } diff --git a/route/RoutingTable.go b/route/RoutingTable.go index d458d9b..c817a57 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -70,7 +70,7 @@ func (t *RoutingTable) Calculate() { // 安排指定时间之后执行一个路由计算 err := t.ScheduleRoutingTableCalculation() if err != nil { - common2.LogFatal("Calculate error,Schedule RoutingTableCalculation error, ", err) + common2.LogError("Calculate error,Schedule RoutingTableCalculation error, ", err) } } } @@ -140,7 +140,7 @@ func (t *RoutingTable) ScheduleRoutingTableCalculation() error { // func (t *RoutingTable) calculateLsRoutingTable() { if t.lsdb.GetIsBuildAdjLsaScheduled() { - common2.LogFatal("Adjacency build is scheduled, routing table can not be calculated :(") + common2.LogError("Adjacency build is scheduled, routing table can not be calculated :(") return } @@ -154,13 +154,13 @@ func (t *RoutingTable) calculateLsRoutingTable() { // 构造路由映射表 lsas, err := t.lsdb.GetLSAsByType(lsa.LsaADJACENCYType) if err != nil { - common2.LogFatal("Get Lsa in calculateLsRoutingTable error, ", err) + common2.LogError("Get Lsa in calculateLsRoutingTable error, ", err) } rMap := new(Calculator.RouterMap) rMap.Init() err = rMap.CreateFromAdjLsdb(lsas) if err != nil { - common2.LogFatal("create RouterMap from lsdb error in calculateLsRoutingTable error, ", err) + common2.LogError("create RouterMap from lsdb error in calculateLsRoutingTable error, ", err) } nRouters := rMap.GetMapSize() @@ -171,7 +171,7 @@ func (t *RoutingTable) calculateLsRoutingTable() { // 使用计算器去计算路由 err = calculator.CalculatePath(rMap, t, t.mlsrConfig, t.lsdb) if err != nil { - common2.LogFatal("CalculatePath in calculateLsRoutingTable error, ", err) + common2.LogError("CalculatePath in calculateLsRoutingTable error, ", err) } // todo: 开始根据新计算的路由去更新NPT表 diff --git a/utils/FileUtils.go b/utils/FileUtils.go index 50807e3..a23c2de 100644 --- a/utils/FileUtils.go +++ b/utils/FileUtils.go @@ -40,6 +40,37 @@ func ReadFromFile(path string) (string, error) { } } +// WriteFile 写入文件,文件不存在则创建,如在则重写内容 +func ClearAndWriteFile(path string, str string) { + _, b := IsFile(path) + var f *os.File + var err error + if b { + //打开文件, + f, _ = os.OpenFile(path, os.O_RDWR|os.O_TRUNC, 0666) + } else { + //新建文件 + f, err = os.Create(path) + } + + //使用完毕,需要关闭文件 + defer func() { + err = f.Close() + if err != nil { + fmt.Println("err = ", err) + } + }() + + if err != nil { + fmt.Println("err = ", err) + return + } + _, err = f.WriteString(str) + if err != nil { + fmt.Println("err = ", err) + } +} + // WriteFile 写入文件,文件不存在则创建,如在则追加内容 func WriteFile(path string, str string) { _, b := IsFile(path) From a13b37c760bdf2a195eb18362946a8cd23552768 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 20 May 2022 15:59:06 +0800 Subject: [PATCH 33/70] =?UTF-8?q?=E5=B0=86=E5=BA=8F=E5=88=97=E5=8F=B7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=99=A8=E4=B8=AD=E9=83=A8=E5=88=86error?= =?UTF-8?q?=E6=94=B9=E4=B8=BAfatal=EF=BC=8C=E5=8D=B3=E5=9C=A8=E5=BA=8F?= =?UTF-8?q?=E5=88=97=E5=8F=B7=E6=96=87=E4=BB=B6=E8=A2=AB=E6=81=B6=E6=84=8F?= =?UTF-8?q?=E7=AF=A1=E6=94=B9=E5=90=8E=EF=BC=8C=E7=A8=8B=E5=BA=8F=E5=B0=86?= =?UTF-8?q?=E8=AE=B0=E5=BD=95=E5=B9=B6=E8=87=AA=E5=8A=A8=E9=80=80=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/SequencingManager.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lsdb/SequencingManager.go b/lsdb/SequencingManager.go index 462a64a..bc25a79 100644 --- a/lsdb/SequencingManager.go +++ b/lsdb/SequencingManager.go @@ -97,24 +97,24 @@ func (s *SequencingManager) InitiateSeqNoFromFile() { seqs, err := utils.ReadFromFile(s.seqFileNameWithPath) common2.LogInfo("读取数据成功,序列号为: " + seqs) if err != nil { - common2.LogError("read seqs from " + s.seqFileNameWithPath + " failed.") + common2.LogFatal("read seqs from " + s.seqFileNameWithPath + " failed.") return } // 读取邻接 seqsArray := strings.Fields(seqs) s.adjLsaSeq, err = strconv.ParseUint(seqsArray[0], 10, 64) if err != nil { - common2.LogError("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) + common2.LogFatal("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) } // 读取名称 s.nameLsaSeq, err = strconv.ParseUint(seqsArray[1], 10, 64) if err != nil { - common2.LogError("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) + common2.LogFatal("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) } // 读取双曲 s.corLsaSeq, err = strconv.ParseUint(seqsArray[2], 10, 64) if err != nil { - common2.LogError("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) + common2.LogFatal("read seqs from " + s.seqFileNameWithPath + " failed, reason is " + err.Error()) } } From 94eb3de6e385262a1960ce2edf23ec1b33a8795f Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 20 May 2022 17:47:29 +0800 Subject: [PATCH 34/70] clean code --- go.sum | 426 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 426 insertions(+) diff --git a/go.sum b/go.sum index d83584c..364652b 100644 --- a/go.sum +++ b/go.sum @@ -1,24 +1,151 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= +cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= +cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= +cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= +cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= +cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= +cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= +cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= +cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= +cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= +cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= +cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= +cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= +cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= +cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= +cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= +cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= +cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= +cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= +cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= +cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= +cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= +cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= +cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= +cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= +cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= +cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= +cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= +cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= +dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U= github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/go-co-op/gocron v1.13.0 h1:BjkuNImPy5NuIPEifhWItFG7pYyr27cyjS6BN9w/D4c= github.com/go-co-op/gocron v1.13.0/go.mod h1:GD5EIEly1YNW+LovFVx5dzbYVcIc8544K99D8UVRpGo= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= +github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= +github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= +github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/jfeliu007/goplantuml v1.6.1 h1:4mRgQ4Lujx11dfw3TyL6xa6w2DGHZar0NktJ6EmZ2dI= +github.com/jfeliu007/goplantuml v1.6.1/go.mod h1:GnvyYGyIXD68akNFe2FBlNBypwfbpeNmVUQ4ZxJw8iI= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= +github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/mutecomm/go-sqlcipher/v4 v4.4.2 h1:eM10bFtI4UvibIsKr10/QT7Yfz+NADfjZYh0GKrXUNc= github.com/mutecomm/go-sqlcipher/v4 v4.4.2/go.mod h1:mF2UmIpBnzFeBdu/ypTDb/LdbS0nk0dfSN1WUsWTjMA= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= @@ -27,9 +154,13 @@ github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= +github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= +github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tidwall/assert v0.1.0 h1:aWcKyRBUAdLoVebxo95N7+YZVTFF/ASTr7BN4sLP6XI= @@ -57,21 +188,316 @@ github.com/tidwall/tinyqueue v0.1.1/go.mod h1:O/QNHwrnjqr6IHItYrzoHAKYhBkLI67Q09 github.com/tylertreat/BoomFilters v0.0.0-20210315201527-1a82519a3e43 h1:QEePdg0ty2r0t1+qwfZmQ4OOl/MB2UXIeJSpIZv56lg= github.com/tylertreat/BoomFilters v0.0.0-20210315201527-1a82519a3e43/go.mod h1:OYRfF6eb5wY9VRFkXJH8FFBi3plw2v+giaIu7P054pM= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/zeebo/xxh3 v1.0.1 h1:FMSRIbkrLikb/0hZxmltpg84VkqDAT5M8ufXynuhXsI= github.com/zeebo/xxh3 v1.0.1/go.mod h1:8VHV24/3AZLn3b6Mlp/KuC33LWH687Wq6EnziEB+rsA= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= +go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= +golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= +golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= +golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= +golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= +golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= +golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= +golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= +golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= +golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= +golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= +golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= +golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= +golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= +golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= +golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= +google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= +google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= +google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= +google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= +google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= +google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= +google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= +google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= +google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= +google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= +google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= +google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= +google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= +google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= +google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +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= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= +rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= +rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= From 0922e507380946f72d4ddd61a02254a837b7f0e5 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 25 May 2022 11:42:56 +0800 Subject: [PATCH 35/70] =?UTF-8?q?=E8=A1=A5=E5=85=85LSDB=E8=8B=A5=E5=B9=B2?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/MlsrConfigParameters.go | 85 ++++++++++++++++++++-------------- lsdb/Lsdb.go | 66 ++++++++++++++++++++++++-- lsdb/Lsdb_test.go | 9 ++++ tests/goCron_test.go | 3 +- 4 files changed, 122 insertions(+), 41 deletions(-) create mode 100644 lsdb/Lsdb_test.go diff --git a/common/MlsrConfigParameters.go b/common/MlsrConfigParameters.go index 65e02cd..4ca79d3 100644 --- a/common/MlsrConfigParameters.go +++ b/common/MlsrConfigParameters.go @@ -24,21 +24,26 @@ type MlsrConfigParameters struct { mlsrconf *MlsrConfig // 名称前缀/名称标识 - m_routerName *component.Identifier - m_siteName *component.Identifier - m_network *component.Identifier - m_routerPrefix *component.Identifier + m_routerName *component.Identifier + m_siteName *component.Identifier + m_network *component.Identifier + m_routerPrefix *component.Identifier m_syncUserPrefix *component.Identifier - m_syncPrefix *component.Identifier - m_lsaPrefix *component.Identifier + m_syncPrefix *component.Identifier + m_lsaPrefix *component.Identifier + + m_lsaRefreshTime time.Duration + m_adjLsaBuildInterval time.Duration + + // 路由器死亡时间(经过了该时间,NameLsa将触发超时) + m_routerDeadInterval time.Duration m_faceDatasetFetchInterval time.Duration - m_lsaInterestLifetime time.Duration - + m_lsaInterestLifetime time.Duration } // MlsrConfig初始化 -func (mcp *MlsrConfigParameters) Init(config *MlsrConfig) { +func (mcp *MlsrConfigParameters) Init(config *MlsrConfig) { mcp.setMetaData(config) // 依次构建各个名称前缀/名称标识 _ = mcp.build3Prefix() @@ -52,11 +57,19 @@ func (mcp *MlsrConfigParameters) Init(config *MlsrConfig) { // @receiver mcp // @param config // -func (mcp *MlsrConfigParameters) setMetaData(config *MlsrConfig) { +func (mcp *MlsrConfigParameters) setMetaData(config *MlsrConfig) { mcp.mlsrconf = config } -func (mcp *MlsrConfigParameters) genDurations() { +func (mcp *MlsrConfigParameters) genDurations() { + mcp.m_lsaRefreshTime = + time.Duration(mcp.mlsrconf.LsaRefreshTime) * time.Millisecond + mcp.m_adjLsaBuildInterval = + time.Duration(mcp.mlsrconf.AdjLsaBuildInterval) * time.Millisecond + + mcp.m_routerDeadInterval = + time.Duration(mcp.mlsrconf.RouterDeadInterval) * time.Millisecond + mcp.m_faceDatasetFetchInterval = time.Duration(mcp.mlsrconf.LogicFaceDatasetFetchInterval) * time.Millisecond mcp.m_lsaInterestLifetime = @@ -71,18 +84,18 @@ func (mcp *MlsrConfigParameters) genDurations() { // func (mcp *MlsrConfigParameters) build3Prefix() error { var err error - mcp.m_network,err = component.CreateIdentifierByString(mcp.mlsrconf.Network) - if err != nil{ + mcp.m_network, err = component.CreateIdentifierByString(mcp.mlsrconf.Network) + if err != nil { return err } - mcp.m_siteName,err = component.CreateIdentifierByString(mcp.mlsrconf.Site) - if err != nil{ + mcp.m_siteName, err = component.CreateIdentifierByString(mcp.mlsrconf.Site) + if err != nil { return err } - mcp.m_routerName,err = component.CreateIdentifierByString(mcp.mlsrconf.Router) - if err != nil{ + mcp.m_routerName, err = component.CreateIdentifierByString(mcp.mlsrconf.Router) + if err != nil { return err } return nil @@ -90,17 +103,17 @@ func (mcp *MlsrConfigParameters) build3Prefix() error { func (mcp *MlsrConfigParameters) buildSyncAndLsaPrefix() error { // 同步前缀 = "/localhop" + 网络字段 + "/mlsr/sync" + SYNC版本号 - syncPrefix := "/localhop"+mcp.mlsrconf.Network+"/mlsr/sync"+"/"+ strconv.Itoa(SYNC_VERSION) + syncPrefix := "/localhop" + mcp.mlsrconf.Network + "/mlsr/sync" + "/" + strconv.Itoa(SYNC_VERSION) var err error - mcp.m_syncPrefix,err = component.CreateIdentifierByString(syncPrefix) - if err != nil{ + mcp.m_syncPrefix, err = component.CreateIdentifierByString(syncPrefix) + if err != nil { return err } // Lsa前缀 = "/localhop" + 网络字段 + "/sync/LSA" - lsaPrefix := "/localhop"+mcp.mlsrconf.Network+"/sync/LSA" - mcp.m_lsaPrefix,err = component.CreateIdentifierByString(lsaPrefix) - if err != nil{ + lsaPrefix := "/localhop" + mcp.mlsrconf.Network + "/sync/LSA" + mcp.m_lsaPrefix, err = component.CreateIdentifierByString(lsaPrefix) + if err != nil { return err } return nil @@ -108,17 +121,17 @@ func (mcp *MlsrConfigParameters) buildSyncAndLsaPrefix() error { func (mcp *MlsrConfigParameters) buildRouterAndSyncUserPrefix() error { // 路由器前缀 = 网络字段 + 网域字段 + 路由器字段 - prefix := mcp.mlsrconf.Network+mcp.mlsrconf.Site+mcp.mlsrconf.Router + prefix := mcp.mlsrconf.Network + mcp.mlsrconf.Site + mcp.mlsrconf.Router var err error - mcp.m_routerPrefix,err = component.CreateIdentifierByString(prefix) - if err != nil{ + mcp.m_routerPrefix, err = component.CreateIdentifierByString(prefix) + if err != nil { return err } // 同步用户前缀 = Lsa前缀 + 网域字段 + 路由器字段 - syncUserPrefix := mcp.m_lsaPrefix.ToUri()+mcp.mlsrconf.Site+mcp.mlsrconf.Router - mcp.m_syncUserPrefix,err = component.CreateIdentifierByString(syncUserPrefix) - if err != nil{ + syncUserPrefix := mcp.m_lsaPrefix.ToUri() + mcp.mlsrconf.Site + mcp.mlsrconf.Router + mcp.m_syncUserPrefix, err = component.CreateIdentifierByString(syncUserPrefix) + if err != nil { return err } return nil @@ -152,28 +165,28 @@ func (mcp *MlsrConfigParameters) GetLsaPrefix() *component.Identifier { return mcp.m_lsaPrefix } -func (mcp *MlsrConfigParameters) GetSyncProtocol() { +func (mcp *MlsrConfigParameters) GetSyncProtocol() { // todo } -func (mcp *MlsrConfigParameters) GetLsaRefreshTime() uint32 { - return mcp.mlsrconf.LsaRefreshTime +func (mcp *MlsrConfigParameters) GetLsaRefreshTime() time.Duration { + return mcp.m_lsaRefreshTime } func (mcp *MlsrConfigParameters) GetLsaInterestLifetime() time.Duration { return mcp.m_lsaInterestLifetime } -func (mcp *MlsrConfigParameters) GetAdjLsaBuildInterval() uint32 { - return mcp.mlsrconf.AdjLsaBuildInterval +func (mcp *MlsrConfigParameters) GetAdjLsaBuildInterval() time.Duration { + return mcp.m_adjLsaBuildInterval } func (mcp *MlsrConfigParameters) GetRoutingCalcInterval() uint32 { return mcp.mlsrconf.RoutingCalcInterval } -func (mcp *MlsrConfigParameters) GetRouterDeadInterval() uint32 { - return mcp.mlsrconf.RouterDeadInterval +func (mcp *MlsrConfigParameters) GetRouterDeadInterval() time.Duration { + return mcp.m_routerDeadInterval } func (mcp *MlsrConfigParameters) GetFaceDatasetFetchTries() uint32 { diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index b98575f..c84dad9 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -10,7 +10,9 @@ package lsdb import ( "bytes" + common2 "minlib/common" "minlib/component" + "minlib/logicface" "minlib/packet" "mlsr/common" "mlsr/communication" @@ -42,6 +44,8 @@ type Lsdb struct { // 任务调度器 scheduler *MlsrScheduler + // LogicFace接口 + face *logicface.LogicFace // 将LSA的名称从sync映射到其已知的最高序列号; // 用于阻止MLSR尝试获取过时的LSA @@ -54,13 +58,40 @@ type Lsdb struct { adjBuildCount uint64 // 邻接LSA的构建的统计数目 } -func (l *Lsdb) Init(mc *common.MlsrConfig, ms *MlsrScheduler) { +func (l *Lsdb) Init(mc *common.MlsrConfig, ms *MlsrScheduler, + _face *logicface.LogicFace) { // 配置项 l.mlsrConfig = mc // 调度器 l.scheduler = ms + // 逻辑face + l.face = _face // 序列号管理器 - //l.sequencingManager = GetInstance() + l.sequencingManager = GetInstance() + + // todo 构造sync + + // lsa刷新时间 + l.lsaRefreshTime = l.mlsrConfig.GetLsaRefreshTime() + // 邻接lsa构建间隔 + l.adjLsaBuildInterval = l.mlsrConfig.GetAdjLsaBuildInterval() + // 本机路由前缀 + l.thisRouterPrefix = l.mlsrConfig.GetRouterPrefix() + + // 是否已经安排邻接LSA的构建 + l.isBuildAdjLsaScheduled = false + // 邻接LSA构建次数统计 + l.adjBuildCount = 0 + + // 在LSDB初始化之前,对配置文件中的本机路由器进行拉式前缀注册(即监听该前缀) + lsaPrefix := l.mlsrConfig.GetLsaPrefix() + err := l.face.RegisterPullIdentifier(lsaPrefix, 2000) + if err != nil { + common2.LogFatal("Lsdb Init error, because face register, ", err.Error()) + } + + // 构建并安装自己的名称LSA + l.BuildAndInstallOwnNameLsa() } // @@ -81,6 +112,17 @@ func (l *Lsdb) DoesLsaExist(routerIdentifier *component.Identifier, lsaType int) // @receiver l // func (l *Lsdb) BuildAndInstallOwnNameLsa() { + // 根据配置文件,构造本机的名称LSA + nlsa := new(lsa.NameLsa) + nlsa.SetOriginRouter(l.thisRouterPrefix) + nlsa.SetSeqNo(l.sequencingManager.GetNameLsaSeq() + 1) + l.getLsaExpirationTimePoint() + nlsa.SetLsaExpirationTime(uint64(l.getLsaExpirationTimePoint().UnixMilli())) + + // todo 使用sync通知路由更新 + + // 安装lsa到LSDB + l.InstallLsa(nlsa) } // @@ -98,6 +140,20 @@ func (l *Lsdb) BuildAndInstallOwnCoordinateLsa() { // @receiver l // func (l *Lsdb) ScheduleAdjLsaBuild() { + // 计数 + l.adjBuildCount++ + // 日志记录 + if l.isBuildAdjLsaScheduled { + common2.LogInfo("Rescheduling Adjacency LSA build in ", l.adjLsaBuildInterval) + } else { + common2.LogInfo("Scheduling Adjacency LSA build in ", l.adjLsaBuildInterval) + l.isBuildAdjLsaScheduled = true + } + // 安排构造邻接LSA + err := l.scheduler.ScheduleTaskAfterDuration(l.adjLsaBuildInterval, l.BuildAdjLsa) + if err != nil { + common2.LogError("Scheduling Adjacency LSA build error, ", err.Error()) + } } // @@ -246,6 +302,8 @@ func (l *Lsdb) AfterFetchLsa(buffer bytes.Buffer, interestName *component.Identi } func (l *Lsdb) getLsaExpirationTimePoint() time.Time { - // todo - return time.Time{} + timeExpire := time.Now() + timeExpire.Add(l.mlsrConfig.GetRouterDeadInterval()) + + return timeExpire } diff --git a/lsdb/Lsdb_test.go b/lsdb/Lsdb_test.go new file mode 100644 index 0000000..49d76fd --- /dev/null +++ b/lsdb/Lsdb_test.go @@ -0,0 +1,9 @@ +// Package lsdb +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/25 10:15 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package lsdb diff --git a/tests/goCron_test.go b/tests/goCron_test.go index e8d66dc..1cdc403 100644 --- a/tests/goCron_test.go +++ b/tests/goCron_test.go @@ -183,7 +183,8 @@ func Test_ScheduleAtTimes(t *testing.T) { // 设置一个触发时间 s := gocron.NewScheduler(time.UTC) - job, _ := s.Every(100).Seconds().StartAt(timeRun).Do(printHHHWithPara, "heiheihei") + //job, _ := s.Every(100).Seconds().StartAt(timeRun).Do(printHHHWithPara, "heiheihei") + job, _ := s.Every(100).Seconds().StartAt(timeRun).Do(printHHH) job.LimitRunsTo(3) s.StartAsync() fmt.Println("预定触发时间: ", job.ScheduledAtTime()) From 19fb515c6941b87d87bb23c39595aa5e99005569 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 26 May 2022 11:57:16 +0800 Subject: [PATCH 36/70] =?UTF-8?q?=E8=A7=A3=E5=86=B3import=20cycle=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=9B=E5=A2=9E=E5=8A=A0=E5=AF=B9ConnectingLogicFac?= =?UTF-8?q?eUri=E7=9A=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.sum | 426 ------------------ route/ConnectingLogicFaceUri_test.go | 109 +++++ .../LinkStateRoutingTableCalculator.go | 51 ++- route/NextHop.go | 30 +- route/{Calculator => }/RouterMap.go | 2 +- route/{Calculator => }/RouterMap_test.go | 28 +- route/RoutingTable.go | 11 +- .../RoutingTableCalculator.go | 13 +- 8 files changed, 190 insertions(+), 480 deletions(-) create mode 100644 route/ConnectingLogicFaceUri_test.go rename route/{Calculator => }/LinkStateRoutingTableCalculator.go (84%) rename route/{Calculator => }/RouterMap.go (99%) rename route/{Calculator => }/RouterMap_test.go (65%) rename route/{Calculator => }/RoutingTableCalculator.go (94%) diff --git a/go.sum b/go.sum index 364652b..d83584c 100644 --- a/go.sum +++ b/go.sum @@ -1,151 +1,24 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U= github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/go-co-op/gocron v1.13.0 h1:BjkuNImPy5NuIPEifhWItFG7pYyr27cyjS6BN9w/D4c= github.com/go-co-op/gocron v1.13.0/go.mod h1:GD5EIEly1YNW+LovFVx5dzbYVcIc8544K99D8UVRpGo= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/jfeliu007/goplantuml v1.6.1 h1:4mRgQ4Lujx11dfw3TyL6xa6w2DGHZar0NktJ6EmZ2dI= -github.com/jfeliu007/goplantuml v1.6.1/go.mod h1:GnvyYGyIXD68akNFe2FBlNBypwfbpeNmVUQ4ZxJw8iI= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/mutecomm/go-sqlcipher/v4 v4.4.2 h1:eM10bFtI4UvibIsKr10/QT7Yfz+NADfjZYh0GKrXUNc= github.com/mutecomm/go-sqlcipher/v4 v4.4.2/go.mod h1:mF2UmIpBnzFeBdu/ypTDb/LdbS0nk0dfSN1WUsWTjMA= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= @@ -154,13 +27,9 @@ github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tidwall/assert v0.1.0 h1:aWcKyRBUAdLoVebxo95N7+YZVTFF/ASTr7BN4sLP6XI= @@ -188,316 +57,21 @@ github.com/tidwall/tinyqueue v0.1.1/go.mod h1:O/QNHwrnjqr6IHItYrzoHAKYhBkLI67Q09 github.com/tylertreat/BoomFilters v0.0.0-20210315201527-1a82519a3e43 h1:QEePdg0ty2r0t1+qwfZmQ4OOl/MB2UXIeJSpIZv56lg= github.com/tylertreat/BoomFilters v0.0.0-20210315201527-1a82519a3e43/go.mod h1:OYRfF6eb5wY9VRFkXJH8FFBi3plw2v+giaIu7P054pM= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/zeebo/xxh3 v1.0.1 h1:FMSRIbkrLikb/0hZxmltpg84VkqDAT5M8ufXynuhXsI= github.com/zeebo/xxh3 v1.0.1/go.mod h1:8VHV24/3AZLn3b6Mlp/KuC33LWH687Wq6EnziEB+rsA= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= -golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037 h1:YyJpGZS1sBuBCzLAR1VEpK193GlqGZbnPFnPV/5Rsb4= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1 h1:SrN+KX8Art/Sf4HNj6Zcz06G7VEz+7w9tdXTPOZ7+l4= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -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= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/route/ConnectingLogicFaceUri_test.go b/route/ConnectingLogicFaceUri_test.go new file mode 100644 index 0000000..48447df --- /dev/null +++ b/route/ConnectingLogicFaceUri_test.go @@ -0,0 +1,109 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/26 10:39 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import ( + "fmt" + "minlib/encoding" + "testing" +) + +// +// TestConnectingLogicFaceUri_LogicFaceUri +// @Description: 设置参数 +// @param t +// +func TestConnectingLogicFaceUri_LogicFaceUri(t *testing.T) { + testCPU := ConnectingLogicFaceUri{} + testCPU.SetLogicFaceUri("url") + fmt.Println(testCPU.LogicFaceUri()) +} + +// +// TestConnectingLogicFaceUri_WireEncode +// @Description: 测试编码 +// @param t +// +func TestConnectingLogicFaceUri_WireEncode(t *testing.T) { + testCPU := new(ConnectingLogicFaceUri) + fmt.Println(testCPU.LogicFaceUri()) + testCPU.SetLogicFaceUri("url") + fmt.Println(testCPU.LogicFaceUri()) + //testCPC.SetTlvType(5) + fmt.Println(testCPU.Value()) + var encoder encoding.Encoder + err := encoder.EncoderReset(encoding.MaxPacketSize, 0) + if err != nil { + fmt.Println("encoder.EncoderReset() failed", err) + return + } + a, err := testCPU.WireEncode(&encoder) + if err != nil { + fmt.Println("ConnectingLogicFaceUri.WireEncode() failed", err) + return + } + fmt.Println(a) + buf, err := encoder.GetBuffer() + if err != nil { + fmt.Println("encoder.GetBuffer() failed", err) + return + } + fmt.Println("interest buf", buf) + block, err := encoding.CreateBlockByBuffer(buf[:], false) + if err != nil { + fmt.Println("encoding.CreateBlockByBuffer() failed", err) + } + fmt.Println("interest block", block) +} + +// +// TestConnectingLogicFaceUri_WireDecode +// @Description: 测试解码 +// @param t +// +func TestConnectingLogicFaceUri_WireDecode(t *testing.T) { + testCPU := new(ConnectingLogicFaceUri) + fmt.Println("interest", testCPU.Value()) + //testCPC.SetTlvType(5) + fmt.Println(testCPU.TlvType()) + testCPU.SetLogicFaceUri("url") + fmt.Println("interest", testCPU.Value()) + fmt.Println("interest", testCPU.IsInitial()) + var encoder encoding.Encoder + err := encoder.EncoderReset(encoding.MaxPacketSize, 0) + if err != nil { + fmt.Println("encoder.EncoderReset() failed", err) + return + } + a, err := testCPU.WireEncode(&encoder) + if err != nil { + fmt.Println("ConnectingLogicFaceUri.WireEncode() failed", err) + } + fmt.Println(a) + buf, err := encoder.GetBuffer() + if err != nil { + fmt.Println("encoder.GetBuffer() failed:", err) + return + } + fmt.Println("interest buf", buf) + block, err := encoding.CreateBlockByBuffer(buf[:], false) + if err != nil { + fmt.Println("encoding.CreateBlockByBuffer() failed:", err) + return + } + fmt.Println("interest block", block) + interest1 := new(ConnectingLogicFaceUri) + err = interest1.WireDecode(block) + if err != nil { + fmt.Println("interest1.WireDecode() failed", err) + return + } + fmt.Println("interest1.value: ", interest1.Value()) + fmt.Println("interest1", interest1.IsInitial()) +} diff --git a/route/Calculator/LinkStateRoutingTableCalculator.go b/route/LinkStateRoutingTableCalculator.go similarity index 84% rename from route/Calculator/LinkStateRoutingTableCalculator.go rename to route/LinkStateRoutingTableCalculator.go index da3fe49..8c0cc75 100644 --- a/route/Calculator/LinkStateRoutingTableCalculator.go +++ b/route/LinkStateRoutingTableCalculator.go @@ -6,15 +6,15 @@ // @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 // -package Calculator +package route import ( "errors" "math" + "minlib/component" "mlsr/common" "mlsr/lsa" "mlsr/lsdb" - "mlsr/route" ) // @@ -51,22 +51,27 @@ const ( // @param lsdb // func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, - rTable *route.RoutingTable, mConfig *common.MlsrConfig, lsdb *lsdb.Lsdb) error { + mConfig *common.MlsrConfig, + lsdb *lsdb.Lsdb) ([]*component.Identifier, []*NextHop, error) { c.allocateAdjMatrix() c.initMatrix() _ = c.makeAdjMatrix(lsdb, routerMap) // 从配置文件中获取源路由器前缀,并根据routerMap获取其映射号 sourceRouter, b := routerMap.GetMappingNoByRouterName(mConfig.GetRouterPrefix()) if !b { - return errors.New("no found the source route in the router map, " + + return nil, nil, errors.New("no found the source route in the router map, " + "the source router prefix is: " + mConfig.GetRouterPrefix().ToUri()) } + // 初始化切片 + routers := []*component.Identifier{} // 路由器标识 + nexthops := []*NextHop{} // 下一跳 // 判断是单路径计算,还是多路径计算 if mConfig.GetMaxFacesPerPrefix() == 1 { // 在单路径的情况下,我们可以简单地运行Dijkstra算法。 c.doDijkstraPathCalculation(sourceRouter) // 将新的下一跳通知路由表。// todo: 注意,当前版本中,本机的邻接信息是从配置文件中读取出来的。 - c.addAllLsNextHopsToRoutingTable(mConfig.GetAdjacencyList(), rTable, routerMap, sourceRouter) + rs, ns := c.addAllLsNextHopsToRoutingTable(mConfig.GetAdjacencyList(), routerMap, sourceRouter) + return rs, ns, nil } else { // 多路径计算 // 1. 先确定源路由器的邻居路由器数目 @@ -82,7 +87,9 @@ func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, // 以当前邻居为起点,执行Dijkstra算法。 c.doDijkstraPathCalculation(sourceRouter) // 用计算结果更新路由表。 - c.addAllLsNextHopsToRoutingTable(mConfig.GetAdjacencyList(), rTable, routerMap, sourceRouter) + rs, ns := c.addAllLsNextHopsToRoutingTable(mConfig.GetAdjacencyList(), routerMap, sourceRouter) + routers = append(routers, rs...) + nexthops = append(nexthops, ns...) } c.freeLinks() c.freeLinksCosts() @@ -90,7 +97,7 @@ func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, c.freeParent() c.freeDistance() c.freeAdjMatrix() - return nil + return routers, nexthops, nil } // @@ -133,7 +140,7 @@ func (c *LinkStateRoutingTableCalculator) doDijkstraPathCalculation(sourceRouter // 对u的相邻节点进行迭代遍历。“朕要以你为衡,重设天下!” for v := 0; v < c.m_nRouters; v++ { // 如果u->v是可达的, - if c.adjMatrix[u][v] != route.NON_ADJACENT_COST { + if c.adjMatrix[u][v] != NON_ADJACENT_COST { // 而且我们还没有访问过v,即v属于右集, if c.isNotExplored(Q, v, head+1, c.m_nRouters) { // 如果到这个节点的距离+从这个节点到v的距离, @@ -196,9 +203,22 @@ func (c *LinkStateRoutingTableCalculator) isNotExplored( return false } +// +// addAllLsNextHopsToRoutingTable +// @Description: 将计算得到的所有路由器及其下一跳加入路由表 +// @receiver c +// @param adjs +// @param rMap +// @param sourceRouter +// @return []*component.Identifier +// @return []*route.NextHop +// func (c *LinkStateRoutingTableCalculator) addAllLsNextHopsToRoutingTable( - adjs *lsa.AdjLsaAdjacenctList, rTable *route.RoutingTable, - rMap *RouterMap, sourceRouter int) { + adjs *lsa.AdjLsaAdjacenctList, rMap *RouterMap, + sourceRouter int) ([]*component.Identifier, []*NextHop) { + // 初始化切片 + routers := []*component.Identifier{} // 路由器标识 + nexthops := []*NextHop{} // 下一跳 // 对于我们有的每个路由器 for i := 0; i < c.m_nRouters; i++ { if i != sourceRouter { @@ -217,14 +237,21 @@ func (c *LinkStateRoutingTableCalculator) addAllLsNextHopsToRoutingTable( continue } // 将下一跳加入路由表 - nextHop := new(route.NextHop) + nextHop := new(NextHop) nextHop.SetRouteCost(routeCost) nextHop.SetLogicFaceUri(nextHopFace.AdjLsaLogicFaceUri.LogicFaceUri()) - // todo : rt.addNextHop(*(pMap.getRouterNameByMappingNo(i)), nh); + // 下面代码相当于:rt.addNextHop(*(pMap.getRouterNameByMappingNo(i)), nh); + name, bb := rMap.GetRouterNameByMappingNo(i) + if !bb { + continue + } + routers = append(routers, name) + nexthops = append(nexthops, nextHop) } } } } + return routers, nexthops } // diff --git a/route/NextHop.go b/route/NextHop.go index 1fb4b02..07854d9 100644 --- a/route/NextHop.go +++ b/route/NextHop.go @@ -19,9 +19,9 @@ import ( // type NextHop struct { encoding.SelfEncodingBase - ConnectingLogicFaceUri // 指示接口 - RouteCost // 路由开销 - IsHyperbolic bool // 是不是双曲路由(v0.1暂时用不到) + ConnectingLogicFaceUri // 指示接口 + RouteCost // 路由开销 + IsHyperbolic bool // 是不是双曲路由(v0.1暂时用不到) } // @@ -32,13 +32,13 @@ type NextHop struct { // @return *NextHop // @return error // -func NewNextHop(uri string,cost uint64) (*NextHop,error) { +func NewNextHop(uri string, cost uint64) (*NextHop, error) { // todo 检查传入的参数格式是否有效 nextHop := new(NextHop) nextHop.IsHyperbolic = false - nextHop.setLogicFaceUri(uri) + nextHop.SetLogicFaceUri(uri) nextHop.SetRouteCost(cost) - return nextHop,nil + return nextHop, nil } // @@ -49,22 +49,22 @@ func NewNextHop(uri string,cost uint64) (*NextHop,error) { // @return int // @return error // -func (l *NextHop) WireEncode(encoder *encoding.Encoder) (int,error) { +func (l *NextHop) WireEncode(encoder *encoding.Encoder) (int, error) { totalLength := 0 // TLV-Value - tmpLen,err := l.ConnectingLogicFaceUri.WireEncode(encoder) + tmpLen, err := l.ConnectingLogicFaceUri.WireEncode(encoder) if err != nil { return 0, err } totalLength += tmpLen - tmpLen,err = l.RouteCost.WireEncode(encoder) + tmpLen, err = l.RouteCost.WireEncode(encoder) if err != nil { return 0, err } totalLength += tmpLen // TLV-Length - tmpLen,err = encoder.PrependVarNumber(encoding.VlInt(totalLength)) + tmpLen, err = encoder.PrependVarNumber(encoding.VlInt(totalLength)) if err != nil { return 0, err } @@ -77,7 +77,7 @@ func (l *NextHop) WireEncode(encoder *encoding.Encoder) (int,error) { } totalLength += tmpLen - return totalLength,nil + return totalLength, nil } // @@ -99,17 +99,17 @@ func (l *NextHop) WireDecode(block *encoding.Block) error { } // 提取参数 - for _, parameter := range block.GetSubElements(){ + for _, parameter := range block.GetSubElements() { switch parameter.GetType() { case extensions.TlvMlsrConnectingLogicFaceUri: - if err:= l.ConnectingLogicFaceUri.WireDecode(parameter); err != nil { + if err := l.ConnectingLogicFaceUri.WireDecode(parameter); err != nil { return err } case extensions.TlvMlsrRouteCost: - if err:= l.RouteCost.WireDecode(parameter); err != nil { + if err := l.RouteCost.WireDecode(parameter); err != nil { return err } } } return nil -} \ No newline at end of file +} diff --git a/route/Calculator/RouterMap.go b/route/RouterMap.go similarity index 99% rename from route/Calculator/RouterMap.go rename to route/RouterMap.go index 6ebc902..8e64d20 100644 --- a/route/Calculator/RouterMap.go +++ b/route/RouterMap.go @@ -7,7 +7,7 @@ // @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 // -package Calculator +package route import ( "minlib/component" diff --git a/route/Calculator/RouterMap_test.go b/route/RouterMap_test.go similarity index 65% rename from route/Calculator/RouterMap_test.go rename to route/RouterMap_test.go index f98ab67..247fdf3 100644 --- a/route/Calculator/RouterMap_test.go +++ b/route/RouterMap_test.go @@ -6,7 +6,7 @@ // @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 // -package Calculator +package route import ( "fmt" @@ -31,22 +31,22 @@ func TestRouterMap_Store(t *testing.T) { rmap.Store(iden2) // 取出标识 - index,b := rmap.GetMappingNoByRouterName(iden2) - fmt.Println(index,b) + index, b := rmap.GetMappingNoByRouterName(iden2) + fmt.Println(index, b) // 取出一个同URI的标识 idenNew2, _ := component.CreateIdentifierByString("/test/weforever2") - index,b = rmap.GetMappingNoByRouterName(idenNew2) - fmt.Println(index,b) + index, b = rmap.GetMappingNoByRouterName(idenNew2) + fmt.Println(index, b) // 取出Iden - idenCat,bb := rmap.GetRouterNameByMappingNo(0) - fmt.Println(idenCat.ToUri(),bb) - idenCat,bb = rmap.GetRouterNameByMappingNo(1) - fmt.Println(idenCat.ToUri(),bb) - idenCat,bb = rmap.GetRouterNameByMappingNo(2) - fmt.Println(idenCat.ToUri(),bb) - idenCat,bb = rmap.GetRouterNameByMappingNo(3) + idenCat, bb := rmap.GetRouterNameByMappingNo(0) + fmt.Println(idenCat.ToUri(), bb) + idenCat, bb = rmap.GetRouterNameByMappingNo(1) + fmt.Println(idenCat.ToUri(), bb) + idenCat, bb = rmap.GetRouterNameByMappingNo(2) + fmt.Println(idenCat.ToUri(), bb) + idenCat, bb = rmap.GetRouterNameByMappingNo(3) fmt.Println(bb) // 查看map大小 @@ -56,8 +56,8 @@ func TestRouterMap_Store(t *testing.T) { rmap.delete(iden) rmap.delete(idenNew2) fmt.Println(rmap.GetMapSize()) - idenCat,bb = rmap.GetRouterNameByMappingNo(0) + idenCat, bb = rmap.GetRouterNameByMappingNo(0) fmt.Println(bb) - idenCat,bb = rmap.GetRouterNameByMappingNo(2) + idenCat, bb = rmap.GetRouterNameByMappingNo(2) fmt.Println(bb) } diff --git a/route/RoutingTable.go b/route/RoutingTable.go index c817a57..6238e93 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -17,7 +17,6 @@ import ( "mlsr/extensions" "mlsr/lsa" "mlsr/lsdb" - "mlsr/route/Calculator" "time" ) @@ -156,7 +155,7 @@ func (t *RoutingTable) calculateLsRoutingTable() { if err != nil { common2.LogError("Get Lsa in calculateLsRoutingTable error, ", err) } - rMap := new(Calculator.RouterMap) + rMap := new(RouterMap) rMap.Init() err = rMap.CreateFromAdjLsdb(lsas) if err != nil { @@ -166,13 +165,17 @@ func (t *RoutingTable) calculateLsRoutingTable() { nRouters := rMap.GetMapSize() // 构造路由计算器 - calculator := new(Calculator.LinkStateRoutingTableCalculator) + calculator := new(LinkStateRoutingTableCalculator) calculator.SetRouterNum(nRouters) // 使用计算器去计算路由 - err = calculator.CalculatePath(rMap, t, t.mlsrConfig, t.lsdb) + routers, nexthops, err := calculator.CalculatePath(rMap, t.mlsrConfig, t.lsdb) if err != nil { common2.LogError("CalculatePath in calculateLsRoutingTable error, ", err) } + // 将路由计算结果依次加入路由表 + for i := 0; i < len(routers); i++ { + t.AddNextHop(routers[i], nexthops[i]) + } // todo: 开始根据新计算的路由去更新NPT表 common2.LogInfo("Calling Update NPT With new Route") diff --git a/route/Calculator/RoutingTableCalculator.go b/route/RoutingTableCalculator.go similarity index 94% rename from route/Calculator/RoutingTableCalculator.go rename to route/RoutingTableCalculator.go index 6c23fde..4cbcfb1 100644 --- a/route/Calculator/RoutingTableCalculator.go +++ b/route/RoutingTableCalculator.go @@ -6,15 +6,12 @@ // @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 // -package Calculator +package route import ( "errors" "mlsr/lsa" - //"errors" - //"mlsr/lsa" "mlsr/lsdb" - "mlsr/route" "sync" ) @@ -60,7 +57,7 @@ func (c *RoutingTableCalculator) allocateAdjMatrix() { func (c *RoutingTableCalculator) initMatrix() { for i := 0; i < c.m_nRouters; i++ { for j := 0; j < c.m_nRouters; j++ { - c.adjMatrix[0][0] = route.NON_ADJACENT_COST + c.adjMatrix[0][0] = NON_ADJACENT_COST } } } @@ -132,7 +129,7 @@ func (c *RoutingTableCalculator) writeAdjMatrixLog(p *sync.Map) { func (c *RoutingTableCalculator) getNumOfLinkfromAdjMatrix(sRouter int) int { num := 0 for i := 0; i < c.m_nRouters; i++ { - if (c.adjMatrix[sRouter][i] != route.NON_ADJACENT_COST) && (i != sRouter) { + if (c.adjMatrix[sRouter][i] != NON_ADJACENT_COST) && (i != sRouter) { num++ } } @@ -161,7 +158,7 @@ func (c *RoutingTableCalculator) adjustAdMatrix(source int, link int, linkCost u if i == link { c.adjMatrix[source][i] = linkCost } else { - c.adjMatrix[source][i] = route.NON_ADJACENT_COST + c.adjMatrix[source][i] = NON_ADJACENT_COST } } } @@ -180,7 +177,7 @@ func (c *RoutingTableCalculator) adjustAdMatrix(source int, link int, linkCost u func (c *RoutingTableCalculator) getLinksFromAdjMatrix(source int) { index := 0 for i := 0; i < c.m_nRouters; i++ { - if (c.adjMatrix[source][i] != route.NON_ADJACENT_COST) && (i != source) { + if (c.adjMatrix[source][i] != NON_ADJACENT_COST) && (i != source) { c.links[index] = i c.linkCosts[index] = c.adjMatrix[source][i] index++ From 3e69ec2dea4c0cd3be3444f9db929bd94e13fbda Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 26 May 2022 12:08:28 +0800 Subject: [PATCH 37/70] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B5=8B=E8=AF=95Route?= =?UTF-8?q?Cost?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/RouteCost_test.go | 81 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 route/RouteCost_test.go diff --git a/route/RouteCost_test.go b/route/RouteCost_test.go new file mode 100644 index 0000000..bf4d5b3 --- /dev/null +++ b/route/RouteCost_test.go @@ -0,0 +1,81 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/26 12:02 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import ( + "bytes" + "fmt" + "minlib/encoding" + "testing" +) + +// +// TestRouteCost_SetRouteCost +// @Description: 测试设置属性 +// @param t +// +func TestRouteCost_SetRouteCost(t *testing.T) { + lsaSequenceNumber := RouteCost{} + lsaSequenceNumber.SetRouteCost(77) + if lsaSequenceNumber.RouteCost() != 77 { + t.Fatal("RouteCost设置失败") + } +} + +// +// TestRouteCost_WireEncode +// @Description: 测试编码 +// @param t +// +func TestRouteCost_WireEncode(t *testing.T) { + linkCost := RouteCost{} + linkCost.SetRouteCost(1234) + + encoder := encoding.Encoder{} + encoder.EncoderReset(encoding.MaxPacketSize, 0) + length, err := linkCost.WireEncode(&encoder) + if err != nil { + t.Fatal("RouteCost编码失败", err.Error()) + } + + buf, err := encoder.GetBuffer() + if err != nil { + t.Fatal("RouteCost获取buffer结果失败", err.Error()) + } + + res := []byte{241, 1, 186, 2, 4, 210} + if length != 6 || !bytes.Equal(buf, res) { + fmt.Println("buf: ", buf) + fmt.Println("res: ", res) + t.Fatal("RouteCost编码内容错误", length, buf) + } +} + +// +// TestRouteCost_WireDecode +// @Description: 测试解码 +// @param t +// +func TestRouteCost_WireDecode(t *testing.T) { + var buf [6]byte = [6]byte{241, 1, 186, 2, 4, 210} + block, err := encoding.CreateBlockByBuffer(buf[:], true) + if err != nil { + t.Fatal("RouteCost创建Block失败", err.Error()) + } + + linkCost := RouteCost{} + err = linkCost.WireDecode(block) + if err != nil { + t.Fatal("RouteCost解码失败", err.Error()) + } + + if linkCost.RouteCost() != 1234 { + t.Fatal("RouteCost解码内容错误", linkCost.RouteCost()) + } +} From 1efd9c63aa2b4307dcbf426b230e6057ddb01573 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 26 May 2022 20:36:47 +0800 Subject: [PATCH 38/70] =?UTF-8?q?=E8=A7=A3=E5=86=B3LsaContainer=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=E9=94=99=E8=AF=AF=E7=9A=84=E9=97=AE=E9=A2=98=EF=BC=88?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E4=B8=8D=E8=A7=84=E8=8C=83=E5=AF=BC=E8=87=B4?= =?UTF-8?q?go=E6=B2=A1=E6=9C=89=E8=AF=86=E5=88=AB=EF=BC=89=EF=BC=9B?= =?UTF-8?q?=E5=B0=86FaceUri=E6=9F=90=E5=87=BD=E6=95=B0=E7=94=B1=E5=B0=8F?= =?UTF-8?q?=E5=86=99=E6=94=B9=E4=B8=BA=E5=A4=A7=E5=86=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../buntdb/LsaContainer_BuntDB.go | 106 ++++++---- .../buntdb/LsaContainer_BuntDB_test.go | 185 +++++++++++++----- 2 files changed, 203 insertions(+), 88 deletions(-) diff --git a/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB.go b/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB.go index 212ca6e..5cee0b7 100644 --- a/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB.go +++ b/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB.go @@ -14,6 +14,7 @@ package buntdb import ( "errors" "github.com/tidwall/buntdb" + common2 "minlib/common" "minlib/component" "mlsr/lsa" "strconv" @@ -48,17 +49,24 @@ type LsaContainer_BuntDB struct { // @return error 如果成功初始化,则返回nil // func (bdb *LsaContainer_BuntDB) Init() error { - // 打开db + // 1. 打开db db, err := buntdb.Open(":memory:") if err != nil { + common2.LogError("buntdb open error") return err } - bdb.db = db - // 建立基于LsaType的索引,便于根据type进行数据库快速检索 + common2.LogInfo("buntdb open success") + + // 2. 建立基于LsaType的索引,便于根据type进行数据库快速检索 err = db.CreateIndex("LsaType", "*", buntdb.IndexJSON("LsaTypeInt")) if err != nil { + common2.LogError("buntdb create index error") return err } + common2.LogInfo("buntdb create index success") + + // 3. 赋值 + bdb.db = db return nil } @@ -109,13 +117,13 @@ func getKeyFromNameAndType(routerIdentifier *component.Identifier, // @return lsa.ILsa // @return error // -func newLsa(lsaType lsa.LsaType) (lsa.ILsa,error) { +func newLsa(lsaType lsa.LsaType) (lsa.ILsa, error) { if lsaType == lsa.LsaADJACENCYType { - return new(lsa.AdjLsa),nil - }else if lsaType == lsa.LsaNAMEType{ - return new(lsa.NameLsa),nil - }else { - return nil,errors.New("invalid lsa type") + return new(lsa.AdjLsa), nil + } else if lsaType == lsa.LsaNAMEType { + return new(lsa.NameLsa), nil + } else { + return nil, errors.New("invalid lsa type") } } @@ -127,8 +135,9 @@ func newLsa(lsaType lsa.LsaType) (lsa.ILsa,error) { // func (bdb *LsaContainer_BuntDB) Emplace(lsa lsa.ILsa) error { // 将lsa转为json字符串 - jsonBytes,err := lsa.GetJsonString() - if err!= nil{ + jsonBytes, err := lsa.GetJsonString() + if err != nil { + common2.LogError("buntdb emplace get json error, because of ", err.Error()) return err } @@ -137,14 +146,15 @@ func (bdb *LsaContainer_BuntDB) Emplace(lsa lsa.ILsa) error { // 将转为的json存入键值对数据库 err = bdb.db.Update(func(tx *buntdb.Tx) error { - _, _, err := tx.Set(key, string(jsonBytes), nil) - if err != nil { - return err + _, _, err2 := tx.Set(key, string(jsonBytes), nil) + if err2 != nil { + common2.LogError("buntdb emplace set value error, because of ", err2.Error()) + return err2 } return nil }) - if err!= nil{ + if err != nil { return err } @@ -159,7 +169,11 @@ func (bdb *LsaContainer_BuntDB) Emplace(lsa lsa.ILsa) error { // func (bdb *LsaContainer_BuntDB) EraseLsa(lsa lsa.ILsa) error { key := getKeyFromLsa(lsa) - return bdb.EraseLsaByKey(key) + err := bdb.EraseLsaByKey(key) + if err != nil { + common2.LogError("buntdb EraseLsa error, because of ", err.Error()) + } + return err } // @@ -172,8 +186,9 @@ func (bdb *LsaContainer_BuntDB) EraseLsa(lsa lsa.ILsa) error { func (bdb *LsaContainer_BuntDB) EraseLsaByKey(key string) error { errRes := bdb.db.Update(func(tx *buntdb.Tx) error { _, err := tx.Delete(key) - //fmt.Println("删除的返回值是啥: ",ss) // 返回值是删除的value + // 返回值是删除的value if err != nil { + common2.LogError("buntdb EraseLsaByKey delete error, because of ", err.Error()) return err } @@ -193,31 +208,34 @@ func (bdb *LsaContainer_BuntDB) EraseLsaByKey(key string) error { // @return error // func (bdb *LsaContainer_BuntDB) GetLSAByNameAndType(routerIdentifier *component.Identifier, - lsaType lsa.LsaType) (lsa.ILsa,error) { - glsa,err := newLsa(lsaType) // 要查找的lsa - if err!= nil{ + lsaType lsa.LsaType) (lsa.ILsa, error) { + glsa, err := newLsa(lsaType) // 要查找的lsa + if err != nil { + common2.LogError("buntdb GetLSAByNameAndType new lsa error, because of ", err.Error()) return nil, err } errRes := bdb.db.View(func(tx *buntdb.Tx) error { // 获取key - key := getKeyFromNameAndType(routerIdentifier,lsaType) + key := getKeyFromNameAndType(routerIdentifier, lsaType) // 获取value - value, err := tx.Get(key) - if err != nil { - return err + value, err2 := tx.Get(key) + if err2 != nil { + common2.LogError("buntdb GetLSAByNameAndType get key error, because of ", err2.Error()) + return err2 } // 将value转为lsa - err = glsa.LoadFromJsonString([]byte(value)) - if err != nil { - return err + err2 = glsa.LoadFromJsonString([]byte(value)) + if err2 != nil { + common2.LogError("buntdb GetLSAByNameAndType load from json error, because of ", err2.Error()) + return err2 } return nil }) - return glsa,errRes + return glsa, errRes } // @@ -228,33 +246,36 @@ func (bdb *LsaContainer_BuntDB) GetLSAByNameAndType(routerIdentifier *component. // @return []lsa.ILsa // @return error // -func (bdb *LsaContainer_BuntDB) GetLSAsByType(lsaType lsa.LsaType) ([]lsa.ILsa,error) { +func (bdb *LsaContainer_BuntDB) GetLSAsByType(lsaType lsa.LsaType) ([]lsa.ILsa, error) { var lsas []lsa.ILsa - equalString := `{"LsaTypeInt":`+ strconv.Itoa(int(lsaType)) +`}` // 查找的类型 + equalString := `{"LsaTypeInt":` + strconv.Itoa(int(lsaType)) + `}` // 查找的类型 errRes := bdb.db.View(func(tx *buntdb.Tx) error { // 查找类型是lsaType的所有Lsa err := tx.AscendEqual("LsaType", equalString, func(key, value string) bool { // 构建一个Lsa - cacheLsa,err1 := newLsa(lsaType) - if err1!= nil{ + cacheLsa, err1 := newLsa(lsaType) + if err1 != nil { + common2.LogError("buntdb GetLSAsByType new lsa error, because of ", err1.Error()) return false } // 将查找到的lsajson放入该lsa err1 = cacheLsa.LoadFromJsonString([]byte(value)) - if err1!= nil{ + if err1 != nil { + common2.LogError("buntdb GetLSAsByType load from json error, because of ", err1.Error()) return false } // 将该lsa放入数组 - lsas = append(lsas,cacheLsa) + lsas = append(lsas, cacheLsa) return true }) - if err!=nil { + if err != nil { + common2.LogError("buntdb GetLSAsByType AscendEqual error, because of ", err.Error()) return err } return nil }) - return lsas,errRes + return lsas, errRes } // @@ -265,21 +286,22 @@ func (bdb *LsaContainer_BuntDB) GetLSAsByType(lsaType lsa.LsaType) ([]lsa.ILsa,e // @return []string // @return error // -func (bdb *LsaContainer_BuntDB) GetLSAKeysByType(lsaType lsa.LsaType) ([]string,error) { +func (bdb *LsaContainer_BuntDB) GetLSAKeysByType(lsaType lsa.LsaType) ([]string, error) { var keys []string - equalString := `{"LsaTypeInt":`+ strconv.Itoa(int(lsaType)) +`}` // 查找的类型 + equalString := `{"LsaTypeInt":` + strconv.Itoa(int(lsaType)) + `}` // 查找的类型 errRes := bdb.db.View(func(tx *buntdb.Tx) error { // 查找类型是lsaType的所有Lsa err := tx.AscendEqual("LsaType", equalString, func(key, value string) bool { // 将该lsa放入数组 - keys = append(keys,key) + keys = append(keys, key) return true }) - if err!=nil { + if err != nil { + common2.LogError("buntdb GetLSAKeysByType AscendEqual error, because of ", err.Error()) return err } return nil }) - return keys,errRes -} \ No newline at end of file + return keys, errRes +} diff --git a/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB_test.go b/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB_test.go index 7d07e48..73f9b8a 100644 --- a/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB_test.go +++ b/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB_test.go @@ -9,89 +9,182 @@ package buntdb import ( - "fmt" - "log" + common2 "minlib/common" "minlib/component" "mlsr/lsa" "testing" ) // -// TestLsaContainer_BuntDB_Emplace -// @Description: +// TestLsaContainer_BuntDB_Init +// @Description: 测试buntdb初始化 // @param t // -func TestLsaContainer_BuntDB_Emplace_Get_Erase(t *testing.T) { +func TestLsaContainer_BuntDB_Init(t *testing.T) { + // 构造LsaContainer + lsaContainer := new(LsaContainer_BuntDB) + err := lsaContainer.Init() + if err != nil { + common2.LogInfo("lsaContainer创建失败:", err.Error()) + } +} + +// +// TestLsaContainer_BuntDB_Emplace +// @Description: 测试插入 +// @param t +// +func TestLsaContainer_BuntDB_Emplace(t *testing.T) { // 构造NameLsa base := new(lsa.NameLsa) base.SetLsaExpirationTime(2000) base.SetLsaSequenceNumber(1234) - base.LsaOriginRouterIdentifier,_ = component.CreateIdentifierByString("/min/pku") - ident,_ := component.CreateIdentifierByString("/pku/routerfucker") - base.Insert(ident,"/bind") - base.Insert(ident,"/wechat") - ident,_ = component.CreateIdentifierByString("/pku/router") - base.Insert(ident,"/qq") - fmt.Println("ToString: "+base.ToString()) + base.LsaOriginRouterIdentifier, _ = component.CreateIdentifierByString("/min/pku") + ident, _ := component.CreateIdentifierByString("/pku/routerfucker") + base.Insert(ident, "/bind") + base.Insert(ident, "/wechat") + ident, _ = component.CreateIdentifierByString("/pku/router") + base.Insert(ident, "/qq") + common2.LogInfo("ToString: " + base.ToString()) // 构造LsaContainer lsaContainer := new(LsaContainer_BuntDB) err := lsaContainer.Init() - if err!=nil{ - log.Fatal("lsaContainer创建失败:",err.Error()) + if err != nil { + common2.LogInfo("lsaContainer创建失败:", err.Error()) } // 将NameLsa插入lsaContainer err = lsaContainer.Emplace(base) - if err!=nil{ - log.Fatal("lsaContainer存入lsa失败:",err.Error()) + if err != nil { + common2.LogInfo("lsaContainer存入名称lsa失败:", err.Error()) } - fmt.Println("lsaContainer存入lsa成功") + common2.LogInfo("lsaContainer存入名称lsa成功") +} + +// +// TestLsaContainer_BuntDB_Emplace_Get_Erase_Adj_Lsa +// @Description: 测试对邻接LSA进行增删改查 +// @param t +// +func TestLsaContainer_BuntDB_Emplace_Get_Erase_Adj_Lsa(t *testing.T) { + // 构造AdjLsa + base := new(lsa.AdjLsa) + base.SetLsaExpirationTime(2000) + base.SetLsaSequenceNumber(1234) + base.LsaOriginRouterIdentifier, _ = component.CreateIdentifierByString("/min/pku") + // 构造邻接信息部分 + // 先构造一个info + linkCost := lsa.AdjLsaLinkCost{} + linkCost.SetLinkCost(100) + faceUri := lsa.AdjLsaLogicFaceUri{} + faceUri.SetLogicFaceUri("uri") + faceId := lsa.AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden, _ := component.CreateIdentifierByString("/pku/router1") + adjInfo := lsa.NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) + base.Insert(adjInfo) + // 再加第二个info + iden2, _ := component.CreateIdentifierByString("/pku/router2") + adjInfo2 := lsa.NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden2, 111, 0) + base.Insert(adjInfo2) + + // 构造LsaContainer + lsaContainer := new(LsaContainer_BuntDB) + err := lsaContainer.Init() + if err != nil { + common2.LogInfo("lsaContainer创建失败:", err.Error()) + } + + // 将AdjLsa插入lsaContainer + err = lsaContainer.Emplace(base) + if err != nil { + common2.LogInfo("lsaContainer存入邻接lsa失败:", err.Error()) + } + common2.LogInfo("lsaContainer存入邻接lsa成功") +} + +// +// TestLsaContainer_BuntDB_Emplace +// @Description: 测试对名称LSA进行增删改查 +// @param t +// +func TestLsaContainer_BuntDB_Emplace_Get_Erase_Name_Lsa(t *testing.T) { + // 构造NameLsa + base := new(lsa.NameLsa) + base.SetLsaExpirationTime(2000) + base.SetLsaSequenceNumber(1234) + base.LsaOriginRouterIdentifier, _ = component.CreateIdentifierByString("/min/pku") + ident, _ := component.CreateIdentifierByString("/pku/routerfucker") + base.Insert(ident, "/bind") + base.Insert(ident, "/wechat") + ident, _ = component.CreateIdentifierByString("/pku/router") + base.Insert(ident, "/qq") + common2.LogInfo("ToString: " + base.ToString()) + + // 构造LsaContainer + lsaContainer := new(LsaContainer_BuntDB) + err := lsaContainer.Init() + if err != nil { + common2.LogInfo("lsaContainer创建失败:", err.Error()) + } + + // 将NameLsa插入lsaContainer + err = lsaContainer.Emplace(base) + if err != nil { + common2.LogInfo("lsaContainer存入名称lsa失败:", err.Error()) + } + common2.LogInfo("lsaContainer存入名称lsa成功") + + common2.LogInfo("fuck") + + //for true { + // time.Sleep(20000) + //} // 获取lsa - origin,_ := component.CreateIdentifierByString("/min/pku") - lsa,err := lsaContainer.GetLSAByNameAndType(origin,2) // 2表示namelsa - if err!=nil{ - log.Fatal("lsaContainer取出lsa失败:",err.Error()) + origin, _ := component.CreateIdentifierByString("/min/pku") + lsa, err := lsaContainer.GetLSAByNameAndType(origin, 2) // 2表示namelsa + if err != nil { + common2.LogInfo("lsaContainer取出名称lsa失败:", err.Error()) } - ss,_ := lsa.GetJsonString() - fmt.Println("lsa取出来:",string(ss)) + ss, _ := lsa.GetJsonString() + common2.LogInfo("lsa取出来:", string(ss)) // 再放入一个namelsa - base.LsaOriginRouterIdentifier,_ = component.CreateIdentifierByString("/min/pku111") + base.LsaOriginRouterIdentifier, _ = component.CreateIdentifierByString("/min/pku111") err = lsaContainer.Emplace(base) - if err!=nil{ - log.Fatal("lsaContainer存入lsa失败:",err.Error()) + if err != nil { + common2.LogInfo("lsaContainer存入名称lsa失败:", err.Error()) } - fmt.Println("lsaContainer存入lsa成功") + common2.LogInfo("lsaContainer存入名称lsa成功") // 取出所有namelsa - lsas,_ := lsaContainer.GetLSAsByType(2) - fmt.Print("取出所有namelsa:") - for i:=0;i Date: Thu, 26 May 2022 21:13:57 +0800 Subject: [PATCH 39/70] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E9=82=BB=E6=8E=A5LSA=E4=B8=8Ejson=E5=AD=97=E7=AC=A6=E4=B8=B2?= =?UTF-8?q?=E4=BA=92=E7=9B=B8=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsa/AdjLsa.go | 164 +++++++++++++++++++++++---- lsa/AdjLsaAdjacencyInfo.go | 66 +++++------ lsa/AdjLsaAdjacencyInfo_test.go | 46 ++++---- lsa/AdjLsaAdjacencyList_test.go | 74 ++++++------ lsa/AdjLsaLogicFaceUri.go | 8 +- lsa/AdjLsaLogicFaceUri_test.go | 6 +- lsa/AdjLsa_test.go | 86 +++++++++++--- lsa/NameLsa.go | 91 ++++++++------- route/RoutingTableCalculator_test.go | 9 ++ 9 files changed, 374 insertions(+), 176 deletions(-) create mode 100644 route/RoutingTableCalculator_test.go diff --git a/lsa/AdjLsa.go b/lsa/AdjLsa.go index 4ebd8dc..bd38ef1 100644 --- a/lsa/AdjLsa.go +++ b/lsa/AdjLsa.go @@ -9,30 +9,152 @@ package lsa import ( + "encoding/json" + "minlib/component" "minlib/encoding" "mlsr/extensions" ) +// +// AdjLsa +// @Description: 邻接LSA +// type AdjLsa struct { encoding.SelfEncodingBase LsaBase AdjLsaAdjacenctList } +// +// innerAdjLsa +// @Description: 内置结构体之:邻接LSA +// +type innerAdjLsa struct { + LsaTypeInt int + LsaOriginRouter string + LsaSequenceNumber uint64 + LsaExpirationTime uint64 + AdjacencyInfoList []innerAdjacencyInfo +} + +// +// innerAdjacencyInfo +// @Description: 内置结构体之:邻接信息 +// +type innerAdjacencyInfo struct { + LinkCost uint64 + LogicFaceUri string + LogicFaceId uint64 + NeighborRouter string + InterestTimedOutNo uint32 + Status int +} + +// +// parseAdjLsaToInner +// @Description: 邻接LSA转内置结构体 +// @param aLsa +// @return innerAdjLsa +// @return error +// +func parseAdjLsaToInner(aLsa *AdjLsa) (innerAdjLsa, error) { + innerALSA := innerAdjLsa{} + innerALSA.LsaTypeInt = int(aLsa.GetType()) + innerALSA.LsaOriginRouter = aLsa.LsaOriginRouterIdentifier.ToUri() + innerALSA.LsaSequenceNumber = aLsa.GetSeqNo() + innerALSA.LsaExpirationTime = aLsa.GetExpirationTime() + for i := 0; i < len(aLsa.lsaAdjacencys); i++ { + info := innerAdjacencyInfo{} + info.LinkCost = aLsa.lsaAdjacencys[i].LinkCost() + info.LogicFaceUri = aLsa.lsaAdjacencys[i].LogicFaceUri() + info.LogicFaceId = aLsa.lsaAdjacencys[i].LogicFaceId() + info.NeighborRouter = aLsa.lsaAdjacencys[i].lsaNeighborRouterIdentifier.ToUri() + info.InterestTimedOutNo = aLsa.lsaAdjacencys[i].InterestTimedOutNo + info.Status = aLsa.lsaAdjacencys[i].Status + innerALSA.AdjacencyInfoList = append(innerALSA.AdjacencyInfoList, info) + } + return innerALSA, nil +} + +// +// parseInnerToAdjLsa +// @Description: 内置结构体转邻接LSA +// @param inner +// @param alsa +// @return error +// +func parseInnerToAdjLsa(inner *innerAdjLsa, alsa *AdjLsa) error { + routerIdent, err := component.CreateIdentifierByString(inner.LsaOriginRouter) + if err != nil { + return err + } + alsa.SetOriginRouter(routerIdent) + alsa.SetSeqNo(inner.LsaSequenceNumber) + alsa.SetExpirationTime(inner.LsaExpirationTime) + for i := 0; i < len(inner.AdjacencyInfoList); i++ { + realInfo := new(AdjLsaAdjacencyInfo) + realInfo.SetLinkCost(inner.AdjacencyInfoList[i].LinkCost) + realInfo.SetLogicFaceUri(inner.AdjacencyInfoList[i].LogicFaceUri) + realInfo.SetLogicFaceId(inner.AdjacencyInfoList[i].LogicFaceId) + iden, err2 := component.CreateIdentifierByString( + inner.AdjacencyInfoList[i].NeighborRouter) + if err2 != nil { + return err2 + } + realInfo.SetNeighborRouterIdentifier(iden) + realInfo.InterestTimedOutNo = inner.AdjacencyInfoList[i].InterestTimedOutNo + realInfo.Status = inner.AdjacencyInfoList[i].Status + alsa.lsaAdjacencys = append(alsa.lsaAdjacencys, realInfo) + } + return nil +} + +// +// LoadFromJsonString +// @Description: 从json字符串中加载AdjLsa +// @receiver a +// @param jsonBytes +// @return error +// +func (a *AdjLsa) LoadFromJsonString(jsonBytes []byte) error { + // 转中间结构体 + inner := innerAdjLsa{} + err := json.Unmarshal(jsonBytes, &inner) + if err != nil { + return err + } + // 转实际结构体 + err = parseInnerToAdjLsa(&inner, a) + if err != nil { + return err + } + + return nil +} + +// +// GetJsonString +// @Description: AdjLsa转json +// @receiver a +// @return []byte +// @return error +// +func (a *AdjLsa) GetJsonString() ([]byte, error) { + innerAdjLsa, err := parseAdjLsaToInner(a) + if err != nil { + return nil, err + } + b, err := json.Marshal(innerAdjLsa) + if err != nil { + return nil, err + } + return b, nil +} + func (a *AdjLsa) GetType() LsaType { return LsaADJACENCYType } -func (a *AdjLsa) GetJsonString() ([]byte,error) { - // todo - return nil,nil -} - -func (a *AdjLsa) LoadFromJsonString(jsonBytes []byte) error{ - //todo - return nil -} - // // GetAdjList // @Description: 获取邻接信息表 @@ -89,22 +211,22 @@ func (a *AdjLsa) ToString() string { // @return int // @return error // -func (a *AdjLsa) WireEncode(encoder *encoding.Encoder) (int,error) { +func (a *AdjLsa) WireEncode(encoder *encoding.Encoder) (int, error) { totalLength := 0 // TLV-Value - tmpLen,err := a.AdjLsaAdjacenctList.WireEncode(encoder) + tmpLen, err := a.AdjLsaAdjacenctList.WireEncode(encoder) if err != nil { return 0, err } - totalLength+=tmpLen - tmpLen,err = a.LsaBase.WireEncode(encoder) + totalLength += tmpLen + tmpLen, err = a.LsaBase.WireEncode(encoder) if err != nil { return 0, err } - totalLength+=tmpLen + totalLength += tmpLen // TLV-Length - tmpLen,err = encoder.PrependVarNumber(encoding.VlInt(totalLength)) + tmpLen, err = encoder.PrependVarNumber(encoding.VlInt(totalLength)) if err != nil { return 0, err } @@ -117,7 +239,7 @@ func (a *AdjLsa) WireEncode(encoder *encoding.Encoder) (int,error) { } totalLength += tmpLen - return totalLength,nil + return totalLength, nil } // @@ -139,17 +261,17 @@ func (a *AdjLsa) WireDecode(block *encoding.Block) error { } // 提取参数 - for _, parameter := range block.GetSubElements(){ + for _, parameter := range block.GetSubElements() { switch parameter.GetType() { case extensions.TlvMlsrLsaBase: - if err:= a.LsaBase.WireDecode(parameter); err != nil { + if err := a.LsaBase.WireDecode(parameter); err != nil { return err } case extensions.TlvMlsrAdjLsaAdjacencyList: - if err:= a.AdjLsaAdjacenctList.WireDecode(parameter); err != nil { + if err := a.AdjLsaAdjacenctList.WireDecode(parameter); err != nil { return err } } } return nil -} \ No newline at end of file +} diff --git a/lsa/AdjLsaAdjacencyInfo.go b/lsa/AdjLsaAdjacencyInfo.go index 332f8bb..4a3eef5 100644 --- a/lsa/AdjLsaAdjacencyInfo.go +++ b/lsa/AdjLsaAdjacencyInfo.go @@ -16,19 +16,19 @@ import ( ) const ( - STATUS_UNKNOWN = -1 + STATUS_UNKNOWN = -1 STATUS_INACTIVE = 0 - STATUS_ACTIVE = 1 + STATUS_ACTIVE = 1 ) type AdjLsaAdjacencyInfo struct { - AdjLsaLinkCost // 两个路由器之间的链路成本 - AdjLsaLogicFaceUri // MIR层级对LogicFace的字符串描述,如udp://1.0.0.2,或ether:aa.aa.aa.aa... - AdjLsaLogicFaceId // MIR给LogicFace分配的uint64类型的id,如182828,nlsr可通过该id定位到哪个logicface负责传该链路数据 + AdjLsaLinkCost // 两个路由器之间的链路成本 + AdjLsaLogicFaceUri // MIR层级对LogicFace的字符串描述,如udp://1.0.0.2,或ether:aa.aa.aa.aa... + AdjLsaLogicFaceId // MIR给LogicFace分配的uint64类型的id,如182828,nlsr可通过该id定位到哪个logicface负责传该链路数据 lsaNeighborRouterIdentifier *component.Identifier // NLSR已配置的邻居路由器标识符,如/min/pkusz/group1/router1 - InterestTimedOutNo uint32 // 自从收到最后一个回复之后,记录已经失败的hello兴趣包的数目 - Status int // 表示邻居路由器的状态:未知-1、未激活0、激活1 + InterestTimedOutNo uint32 // 自从收到最后一个回复之后,记录已经失败的hello兴趣包的数目 + Status int // 表示邻居路由器的状态:未知-1、未激活0、激活1 } // @@ -45,7 +45,7 @@ func NewAdjLsaAdjacencyInfo(adjLsaLinkCost AdjLsaLinkCost, adjLsaLogicFaceUri Ad faceId AdjLsaLogicFaceId, m_lsaNeighborRouterIdentifier *component.Identifier, m_interestTimedOutNo uint32, m_status int) *AdjLsaAdjacencyInfo { return &AdjLsaAdjacencyInfo{AdjLsaLinkCost: adjLsaLinkCost, AdjLsaLogicFaceUri: adjLsaLogicFaceUri, - AdjLsaLogicFaceId: faceId,lsaNeighborRouterIdentifier: m_lsaNeighborRouterIdentifier, + AdjLsaLogicFaceId: faceId, lsaNeighborRouterIdentifier: m_lsaNeighborRouterIdentifier, InterestTimedOutNo: m_interestTimedOutNo, Status: m_status} } @@ -65,7 +65,7 @@ func NewAdjLsaAdjacencyInfoByInstance(adjLsaLinkCost *AdjLsaLinkCost, adjLsaLogi m_interestTimedOutNo uint32, m_status int) *AdjLsaAdjacencyInfo { adjRes := AdjLsaAdjacencyInfo{} adjRes.SetLinkCost(adjLsaLinkCost.LinkCost()) - adjRes.setLogicFaceUri(adjLsaLogicFaceUri.LogicFaceUri()) + adjRes.SetLogicFaceUri(adjLsaLogicFaceUri.LogicFaceUri()) adjRes.SetLogicFaceId(faceId.LogicFaceId()) adjRes.SetNeighborRouterIdentifier(m_lsaNeighborRouterIdentifier) adjRes.InterestTimedOutNo = m_interestTimedOutNo @@ -91,7 +91,7 @@ func (l *AdjLsaAdjacencyInfo) GetNeighborRouterIdentifier() *component.Identifie // func (l *AdjLsaAdjacencyInfo) SetNeighborRouterIdentifier(routerIdentifier *component.Identifier) { // todo: 验证identifier,如类型、字段是否为空等 - l.lsaNeighborRouterIdentifier= routerIdentifier + l.lsaNeighborRouterIdentifier = routerIdentifier } // @@ -103,7 +103,7 @@ func (l *AdjLsaAdjacencyInfo) SetNeighborRouterIdentifier(routerIdentifier *comp // func (l *AdjLsaAdjacencyInfo) Compare(routerIdentifier *component.Identifier) bool { // todo: 验证identifier,如类型、字段是否为空等 - if routerIdentifier.ToUri()==l.lsaNeighborRouterIdentifier.ToUri() { + if routerIdentifier.ToUri() == l.lsaNeighborRouterIdentifier.ToUri() { return true } return false @@ -117,7 +117,7 @@ func (l *AdjLsaAdjacencyInfo) Compare(routerIdentifier *component.Identifier) bo // @return bool // func (l *AdjLsaAdjacencyInfo) CompareLogicFaceUri(faceUri *AdjLsaLogicFaceUri) bool { - if faceUri.LogicFaceUri()==l.LogicFaceUri(){ + if faceUri.LogicFaceUri() == l.LogicFaceUri() { return true } return false @@ -131,7 +131,7 @@ func (l *AdjLsaAdjacencyInfo) CompareLogicFaceUri(faceUri *AdjLsaLogicFaceUri) b // @return bool // func (l *AdjLsaAdjacencyInfo) CompareLogicFaceUriString(faceUriString string) bool { - if faceUriString==l.LogicFaceUri(){ + if faceUriString == l.LogicFaceUri() { return true } return false @@ -145,7 +145,7 @@ func (l *AdjLsaAdjacencyInfo) CompareLogicFaceUriString(faceUriString string) bo // @return bool // func (l *AdjLsaAdjacencyInfo) CompareLogicFaceId(faceId uint64) bool { - if faceId==l.LogicFaceId(){ + if faceId == l.LogicFaceId() { return true } return false @@ -163,7 +163,7 @@ func (l *AdjLsaAdjacencyInfo) ToString() string { resString += ", LogicFaceUri: " resString += l.LogicFaceUri() resString += ", LogicFaceId: " - resString += strconv.FormatUint(l.LogicFaceId(),10) + resString += strconv.FormatUint(l.LogicFaceId(), 10) resString += ", NeighborRouterIdentifier: " resString += l.lsaNeighborRouterIdentifier.ToUri() resString += ", InterestTimedOutNo: " @@ -182,41 +182,41 @@ func (l *AdjLsaAdjacencyInfo) ToString() string { // @return int // @return error // -func (l *AdjLsaAdjacencyInfo) WireEncode(encoder *encoding.Encoder) (int,error) { +func (l *AdjLsaAdjacencyInfo) WireEncode(encoder *encoding.Encoder) (int, error) { totalLength := 0 // TLV-Value - if tmpLen,err := l.AdjLsaLinkCost.WireEncode(encoder); err!=nil{ + if tmpLen, err := l.AdjLsaLinkCost.WireEncode(encoder); err != nil { return 0, err - }else{ + } else { totalLength += tmpLen } - if tmpLen,err := l.AdjLsaLogicFaceUri.WireEncode(encoder); err!=nil{ + if tmpLen, err := l.AdjLsaLogicFaceUri.WireEncode(encoder); err != nil { return 0, err - }else{ + } else { totalLength += tmpLen } - if tmpLen,err := l.lsaNeighborRouterIdentifier.WireEncode(encoder); err!=nil{ + if tmpLen, err := l.lsaNeighborRouterIdentifier.WireEncode(encoder); err != nil { return 0, err - }else{ + } else { totalLength += tmpLen } // TLV-Length - if tmpLen,err := encoder.PrependVarNumber(encoding.VlInt(totalLength)); err!=nil{ + if tmpLen, err := encoder.PrependVarNumber(encoding.VlInt(totalLength)); err != nil { return 0, err - }else{ + } else { totalLength += tmpLen } // TLV-Type - if tmpLen,err := encoder.PrependVarNumber(extensions.TlvMlsrAdjLsaAdjacencyInfo); err!=nil{ + if tmpLen, err := encoder.PrependVarNumber(extensions.TlvMlsrAdjLsaAdjacencyInfo); err != nil { return 0, err - }else{ + } else { totalLength += tmpLen } - return totalLength,nil + return totalLength, nil } // @@ -238,23 +238,23 @@ func (l *AdjLsaAdjacencyInfo) WireDecode(block *encoding.Block) error { } // 提取参数 - for _, parameter := range block.GetSubElements(){ + for _, parameter := range block.GetSubElements() { switch parameter.GetType() { case encoding.TlvIdentifier: - iden:=component.Identifier{} - if err:= iden.WireDecode(parameter); err != nil { + iden := component.Identifier{} + if err := iden.WireDecode(parameter); err != nil { return err } l.lsaNeighborRouterIdentifier = &iden case extensions.TlvMlsrAdjLsaLogicFaceUri: - if err:= l.AdjLsaLogicFaceUri.WireDecode(parameter); err != nil { + if err := l.AdjLsaLogicFaceUri.WireDecode(parameter); err != nil { return err } case extensions.TlvMlsrAdjLsaLinkCost: - if err:= l.AdjLsaLinkCost.WireDecode(parameter); err != nil { + if err := l.AdjLsaLinkCost.WireDecode(parameter); err != nil { return err } } } return nil -} \ No newline at end of file +} diff --git a/lsa/AdjLsaAdjacencyInfo_test.go b/lsa/AdjLsaAdjacencyInfo_test.go index cf7dc21..8e8b77d 100644 --- a/lsa/AdjLsaAdjacencyInfo_test.go +++ b/lsa/AdjLsaAdjacencyInfo_test.go @@ -21,18 +21,18 @@ import ( // @param t // func TestNewAdjLsaAdjacencyInfo(t *testing.T) { - linkCost :=AdjLsaLinkCost{} + linkCost := AdjLsaLinkCost{} linkCost.SetLinkCost(100) faceUri := AdjLsaLogicFaceUri{} - faceUri.setLogicFaceUri("uri") - faceId :=AdjLsaLogicFaceId{} + faceUri.SetLogicFaceUri("uri") + faceId := AdjLsaLogicFaceId{} faceId.SetLogicFaceId(77) - iden,_ := component.CreateIdentifierByString("/pku/router") - adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) - fmt.Println("cost: ",adjInfo.LinkCost()) - fmt.Println("uri: ",adjInfo.LogicFaceUri()) - fmt.Println("id: ",adjInfo.LogicFaceId()) - fmt.Println("identifier: ",iden.ToUri()) + iden, _ := component.CreateIdentifierByString("/pku/router") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) + fmt.Println("cost: ", adjInfo.LinkCost()) + fmt.Println("uri: ", adjInfo.LogicFaceUri()) + fmt.Println("id: ", adjInfo.LogicFaceId()) + fmt.Println("identifier: ", iden.ToUri()) fmt.Println(adjInfo.ToString()) } @@ -43,16 +43,16 @@ func TestNewAdjLsaAdjacencyInfo(t *testing.T) { // func TestAdjLsaAdjacencyInfo_Compare(t *testing.T) { // 先构造 - linkCost :=AdjLsaLinkCost{} + linkCost := AdjLsaLinkCost{} linkCost.SetLinkCost(100) faceUri := AdjLsaLogicFaceUri{} - faceUri.setLogicFaceUri("uri") - faceId :=AdjLsaLogicFaceId{} + faceUri.SetLogicFaceUri("uri") + faceId := AdjLsaLogicFaceId{} faceId.SetLogicFaceId(77) - iden,_ := component.CreateIdentifierByString("/pku/router") - adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + iden, _ := component.CreateIdentifierByString("/pku/router") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) // 再测试:全部为true则pass - iden2,_ := component.CreateIdentifierByString("/pku/router") + iden2, _ := component.CreateIdentifierByString("/pku/router") fmt.Println(adjInfo.Compare(iden2)) fmt.Println(adjInfo.CompareLogicFaceId(77)) fmt.Println(adjInfo.CompareLogicFaceUriString("uri")) @@ -66,14 +66,14 @@ func TestAdjLsaAdjacencyInfo_Compare(t *testing.T) { // func TestAdjLsaAdjacencyInfo_WireEncode(t *testing.T) { // 先构造 - linkCost :=AdjLsaLinkCost{} + linkCost := AdjLsaLinkCost{} linkCost.SetLinkCost(100) faceUri := AdjLsaLogicFaceUri{} - faceUri.setLogicFaceUri("uri") - faceId :=AdjLsaLogicFaceId{} + faceUri.SetLogicFaceUri("uri") + faceId := AdjLsaLogicFaceId{} faceId.SetLogicFaceId(77) - iden,_ := component.CreateIdentifierByString("/pku/router") - adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + iden, _ := component.CreateIdentifierByString("/pku/router") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) // 构造编码器 encoder := encoding.Encoder{} @@ -95,8 +95,8 @@ func TestAdjLsaAdjacencyInfo_WireEncode(t *testing.T) { return } fmt.Println(cnt) - for i:=0;i < len(res);i++{ - fmt.Print(res[i],", ") + for i := 0; i < len(res); i++ { + fmt.Print(res[i], ", ") } fmt.Println() // 241, 1, 169, 33, 101, 19, 100, 2, 0, 47, 100, 4, 0, 112, 107, 117, 100, 7, 0, 114, 111, 117, 116, 101, 114, 241, 1, 168, 3, 117, 114, 105, 241, 1, 167, 1, 100, @@ -127,4 +127,4 @@ func TestAdjLsaAdjacencyInfo_WireDecode(t *testing.T) { return } fmt.Println(adjInfo.ToString()) -} \ No newline at end of file +} diff --git a/lsa/AdjLsaAdjacencyList_test.go b/lsa/AdjLsaAdjacencyList_test.go index df3bdcd..debe648 100644 --- a/lsa/AdjLsaAdjacencyList_test.go +++ b/lsa/AdjLsaAdjacencyList_test.go @@ -22,21 +22,21 @@ import ( // func TestAdjLsaAdjacenctList_GetAdjList(t *testing.T) { // 先构造一个info - linkCost :=AdjLsaLinkCost{} + linkCost := AdjLsaLinkCost{} linkCost.SetLinkCost(100) faceUri := AdjLsaLogicFaceUri{} - faceUri.setLogicFaceUri("uri") - faceId :=AdjLsaLogicFaceId{} + faceUri.SetLogicFaceUri("uri") + faceId := AdjLsaLogicFaceId{} faceId.SetLogicFaceId(77) - iden,_ := component.CreateIdentifierByString("/pku/router1") - adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + iden, _ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) // 构造Info列表 adjInfoList := new(AdjLsaAdjacenctList) adjInfoList.Insert(adjInfo) // 再加第二个info - iden2,_ := component.CreateIdentifierByString("/pku/router2") + iden2, _ := component.CreateIdentifierByString("/pku/router2") adjInfo.SetNeighborRouterIdentifier(iden2) adjInfoList.Insert(adjInfo) @@ -51,20 +51,20 @@ func TestAdjLsaAdjacenctList_GetAdjList(t *testing.T) { // func TestAdjLsaAdjacenctList_IsNeighbor(t *testing.T) { // 先构造一个info - linkCost :=AdjLsaLinkCost{} + linkCost := AdjLsaLinkCost{} linkCost.SetLinkCost(100) faceUri := AdjLsaLogicFaceUri{} - faceUri.setLogicFaceUri("uri") - faceId :=AdjLsaLogicFaceId{} + faceUri.SetLogicFaceUri("uri") + faceId := AdjLsaLogicFaceId{} faceId.SetLogicFaceId(77) - iden,_ := component.CreateIdentifierByString("/pku/router1") - adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + iden, _ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) adjInfoList := new(AdjLsaAdjacenctList) adjInfoList.Insert(adjInfo) // 测试某路由器是否是邻居节点 fmt.Println(adjInfoList.IsNeighbor(iden)) - iden2,_ := component.CreateIdentifierByString("/pku/router2") + iden2, _ := component.CreateIdentifierByString("/pku/router2") fmt.Println(adjInfoList.IsNeighbor(iden2)) } @@ -75,14 +75,14 @@ func TestAdjLsaAdjacenctList_IsNeighbor(t *testing.T) { // func TestAdjLsaAdjacenctList_IncrementTimedOutInterestCount(t *testing.T) { // 先构造一个info - linkCost :=AdjLsaLinkCost{} + linkCost := AdjLsaLinkCost{} linkCost.SetLinkCost(100) faceUri := AdjLsaLogicFaceUri{} - faceUri.setLogicFaceUri("uri") - faceId :=AdjLsaLogicFaceId{} + faceUri.SetLogicFaceUri("uri") + faceId := AdjLsaLogicFaceId{} faceId.SetLogicFaceId(77) - iden,_ := component.CreateIdentifierByString("/pku/router1") - adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + iden, _ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) adjInfoList := new(AdjLsaAdjacenctList) adjInfoList.Insert(adjInfo) @@ -105,14 +105,14 @@ func TestAdjLsaAdjacenctList_IncrementTimedOutInterestCount(t *testing.T) { // func TestAdjLsaAdjacenctList_GetStatusOfNeighbor(t *testing.T) { // 先构造一个info - linkCost :=AdjLsaLinkCost{} + linkCost := AdjLsaLinkCost{} linkCost.SetLinkCost(100) faceUri := AdjLsaLogicFaceUri{} - faceUri.setLogicFaceUri("uri") - faceId :=AdjLsaLogicFaceId{} + faceUri.SetLogicFaceUri("uri") + faceId := AdjLsaLogicFaceId{} faceId.SetLogicFaceId(77) - iden,_ := component.CreateIdentifierByString("/pku/router1") - adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + iden, _ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) adjInfoList := new(AdjLsaAdjacenctList) adjInfoList.Insert(adjInfo) @@ -120,7 +120,7 @@ func TestAdjLsaAdjacenctList_GetStatusOfNeighbor(t *testing.T) { fmt.Println(adjInfoList.GetStatusOfNeighbor(iden)) // 设置再获取 - adjInfoList.SetStatusOfNeighbor(iden,2) + adjInfoList.SetStatusOfNeighbor(iden, 2) fmt.Println(adjInfoList.GetStatusOfNeighbor(iden)) } @@ -131,14 +131,14 @@ func TestAdjLsaAdjacenctList_GetStatusOfNeighbor(t *testing.T) { // func TestAdjLsaAdjacenctList_FindAdjacencyByRouterIdentifier(t *testing.T) { // 先构造一个info - linkCost :=AdjLsaLinkCost{} + linkCost := AdjLsaLinkCost{} linkCost.SetLinkCost(100) faceUri := AdjLsaLogicFaceUri{} - faceUri.setLogicFaceUri("uri") - faceId :=AdjLsaLogicFaceId{} + faceUri.SetLogicFaceUri("uri") + faceId := AdjLsaLogicFaceId{} faceId.SetLogicFaceId(77) - iden,_ := component.CreateIdentifierByString("/pku/router1") - adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + iden, _ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) adjInfoList := new(AdjLsaAdjacenctList) adjInfoList.Insert(adjInfo) @@ -156,19 +156,19 @@ func TestAdjLsaAdjacenctList_FindAdjacencyByRouterIdentifier(t *testing.T) { // func TestAdjLsaAdjacenctList_WireEncode(t *testing.T) { // 先构造一个info - linkCost :=AdjLsaLinkCost{} + linkCost := AdjLsaLinkCost{} linkCost.SetLinkCost(100) faceUri := AdjLsaLogicFaceUri{} - faceUri.setLogicFaceUri("uri") - faceId :=AdjLsaLogicFaceId{} + faceUri.SetLogicFaceUri("uri") + faceId := AdjLsaLogicFaceId{} faceId.SetLogicFaceId(77) - iden,_ := component.CreateIdentifierByString("/pku/router1") - adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + iden, _ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) // 构造Info列表 adjInfoList := new(AdjLsaAdjacenctList) adjInfoList.Insert(adjInfo) // 再加第二个info - iden2,_ := component.CreateIdentifierByString("/pku/router2") + iden2, _ := component.CreateIdentifierByString("/pku/router2") adjInfo2 := AdjLsaAdjacencyInfo{ AdjLsaLinkCost: adjInfo.AdjLsaLinkCost, AdjLsaLogicFaceUri: adjInfo.AdjLsaLogicFaceUri, @@ -200,8 +200,8 @@ func TestAdjLsaAdjacenctList_WireEncode(t *testing.T) { return } fmt.Println(cnt) - for i:=0;i < len(res);i++{ - fmt.Print(res[i],", ") + for i := 0; i < len(res); i++ { + fmt.Print(res[i], ", ") } fmt.Println() } @@ -233,4 +233,4 @@ func TestAdjLsaAdjacenctList_WireDecode(t *testing.T) { return } fmt.Println(base.ToString()) -} \ No newline at end of file +} diff --git a/lsa/AdjLsaLogicFaceUri.go b/lsa/AdjLsaLogicFaceUri.go index 546247f..928fc97 100644 --- a/lsa/AdjLsaLogicFaceUri.go +++ b/lsa/AdjLsaLogicFaceUri.go @@ -33,12 +33,12 @@ func (l *AdjLsaLogicFaceUri) LogicFaceUri() string { } // -// setLogicFaceUri +// SetLogicFaceUri // @Description: 设置LogicFaceUri // @receiver l // @param logicFaceUri // -func (l *AdjLsaLogicFaceUri) setLogicFaceUri(logicFaceUri string) { +func (l *AdjLsaLogicFaceUri) SetLogicFaceUri(logicFaceUri string) { l.CommonString.SetValue(logicFaceUri) } @@ -50,7 +50,7 @@ func (l *AdjLsaLogicFaceUri) setLogicFaceUri(logicFaceUri string) { // @return int // @return error // -func (l *AdjLsaLogicFaceUri) WireEncode(encoder *encoding.Encoder) (int,error) { +func (l *AdjLsaLogicFaceUri) WireEncode(encoder *encoding.Encoder) (int, error) { l.CommonString.SetTlvType(extensions.TlvMlsrAdjLsaLogicFaceUri) return l.CommonString.WireEncode(encoder) } @@ -64,7 +64,7 @@ func (l *AdjLsaLogicFaceUri) WireEncode(encoder *encoding.Encoder) (int,error) { // func (l *AdjLsaLogicFaceUri) WireDecode(block *encoding.Block) error { // 检查type是否正确 - if err := encoding.ExpectType(block.GetType(),extensions.TlvMlsrAdjLsaLogicFaceUri); err!=nil { + if err := encoding.ExpectType(block.GetType(), extensions.TlvMlsrAdjLsaLogicFaceUri); err != nil { return err } return l.CommonString.WireDecode(block) diff --git a/lsa/AdjLsaLogicFaceUri_test.go b/lsa/AdjLsaLogicFaceUri_test.go index 1f7762a..24d347f 100644 --- a/lsa/AdjLsaLogicFaceUri_test.go +++ b/lsa/AdjLsaLogicFaceUri_test.go @@ -21,7 +21,7 @@ import ( // func TestAdjLsaLogicFaceUri_LogicFaceUri(t *testing.T) { testCPU := AdjLsaLogicFaceUri{} - testCPU.setLogicFaceUri("url") + testCPU.SetLogicFaceUri("url") fmt.Println(testCPU.LogicFaceUri()) } @@ -33,7 +33,7 @@ func TestAdjLsaLogicFaceUri_LogicFaceUri(t *testing.T) { func TestAdjLsaLogicFaceUri_WireEncode(t *testing.T) { testCPU := new(AdjLsaLogicFaceUri) fmt.Println(testCPU.LogicFaceUri()) - testCPU.setLogicFaceUri("url") + testCPU.SetLogicFaceUri("url") fmt.Println(testCPU.LogicFaceUri()) //testCPC.SetTlvType(5) fmt.Println(testCPU.Value()) @@ -72,7 +72,7 @@ func TestAdjLsaLogicFaceUri_WireDecode(t *testing.T) { fmt.Println("interest", testCPU.Value()) //testCPC.SetTlvType(5) fmt.Println(testCPU.TlvType()) - testCPU.setLogicFaceUri("url") + testCPU.SetLogicFaceUri("url") fmt.Println("interest", testCPU.Value()) fmt.Println("interest", testCPU.IsInitial()) var encoder encoding.Encoder diff --git a/lsa/AdjLsa_test.go b/lsa/AdjLsa_test.go index 6a36a6d..ee00f49 100644 --- a/lsa/AdjLsa_test.go +++ b/lsa/AdjLsa_test.go @@ -9,12 +9,64 @@ package lsa import ( + "encoding/json" "fmt" + common2 "minlib/common" "minlib/component" "minlib/encoding" "testing" ) +func TestAdjLsa_JsonConv(t *testing.T) { + // 构造基本部分 + base := new(AdjLsa) + base.SetLsaExpirationTime(2000) + base.SetLsaSequenceNumber(1234) + base.LsaOriginRouterIdentifier, _ = component.CreateIdentifierByString("/min/pku") + // 构造邻接信息部分 + // 先构造一个info + linkCost := AdjLsaLinkCost{} + linkCost.SetLinkCost(100) + faceUri := AdjLsaLogicFaceUri{} + faceUri.SetLogicFaceUri("uri") + faceId := AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden, _ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) + base.Insert(adjInfo) + // 再加第二个info + iden2, _ := component.CreateIdentifierByString("/pku/router2") + adjInfo2 := AdjLsaAdjacencyInfo{ + AdjLsaLinkCost: adjInfo.AdjLsaLinkCost, + AdjLsaLogicFaceUri: adjInfo.AdjLsaLogicFaceUri, + AdjLsaLogicFaceId: adjInfo.AdjLsaLogicFaceId, + lsaNeighborRouterIdentifier: iden2, + InterestTimedOutNo: 111, + Status: 0, + } + base.Insert(&adjInfo2) + // 打印该adjlsa + common2.LogInfo(base.ToString()) + + // 转byte[]类型的json + jsonBytes, err := json.Marshal(&base) + if err != nil { + common2.LogInfo("邻接LSA json 转换失败") + } + common2.LogInfo("直接用Marshal将邻接LSA为Json: " + string(jsonBytes)) + + jsonBytes, err = base.GetJsonString() + common2.LogInfo("通过中间结构体将邻接LSA转为json: " + string(jsonBytes)) + + // 从Json转回来 + newAdjLsa := new(AdjLsa) + err = newAdjLsa.LoadFromJsonString(jsonBytes) + if err != nil { + common2.LogInfo("邻接LSA json 转换失败") + } + common2.LogInfo("通过中间结构体将json转为邻接LSA: " + newAdjLsa.ToString()) +} + // // TestAdjLsa_New // @Description: 构造 @@ -25,20 +77,20 @@ func TestAdjLsa_New(t *testing.T) { base := new(AdjLsa) base.SetLsaExpirationTime(2000) base.SetLsaSequenceNumber(1234) - base.LsaOriginRouterIdentifier,_ = component.CreateIdentifierByString("/min/pku") + base.LsaOriginRouterIdentifier, _ = component.CreateIdentifierByString("/min/pku") // 构造邻接信息部分 // 先构造一个info - linkCost :=AdjLsaLinkCost{} + linkCost := AdjLsaLinkCost{} linkCost.SetLinkCost(100) faceUri := AdjLsaLogicFaceUri{} - faceUri.setLogicFaceUri("uri") - faceId :=AdjLsaLogicFaceId{} + faceUri.SetLogicFaceUri("uri") + faceId := AdjLsaLogicFaceId{} faceId.SetLogicFaceId(77) - iden,_ := component.CreateIdentifierByString("/pku/router1") - adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + iden, _ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) base.Insert(adjInfo) // 再加第二个info - iden2,_ := component.CreateIdentifierByString("/pku/router2") + iden2, _ := component.CreateIdentifierByString("/pku/router2") adjInfo2 := AdjLsaAdjacencyInfo{ AdjLsaLinkCost: adjInfo.AdjLsaLinkCost, AdjLsaLogicFaceUri: adjInfo.AdjLsaLogicFaceUri, @@ -63,20 +115,20 @@ func TestAdjLsa_WireEncode(t *testing.T) { base := new(AdjLsa) base.SetLsaExpirationTime(2000) base.SetLsaSequenceNumber(1234) - base.LsaOriginRouterIdentifier,_ = component.CreateIdentifierByString("/min/pku") + base.LsaOriginRouterIdentifier, _ = component.CreateIdentifierByString("/min/pku") // 构造邻接信息部分 // 先构造一个info - linkCost :=AdjLsaLinkCost{} + linkCost := AdjLsaLinkCost{} linkCost.SetLinkCost(100) faceUri := AdjLsaLogicFaceUri{} - faceUri.setLogicFaceUri("uri") - faceId :=AdjLsaLogicFaceId{} + faceUri.SetLogicFaceUri("uri") + faceId := AdjLsaLogicFaceId{} faceId.SetLogicFaceId(77) - iden,_ := component.CreateIdentifierByString("/pku/router1") - adjInfo := NewAdjLsaAdjacencyInfo(linkCost,faceUri,faceId,iden,123,1) + iden, _ := component.CreateIdentifierByString("/pku/router1") + adjInfo := NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) base.Insert(adjInfo) // 再加第二个info - iden2,_ := component.CreateIdentifierByString("/pku/router2") + iden2, _ := component.CreateIdentifierByString("/pku/router2") adjInfo2 := AdjLsaAdjacencyInfo{ AdjLsaLinkCost: adjInfo.AdjLsaLinkCost, AdjLsaLogicFaceUri: adjInfo.AdjLsaLogicFaceUri, @@ -107,8 +159,8 @@ func TestAdjLsa_WireEncode(t *testing.T) { return } fmt.Println(cnt) - for i:=0;i < len(res);i++{ - fmt.Print(res[i],", ") + for i := 0; i < len(res); i++ { + fmt.Print(res[i], ", ") } fmt.Println() } @@ -143,4 +195,4 @@ func TestAdjLsa_WireDecode(t *testing.T) { return } fmt.Println(base.ToString()) -} \ No newline at end of file +} diff --git a/lsa/NameLsa.go b/lsa/NameLsa.go index ca6a6db..5e17281 100644 --- a/lsa/NameLsa.go +++ b/lsa/NameLsa.go @@ -15,6 +15,10 @@ import ( "mlsr/extensions" ) +// +// NameLsa +// @Description: 名称LSA +// type NameLsa struct { encoding.SelfEncodingBase LsaBase @@ -23,19 +27,23 @@ type NameLsa struct { // // innerNameLsa -// @Description: 转json所用的中间结构体 +// @Description: 内置结构体之:名称LSA // type innerNameLsa struct { - LsaTypeInt int - LsaOriginRouter string + LsaTypeInt int + LsaOriginRouter string LsaSequenceNumber uint64 LsaExpirationTime uint64 - NamePrefixList []innerNamePrefixInfo + NamePrefixList []innerNamePrefixInfo } +// +// innerNamePrefixInfo +// @Description: 内置结构体之:名称前缀信息 +// type innerNamePrefixInfo struct { NamePrefix string - Sources []string + Sources []string } // @@ -45,19 +53,19 @@ type innerNamePrefixInfo struct { // @return innerNameLsa // @return error // -func parseNameLsaToInner(nLsa *NameLsa) (innerNameLsa,error) { +func parseNameLsaToInner(nLsa *NameLsa) (innerNameLsa, error) { innerNLSA := innerNameLsa{} innerNLSA.LsaTypeInt = int(nLsa.GetType()) innerNLSA.LsaOriginRouter = nLsa.LsaOriginRouterIdentifier.ToUri() innerNLSA.LsaSequenceNumber = nLsa.GetSeqNo() innerNLSA.LsaExpirationTime = nLsa.GetExpirationTime() - for i:=0;i Date: Thu, 26 May 2022 21:26:23 +0800 Subject: [PATCH 40/70] =?UTF-8?q?=E5=AF=B9LsaContainer=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E5=AD=98=E5=8F=96=E9=82=BB=E6=8E=A5LSA=E7=9A=84=E6=B5=8B?= =?UTF-8?q?=E8=AF=95=EF=BC=8C=E6=B5=8B=E8=AF=95=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../buntdb/LsaContainer_BuntDB_test.go | 68 +++++++++++++++++-- 1 file changed, 62 insertions(+), 6 deletions(-) diff --git a/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB_test.go b/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB_test.go index 73f9b8a..832484b 100644 --- a/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB_test.go +++ b/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB_test.go @@ -102,6 +102,68 @@ func TestLsaContainer_BuntDB_Emplace_Get_Erase_Adj_Lsa(t *testing.T) { common2.LogInfo("lsaContainer存入邻接lsa失败:", err.Error()) } common2.LogInfo("lsaContainer存入邻接lsa成功") + + // 尝试获取lsa + origin, _ := component.CreateIdentifierByString("/min/pku") + lsa, err := lsaContainer.GetLSAByNameAndType(origin, 2) // 2表示namelsa + if err != nil { + common2.LogInfo("lsaContainer取出名称lsa失败:", err.Error()) + } else { + ss, _ := lsa.GetJsonString() + common2.LogInfo("lsa取出来:", string(ss)) + } + + // 尝试获取邻接LSA + lsa, err = lsaContainer.GetLSAByNameAndType(origin, 1) + if err != nil { + common2.LogInfo("lsaContainer取出邻接lsa失败:", err.Error()) + } else { + ss, _ := lsa.GetJsonString() + common2.LogInfo("lsa取出来:", string(ss)) + } + + // 再放入一个不同来源路由的邻接lsa + base.LsaOriginRouterIdentifier, _ = component.CreateIdentifierByString("/min/thu") + err = lsaContainer.Emplace(base) + if err != nil { + common2.LogInfo("lsaContainer存入邻接lsa失败:", err.Error()) + } + common2.LogInfo("lsaContainer存入邻接lsa成功") + + // 取出所有namelsa + lsas, _ := lsaContainer.GetLSAsByType(2) + common2.LogInfo("取出所有namelsa:") + for i := 0; i < len(lsas); i++ { + common2.LogInfo(lsas[i].ToString()) + } + common2.LogInfo("") + + // 取出所有邻接lsa + lsas, _ = lsaContainer.GetLSAsByType(1) + common2.LogInfo("取出所有adjlsa:") + for i := 0; i < len(lsas); i++ { + common2.LogInfo(lsas[i].ToString()) + } + common2.LogInfo("") + + // 取出所有Namelsa的key + keys, _ := lsaContainer.GetLSAKeysByType(2) + common2.LogInfo("取出所有namelsa的key:", keys) + common2.LogInfo("") + + // 取出所有邻接lsa的key + keys, _ = lsaContainer.GetLSAKeysByType(1) + common2.LogInfo("取出所有邻接lsa的key:", keys) + common2.LogInfo("") + + // 删除base2 + _ = lsaContainer.EraseLsa(base) + lsas, _ = lsaContainer.GetLSAsByType(1) + common2.LogInfo("删除一个后,取出所有邻接LSA:") + for i := 0; i < len(lsas); i++ { + common2.LogInfo(lsas[i].ToString()) + } + common2.LogInfo("") } // @@ -136,12 +198,6 @@ func TestLsaContainer_BuntDB_Emplace_Get_Erase_Name_Lsa(t *testing.T) { } common2.LogInfo("lsaContainer存入名称lsa成功") - common2.LogInfo("fuck") - - //for true { - // time.Sleep(20000) - //} - // 获取lsa origin, _ := component.CreateIdentifierByString("/min/pku") lsa, err := lsaContainer.GetLSAByNameAndType(origin, 2) // 2表示namelsa From 381e1adbc9fb1b2a6152614dd0c1bbc98ab4ffd9 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 27 May 2022 19:24:06 +0800 Subject: [PATCH 41/70] =?UTF-8?q?=E5=B0=8F=E4=BF=AELSDB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/Lsdb.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index c84dad9..973f096 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -218,8 +218,8 @@ func (l *Lsdb) FindLsa(routerIdentifier *component.Identifier, // func (l *Lsdb) IsLsaNew(routerIdentifier *component.Identifier, lsaType lsa.LsaType, seqNo uint64) bool { - lsa := l.FindLsa(routerIdentifier, lsaType) - if lsa.GetSeqNo() >= seqNo { + iLsa := l.FindLsa(routerIdentifier, lsaType) + if iLsa.GetSeqNo() >= seqNo { return false } return true From 49432f82d1e0e7158c378b05dea980ff69b87ab3 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Mon, 30 May 2022 17:14:36 +0800 Subject: [PATCH 42/70] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=8B=A5=E5=B9=B2?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=E6=96=87=E4=BB=B6=EF=BC=88=E5=B0=9A=E6=9C=AA?= =?UTF-8?q?=E5=A1=AB=E5=85=85=EF=BC=89=EF=BC=9B=E5=AF=B9Scheduler=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E6=B5=8B=E8=AF=95=E5=B9=B6=E4=BF=AE=E5=A4=8DBUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/Lsdb.go | 4 +- lsdb/Lsdb_test.go | 5 + lsdb/Scheduler.go | 53 +++----- lsdb/Scheduler_test.go | 115 ++++++++++++++++++ route/LinkStateRoutingTableCalculator_test.go | 14 +++ route/RouterMap.go | 7 ++ route/RouterMap_test.go | 18 +++ route/RoutingTableCalculator_test.go | 16 +++ tests/goCron_test.go | 2 +- 9 files changed, 199 insertions(+), 35 deletions(-) create mode 100644 lsdb/Scheduler_test.go create mode 100644 route/LinkStateRoutingTableCalculator_test.go diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index 973f096..393850a 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -150,7 +150,9 @@ func (l *Lsdb) ScheduleAdjLsaBuild() { l.isBuildAdjLsaScheduled = true } // 安排构造邻接LSA - err := l.scheduler.ScheduleTaskAfterDuration(l.adjLsaBuildInterval, l.BuildAdjLsa) + job, err := l.scheduler.ScheduleTaskAfterDuration(l.adjLsaBuildInterval, 1).Do(l.BuildAdjLsa) + job.LimitRunsTo(1) + l.scheduler.StartAsync() if err != nil { common2.LogError("Scheduling Adjacency LSA build error, ", err.Error()) } diff --git a/lsdb/Lsdb_test.go b/lsdb/Lsdb_test.go index 49d76fd..1bc253a 100644 --- a/lsdb/Lsdb_test.go +++ b/lsdb/Lsdb_test.go @@ -7,3 +7,8 @@ // package lsdb + +import "testing" + +func TestLsdb_Init(t *testing.T) { +} diff --git a/lsdb/Scheduler.go b/lsdb/Scheduler.go index c693f1d..ecfe410 100644 --- a/lsdb/Scheduler.go +++ b/lsdb/Scheduler.go @@ -9,7 +9,6 @@ package lsdb import ( - "errors" "github.com/go-co-op/gocron" "time" ) @@ -28,6 +27,7 @@ type MlsrScheduler struct { // @receiver s // func (s *MlsrScheduler) Init() { + // UTC表示unix标准时间,与北京时区不同,但不影响任务执行 s.sche = gocron.NewScheduler(time.UTC) } @@ -36,19 +36,11 @@ func (s *MlsrScheduler) Init() { // @Description: 安排任务在一定时间后触发,触发一次 // @receiver s // @param dur 时间间隔 -// @param jobFun -// @param params -// @return error // -func (s *MlsrScheduler) ScheduleTaskAfterDuration(dur time.Duration, - jobFun interface{}, params ...interface{}) error { +func (s *MlsrScheduler) ScheduleTaskAfterDuration(dur time.Duration, intervalSeconds int) *gocron.Scheduler { timeRun := time.Now() timeRun = timeRun.Add(dur) - err := s.ScheduleRecurringTaskAtTime(timeRun, 100, 1, jobFun, params) - if err != nil { - return err - } - return nil + return s.scheduleRecurringTaskAtTime(timeRun, intervalSeconds) } // @@ -56,41 +48,36 @@ func (s *MlsrScheduler) ScheduleTaskAfterDuration(dur time.Duration, // @Description: 安排任务在某个时间执行一次 // @receiver s // @param timeRun 执行时间 -// @param jobFun 任务 -// @param params 任务参数 -// @return error // -func (s *MlsrScheduler) ScheduleTaskAtTime(timeRun time.Time, - jobFun interface{}, params ...interface{}) error { - err := s.ScheduleRecurringTaskAtTime(timeRun, 100, 1, jobFun, params) - if err != nil { - return err - } - return nil +func (s *MlsrScheduler) ScheduleTaskAtTime(timeRun time.Time, intervalSeconds int) *gocron.Scheduler { + return s.scheduleRecurringTaskAtTime(timeRun, intervalSeconds) } // -// ScheduleRecurringTaskAtTime +// scheduleRecurringTaskAtTime // @Description: 安排执行某次循环性任务 // @receiver s // @param timeRun 首次执行时间 // @param intervalSeconds 执行间隔(单位:秒) -// @param num 执行次数 -// @param jobFun 要执行的任务 -// @param params 任务参数 // -func (s *MlsrScheduler) ScheduleRecurringTaskAtTime(timeRun time.Time, intervalSeconds int, num int, - jobFun interface{}, params ...interface{}) error { +func (s *MlsrScheduler) scheduleRecurringTaskAtTime(timeRun time.Time, intervalSeconds int) *gocron.Scheduler { // 判断调度器是否还在正常运行 if (s.sche == nil) || (!s.sche.IsRunning()) { s.Init() } // 安排任务执行 - job, err := s.sche.Every(intervalSeconds).Seconds().StartAt(timeRun).Do(jobFun, params) - if err != nil { - return errors.New("ScheduleRecurringTaskAtTime error, " + err.Error()) - } - job.LimitRunsTo(num) + return s.sche.Every(intervalSeconds).Seconds().StartAt(timeRun) +} + +func (s *MlsrScheduler) StartAsync() { s.sche.StartAsync() - return nil +} + +// +// Close +// @Description: 关闭调度器 +// @receiver s +// +func (s *MlsrScheduler) Close() { + s.sche.Clear() } diff --git a/lsdb/Scheduler_test.go b/lsdb/Scheduler_test.go new file mode 100644 index 0000000..409471b --- /dev/null +++ b/lsdb/Scheduler_test.go @@ -0,0 +1,115 @@ +// Package lsdb +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/30 11:19 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package lsdb + +import ( + "fmt" + "github.com/go-co-op/gocron" + common2 "minlib/common" + "testing" + "time" +) + +func printHelloWithS(s string) { + fmt.Println("hello, ", s) +} + +func printHello() { + fmt.Println("hello! ") +} + +func testLuoTest() error { + timeRun := time.Now() + timeRun.Add(time.Second) + + sche := gocron.NewScheduler(time.UTC) + job, err := sche.Every(3).Seconds().StartAt(timeRun).Do(printHelloWithS, "fuck") + if err != nil { + fmt.Println(err) + } + job.LimitRunsTo(3) + sche.StartAsync() + return nil + //for true { + // time.Sleep(time.Second) + //} +} + +func testLuoTest2() error { + timeRun := time.Now() + timeRun.Add(time.Second) + + sche := gocron.NewScheduler(time.UTC) + job, err := sche.Every(3).Seconds().StartAt(timeRun).Do(printHelloWithS, "fuck2") + if err != nil { + fmt.Println(err) + } + job.LimitRunsTo(3) + sche.StartAsync() + return nil + //for true { + // time.Sleep(time.Second) + //} +} + +func TestMlsrScheduler_ScheduleTaskAfterDuration(t *testing.T) { + //_ = testLuoTest() + //_ = testLuoTest2() + //printHelloWithS("ddd") + //for true { + // time.Sleep(time.Second) + //} + + // 构造 + s := new(MlsrScheduler) + s.Init() + // 定时 + timeNow := time.Now() + timeNow = timeNow.Add(3 * time.Second) + //调度任务 + job, err := s.ScheduleTaskAfterDuration(time.Second, 3).Do(printHelloWithS, "sss") + job.LimitRunsTo(3) + s.StartAsync() + if err != nil { + fmt.Println("调度器调度任务测试失败, " + err.Error()) + return + } + for true { + time.Sleep(time.Second) + } + //关闭调度器 + s.Close() +} + +// +// TestMlsrScheduler_ScheduleTaskAtTime +// @Description: 测试调度器在指定时间执行任务 +// @param t +// +func TestMlsrScheduler_ScheduleTaskAtTime(t *testing.T) { + // 构造 + s := new(MlsrScheduler) + s.Init() + // 定时 + timeNow := time.Now() + timeNow = timeNow.Add(3 * time.Second) + // 调度任务 + job, err := s.ScheduleTaskAtTime(timeNow, 1).Do(printHello) + job.LimitRunsTo(3) + s.StartAsync() + if err != nil { + common2.LogFatal("调度器调度任务测试失败, " + err.Error()) + return + } + for true { + time.Sleep(time.Second) + } + // 关闭调度器 + s.Close() +} diff --git a/route/LinkStateRoutingTableCalculator_test.go b/route/LinkStateRoutingTableCalculator_test.go new file mode 100644 index 0000000..c09b219 --- /dev/null +++ b/route/LinkStateRoutingTableCalculator_test.go @@ -0,0 +1,14 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/5/30 10:57 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import "testing" + +func TestLinkStateRoutingTableCalculator_CalculatePath(t *testing.T) { +} diff --git a/route/RouterMap.go b/route/RouterMap.go index 8e64d20..a2f6719 100644 --- a/route/RouterMap.go +++ b/route/RouterMap.go @@ -54,6 +54,13 @@ func (m *RouterMap) Store(routerName *component.Identifier) { m.mapLock.Unlock() } +// +// CreateFromAdjLsdb +// @Description: 根据从LSDB中取出来的邻接LSA,进行RouterMap的生成 +// @receiver m +// @param lsas +// @return error +// func (m *RouterMap) CreateFromAdjLsdb(lsas []lsa.ILsa) error { for i := 0; i < len(lsas); i++ { // 1. 先将LSA解析为邻接LSA diff --git a/route/RouterMap_test.go b/route/RouterMap_test.go index 247fdf3..118c83f 100644 --- a/route/RouterMap_test.go +++ b/route/RouterMap_test.go @@ -10,10 +10,28 @@ package route import ( "fmt" + common2 "minlib/common" "minlib/component" + "mlsr/lsa" + "mlsr/lsdb" "testing" ) +func TestRouterMap_CreateFromAdjLsdb(t *testing.T) { + // 1. 构造LSDB + mLsdb := new(lsdb.Lsdb) + + // 2. 取出LSDB中的邻接LSA + lsas, err := mLsdb.GetLSAsByType(lsa.LsaADJACENCYType) + if err != nil { + common2.LogError("Get Lsa in calculateLsRoutingTable error, ", err) + } + // 3. 构造RouterMap + rMap := new(RouterMap) + rMap.Init() + err = rMap.CreateFromAdjLsdb(lsas) +} + // // TestRouterMap_Store // @Description: 测试RouterMap diff --git a/route/RoutingTableCalculator_test.go b/route/RoutingTableCalculator_test.go index 91b9b23..922d849 100644 --- a/route/RoutingTableCalculator_test.go +++ b/route/RoutingTableCalculator_test.go @@ -7,3 +7,19 @@ // package route + +import "testing" + +func TestRoutingTableCalculator_Init(t *testing.T) { + // 1. 路由计算器 + rtc := new(RoutingTableCalculator) + // 1.1 分配矩阵空间 + rtc.allocateAdjMatrix() + // 1.2 初始化矩阵 + rtc.initMatrix() + // 1.3 根据LSDB构造邻接矩阵 + + // 1.3.1 构造LSDB + // 1.3.2 构造RouterMap + +} diff --git a/tests/goCron_test.go b/tests/goCron_test.go index 1cdc403..10300a6 100644 --- a/tests/goCron_test.go +++ b/tests/goCron_test.go @@ -184,7 +184,7 @@ func Test_ScheduleAtTimes(t *testing.T) { // 设置一个触发时间 s := gocron.NewScheduler(time.UTC) //job, _ := s.Every(100).Seconds().StartAt(timeRun).Do(printHHHWithPara, "heiheihei") - job, _ := s.Every(100).Seconds().StartAt(timeRun).Do(printHHH) + job, _ := s.Every(3).Seconds().StartAt(timeRun).Do(printHHH) job.LimitRunsTo(3) s.StartAsync() fmt.Println("预定触发时间: ", job.ScheduledAtTime()) From b1fe878eb5908f9f90cb2d9747bed6b2ad69059d Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Mon, 30 May 2022 17:29:41 +0800 Subject: [PATCH 43/70] =?UTF-8?q?=E6=9B=B4=E6=96=B0RoutingTable=E4=B8=AD?= =?UTF-8?q?=E5=85=B3=E4=BA=8E=E4=BB=BB=E5=8A=A1=E8=B0=83=E5=BA=A6=E7=9A=84?= =?UTF-8?q?=E8=AF=AD=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/RoutingTable.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/route/RoutingTable.go b/route/RoutingTable.go index 6238e93..639ec36 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -123,10 +123,12 @@ func (t *RoutingTable) FindRoutingTableEntry(destRouter *component.Identifier) * func (t *RoutingTable) ScheduleRoutingTableCalculation() error { if !t.m_isRouteCalculationScheduled { common2.LogInfo("Scheduling routing table calculation in ", t.m_routingCalcInterval) - err := t.scheduler.ScheduleTaskAfterDuration(t.m_routingCalcInterval, t.Calculate) + job, err := t.scheduler.ScheduleTaskAfterDuration(t.m_routingCalcInterval, 1).Do(t.Calculate) if err != nil { return err } + job.LimitRunsTo(1) + t.scheduler.StartAsync() t.m_isRouteCalculationScheduled = true } return nil From 0dca6fd43f2b970b8eb3eea3850d6849dcb4fd1c Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 2 Jun 2022 17:37:45 +0800 Subject: [PATCH 44/70] =?UTF-8?q?=E6=B5=8B=E8=AF=95MlsrConfig=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E5=B0=86=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E6=A0=B7?= =?UTF-8?q?=E4=BE=8B=E6=94=BE=E7=BD=AE=E5=88=B0=E9=A1=B9=E7=9B=AE=E6=A0=B9?= =?UTF-8?q?=E7=9B=AE=E5=BD=95=E4=B8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/MlsrConfig.go | 3 +++ common/MlsrConfig_test.go | 30 +++++++++++++++++++++++++----- mlsrConf.ini | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 5 deletions(-) create mode 100644 mlsrConf.ini diff --git a/common/MlsrConfig.go b/common/MlsrConfig.go index eee6eb2..0fbc6b8 100644 --- a/common/MlsrConfig.go +++ b/common/MlsrConfig.go @@ -11,6 +11,7 @@ package common import ( "encoding/json" "gopkg.in/ini.v1" + common2 "minlib/common" ) const DefaultConfFileName = "mlsrConf.ini" @@ -225,6 +226,7 @@ func (c *MlsrConfig) Save() error { func ParseConfig(configPath string) (*MlsrConfig, error) { cfg, err := ini.Load(configPath) if err != nil { + common2.LogFatal("ParseConfig error, load error, path is ", configPath, err.Error()) return nil, err } mlsrConfig := new(MlsrConfig) @@ -233,6 +235,7 @@ func ParseConfig(configPath string) (*MlsrConfig, error) { mlsrConfig.Init() // 加载配置文件中的配置 if err = cfg.MapTo(&mlsrConfig); err != nil { + common2.LogFatal("ParseConfig error, mapTo error, path is ", configPath, err.Error()) return nil, err } if mlsrConfig.NeighborsInfo != "" { diff --git a/common/MlsrConfig_test.go b/common/MlsrConfig_test.go index 0a4a849..4ddbc98 100644 --- a/common/MlsrConfig_test.go +++ b/common/MlsrConfig_test.go @@ -25,6 +25,23 @@ func getCurrentDirectory() string { return dir } +// +// TestCreatConfigFile +// @Description: 测试生成mlsrConfig文件 +// @param t +// +func TestCreatConfigFile(t *testing.T) { + testPath := "D:" + testPath += "\\" + testPath += DefaultConfFileName + + mlsrConfig := new(MlsrConfig) + mlsrConfig.mlsrConfigPath = testPath + mlsrConfig.Init() + mlsrConfig.MlsrConfigParameters.Init(mlsrConfig) + _ = mlsrConfig.Save() +} + // // TestMlsrConfig_ParseConfigAndSave // @Description: 测试配置文件解析和存储 @@ -34,15 +51,18 @@ func TestMlsrConfig_ParseConfigAndSave(t *testing.T) { testPath := "D:" testPath += "\\" testPath += DefaultConfFileName - fmt.Println("test mlsr conf path: "+testPath) - mlsrConfig,_ := ParseConfig(testPath) + fmt.Println("test mlsr conf path: " + testPath) + mlsrConfig, err := ParseConfig(testPath) + if err != nil { + fmt.Println("配置文件加载错误") + } // 存储 fmt.Println(mlsrConfig) _ = mlsrConfig.Save() // 取出 - mlsrConfig2,_ := ParseConfig(testPath) + mlsrConfig2, _ := ParseConfig(testPath) fmt.Println(mlsrConfig2) // 解析neighbors @@ -50,11 +70,11 @@ func TestMlsrConfig_ParseConfigAndSave(t *testing.T) { fmt.Println(neighbors) // 修改再存 - ss:=NeighborConfig{ + ss := NeighborConfig{ NeighborName: "nei", LogicFaceUri: "uri", LinkCost: 0, } - mlsrConfig2.neighbors = append(mlsrConfig2.neighbors,ss) + mlsrConfig2.neighbors = append(mlsrConfig2.neighbors, ss) _ = mlsrConfig2.Save() } diff --git a/mlsrConf.ini b/mlsrConf.ini new file mode 100644 index 0000000..7d9d585 --- /dev/null +++ b/mlsrConf.ini @@ -0,0 +1,38 @@ +[General] +Network = /min +Site = /pkusz +Router = /routerA +LsaRefreshTime = 1800 +RouterDeadInterval = 3600 +LsaInterestLifetime = 4 +SyncProtocol = min-sync +SyncInterestLifetime = 60000 + +[Log] +LogLevel = INFO +ReportCaller = true +LogFormat = text +LogFilePath = + +[Neighbors] +HelloRetries = 3 +HelloTimeout = 1 +HelloInterval = 60 +AdjLsaBuildInterval = 10 +LogicFaceDatasetFetchRetries = 3 +LogicFaceDatasetFetchInterval = 3600 +NeighborsInfo = [{"NeighborName":"/routerB","LogicFaceUri":"tcp://1.1.1.1","LinkCost":10},{"NeighborName":"/routerC","LogicFaceUri":"tcp://1.1.1.0","LinkCost":10},{"NeighborName":"nei","LogicFaceUri":"uri","LinkCost":0}] + +[Hyperbolic] + +[Fib] +MaxLogicFacesPerPrefix = 0 +RoutingCalcInterval = 15 + +[Advertising] +Prefixs = /videos,/files,voices + +[Security] + +[MlsrConfigParameters] + From 997abd5f91cdd84ca1b1ee17e191e6bfe90ebcec Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 3 Jun 2022 14:09:52 +0800 Subject: [PATCH 45/70] =?UTF-8?q?=E5=AF=B9MlscConfig=E5=A2=9E=E5=8A=A0ToSt?= =?UTF-8?q?ring=EF=BC=8C=E5=B9=B6=E6=B5=8B=E8=AF=95=E9=80=9A=E8=BF=87MlsrC?= =?UTF-8?q?onfigParameters=E4=B8=AD=E5=85=B3=E4=BA=8E=E6=A0=87=E8=AF=86?= =?UTF-8?q?=E5=92=8C=E6=97=B6=E9=97=B4=E7=9A=84=E5=8F=82=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/MlsrConfig.go | 148 +++++++++++++++++++----- common/MlsrConfigParameters.go | 199 ++++++++++++++++++++++++++++----- common/MlsrConfig_test.go | 21 ++++ 3 files changed, 308 insertions(+), 60 deletions(-) diff --git a/common/MlsrConfig.go b/common/MlsrConfig.go index 0fbc6b8..1a3d057 100644 --- a/common/MlsrConfig.go +++ b/common/MlsrConfig.go @@ -12,6 +12,7 @@ import ( "encoding/json" "gopkg.in/ini.v1" common2 "minlib/common" + "strconv" ) const DefaultConfFileName = "mlsrConf.ini" @@ -36,28 +37,105 @@ type MlsrConfig struct { neighbors []NeighborConfig // NeighborsConfig中的信息 } +// +// ToString +// @Description: +// @receiver c +// +func (c *MlsrConfig) ToString() string { + var str string + str += "----------------------- MlsrConfig -------------------------\n" + str += "Config File Path: " + c.mlsrConfigPath + "\n" + str += "----------------- 1. GeneralConfig -------------------------\n" + bytes, err := json.Marshal(c.GeneralConfig) + if err == nil { + str += string(bytes) + "\n" + } + str += "----------------- 2. LogConfig -----------------------------\n" + bytes, err = json.Marshal(c.LogConfig) + if err == nil { + str += string(bytes) + "\n" + } + str += "----------------- 3. NeighborsConfig -----------------------\n" + bytes, err = json.Marshal(c.NeighborsConfig) + if err == nil { + str += string(bytes) + "\n" + } + str += "----------------- 4. HyperbolicConfig ----------------------\n" + bytes, err = json.Marshal(c.HyperbolicConfig) + if err == nil { + str += string(bytes) + "\n" + } + str += "----------------- 5. FibConfig -----------------------------\n" + bytes, err = json.Marshal(c.FibConfig) + if err == nil { + str += string(bytes) + "\n" + } + str += "----------------- 6. AdvertisingConfig ---------------------\n" + bytes, err = json.Marshal(c.AdvertisingConfig) + if err == nil { + str += string(bytes) + "\n" + } + str += "----------------- 7. SecurityConfig ------------------------\n" + bytes, err = json.Marshal(c.SecurityConfig) + if err == nil { + str += string(bytes) + "\n" + } + str += "\n" + return str +} + +func (c *MlsrConfig) ParametersToString() string { + var str string + str += "----------------------- MlsrConfigParameters -------------------------\n" + str += "----------------------- 1. 标识符 -------------------------------------\n" + str += "路由器定位符:" + c.MlsrConfigParameters.m_routerName.ToUri() + "\n" + str += "网域定位符:" + c.MlsrConfigParameters.m_siteName.ToUri() + "\n" + str += "网络定位符:" + c.MlsrConfigParameters.m_network.ToUri() + "\n" + str += "路由器前缀:" + c.MlsrConfigParameters.m_routerPrefix.ToUri() + "\n" + str += "同步用户前缀:" + c.MlsrConfigParameters.m_syncUserPrefix.ToUri() + "\n" + str += "同步前缀:" + c.MlsrConfigParameters.m_syncPrefix.ToUri() + "\n" + str += "LSA前缀:" + c.MlsrConfigParameters.m_lsaPrefix.ToUri() + "\n" + str += "----------------------- 2. 时间 ---------------------------------------\n" + str += "LSA刷新时间:" + strconv.Itoa(int(c.MlsrConfigParameters.m_lsaRefreshTime.Seconds())) + " " + + "秒 = " + strconv.Itoa(int(c.MlsrConfigParameters.m_lsaRefreshTime.Seconds())/60) + "分钟\n" + str += "LSA兴趣包生命周期:" + strconv.Itoa(int(c.MlsrConfigParameters.m_lsaInterestLifetime.Seconds())) + " 秒" + "\n" + str += "路由器死亡间隔:" + strconv.Itoa(int(c.MlsrConfigParameters.m_routerDeadInterval.Seconds())) + " " + + "秒 = " + strconv.Itoa(int(c.MlsrConfigParameters.m_routerDeadInterval.Seconds())/60) + "分钟\n" + str += "同步兴趣包生命周期:" + strconv.Itoa(int(c.MlsrConfigParameters.m_syncInterestLifetime.Seconds())) + " 秒" + "\n" + + str += "hello超时时间:" + strconv.Itoa(int(c.MlsrConfigParameters.m_helloTimeout.Seconds())) + " 秒" + "\n" + str += "hello发送间隔:" + strconv.Itoa(int(c.MlsrConfigParameters.m_helloInterval.Seconds())) + " 秒" + "\n" + str += "邻接LSA构建间隔:" + strconv.Itoa(int(c.MlsrConfigParameters.m_adjLsaBuildInterval.Seconds())) + " 秒" + "\n" + str += "LogicFace数据集请求间隔:" + strconv.Itoa(int(c.MlsrConfigParameters.m_faceDatasetFetchInterval.Seconds())) + " " + + "秒 = " + strconv.Itoa(int(c.MlsrConfigParameters.m_faceDatasetFetchInterval.Seconds())/60) + "分钟\n" + str += "路由计算间隔:" + strconv.Itoa(int(c.MlsrConfigParameters.m_RoutingCalcInterval.Seconds())) + " 秒" + "\n" + str += "\n" + return str +} + // // GeneralConfig -// @Description: 最基础配置信息:LSA、同步协议 +// @Description: 一、最基础配置信息:LSA、同步协议 // type GeneralConfig struct { Network string `ini:"Network"` // 所属网络 Site string `ini:"Site"` // 所属站点 Router string `ini:"Router"` // 所属路由器 - LsaRefreshTime uint32 `ini:"LsaRefreshTime"` // LSA刷新时间 + LsaRefreshTime uint32 `ini:"LsaRefreshTime"` // LSA刷新时间【单位:毫秒】 - RouterDeadInterval uint32 `ini:"RouterDeadInterval"` // 路由器判断死亡的时间间隔(必须大于LSA刷新时间) + RouterDeadInterval uint32 `ini:"RouterDeadInterval"` // 路由器判断死亡的时间间隔(必须大于LSA刷新时间)【单位:毫秒】 LsaInterestLifetime int `ini:"LsaInterestLifetime"` // LSA兴趣包生存周期。当使用推式包时,此值无效【单位:毫秒】 SyncProtocol string `ini:"SyncProtocol"` // 同步协议 - SyncInterestLifetime uint32 `ini:"SyncInterestLifetime"` // 同步协议兴趣包生命周期 + SyncInterestLifetime uint32 `ini:"SyncInterestLifetime"` // 同步协议兴趣包生命周期【单位:毫秒】 } // // LogConfig -// @Description: 日志模块 +// @Description: 二、日志模块 // type LogConfig struct { LogLevel string `ini:"LogLevel"` // 日志等级 @@ -68,14 +146,14 @@ type LogConfig struct { // // NeighborsConfig -// @Description: 邻居路由器相关配置 +// @Description: 三、邻居路由器相关配置 // type NeighborsConfig struct { - HelloRetries int `ini:"HelloRetries"` // hello协议探测最大次数 - HelloTimeout uint32 `ini:"HelloTimeout"` // hello协议中的超时时间 - HelloInterval uint32 `ini:"HelloInterval"` // 两个hello包之间的间隔时间 + HelloRetries int `ini:"HelloRetries"` // hello协议探测最大次数【单位:毫秒】 + HelloTimeout uint32 `ini:"HelloTimeout"` // hello协议中的超时时间【单位:毫秒】 + HelloInterval uint32 `ini:"HelloInterval"` // 两个hello包之间的间隔时间【单位:毫秒】 - AdjLsaBuildInterval uint32 `ini:"AdjLsaBuildInterval"` // 邻接LSA构建的时间间隔 + AdjLsaBuildInterval uint32 `ini:"AdjLsaBuildInterval"` // 邻接LSA构建的时间间隔【单位:毫秒】 LogicFaceDatasetFetchRetries uint32 `ini:"LogicFaceDatasetFetchRetries"` // 获取FaceStatus数据集的重试次数 LogicFaceDatasetFetchInterval uint32 `ini:"LogicFaceDatasetFetchInterval"` // FaceStatus数据集获取尝试之间的间隔【单位:毫秒】 @@ -124,24 +202,32 @@ func parseJsonStringToNeighbors(jsonString NeighborsJsonString) ([]NeighborConfi // // HyperbolicConfig -// @Description: 预留双曲坐标的接口 +// @Description: 四、预留双曲坐标的配置 // type HyperbolicConfig struct { } // // FibConfig -// @Description: 路由计算相关配置 +// @Description: 五、路由计算与FIB更新相关配置 // type FibConfig struct { MaxLogicFacesPerPrefix int `ini:"MaxLogicFacesPerPrefix"` // 每个前缀对应的下一跳face列表的最大数目 - RoutingCalcInterval uint32 `ini:"RoutingCalcInterval"` // 两次路由计算的时间间隔 + RoutingCalcInterval uint32 `ini:"RoutingCalcInterval"` // 两次路由计算的时间间隔【单位:毫秒】 } +// +// AdvertisingConfig +// @Description: 六、需要通告给其它路由器的前缀 +// type AdvertisingConfig struct { Prefixs []string `ini:"Prefixs"` // 需要广告给其他路由器的本机前缀 } +// +// SecurityConfig +// @Description: 七、预留安全相关的配置 +// type SecurityConfig struct { } @@ -151,29 +237,29 @@ type SecurityConfig struct { // @receiver c // func (c *MlsrConfig) Init() { - // 通用配置参数 + // 1. 通用配置参数 c.GeneralConfig.Network = "/min" c.GeneralConfig.Site = "/pkusz" c.GeneralConfig.Router = "/routerA" - c.GeneralConfig.LsaRefreshTime = 1800 // 240-7200 - c.GeneralConfig.RouterDeadInterval = 2 * c.GeneralConfig.LsaRefreshTime - c.GeneralConfig.LsaInterestLifetime = 4 // 4-60 + c.GeneralConfig.LsaRefreshTime = 30 * 60 * 1000 // 60*4-60*120,范围是4分钟-2小时。默认半小时 + c.GeneralConfig.RouterDeadInterval = 2 * c.GeneralConfig.LsaRefreshTime // 默认一小时 + c.GeneralConfig.LsaInterestLifetime = 4 * 1000 // 4-60,范围是4秒钟到1分钟。默认4秒钟 c.GeneralConfig.SyncProtocol = "min-sync" - c.GeneralConfig.SyncInterestLifetime = 60000 // 1000-120000 + c.GeneralConfig.SyncInterestLifetime = 60 * 1000 // 1000-120*1000,范围是1秒到2分钟。默认1分钟 - // Log + // 2. Log c.LogConfig.LogLevel = "INFO" c.LogConfig.ReportCaller = true c.LogConfig.LogFormat = "text" c.LogConfig.LogFilePath = "" - // 邻居路由器配置参数 - c.NeighborsConfig.HelloRetries = 3 // 1-15 - c.NeighborsConfig.HelloTimeout = 1 // 1-15 - c.NeighborsConfig.HelloInterval = 60 // 30-90 - c.NeighborsConfig.AdjLsaBuildInterval = 10 // 5-30 - c.NeighborsConfig.LogicFaceDatasetFetchRetries = 3 // 1-10 - c.NeighborsConfig.LogicFaceDatasetFetchInterval = 3600 // 1800-5400 + // 3. 邻居路由器配置参数 + c.NeighborsConfig.HelloRetries = 3 // 1-15,次数 + c.NeighborsConfig.HelloTimeout = 1 * 1000 // 1-15,超时时间,范围1秒-15秒。默认1秒钟 + c.NeighborsConfig.HelloInterval = 60 * 1000 // 30-90,间隔时间,范围30秒到1分钟。默认1分钟 + c.NeighborsConfig.AdjLsaBuildInterval = 10 * 1000 // 5-30,构建间隔,范围5秒到30秒。默认10秒钟 + c.NeighborsConfig.LogicFaceDatasetFetchRetries = 3 // 1-10,次数 + c.NeighborsConfig.LogicFaceDatasetFetchInterval = 60 * 60 * 1000 // 30*60-90*60,半小时到一个半小时。默认1小时 // 将邻居链路信息存储到配置文件中 todo:用于测试 neighborConfig1 := NeighborConfig{ NeighborName: "/routerB", @@ -190,11 +276,11 @@ func (c *MlsrConfig) Init() { //c.NeighborsConfig.NeighborsInfo=neighborsJsonString c.neighbors = []NeighborConfig{neighborConfig1, neighborConfig2} - // 路由计算配置参数 - c.FibConfig.MaxLogicFacesPerPrefix = 0 // 0-60 todo:为啥默认是0呢 - c.FibConfig.RoutingCalcInterval = 15 // 0-15 + // 5. FIB更新配置参数 + c.FibConfig.MaxLogicFacesPerPrefix = 0 // 0-60,个数,最多有多少个下一跳。置0表示保留所有计算出的下一跳 + c.FibConfig.RoutingCalcInterval = 15 * 1000 // 0-15,路由计算间隔。默认15秒计算一次 - // 广播本地前缀配置参数 + // 6. 广播本地前缀配置参数 c.AdvertisingConfig.Prefixs = []string{"/videos", "/files", "voices"} // todo:用于测试 } @@ -233,7 +319,7 @@ func ParseConfig(configPath string) (*MlsrConfig, error) { mlsrConfig.mlsrConfigPath = configPath // 初始化配置,给所有的配置项设置默认值 mlsrConfig.Init() - // 加载配置文件中的配置 + // 加载配置文件中的配置:如果有,则理应覆盖Init中设置的默认配置 if err = cfg.MapTo(&mlsrConfig); err != nil { common2.LogFatal("ParseConfig error, mapTo error, path is ", configPath, err.Error()) return nil, err diff --git a/common/MlsrConfigParameters.go b/common/MlsrConfigParameters.go index 4ca79d3..4e5c734 100644 --- a/common/MlsrConfigParameters.go +++ b/common/MlsrConfigParameters.go @@ -32,14 +32,20 @@ type MlsrConfigParameters struct { m_syncPrefix *component.Identifier m_lsaPrefix *component.Identifier - m_lsaRefreshTime time.Duration - m_adjLsaBuildInterval time.Duration - - // 路由器死亡时间(经过了该时间,NameLsa将触发超时) - m_routerDeadInterval time.Duration + // 时间:通用配置 + m_lsaRefreshTime time.Duration + m_lsaInterestLifetime time.Duration + m_routerDeadInterval time.Duration // 路由器死亡时间(经过了该时间,NameLsa将触发超时) + m_syncInterestLifetime time.Duration + // 时间:邻居路由器 + m_helloTimeout time.Duration + m_helloInterval time.Duration + m_adjLsaBuildInterval time.Duration m_faceDatasetFetchInterval time.Duration - m_lsaInterestLifetime time.Duration + + // 时间:FIB更新 + m_RoutingCalcInterval time.Duration } // MlsrConfig初始化 @@ -49,6 +55,8 @@ func (mcp *MlsrConfigParameters) Init(config *MlsrConfig) { _ = mcp.build3Prefix() _ = mcp.buildSyncAndLsaPrefix() _ = mcp.buildRouterAndSyncUserPrefix() + // 构建时间间隔 + mcp.genDurations() } // @@ -61,19 +69,32 @@ func (mcp *MlsrConfigParameters) setMetaData(config *MlsrConfig) { mcp.mlsrconf = config } +// +// genDurations +// @Description: 生成时间相关配置信息 +// @receiver mcp +// func (mcp *MlsrConfigParameters) genDurations() { mcp.m_lsaRefreshTime = time.Duration(mcp.mlsrconf.LsaRefreshTime) * time.Millisecond - mcp.m_adjLsaBuildInterval = - time.Duration(mcp.mlsrconf.AdjLsaBuildInterval) * time.Millisecond - - mcp.m_routerDeadInterval = - time.Duration(mcp.mlsrconf.RouterDeadInterval) * time.Millisecond - - mcp.m_faceDatasetFetchInterval = - time.Duration(mcp.mlsrconf.LogicFaceDatasetFetchInterval) * time.Millisecond mcp.m_lsaInterestLifetime = time.Duration(mcp.mlsrconf.LsaInterestLifetime) * time.Millisecond + mcp.m_routerDeadInterval = + time.Duration(mcp.mlsrconf.RouterDeadInterval) * time.Millisecond + mcp.m_syncInterestLifetime = + time.Duration(mcp.mlsrconf.SyncInterestLifetime) * time.Millisecond + + mcp.m_helloTimeout = + time.Duration(mcp.mlsrconf.HelloTimeout) * time.Millisecond + mcp.m_helloInterval = + time.Duration(mcp.mlsrconf.HelloInterval) * time.Millisecond + mcp.m_adjLsaBuildInterval = + time.Duration(mcp.mlsrconf.AdjLsaBuildInterval) * time.Millisecond + mcp.m_faceDatasetFetchInterval = + time.Duration(mcp.mlsrconf.LogicFaceDatasetFetchInterval) * time.Millisecond + + mcp.m_RoutingCalcInterval = + time.Duration(mcp.mlsrconf.RoutingCalcInterval) * time.Millisecond } // @@ -137,30 +158,72 @@ func (mcp *MlsrConfigParameters) buildRouterAndSyncUserPrefix() error { return nil } +// +// GetNetwork +// @Description: 网络定位符 +// @receiver mcp +// @return *component.Identifier +// func (mcp *MlsrConfigParameters) GetNetwork() *component.Identifier { return mcp.m_network } +// +// GetSiteName +// @Description:网域定位符 +// @receiver mcp +// @return *component.Identifier +// func (mcp *MlsrConfigParameters) GetSiteName() *component.Identifier { return mcp.m_siteName } +// +// GetRouterName +// @Description: 路由器定位符 +// @receiver mcp +// @return *component.Identifier +// func (mcp *MlsrConfigParameters) GetRouterName() *component.Identifier { return mcp.m_routerName } +// +// GetRouterPrefix +// @Description: 路由器前缀 +// @receiver mcp +// @return *component.Identifier +// func (mcp *MlsrConfigParameters) GetRouterPrefix() *component.Identifier { return mcp.m_routerPrefix } +// +// GetSyncUserPrefix +// @Description: 同步用户前缀 +// @receiver mcp +// @return *component.Identifier +// func (mcp *MlsrConfigParameters) GetSyncUserPrefix() *component.Identifier { return mcp.m_syncUserPrefix } +// +// GetSyncPrefix +// @Description: 同步前缀 +// @receiver mcp +// @return *component.Identifier +// func (mcp *MlsrConfigParameters) GetSyncPrefix() *component.Identifier { return mcp.m_syncPrefix } +// +// GetLsaPrefix +// @Description: LSA前缀 +// @receiver mcp +// @return *component.Identifier +// func (mcp *MlsrConfigParameters) GetLsaPrefix() *component.Identifier { return mcp.m_lsaPrefix } @@ -169,38 +232,120 @@ func (mcp *MlsrConfigParameters) GetSyncProtocol() { // todo } +// +// GetLsaRefreshTime +// @Description: LSA刷新时间 +// @receiver mcp +// @return time.Duration +// func (mcp *MlsrConfigParameters) GetLsaRefreshTime() time.Duration { return mcp.m_lsaRefreshTime } +// +// GetLsaInterestLifetime +// @Description: LSA兴趣包生命周期 +// @receiver mcp +// @return time.Duration +// func (mcp *MlsrConfigParameters) GetLsaInterestLifetime() time.Duration { return mcp.m_lsaInterestLifetime } -func (mcp *MlsrConfigParameters) GetAdjLsaBuildInterval() time.Duration { - return mcp.m_adjLsaBuildInterval -} - -func (mcp *MlsrConfigParameters) GetRoutingCalcInterval() uint32 { - return mcp.mlsrconf.RoutingCalcInterval -} - +// +// GetRouterDeadInterval +// @Description: 路由器死亡间隔 +// @receiver mcp +// @return time.Duration +// func (mcp *MlsrConfigParameters) GetRouterDeadInterval() time.Duration { return mcp.m_routerDeadInterval } -func (mcp *MlsrConfigParameters) GetFaceDatasetFetchTries() uint32 { - return mcp.mlsrconf.LogicFaceDatasetFetchRetries +// +// GetSyncInterestLifetime +// @Description: 同步兴趣包生命周期 +// @receiver mcp +// @return time.Duration +// +func (mcp *MlsrConfigParameters) GetSyncInterestLifetime() time.Duration { + return mcp.m_syncInterestLifetime } +// +// GetAdjLsaBuildInterval +// @Description: 邻接LSA构建间隔 +// @receiver mcp +// @return time.Duration +// +func (mcp *MlsrConfigParameters) GetAdjLsaBuildInterval() time.Duration { + return mcp.m_adjLsaBuildInterval +} + +// +// GetFaceDatasetFetchInterval +// @Description: LogicFace数据集请求间隔 +// @receiver mcp +// @return time.Duration +// func (mcp *MlsrConfigParameters) GetFaceDatasetFetchInterval() time.Duration { return mcp.m_faceDatasetFetchInterval } -func (mcp *MlsrConfigParameters) GetInterestRetryNumber() int { +// +// GetRoutingCalcInterval +// @Description: 路由计算间隔 +// @receiver mcp +// @return time.Duration +// +func (mcp *MlsrConfigParameters) GetRoutingCalcInterval() time.Duration { + return mcp.m_RoutingCalcInterval +} + +// +// GetFaceDatasetFetchTries +// @Description: LogicFace数据集请求次数 +// @receiver mcp +// @return int +// +func (mcp *MlsrConfigParameters) GetFaceDatasetFetchTries() uint32 { + return mcp.mlsrconf.LogicFaceDatasetFetchRetries +} + +// +// GetHelloRetries +// @Description: hello兴趣包重传次数 +// @receiver mcp +// @return int +// +func (mcp MlsrConfigParameters) GetHelloRetries() int { return mcp.mlsrconf.HelloRetries } +// +// GetHelloTimeout +// @Description: Hello超时时间 +// @receiver mcp +// @return time.Duration +// +func (mcp *MlsrConfigParameters) GetHelloTimeout() time.Duration { + return mcp.m_helloTimeout +} + +// +// GetHelloInterval +// @Description: Hello重传间隔 +// @receiver mcp +// @return time.Duration +// +func (mcp *MlsrConfigParameters) GetHelloInterval() time.Duration { + return mcp.m_helloInterval +} + +func (mcp *MlsrConfigParameters) GetInterestRetryNumber() { + // todo +} + func (mcp *MlsrConfigParameters) GetInterestResendTime() { // todo } @@ -213,10 +358,6 @@ func (mcp *MlsrConfigParameters) GetMaxFacesPerPrefix() int { return mcp.mlsrconf.MaxLogicFacesPerPrefix } -func (mcp *MlsrConfigParameters) GetSyncInterestLifetime() uint32 { - return mcp.mlsrconf.SyncInterestLifetime -} - func (mcp *MlsrConfigParameters) GetAdjacencyList() *lsa.AdjLsaAdjacenctList { // todo return nil diff --git a/common/MlsrConfig_test.go b/common/MlsrConfig_test.go index 4ddbc98..3925434 100644 --- a/common/MlsrConfig_test.go +++ b/common/MlsrConfig_test.go @@ -25,6 +25,8 @@ func getCurrentDirectory() string { return dir } +const testConfigPath = "D:\\" + DefaultConfFileName + // // TestCreatConfigFile // @Description: 测试生成mlsrConfig文件 @@ -42,6 +44,25 @@ func TestCreatConfigFile(t *testing.T) { _ = mlsrConfig.Save() } +// +// TestMlsrConfigParameters +// @Description: 测试配置项所有参数 +// @param t +// +func TestMlsrConfigParameters(t *testing.T) { + // 1、从指定目录解析配置文件 + mlsrConfig, err := ParseConfig(testConfigPath) + if err != nil { + fmt.Println("配置文件解析错误") + } + // 2、打印配置中的普通字符串信息 + fmt.Println(mlsrConfig.ToString()) + // 3、打印配置中的特殊参数信息 + fmt.Println(mlsrConfig.ParametersToString()) + fmt.Println("!!!", mlsrConfig.MlsrConfigParameters.GetSyncUserPrefix().ToUri()+"00000") + fmt.Println("end") +} + // // TestMlsrConfig_ParseConfigAndSave // @Description: 测试配置文件解析和存储 From bd40bc3e480f19754a42ecefc0100ad47c184ea3 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 3 Jun 2022 14:15:26 +0800 Subject: [PATCH 46/70] =?UTF-8?q?=E5=9C=A8=E9=85=8D=E7=BD=AE=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E5=8A=A0=E8=BD=BD=E5=90=8E=EF=BC=8C=E5=B0=86=E6=97=A5?= =?UTF-8?q?=E5=BF=97=E6=A8=A1=E5=9D=97=E6=8C=89=E7=85=A7=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E8=BF=9B=E8=A1=8C=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/MlsrConfig.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/common/MlsrConfig.go b/common/MlsrConfig.go index 1a3d057..b1adf25 100644 --- a/common/MlsrConfig.go +++ b/common/MlsrConfig.go @@ -329,5 +329,7 @@ func ParseConfig(configPath string) (*MlsrConfig, error) { } // 将配置中的参数进行初始化,以支持直接获取结构体形式的参数 mlsrConfig.MlsrConfigParameters.Init(mlsrConfig) + // 按照配置文件中的参数,对日志模块进行初始化。不做这一步,则日志模块的配置失效 + InitLogger(mlsrConfig) return mlsrConfig, nil } From 4846c362ea7aefba0e3b1a3c07dbd18a8fe12276 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 3 Jun 2022 15:46:44 +0800 Subject: [PATCH 47/70] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BB=8E=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=96=87=E4=BB=B6=E4=B8=AD=E8=AF=BB=E5=8F=96=E9=82=BB?= =?UTF-8?q?=E6=8E=A5=E4=BF=A1=E6=81=AF=E5=92=8C=E5=90=8D=E7=A7=B0=E5=89=8D?= =?UTF-8?q?=E7=BC=80=E4=BF=A1=E6=81=AF=EF=BC=9B=E5=AE=9E=E7=8E=B0=E5=B0=86?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E4=B8=AD=E7=9A=84=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E5=89=8D=E7=BC=80=E4=BF=A1=E6=81=AF=E6=8F=92=E5=85=A5?= =?UTF-8?q?NameLsa=EF=BC=9B=E5=AE=9E=E7=8E=B0LSDB=E4=B8=ADScheduleAdjLsaBu?= =?UTF-8?q?ild?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/MlsrConfig.go | 8 +++-- common/MlsrConfigParameters.go | 59 +++++++++++++++++++++++++++++++--- common/MlsrConfig_test.go | 11 +++++++ lsa/NameLsaNamePrefixList.go | 35 ++++++++++++++------ lsdb/Lsdb.go | 23 +++++++------ lsdb/Lsdb_test.go | 22 ++++++++++++- 6 files changed, 131 insertions(+), 27 deletions(-) diff --git a/common/MlsrConfig.go b/common/MlsrConfig.go index b1adf25..3b08da7 100644 --- a/common/MlsrConfig.go +++ b/common/MlsrConfig.go @@ -260,6 +260,8 @@ func (c *MlsrConfig) Init() { c.NeighborsConfig.AdjLsaBuildInterval = 10 * 1000 // 5-30,构建间隔,范围5秒到30秒。默认10秒钟 c.NeighborsConfig.LogicFaceDatasetFetchRetries = 3 // 1-10,次数 c.NeighborsConfig.LogicFaceDatasetFetchInterval = 60 * 60 * 1000 // 30*60-90*60,半小时到一个半小时。默认1小时 + // 邻接链路信息 + c.neighbors = []NeighborConfig{} // 将邻居链路信息存储到配置文件中 todo:用于测试 neighborConfig1 := NeighborConfig{ NeighborName: "/routerB", @@ -274,14 +276,16 @@ func (c *MlsrConfig) Init() { //neighborsJsonString, _ := parseNeighborConfigToJsonString( // []NeighborConfig{neighborConfig1,neighborConfig2}) //c.NeighborsConfig.NeighborsInfo=neighborsJsonString - c.neighbors = []NeighborConfig{neighborConfig1, neighborConfig2} + c.neighbors = append(c.neighbors, neighborConfig1) + c.neighbors = append(c.neighbors, neighborConfig2) // 5. FIB更新配置参数 c.FibConfig.MaxLogicFacesPerPrefix = 0 // 0-60,个数,最多有多少个下一跳。置0表示保留所有计算出的下一跳 c.FibConfig.RoutingCalcInterval = 15 * 1000 // 0-15,路由计算间隔。默认15秒计算一次 // 6. 广播本地前缀配置参数 - c.AdvertisingConfig.Prefixs = []string{"/videos", "/files", "voices"} // todo:用于测试 + // c.AdvertisingConfig.Prefixs = []string{} // 非测试状态 + c.AdvertisingConfig.Prefixs = []string{"/videos", "/files", "/voices"} // todo:用于测试 } // diff --git a/common/MlsrConfigParameters.go b/common/MlsrConfigParameters.go index 4e5c734..0fed91c 100644 --- a/common/MlsrConfigParameters.go +++ b/common/MlsrConfigParameters.go @@ -10,6 +10,7 @@ package common import ( + common2 "minlib/common" "minlib/component" "mlsr/lsa" "strconv" @@ -358,13 +359,61 @@ func (mcp *MlsrConfigParameters) GetMaxFacesPerPrefix() int { return mcp.mlsrconf.MaxLogicFacesPerPrefix } -func (mcp *MlsrConfigParameters) GetAdjacencyList() *lsa.AdjLsaAdjacenctList { - // todo - return nil +// +// GetAdjacencyList +// @Description: 从配置文件中获取邻接信息列表 +// @receiver mcp +// @return []*lsa.AdjLsaAdjacencyInfo +// +func (mcp *MlsrConfigParameters) GetAdjacencyList() []*lsa.AdjLsaAdjacencyInfo { + adjInfos := []*lsa.AdjLsaAdjacencyInfo{} + neighborConfigs := mcp.mlsrconf.neighbors + for i := 0; i < len(neighborConfigs); i++ { + // 根据配置文件构造每条邻接链路信息 + // 链路开销、URI及定位符均按照配置进行构造, + // FaceId缺省为0,兴趣包超时次数缺省为0,状态缺省为未激活 + linkCost := lsa.AdjLsaLinkCost{} + linkCost.SetLinkCost(neighborConfigs[i].LinkCost) + faceUri := lsa.AdjLsaLogicFaceUri{} + faceUri.SetLogicFaceUri(neighborConfigs[i].LogicFaceUri) + iden, err := component.CreateIdentifierByString(neighborConfigs[i].NeighborName) + if err != nil { + common2.LogError("MlsrCOnfig GetAdjacencyList error, beacuse ", err.Error()) + continue + } + faceId := lsa.AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(0) + adjInfo := lsa.NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 0, lsa.STATUS_INACTIVE) + // 加入信息列表 + adjInfos = append(adjInfos, adjInfo) + } + return adjInfos } -func (mcp *MlsrConfigParameters) GetNamePrefixList() { - // todo +// +// GetNamePrefixList +// @Description: 从配置文件中获取名称前缀信息列表 +// @receiver mcp +// @return []*lsa.NameLsaNamePrefixInfo +// +func (mcp *MlsrConfigParameters) GetNamePrefixList() []*lsa.NameLsaNamePrefixInfo { + infos := []*lsa.NameLsaNamePrefixInfo{} + // 从配置文件读取广播前缀 + adverPrefixs := mcp.mlsrconf.AdvertisingConfig.Prefixs + for i := 0; i < len(adverPrefixs); i++ { + // 为每个广播前缀构建一条名称前缀信息,其source为缺省的"" + namePrefixInfo := new(lsa.NameLsaNamePrefixInfo) + iden, err := component.CreateIdentifierByString(adverPrefixs[i]) + if err != nil { + common2.LogError("MlsrCOnfig GetNamePrefixList error, beacuse ", err.Error()) + continue + } + namePrefixInfo.NamePrefix = iden + namePrefixInfo.InsertSource("") + // 将该名称前缀信息加入切片 + infos = append(infos, namePrefixInfo) + } + return infos } func (mcp *MlsrConfigParameters) GetKeyChain() { diff --git a/common/MlsrConfig_test.go b/common/MlsrConfig_test.go index 3925434..cb878b3 100644 --- a/common/MlsrConfig_test.go +++ b/common/MlsrConfig_test.go @@ -61,6 +61,17 @@ func TestMlsrConfigParameters(t *testing.T) { fmt.Println(mlsrConfig.ParametersToString()) fmt.Println("!!!", mlsrConfig.MlsrConfigParameters.GetSyncUserPrefix().ToUri()+"00000") fmt.Println("end") + // 打印邻接列表 + adjs := mlsrConfig.GetAdjacencyList() + for i := 0; i < len(adjs); i++ { + fmt.Println(adjs[i].ToString()) + } + fmt.Println("#########################################################") + // 打印名称前缀表 + prefixs := mlsrConfig.GetNamePrefixList() + for i := 0; i < len(prefixs); i++ { + fmt.Println(prefixs[i].ToString()) + } } // diff --git a/lsa/NameLsaNamePrefixList.go b/lsa/NameLsaNamePrefixList.go index a7db8f9..61b45ea 100644 --- a/lsa/NameLsaNamePrefixList.go +++ b/lsa/NameLsaNamePrefixList.go @@ -22,6 +22,23 @@ type NameLsaNamePrefixList struct { lsaNamePrefixs LsaNamePrefixContainer } +// +// InsertNamePrefixList +// @Description: 插入一张名称前缀信息列表 +// @receiver l +// @param list +// @return bool 如果成功插入任何一条信息,即返回true +// +func (l *NameLsaNamePrefixList) InsertNamePrefixList(list []*NameLsaNamePrefixInfo) bool { + b := false + for i := 0; i < len(list); i++ { + if l.InsertNamePrefixInfo(list[i]) { + b = true + } + } + return b +} + // // GetIndex // @Description: 获取指定名称前缀在列表中的索引值 @@ -46,11 +63,11 @@ func (l *NameLsaNamePrefixList) GetIndex(namePrefix *component.Identifier) int { // @return bool 只要能插入Info中的任何一个source,即返回true // func (l *NameLsaNamePrefixList) InsertNamePrefixInfo(info *NameLsaNamePrefixInfo) bool { - b:=false - for i:=0;i Date: Fri, 3 Jun 2022 17:22:32 +0800 Subject: [PATCH 48/70] =?UTF-8?q?=E5=AE=9E=E7=8E=B0LSDB=E4=B8=AD=E5=8A=9F?= =?UTF-8?q?=E8=83=BD=E7=82=B9=EF=BC=9ALSA=E5=AE=89=E8=A3=85=E3=80=81?= =?UTF-8?q?=E5=AE=89=E6=8E=92LSA=E8=B6=85=E6=9C=9F=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E3=80=81LSA=E8=B6=85=E6=9C=9F=E5=88=B7=E6=96=B0=E6=88=96?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/MlsrConfig.go | 4 ++ lsdb/Lsdb.go | 102 ++++++++++++++++++++++++++++++++++++++++--- lsdb/Lsdb_test.go | 32 ++++++++++++++ 3 files changed, 132 insertions(+), 6 deletions(-) diff --git a/common/MlsrConfig.go b/common/MlsrConfig.go index 3b08da7..e0591c8 100644 --- a/common/MlsrConfig.go +++ b/common/MlsrConfig.go @@ -125,6 +125,10 @@ type GeneralConfig struct { LsaRefreshTime uint32 `ini:"LsaRefreshTime"` // LSA刷新时间【单位:毫秒】 + // 路由器死亡后,本机NameLsa和AdjLsa将超期失效,从而被LSDB清除 + // 路由器死亡时间是本机LSA构建时的超期时间,但它在本机进行刷新时,是不按照死亡时间进行刷新的,而是按照LSA刷新时间做刷新的触发 + // 路由器死亡时间是给其他路由器的LSA超期时间,例如路由器B在死亡时间间隔后会将路由器A的LSA删除,但路由器A其实在LSA刷新时间就已经 + // 刷新该LSA,并通知给路由器B,因而保证了路由器B一直有路由器A的LSA。 RouterDeadInterval uint32 `ini:"RouterDeadInterval"` // 路由器判断死亡的时间间隔(必须大于LSA刷新时间)【单位:毫秒】 LsaInterestLifetime int `ini:"LsaInterestLifetime"` // LSA兴趣包生存周期。当使用推式包时,此值无效【单位:毫秒】 diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index 0d696ab..995799c 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -28,6 +28,8 @@ const ( REMOVED = -1 // 已移除 ) +const GRACE_PERIOD = 10 * time.Second // 超期宽限期。LSA比设定时间晚几秒钟被删除,以避免信息过早失效。 + type Lsdb struct { // 配置参数 mlsrConfig *common.MlsrConfig @@ -117,7 +119,7 @@ func (l *Lsdb) BuildAndInstallOwnNameLsa() { nlsa := new(lsa.NameLsa) nlsa.SetOriginRouter(l.thisRouterPrefix) // 源路由 nlsa.SetSeqNo(l.sequencingManager.GetNameLsaSeq() + 1) // 序列号 - nlsa.SetLsaExpirationTime(uint64(l.getLsaExpirationTimePoint().UnixMilli())) // 超期时间 + nlsa.SetLsaExpirationTime(l.getLsaExpirationTimePoint()) // 超期时间 nlsa.NameLsaNamePrefixList.InsertNamePrefixList(l.mlsrConfig.GetNamePrefixList()) // 名称前缀列表 // 刷新序列号管理器中的名称LSA序列号 l.sequencingManager.IncreaseNameLsaSeq() @@ -231,6 +233,46 @@ func (l *Lsdb) IsLsaNew(routerIdentifier *component.Identifier, } func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { + timeToExpire := l.lsaRefreshTime + + // 判断不是本机LSA时,调整超期时间 + if lsa.GetOriginRouter().ToUri() != l.thisRouterPrefix.ToUri() { + // 如果该其他路由器发来的LSA还没超时,则将超时时间间隔设置为该LSA剩余存活时间 + if l.uintToTime(lsa.GetExpirationTime()).After(time.Now()) { + timeToExpire = l.uintToTime(lsa.GetExpirationTime()).Sub(time.Now()) + } + } + + // 查看数据库中是否已有该LSA源路由器所发出的LSA + lsaInDb := l.FindLsa(lsa.GetOriginRouter(), lsa.GetType()) + if lsa == nil { + // 如果没有: + common2.LogDebug("Adding Lsa ", lsa.ToString()) + // 1. 就插入该LSA + err := l.Emplace(lsa) + if err != nil { + common2.LogError("Add Lsa error", lsa.ToString()) + return + } + // 2. 触发LSDB安装LSA的动作信号 + // todo: onLsdbModified(lsa, LsdbUpdate::INSTALLED, {}, {}); + // 3. 设置LSA超期时间事件 + l.ScheduleLsaExpiration(lsa, timeToExpire) + } else if lsaInDb.GetSeqNo() < lsa.GetSeqNo() { + // 如果查到了,而且传入的这个LSA比数据库中的更新,我们将更新数据库 + common2.LogDebug("Updating Lsa ", lsaInDb.ToString()) + // 1. 就插入该LSA + err := l.Emplace(lsa) + if err != nil { + common2.LogError("Add Lsa error", lsa.ToString()) + return + } + // 2. 触发LSDB更新LSA的动作信号 + // todo: onLsdbModified(lsa, LsdbUpdate::UPDATED, namesToAdd, namesToRemove); + // 3. 设置LSA超期时间事件 + l.ScheduleLsaExpiration(lsa, timeToExpire) + common2.LogDebug("Updated Lsa ", lsa.ToString()) + } } func (l *Lsdb) RemoveLsa(routerIdentifier *component.Identifier, @@ -262,11 +304,55 @@ func (l *Lsdb) BuildAndInstallOwnAdjLsa() { // @Description: 在调度器中安排一个刷新或过期事件 // @receiver l // -func (l *Lsdb) ScheduleLsaExpiration(lsa lsa.ILsa, duration *time.Duration) { - +func (l *Lsdb) ScheduleLsaExpiration(lsa lsa.ILsa, duration time.Duration) { + // 安排LSA在指定时间间隔后进行删除 + job, err := l.scheduler.ScheduleTaskAfterDuration(duration, 1).Do(l.ExpireOrRefreshLsa, lsa) + job.LimitRunsTo(1) + l.scheduler.StartAsync() + if err != nil { + common2.LogError("Scheduling Lsa Expiration error, ", err.Error()) + } } +// +// ExpireOrRefreshLsa +// @Description: LSA过期时间触发后,执行该函数 +// @receiver l +// @param lsa +// func (l *Lsdb) ExpireOrRefreshLsa(lsa lsa.ILsa) { + common2.LogDebug("ExpireOrRefreshLsa called for ", lsa.ToString()) + + lsaInDb := l.FindLsa(lsa.GetOriginRouter(), lsa.GetType()) + if lsaInDb != nil { + common2.LogDebug("LSA Exists with seq no: ", lsaInDb.GetSeqNo()) + // 只有DB中LSA序列号依然是传入调度器的LSA序列号时,才执行删除或更新动作。否则,该LSA已是新的,则不应修改它。 + if lsaInDb.GetSeqNo() == lsa.GetSeqNo() { + if lsaInDb.GetOriginRouter().ToUri() == l.thisRouterPrefix.ToUri() { + // 如果是本机LSA,由于它不能被删除,因此我们只继续更新它 + // 1. 更新 + common2.LogDebug("Own lsa refreshing, ", lsaInDb.ToString()) + lsaInDb.SetSeqNo(lsaInDb.GetSeqNo() + 1) + l.sequencingManager.SetLsaSeq(lsaInDb.GetSeqNo()+1, lsaInDb.GetType()) + lsaInDb.SetExpirationTime(l.getLsaExpirationTimePoint()) + err := l.Emplace(lsaInDb) + if err != nil { + common2.LogError("Own lsa refresh error, ", err.Error()) + return + } + common2.LogDebug("Own lsa refreshed, ", lsaInDb.ToString()) + // 2. 安排新的超期事件 + l.ScheduleLsaExpiration(lsaInDb, l.lsaRefreshTime) + // 3. todo: 将lsa更新通知给sync + // m_sync.publishRoutingUpdate(lsaPtr->getType(), m_sequencingManager.getLsaSeq(lsaPtr->getType())); + } else { + // 如果是其他路由器的LSA,我们将删除它。 + // 更新其他路由器的LSA是通过min-sync实现的,而不是超期触发。 + common2.LogDebug("Other's LSA, so removing from LSDB, lsa is ", lsa.ToString()) + l.RemoveLsa(lsaInDb.GetOriginRouter(), lsaInDb.GetType()) + } + } + } } func (l *Lsdb) ProcessInterestForLsa(interest *packet.Interest, @@ -306,9 +392,13 @@ func (l *Lsdb) OnFetchLsaError(errorCode uint32, msg string, func (l *Lsdb) AfterFetchLsa(buffer bytes.Buffer, interestName *component.Identifier) { } -func (l *Lsdb) getLsaExpirationTimePoint() time.Time { +func (l *Lsdb) getLsaExpirationTimePoint() uint64 { timeExpire := time.Now() - timeExpire.Add(l.mlsrConfig.GetRouterDeadInterval()) + timeExpire = timeExpire.Add(l.mlsrConfig.GetRouterDeadInterval()) - return timeExpire + return uint64(timeExpire.UnixMilli()) +} + +func (l *Lsdb) uintToTime(uintTime uint64) time.Time { + return time.UnixMilli(int64(uintTime)) } diff --git a/lsdb/Lsdb_test.go b/lsdb/Lsdb_test.go index 2a0d916..50186c9 100644 --- a/lsdb/Lsdb_test.go +++ b/lsdb/Lsdb_test.go @@ -17,6 +17,11 @@ import ( const testConfigPath = "D:\\" + common.DefaultConfFileName +// +// TestLsdb_Init +// @Description: 测试LSDB初始化 +// @param t +// func TestLsdb_Init(t *testing.T) { // 配置文件初始化 mlsrConfig, err := common.ParseConfig(testConfigPath) @@ -32,3 +37,30 @@ func TestLsdb_Init(t *testing.T) { lsdb := new(Lsdb) lsdb.Init(mlsrConfig, sche, face) } + +// +// TestUnixTime +// @Description: 测试时间与时间戳的转换。将用于LSA中过期时间的保存,非常重要。 +// @param t +// +func TestUnixTime(t *testing.T) { + // 配置文件初始化 + mlsrConfig, err := common.ParseConfig(testConfigPath) + if err != nil { + fmt.Println("配置文件解析错误") + } + // 调度器初始化 + sche := new(MlsrScheduler) + sche.Init() + // LogicFace初始化(假设初始化,暂时用不到) + face := new(logicface.LogicFace) + // LSDB初始化 + lsdb := new(Lsdb) + lsdb.Init(mlsrConfig, sche, face) + + // 获取过期时间的时间戳 + timeExpire := lsdb.getLsaExpirationTimePoint() + // 时间戳转回过期时间 + timeTemplate := "2006-01-02 15:04:05" // 时间戳常规类型 + fmt.Println(lsdb.uintToTime(timeExpire).Format(timeTemplate)) +} From 80be9015af9298d3e3f50988a91700316c941fde Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 3 Jun 2022 19:18:15 +0800 Subject: [PATCH 49/70] =?UTF-8?q?LSDB=EF=BC=9A=E5=A2=9E=E5=8A=A0=E5=88=A0?= =?UTF-8?q?=E9=99=A4LSA=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/Lsdb.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index 995799c..e17033b 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -275,8 +275,19 @@ func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { } } -func (l *Lsdb) RemoveLsa(routerIdentifier *component.Identifier, - lsaType lsa.LsaType) { +// +// RemoveLsa +// @Description: 从LSDB中删除LSA +// @receiver l +// @param lsa +// +func (l *Lsdb) RemoveLsa(lsa lsa.ILsa) { + err := l.LsaContainer.EraseLsa(lsa) + if err != nil { + common2.LogError("") + return + } + common2.LogDebug("Removing LSA: ", lsa.ToString()) } func (l *Lsdb) RemoveLsaByContainerIndex(index int) { @@ -349,7 +360,7 @@ func (l *Lsdb) ExpireOrRefreshLsa(lsa lsa.ILsa) { // 如果是其他路由器的LSA,我们将删除它。 // 更新其他路由器的LSA是通过min-sync实现的,而不是超期触发。 common2.LogDebug("Other's LSA, so removing from LSDB, lsa is ", lsa.ToString()) - l.RemoveLsa(lsaInDb.GetOriginRouter(), lsaInDb.GetType()) + l.RemoveLsa(lsaInDb) } } } From 0d5ef9368d867fd0647d96759b535943e209f089 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 3 Jun 2022 19:56:09 +0800 Subject: [PATCH 50/70] =?UTF-8?q?LSDB=EF=BC=9A=E5=A2=9E=E5=8A=A0=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=E6=9F=90=E4=B8=AAlsa=E6=98=AF=E5=90=A6=E5=AD=98?= =?UTF-8?q?=E5=9C=A8=E3=80=81=E6=9F=A5=E6=89=BElsa=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extensions/TlvMlsrExtention.go | 40 +++++++------- lsa/NameLsa.go | 4 +- .../buntdb/LsaContainer_BuntDB.go | 53 +++++++++++++++++-- .../buntdb/LsaContainer_BuntDB_test.go | 48 +++++++++++++++++ lsdb/Lsdb.go | 24 +++++++-- 5 files changed, 138 insertions(+), 31 deletions(-) diff --git a/extensions/TlvMlsrExtention.go b/extensions/TlvMlsrExtention.go index aa37d9f..601a0a5 100644 --- a/extensions/TlvMlsrExtention.go +++ b/extensions/TlvMlsrExtention.go @@ -12,34 +12,32 @@ package extensions const ( // Lsa for MLSR - TlvMlsrLsaAdjacency = 401 // 表示MIR之间邻接关系信息的LSA - TlvMlsrLsaNamePrefix = 402 // 表示名称前缀(内容标识、身份标识等以前缀形式命名的标识)信息的LSA - TlvMlsrLsaCoordinate = 403 // 表示坐标信息的LSA + TlvMlsrLsaAdjacency = 401 // 表示MIR之间邻接关系信息的LSA + TlvMlsrLsaName = 402 // 表示名称前缀(内容标识、身份标识等以前缀形式命名的标识)信息的LSA + TlvMlsrLsaCoordinate = 403 // 表示坐标信息的LSA // 所有类型Lsa的必需部分 - TlvMlsrLsaBase = 410 // 表示LSA最基本信息:源MIR、序列号、过期时间 - TlvMlsrLsaExpirationTime = 420 // LSA过期时间 - TlvMlsrLsaSequenceNumber = 421 // LSA序列号 + TlvMlsrLsaBase = 410 // 表示LSA最基本信息:源MIR、序列号、过期时间 + TlvMlsrLsaExpirationTime = 420 // LSA过期时间 + TlvMlsrLsaSequenceNumber = 421 // LSA序列号 // AdjLsa的组件 - TlvMlsrAdjLsaLogicFaceId = 422 // logicface Id - TlvMlsrAdjLsaLinkCost = 423 // 链路开销 - TlvMlsrAdjLsaLogicFaceUri = 424 // LogicFace前缀 - TlvMlsrAdjLsaAdjacencyInfo = 425 // 单条邻接信息 - TlvMlsrAdjLsaAdjacencyList = 426 // 一个邻接LSA包含的所有邻接信息 + TlvMlsrAdjLsaLogicFaceId = 422 // logicface Id + TlvMlsrAdjLsaLinkCost = 423 // 链路开销 + TlvMlsrAdjLsaLogicFaceUri = 424 // LogicFace前缀 + TlvMlsrAdjLsaAdjacencyInfo = 425 // 单条邻接信息 + TlvMlsrAdjLsaAdjacencyList = 426 // 一个邻接LSA包含的所有邻接信息 // NameLsa的组件 - TlvMlsrNameLsaNamePrefixSource = 427 // 名称前缀的来源 - TlvMlsrNameLsaNamePrefixInfo = 428 // 单条名称前缀信息 - TlvMlsrNameLsaNamePrefixList = 429 // 一个名称LSA包含的所有名称前缀信息 + TlvMlsrNameLsaNamePrefixSource = 427 // 名称前缀的来源 + TlvMlsrNameLsaNamePrefixInfo = 428 // 单条名称前缀信息 + TlvMlsrNameLsaNamePrefixList = 429 // 一个名称LSA包含的所有名称前缀信息 // route模块涉及到的组件 TlvMlsrConnectingLogicFaceUri = 441 - TlvMlsrRouteCost = 442 - TlvMlsrNextHop = 443 - TlvMlsrNextHopList = 444 - TlvMlsrRoutingTableEntry = 445 - TlvMlsrRoutingTable = 446 - + TlvMlsrRouteCost = 442 + TlvMlsrNextHop = 443 + TlvMlsrNextHopList = 444 + TlvMlsrRoutingTableEntry = 445 + TlvMlsrRoutingTable = 446 ) - diff --git a/lsa/NameLsa.go b/lsa/NameLsa.go index 5e17281..7146f2e 100644 --- a/lsa/NameLsa.go +++ b/lsa/NameLsa.go @@ -213,7 +213,7 @@ func (n *NameLsa) WireEncode(encoder *encoding.Encoder) (int, error) { totalLength += tmpLen // TLV-Type - tmpLen, err = encoder.PrependVarNumber(extensions.TlvMlsrLsaNamePrefix) + tmpLen, err = encoder.PrependVarNumber(extensions.TlvMlsrLsaName) if err != nil { return 0, err } @@ -231,7 +231,7 @@ func (n *NameLsa) WireEncode(encoder *encoding.Encoder) (int, error) { // func (n *NameLsa) WireDecode(block *encoding.Block) error { // 检查 TLV-TYPE 是否正确 - if err := encoding.ExpectType(block.GetType(), extensions.TlvMlsrLsaNamePrefix); err != nil { + if err := encoding.ExpectType(block.GetType(), extensions.TlvMlsrLsaName); err != nil { return err } diff --git a/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB.go b/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB.go index 5cee0b7..18362be 100644 --- a/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB.go +++ b/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB.go @@ -1,9 +1,9 @@ // Package buntdb // @Author: Wang Feng // @Description: -// todo: 需要注意的是,根据对NLSR源代码的阅读,可以看出其通过originRouterName和lsaType可唯一确定一个LSA。 -// todo 这就意味着,序列号只区分同一路由器同一类型LSA的新和旧,并不是如邻接LSA分成多个LSA进行传播。 -// todo MLSR可参考其设计,也可通过originRouter和序列号来确定唯一LSA。 +// 需要注意的是,根据对NLSR源代码的阅读,可以看出其通过originRouterName和lsaType可唯一确定一个LSA。 +// 这就意味着,序列号只区分同一路由器同一类型LSA的新和旧,并不是分成多个LSA进行传播。 +// MLSR参考其设计,同一路由器在另一路由器的LSDB中,仅保留最新序列号的两个LSA:邻接LSA、名称LSA。 // @Version: 0.1.0 // @Date: 2022/4/6 17:49 // @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 @@ -127,6 +127,53 @@ func newLsa(lsaType lsa.LsaType) (lsa.ILsa, error) { } } +// +// Exists +// @Description: 判断某个lsa是否在内存数据库里 +// @receiver bdb +// @param lsa +// @return bool +// +func (bdb *LsaContainer_BuntDB) Exists(lsa lsa.ILsa) bool { + errRes := bdb.db.View(func(tx *buntdb.Tx) error { + // 获取key + key := getKeyFromNameAndType(lsa.GetOriginRouter(), lsa.GetType()) + + // 获取value + _, err := tx.Get(key) + if err != nil { + common2.LogDebug("buntdb Exists get key no found, because of ", err.Error()) + return err + } + + return nil + }) + if errRes == nil { + return true + } + return false +} + +func (bdb *LsaContainer_BuntDB) ExistsRouterNameAndType(routerIdentifier *component.Identifier, lsaType lsa.LsaType) bool { + errRes := bdb.db.View(func(tx *buntdb.Tx) error { + // 获取key + key := getKeyFromNameAndType(routerIdentifier, lsaType) + + // 获取value + _, err := tx.Get(key) + if err != nil { + common2.LogDebug("buntdb ExistsRouterNameAndType get key no found, because of ", err.Error()) + return err + } + + return nil + }) + if errRes == nil { + return true + } + return false +} + // // Emplace // @Description: 安装一个lsa到LsaContainer diff --git a/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB_test.go b/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB_test.go index 832484b..f5b68fc 100644 --- a/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB_test.go +++ b/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB_test.go @@ -62,6 +62,54 @@ func TestLsaContainer_BuntDB_Emplace(t *testing.T) { common2.LogInfo("lsaContainer存入名称lsa成功") } +// +// TestLsaContainer_BuntDB_FindLsa +// @Description: 测试查找lsa +// @param t +// +func TestLsaContainer_BuntDB_FindLsa(t *testing.T) { + // 构造NameLsa + base := new(lsa.NameLsa) + base.SetLsaExpirationTime(2000) + base.SetLsaSequenceNumber(1234) + base.LsaOriginRouterIdentifier, _ = component.CreateIdentifierByString("/min/pku") + ident, _ := component.CreateIdentifierByString("/pku/routerfucker") + base.Insert(ident, "/bind") + base.Insert(ident, "/wechat") + ident, _ = component.CreateIdentifierByString("/pku/router") + base.Insert(ident, "/qq") + common2.LogInfo("ToString: " + base.ToString()) + + // 构造LsaContainer + lsaContainer := new(LsaContainer_BuntDB) + err := lsaContainer.Init() + if err != nil { + common2.LogInfo("lsaContainer创建失败:", err.Error()) + } + + // 将NameLsa插入lsaContainer + err = lsaContainer.Emplace(base) + if err != nil { + common2.LogInfo("lsaContainer存入名称lsa失败:", err.Error()) + } + common2.LogInfo("lsaContainer存入名称lsa成功") + + // 查看某个lsa是否存在 + b := lsaContainer.Exists(base) + common2.LogInfo("是否存在已插入的lsa:", b) + b = lsaContainer.ExistsRouterNameAndType(base.GetOriginRouter(), base.GetType()) + common2.LogInfo("是否存在已插入的lsa:", b) + // 构造一个新Lsa + idenNew, _ := component.CreateIdentifierByString("/min/thu") + namelsa := new(lsa.NameLsa) + namelsa.SetOriginRouter(idenNew) + // 查看是否存在 + b = lsaContainer.Exists(namelsa) + common2.LogInfo("是否存在尚未插入的lsa:", b) + b = lsaContainer.ExistsRouterNameAndType(idenNew, namelsa.GetType()) + common2.LogInfo("是否存在尚未插入的lsa:", b) +} + // // TestLsaContainer_BuntDB_Emplace_Get_Erase_Adj_Lsa // @Description: 测试对邻接LSA进行增删改查 diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index e17033b..2459128 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -99,14 +99,25 @@ func (l *Lsdb) Init(mc *common.MlsrConfig, ms *MlsrScheduler, // // DoesLsaExist -// @Description: 返回LSDB是否存在某些LSA的查询结果 +// @Description: 返回LSDB是否存在某个LSA的查询结果 // @receiver l // @param routerIdentifier // @param lsaType // @return bool // -func (l *Lsdb) DoesLsaExist(routerIdentifier *component.Identifier, lsaType int) bool { - panic("implement me") +func (l *Lsdb) DoesLsaNameExist(routerIdentifier *component.Identifier, lsaType lsa.LsaType) bool { + return l.ExistsRouterNameAndType(routerIdentifier, lsaType) +} + +// +// DoesLsaExist +// @Description: 返回LSDB是否存在某个LSA的查询结果 +// @receiver l +// @param lsa +// @return bool +// +func (l *Lsdb) DoesLsaExist(lsa lsa.ILsa) bool { + return l.Exists(lsa) } // @@ -210,8 +221,11 @@ func (l *Lsdb) GetSync() *communication.SyncLogicHandler { // func (l *Lsdb) FindLsa(routerIdentifier *component.Identifier, lsaType lsa.LsaType) lsa.ILsa { - // todo - return &lsa.NameLsa{} + lsaGet, err := l.GetLSAByNameAndType(routerIdentifier, lsaType) + if err != nil { + lsaGet = nil + } + return lsaGet } // From aa5018cf9d1fb4d532dafe44b0722e82ee86b5fe Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 3 Jun 2022 20:00:36 +0800 Subject: [PATCH 51/70] =?UTF-8?q?lsa=E5=88=B7=E6=96=B0=E6=88=96=E8=BF=87?= =?UTF-8?q?=E6=9C=9F=E7=9A=84=E8=A7=A6=E5=8F=91=E5=A2=9E=E5=8A=A0=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=AE=BD=E9=99=90=E6=9C=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/Lsdb.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index 2459128..3ed9315 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -330,6 +330,8 @@ func (l *Lsdb) BuildAndInstallOwnAdjLsa() { // @receiver l // func (l *Lsdb) ScheduleLsaExpiration(lsa lsa.ILsa, duration time.Duration) { + // 在指定间隔的几秒后触发刷新或过期事件 + duration = duration + GRACE_PERIOD // 安排LSA在指定时间间隔后进行删除 job, err := l.scheduler.ScheduleTaskAfterDuration(duration, 1).Do(l.ExpireOrRefreshLsa, lsa) job.LimitRunsTo(1) From 4592b554edc7e6bbc24a897655dafa99959970b9 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 3 Jun 2022 21:59:11 +0800 Subject: [PATCH 52/70] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=99=A8=E4=B8=AD=E5=85=B3=E4=BA=8E=E9=82=BB?= =?UTF-8?q?=E6=8E=A5=E5=88=97=E8=A1=A8=E5=92=8C=E5=90=8D=E7=A7=B0=E5=88=97?= =?UTF-8?q?=E8=A1=A8=E7=9A=84=E8=AF=BB=E5=8F=96=EF=BC=9B=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=82=BB=E6=8E=A5=E5=88=97=E8=A1=A8=E5=88=A4?= =?UTF-8?q?=E6=96=AD=E5=BD=93=E5=89=8D=E9=82=BB=E6=8E=A5=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E5=AF=B9=E5=91=A8=E5=9B=B4=E8=B7=AF=E7=94=B1=E5=99=A8=E7=9A=84?= =?UTF-8?q?=E6=8E=A2=E6=B5=8B=E7=BB=93=E6=9E=9C=EF=BC=9B=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?LSDB=E4=B8=AD=E6=9E=84=E5=BB=BA=E9=82=BB=E6=8E=A5LSA=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/MlsrConfigParameters.go | 75 ++++++-- lsa/AdjLsaAdjacencyList.go | 160 +++++++++--------- lsa/NameLsaNamePrefixList.go | 10 ++ .../buntdb/LsaContainer_BuntDB.go | 28 ++- lsdb/Lsdb.go | 64 ++++++- route/LinkStateRoutingTableCalculator.go | 4 +- 6 files changed, 238 insertions(+), 103 deletions(-) diff --git a/common/MlsrConfigParameters.go b/common/MlsrConfigParameters.go index 0fed91c..acd5d78 100644 --- a/common/MlsrConfigParameters.go +++ b/common/MlsrConfigParameters.go @@ -47,6 +47,11 @@ type MlsrConfigParameters struct { // 时间:FIB更新 m_RoutingCalcInterval time.Duration + + // 邻接信息列表 + m_adjl *lsa.AdjLsaAdjacenctList + // 命名前缀列表 + m_npl *lsa.NameLsaNamePrefixList } // MlsrConfig初始化 @@ -58,6 +63,9 @@ func (mcp *MlsrConfigParameters) Init(config *MlsrConfig) { _ = mcp.buildRouterAndSyncUserPrefix() // 构建时间间隔 mcp.genDurations() + // 构建邻接表和名称前缀表 + mcp.InitAdjacencyList() + mcp.InitNamePrefixList() } // @@ -360,13 +368,12 @@ func (mcp *MlsrConfigParameters) GetMaxFacesPerPrefix() int { } // -// GetAdjacencyList -// @Description: 从配置文件中获取邻接信息列表 +// InitAdjacencyList +// @Description: 从配置文件中初始化邻接信息列表 // @receiver mcp -// @return []*lsa.AdjLsaAdjacencyInfo // -func (mcp *MlsrConfigParameters) GetAdjacencyList() []*lsa.AdjLsaAdjacencyInfo { - adjInfos := []*lsa.AdjLsaAdjacencyInfo{} +func (mcp *MlsrConfigParameters) InitAdjacencyList() { + mcp.m_adjl = new(lsa.AdjLsaAdjacenctList) neighborConfigs := mcp.mlsrconf.neighbors for i := 0; i < len(neighborConfigs); i++ { // 根据配置文件构造每条邻接链路信息 @@ -385,19 +392,12 @@ func (mcp *MlsrConfigParameters) GetAdjacencyList() []*lsa.AdjLsaAdjacencyInfo { faceId.SetLogicFaceId(0) adjInfo := lsa.NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 0, lsa.STATUS_INACTIVE) // 加入信息列表 - adjInfos = append(adjInfos, adjInfo) + mcp.m_adjl.Insert(adjInfo) } - return adjInfos } -// -// GetNamePrefixList -// @Description: 从配置文件中获取名称前缀信息列表 -// @receiver mcp -// @return []*lsa.NameLsaNamePrefixInfo -// -func (mcp *MlsrConfigParameters) GetNamePrefixList() []*lsa.NameLsaNamePrefixInfo { - infos := []*lsa.NameLsaNamePrefixInfo{} +func (mcp *MlsrConfigParameters) InitNamePrefixList() { + mcp.m_npl = new(lsa.NameLsaNamePrefixList) // 从配置文件读取广播前缀 adverPrefixs := mcp.mlsrconf.AdvertisingConfig.Prefixs for i := 0; i < len(adverPrefixs); i++ { @@ -410,10 +410,49 @@ func (mcp *MlsrConfigParameters) GetNamePrefixList() []*lsa.NameLsaNamePrefixInf } namePrefixInfo.NamePrefix = iden namePrefixInfo.InsertSource("") - // 将该名称前缀信息加入切片 - infos = append(infos, namePrefixInfo) + // 将该名称前缀信息加入列表 + mcp.m_npl.InsertNamePrefixInfo(namePrefixInfo) } - return infos +} + +// +// GetAdjacencyList +// @Description: 从配置文件中获取邻接信息列表 +// @receiver mcp +// @return []*lsa.AdjLsaAdjacencyInfo +// +func (mcp *MlsrConfigParameters) GetAdjacencyList() []*lsa.AdjLsaAdjacencyInfo { + return mcp.m_adjl.GetAdjList() +} + +// +// GetAdjacencys +// @Description: 获取整体的邻接信息 +// @receiver mcp +// @return *lsa.AdjLsaAdjacenctList +// +func (mcp *MlsrConfigParameters) GetAdjacencys() *lsa.AdjLsaAdjacenctList { + return mcp.m_adjl +} + +// +// GetNamePrefixList +// @Description: 从配置文件中获取名称前缀信息列表 +// @receiver mcp +// @return []*lsa.NameLsaNamePrefixInfo +// +func (mcp *MlsrConfigParameters) GetNamePrefixList() []*lsa.NameLsaNamePrefixInfo { + return mcp.m_npl.GetNamePrefixList() +} + +// +// GetNamePrefixs +// @Description: 获取整体的名称前缀信息 +// @receiver mcp +// @return *lsa.NameLsaNamePrefixList +// +func (mcp *MlsrConfigParameters) GetNamePrefixs() *lsa.NameLsaNamePrefixList { + return mcp.m_npl } func (mcp *MlsrConfigParameters) GetKeyChain() { diff --git a/lsa/AdjLsaAdjacencyList.go b/lsa/AdjLsaAdjacencyList.go index da495ce..490d5d2 100644 --- a/lsa/AdjLsaAdjacencyList.go +++ b/lsa/AdjLsaAdjacencyList.go @@ -58,7 +58,7 @@ func (l *AdjLsaAdjacenctList) ToString() string { resString += "[ " for i := 0; i < l.Size(); i++ { resString += l.GetAdjList()[i].ToString() - if i < (l.Size()-1){ + if i < (l.Size() - 1) { resString += ", " } } @@ -74,8 +74,8 @@ func (l *AdjLsaAdjacenctList) ToString() string { // @return bool // func (l *AdjLsaAdjacenctList) IsNeighbor(routerIdentifier *component.Identifier) bool { - for i:=0; i= interestRetryNo { + // 如果邻居全部都没有激活,且兴趣包尝试次数超出最大值,就删掉本机的邻接LSA + nTimedOutNeighbors++ } } - return true + if nTimedOutNeighbors == len(l.lsaAdjacencys) { + return true + } else { + // 既没有激活邻居,又还在尝试查看邻居情况,则继续安排构建邻接LSA + return false + } } // @@ -214,11 +218,11 @@ func (l *AdjLsaAdjacenctList) IsAdjLsaBuildable(interestRetryNo uint32) bool { // @return *AdjLsaAdjacencyInfo // @return error // -func (l *AdjLsaAdjacenctList) GetAdjacency(routerIdentifier *component.Identifier) (*AdjLsaAdjacencyInfo,error){ - if index,err:=l.findIndexByRouterIdentifier(routerIdentifier);err!=nil{ - return nil,err - }else{ - return l.lsaAdjacencys[index],nil +func (l *AdjLsaAdjacenctList) GetAdjacency(routerIdentifier *component.Identifier) (*AdjLsaAdjacencyInfo, error) { + if index, err := l.findIndexByRouterIdentifier(routerIdentifier); err != nil { + return nil, err + } else { + return l.lsaAdjacencys[index], nil } } @@ -229,9 +233,9 @@ func (l *AdjLsaAdjacenctList) GetAdjacency(routerIdentifier *component.Identifie // @return int // func (l *AdjLsaAdjacenctList) GetNumOfActiveNeighbor() int { - numbers:=0 - for i:=0; i=0; i-- { - if l.lsaAdjacencys[i]==nil { + for i := len(l.lsaAdjacencys) - 1; i >= 0; i-- { + if l.lsaAdjacencys[i] == nil { continue } - tmpLen,err := l.lsaAdjacencys[i].WireEncode(encoder) + tmpLen, err := l.lsaAdjacencys[i].WireEncode(encoder) if err != nil { return 0, err } @@ -405,7 +409,7 @@ func (l *AdjLsaAdjacenctList) WireEncode(encoder *encoding.Encoder) (int,error) } totalLength += tmpLen - return totalLength,nil + return totalLength, nil } // @@ -436,4 +440,4 @@ func (l *AdjLsaAdjacenctList) WireDecode(block *encoding.Block) error { } l.lsaAdjacencys = adjacencyContainer return nil -} \ No newline at end of file +} diff --git a/lsa/NameLsaNamePrefixList.go b/lsa/NameLsaNamePrefixList.go index 61b45ea..0d00042 100644 --- a/lsa/NameLsaNamePrefixList.go +++ b/lsa/NameLsaNamePrefixList.go @@ -22,6 +22,16 @@ type NameLsaNamePrefixList struct { lsaNamePrefixs LsaNamePrefixContainer } +// +// GetNamePrefixList +// @Description: 获取名称前缀列表 +// @receiver l +// @return []*NameLsaNamePrefixInfo +// +func (l *NameLsaNamePrefixList) GetNamePrefixList() []*NameLsaNamePrefixInfo { + return l.lsaNamePrefixs +} + // // InsertNamePrefixList // @Description: 插入一张名称前缀信息列表 diff --git a/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB.go b/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB.go index 18362be..3bee435 100644 --- a/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB.go +++ b/lsdb/LsaContainer/buntdb/LsaContainer_BuntDB.go @@ -154,6 +154,14 @@ func (bdb *LsaContainer_BuntDB) Exists(lsa lsa.ILsa) bool { return false } +// +// ExistsRouterNameAndType +// @Description: 判断是否存在某个lsa +// @receiver bdb +// @param routerIdentifier +// @param lsaType +// @return bool +// func (bdb *LsaContainer_BuntDB) ExistsRouterNameAndType(routerIdentifier *component.Identifier, lsaType lsa.LsaType) bool { errRes := bdb.db.View(func(tx *buntdb.Tx) error { // 获取key @@ -210,7 +218,7 @@ func (bdb *LsaContainer_BuntDB) Emplace(lsa lsa.ILsa) error { // // Erase -// @Description: 删除一个lsa:根据routerIdentifier和lsaType +// @Description: 删除一个lsa // @receiver bdb // @param lsa // @@ -223,6 +231,24 @@ func (bdb *LsaContainer_BuntDB) EraseLsa(lsa lsa.ILsa) error { return err } +// +// EraseLsaByNameAndType +// @Description: 删除一个lsa:根据routerIdentifier和lsaType +// @receiver bdb +// @param routerIdentifier +// @param lsaType +// @return error +// +func (bdb *LsaContainer_BuntDB) EraseLsaByNameAndType(routerIdentifier *component.Identifier, + lsaType lsa.LsaType) error { + key := getKeyFromNameAndType(routerIdentifier, lsaType) + err := bdb.EraseLsaByKey(key) + if err != nil { + common2.LogError("buntdb EraseLsa error, because of ", err.Error()) + } + return err +} + // // EraseLsaByKey // @Description: 删除一个lsa,根据其在db中的key diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index 3ed9315..a18b0a7 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -136,6 +136,7 @@ func (l *Lsdb) BuildAndInstallOwnNameLsa() { l.sequencingManager.IncreaseNameLsaSeq() // todo: 使用sync通知路由更新 + // m_sync.publishRoutingUpdate(Lsa::Type::NAME, m_sequencingManager.getNameLsaSeq()); // 安装lsa到LSDB l.InstallLsa(nlsa) @@ -147,7 +148,7 @@ func (l *Lsdb) BuildAndInstallOwnNameLsa() { // @receiver l // func (l *Lsdb) BuildAndInstallOwnCoordinateLsa() { - // todo + // todo:坐标计算预留接口 } // @@ -176,7 +177,8 @@ func (l *Lsdb) ScheduleAdjLsaBuild() { // // ProcessInterest -// @Description: 处理兴趣包。类似NDN的拉式传输。 +// @Description:收到一个兴趣包,根据兴趣包名称,查找LSA并返回。 +// 处理兴趣包。类似NDN的拉式传输。 // 在NLSR的设计中,由于对兴趣包进行了进一步的分段,因此有以下两种兴趣包: //* 1) 需要从segment fetcher中查找的兴趣包: //* /localhop//nlsr/LSA//// @@ -188,6 +190,10 @@ func (l *Lsdb) ScheduleAdjLsaBuild() { func (l *Lsdb) ProcessInterest(interest *packet.Interest) { } +func (l Lsdb) processInterestForLsa() bool { + return true +} + func (l *Lsdb) ProcessGPPkt(pkt *packet.GPPkt) { } @@ -301,10 +307,24 @@ func (l *Lsdb) RemoveLsa(lsa lsa.ILsa) { common2.LogError("") return } - common2.LogDebug("Removing LSA: ", lsa.ToString()) + common2.LogDebug("Removed LSA: ", lsa.ToString()) } -func (l *Lsdb) RemoveLsaByContainerIndex(index int) { +// +// RemoveLsaByNameAndType +// @Description: 删除lsa +// @receiver l +// @param routerIdentifier +// @param lsaType +// +func (l *Lsdb) RemoveLsaByNameAndType(routerIdentifier *component.Identifier, + lsaType lsa.LsaType) { + err := l.LsaContainer.EraseLsaByNameAndType(routerIdentifier, lsaType) + if err != nil { + common2.LogError("") + return + } + common2.LogDebug("Removed LSA: ", routerIdentifier.ToUri()) } // @@ -314,6 +334,42 @@ func (l *Lsdb) RemoveLsaByContainerIndex(index int) { // @receiver l // func (l *Lsdb) BuildAdjLsa() { + common2.LogDebug("buildAdjLsa called") + + // 构建邻接lsa的任务启动,那么安排构建就变为false + l.isBuildAdjLsaScheduled = false + + // 根据配置文件中邻接表的状态,执行不同的动作 + if l.mlsrConfig.GetAdjacencys().IsAdjLsaBuildable(uint32(l.mlsrConfig.GetHelloRetries())) { + // 只有在有计划的情况下才执行adjLsa构建 + adjBuildCountCache := l.adjBuildCount + if adjBuildCountCache > 0 { + // 只有有安排时,构建邻接lsa + if l.mlsrConfig.GetAdjacencys().GetNumOfActiveNeighbor() > 0 { + // 有激活状态的邻居,则安装邻接LSA + common2.LogDebug("Building and installing own Adj LSA") + l.BuildAndInstallOwnAdjLsa() + } else { + // 我们没有活跃的邻居,这意味着没有人可以穿过我们。 + // 因此,请删除LSDB中的条目。这会阻止此路由器刷新LSA,最终导致其他路由器也将其删除。 + common2.LogDebug("Removing own Adj LSA; no ACTIVE neighbors") + l.RemoveLsaByNameAndType(l.thisRouterPrefix, lsa.LsaADJACENCYType) + } + // 如果在构建adj LSA的过程中,FIB必须等待兴趣响应, + // 那么计划的adj LSA构建的数量可能会发生变化,因此我们不应该只将其设置为0。 + l.adjBuildCount = l.adjBuildCount - adjBuildCountCache + } + } else { + // 我们仍在等待了解某个邻居的邻接状态,因此请安排稍后的构建(当有望完成时) + l.isBuildAdjLsaScheduled = true + scheTime := l.mlsrConfig.GetHelloTimeout() * time.Duration(l.mlsrConfig.GetHelloRetries()) + job, err := l.scheduler.ScheduleTaskAfterDuration(scheTime, 1).Do(l.BuildAdjLsa) + job.LimitRunsTo(1) + l.scheduler.StartAsync() + if err != nil { + common2.LogError("Scheduling BuildAdjLsa error, ", err.Error()) + } + } } // diff --git a/route/LinkStateRoutingTableCalculator.go b/route/LinkStateRoutingTableCalculator.go index 8c0cc75..c552328 100644 --- a/route/LinkStateRoutingTableCalculator.go +++ b/route/LinkStateRoutingTableCalculator.go @@ -70,7 +70,7 @@ func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, // 在单路径的情况下,我们可以简单地运行Dijkstra算法。 c.doDijkstraPathCalculation(sourceRouter) // 将新的下一跳通知路由表。// todo: 注意,当前版本中,本机的邻接信息是从配置文件中读取出来的。 - rs, ns := c.addAllLsNextHopsToRoutingTable(mConfig.GetAdjacencyList(), routerMap, sourceRouter) + rs, ns := c.addAllLsNextHopsToRoutingTable(mConfig.GetAdjacencys(), routerMap, sourceRouter) return rs, ns, nil } else { // 多路径计算 @@ -87,7 +87,7 @@ func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, // 以当前邻居为起点,执行Dijkstra算法。 c.doDijkstraPathCalculation(sourceRouter) // 用计算结果更新路由表。 - rs, ns := c.addAllLsNextHopsToRoutingTable(mConfig.GetAdjacencyList(), routerMap, sourceRouter) + rs, ns := c.addAllLsNextHopsToRoutingTable(mConfig.GetAdjacencys(), routerMap, sourceRouter) routers = append(routers, rs...) nexthops = append(nexthops, ns...) } From 1e2780ea1bc81c8e93b6aa49724d2bbc4f1b68ce Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 3 Jun 2022 22:19:27 +0800 Subject: [PATCH 53/70] =?UTF-8?q?LSDB=EF=BC=9A=E5=AE=9E=E7=8E=B0=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E9=82=BB=E6=8E=A5lsa=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsa/AdjLsaAdjacencyList.go | 12 ++++++++++++ lsdb/Lsdb.go | 34 ++++++++++++++++++++++++++-------- 2 files changed, 38 insertions(+), 8 deletions(-) diff --git a/lsa/AdjLsaAdjacencyList.go b/lsa/AdjLsaAdjacencyList.go index 490d5d2..8d9010e 100644 --- a/lsa/AdjLsaAdjacencyList.go +++ b/lsa/AdjLsaAdjacencyList.go @@ -37,6 +37,18 @@ func (l *AdjLsaAdjacenctList) Insert(info *AdjLsaAdjacencyInfo) { l.lsaAdjacencys = append(l.lsaAdjacencys, info) } +// +// InsertAdjacenctList +// @Description: 插入邻接列表 +// @receiver l +// @param list +// +func (l *AdjLsaAdjacenctList) InsertAdjacenctList(list []*AdjLsaAdjacencyInfo) { + for i := 0; i < len(list); i++ { + l.Insert(list[i]) + } +} + // // getAdjList // @Description: 获取包含所有邻接信息的邻接表 diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index a18b0a7..5bcd8c4 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -190,8 +190,8 @@ func (l *Lsdb) ScheduleAdjLsaBuild() { func (l *Lsdb) ProcessInterest(interest *packet.Interest) { } -func (l Lsdb) processInterestForLsa() bool { - return true +func (l *Lsdb) processInterestForLsa(interest *packet.Interest, + originRouterIdentifier *component.Identifier, lsaType lsa.LsaType, seqNo uint64) { } func (l *Lsdb) ProcessGPPkt(pkt *packet.GPPkt) { @@ -378,6 +378,20 @@ func (l *Lsdb) BuildAdjLsa() { // @receiver l // func (l *Lsdb) BuildAndInstallOwnAdjLsa() { + // 根据配置文件,构造本机的名称LSA + adjLsa := new(lsa.AdjLsa) + adjLsa.SetOriginRouter(l.thisRouterPrefix) + adjLsa.SetSeqNo(l.sequencingManager.GetAdjLsaSeq() + 1) // 序列号 + adjLsa.SetLsaExpirationTime(l.getLsaExpirationTimePoint()) // 超期时间 + adjLsa.AdjLsaAdjacenctList.InsertAdjacenctList(l.mlsrConfig.GetAdjacencyList()) // 名称前缀列表 + // 刷新序列号管理器中的名称LSA序列号 + l.sequencingManager.IncreaseAdjLsaSeq() + + // todo: 使用sync通知路由更新 + // m_sync.publishRoutingUpdate(Lsa::Type::ADJACENCY, m_sequencingManager.getAdjLsaSeq()); + + // 安装lsa到LSDB + l.InstallLsa(adjLsa) } // @@ -438,10 +452,14 @@ func (l *Lsdb) ExpireOrRefreshLsa(lsa lsa.ILsa) { } } -func (l *Lsdb) ProcessInterestForLsa(interest *packet.Interest, - originRouterIdentifier *component.Identifier, lsaType lsa.LsaType, seqNo uint64) { -} - +// +// ExpressInterest +// @Description: 发送请求其它路由器LSA的兴趣包 +// @receiver l +// @param interestName +// @param timeOut +// @param deadline +// func (l *Lsdb) ExpressInterest(interestName *component.Identifier, timeOut uint32, deadline *time.Time) { } @@ -458,7 +476,7 @@ func (l *Lsdb) ExpressInterest(interestName *component.Identifier, // @param lsaName // @param seqNo // -func (l *Lsdb) OnFetchLsaError(errorCode uint32, msg string, +func (l *Lsdb) onFetchLsaError(errorCode uint32, msg string, interestName *component.Identifier, retransmitNo uint32, deadline *time.Time, lsaName *component.Identifier, seqNo uint64) { } @@ -472,7 +490,7 @@ func (l *Lsdb) OnFetchLsaError(errorCode uint32, msg string, // @param buffer // @param interestName // -func (l *Lsdb) AfterFetchLsa(buffer bytes.Buffer, interestName *component.Identifier) { +func (l *Lsdb) afterFetchLsa(buffer bytes.Buffer, interestName *component.Identifier) { } func (l *Lsdb) getLsaExpirationTimePoint() uint64 { From 30e5044896ffd510fc455902b91372a903622662 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Mon, 6 Jun 2022 16:50:41 +0800 Subject: [PATCH 54/70] =?UTF-8?q?=E6=B5=8B=E8=AF=95=E9=80=9A=E8=BF=87?= =?UTF-8?q?=E4=BA=86=E5=AE=9A=E6=97=B6=E5=88=A0=E9=99=A4=E5=85=B6=E4=BB=96?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E5=99=A8=E7=9A=84LSA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- common/MlsrConfig.go | 2 +- lsdb/Lsdb.go | 42 +++++++++++++++++---- lsdb/Lsdb_test.go | 89 ++++++++++++++++++++++++++++++++++++++++++++ mlsrConf.ini | 2 +- 4 files changed, 126 insertions(+), 9 deletions(-) diff --git a/common/MlsrConfig.go b/common/MlsrConfig.go index e0591c8..1d97932 100644 --- a/common/MlsrConfig.go +++ b/common/MlsrConfig.go @@ -252,7 +252,7 @@ func (c *MlsrConfig) Init() { c.GeneralConfig.SyncInterestLifetime = 60 * 1000 // 1000-120*1000,范围是1秒到2分钟。默认1分钟 // 2. Log - c.LogConfig.LogLevel = "INFO" + c.LogConfig.LogLevel = "ALL" c.LogConfig.ReportCaller = true c.LogConfig.LogFormat = "text" c.LogConfig.LogFilePath = "" diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index 5bcd8c4..f928c97 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -70,6 +70,11 @@ func (l *Lsdb) Init(mc *common.MlsrConfig, ms *MlsrScheduler, l.face = _face // 序列号管理器 l.sequencingManager = GetInstance() + // 存储器 + err := l.LsaContainer.Init() + if err != nil { + common2.LogFatal("lsdb.LsaContainer init error, ", err.Error()) + } // todo 构造sync @@ -94,7 +99,8 @@ func (l *Lsdb) Init(mc *common.MlsrConfig, ms *MlsrScheduler, //} // 构建并安装自己的名称LSA - l.BuildAndInstallOwnNameLsa() + // todo 先测试其它项 + //l.BuildAndInstallOwnNameLsa() } // @@ -235,7 +241,7 @@ func (l *Lsdb) FindLsa(routerIdentifier *component.Identifier, } // -// IsLsaNew +// isLsaNew // @Description: 返回来自某个路由器的seq是否表示新的LSA。 // @receiver l // @param routerIdentifier @@ -243,15 +249,37 @@ func (l *Lsdb) FindLsa(routerIdentifier *component.Identifier, // @param seqNo // @return bool // -func (l *Lsdb) IsLsaNew(routerIdentifier *component.Identifier, +func (l *Lsdb) isLsaNew(routerIdentifier *component.Identifier, lsaType lsa.LsaType, seqNo uint64) bool { iLsa := l.FindLsa(routerIdentifier, lsaType) - if iLsa.GetSeqNo() >= seqNo { - return false + // 没找到,说明是最新的 + if iLsa == nil { + return true } - return true + // 找到了,且LSDB中的该lsa序列号小于要查的lsa,说明是最新的 + if iLsa.GetSeqNo() < seqNo { + return true + } + return false } +// +// IsLsaNew +// @Description: 返回来自某个路由器的seq是否表示新的LSA。 +// @receiver l +// @param fLsa +// @return bool +// +func (l *Lsdb) IsLsaNew(fLsa lsa.ILsa) bool { + return l.isLsaNew(fLsa.GetOriginRouter(), fLsa.GetType(), fLsa.GetSeqNo()) +} + +// +// InstallLsa +// @Description: 将LSA安装到lsdb中 +// @receiver l +// @param lsa +// func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { timeToExpire := l.lsaRefreshTime @@ -265,7 +293,7 @@ func (l *Lsdb) InstallLsa(lsa lsa.ILsa) { // 查看数据库中是否已有该LSA源路由器所发出的LSA lsaInDb := l.FindLsa(lsa.GetOriginRouter(), lsa.GetType()) - if lsa == nil { + if lsaInDb == nil { // 如果没有: common2.LogDebug("Adding Lsa ", lsa.ToString()) // 1. 就插入该LSA diff --git a/lsdb/Lsdb_test.go b/lsdb/Lsdb_test.go index 50186c9..8a25ffc 100644 --- a/lsdb/Lsdb_test.go +++ b/lsdb/Lsdb_test.go @@ -10,9 +10,14 @@ package lsdb import ( "fmt" + common2 "minlib/common" + "minlib/component" "minlib/logicface" "mlsr/common" + "mlsr/lsa" + "strconv" "testing" + "time" ) const testConfigPath = "D:\\" + common.DefaultConfFileName @@ -64,3 +69,87 @@ func TestUnixTime(t *testing.T) { timeTemplate := "2006-01-02 15:04:05" // 时间戳常规类型 fmt.Println(lsdb.uintToTime(timeExpire).Format(timeTemplate)) } + +// +// TestLsdb_ScheduleLsaExpiration +// @Description: 测试安排LSA过期事件 +// @param t +// +func TestLsdb_ScheduleLsaExpiration(t *testing.T) { + // 1. 初始化LSDB + // 配置文件初始化 + mlsrConfig, err := common.ParseConfig(testConfigPath) + if err != nil { + common2.LogInfo("配置文件解析错误") + } + // 调度器初始化 + sche := new(MlsrScheduler) + sche.Init() + // LogicFace初始化(假设初始化,暂时用不到) + face := new(logicface.LogicFace) + // LSDB初始化 + lsdb := new(Lsdb) + lsdb.Init(mlsrConfig, sche, face) + + // 2. 生成一个邻接Lsa + adjLsa := new(lsa.AdjLsa) + adjLsa.SetLsaExpirationTime(2000) + adjLsa.SetLsaSequenceNumber(1234) + adjLsa.LsaOriginRouterIdentifier, _ = component.CreateIdentifierByString("/min/pku") + // 构造邻接信息部分 + // 先构造一个info + linkCost := lsa.AdjLsaLinkCost{} + linkCost.SetLinkCost(100) + faceUri := lsa.AdjLsaLogicFaceUri{} + faceUri.SetLogicFaceUri("uri") + faceId := lsa.AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden, _ := component.CreateIdentifierByString("/pku/router1") + adjInfo := lsa.NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) + adjLsa.Insert(adjInfo) + + // 3. 插入Lsdb + err = lsdb.Emplace(adjLsa) + if err != nil { + common2.LogInfo("插入错误") + } + common2.LogInfo("插入成功") + + // 4. 设置自动删除任务【3s+10s=13s】 + timeDur := 3 * time.Second + lsdb.ScheduleLsaExpiration(adjLsa, timeDur) + common2.LogInfo("???") + + // 5. 不断循环查询lsdb中是否存在该lsa + i := 0 + for true { + b := lsdb.DoesLsaExist(adjLsa) + common2.LogInfo("是否存在:" + strconv.FormatBool(b)) + time.Sleep(time.Second) + i++ + } +} + +// +// TestLsdb_InstallLsa +// @Description: 测试安装lsa +// @param t +// +func TestLsdb_InstallLsa_DoesExist(t *testing.T) { + // 1. 初始化LSDB + // 配置文件初始化 + mlsrConfig, err := common.ParseConfig(testConfigPath) + if err != nil { + fmt.Println("配置文件解析错误") + } + // 调度器初始化 + sche := new(MlsrScheduler) + sche.Init() + // LogicFace初始化(假设初始化,暂时用不到) + face := new(logicface.LogicFace) + // LSDB初始化 + lsdb := new(Lsdb) + lsdb.Init(mlsrConfig, sche, face) + + // 2. +} diff --git a/mlsrConf.ini b/mlsrConf.ini index 7d9d585..3af5564 100644 --- a/mlsrConf.ini +++ b/mlsrConf.ini @@ -9,7 +9,7 @@ SyncProtocol = min-sync SyncInterestLifetime = 60000 [Log] -LogLevel = INFO +LogLevel = ALL ReportCaller = true LogFormat = text LogFilePath = From e315bc868dc47e4c323604d8ed355dbe54354458 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Mon, 6 Jun 2022 17:46:24 +0800 Subject: [PATCH 55/70] =?UTF-8?q?=E5=A2=9E=E5=8A=A0lsdb=E4=B8=AD=E8=8B=A5?= =?UTF-8?q?=E5=B9=B2=E5=87=BD=E6=95=B0=E7=9A=84=E6=B5=8B=E8=AF=95=EF=BC=9A?= =?UTF-8?q?=E6=9E=84=E5=BB=BA=E5=B9=B6=E5=AE=89=E8=A3=85namelsa=20?= =?UTF-8?q?=E5=AE=89=E8=A3=85lsa=20=E6=9E=84=E5=BB=BA=E5=B9=B6=E5=AE=89?= =?UTF-8?q?=E8=A3=85=E6=9C=AC=E6=9C=BAadjlsa=20=E5=AF=B9=E6=9D=A5=E6=BA=90?= =?UTF-8?q?=E4=BA=8E=E5=85=B6=E5=AE=83=E8=B7=AF=E7=94=B1=E5=99=A8=E7=9A=84?= =?UTF-8?q?lsa=E8=BF=9B=E8=A1=8C=E5=88=B0=E6=9C=9F=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/Lsdb.go | 3 +- lsdb/Lsdb_test.go | 107 ++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 104 insertions(+), 6 deletions(-) diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index f928c97..7bcc44b 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -99,8 +99,7 @@ func (l *Lsdb) Init(mc *common.MlsrConfig, ms *MlsrScheduler, //} // 构建并安装自己的名称LSA - // todo 先测试其它项 - //l.BuildAndInstallOwnNameLsa() + l.BuildAndInstallOwnNameLsa() } // diff --git a/lsdb/Lsdb_test.go b/lsdb/Lsdb_test.go index 8a25ffc..f1a3855 100644 --- a/lsdb/Lsdb_test.go +++ b/lsdb/Lsdb_test.go @@ -12,6 +12,7 @@ import ( "fmt" common2 "minlib/common" "minlib/component" + "minlib/encoding" "minlib/logicface" "mlsr/common" "mlsr/lsa" @@ -125,17 +126,80 @@ func TestLsdb_ScheduleLsaExpiration(t *testing.T) { for true { b := lsdb.DoesLsaExist(adjLsa) common2.LogInfo("是否存在:" + strconv.FormatBool(b)) + lsaCache := lsdb.FindLsa(adjLsa.GetOriginRouter(), adjLsa.GetType()) + if lsaCache != nil { + common2.LogInfo(lsaCache.ToString()) + } time.Sleep(time.Second) i++ } } // -// TestLsdb_InstallLsa -// @Description: 测试安装lsa +// TestLsab_InstallLsa +// @Description: 测试安装lsa。安装lsa时会根据过期时间来设置多久后删除或更新该lsa // @param t // -func TestLsdb_InstallLsa_DoesExist(t *testing.T) { +func TestLsab_InstallLsa(t *testing.T) { + // 1. 初始化LSDB + // 配置文件初始化 + mlsrConfig, err := common.ParseConfig(testConfigPath) + if err != nil { + common2.LogInfo("配置文件解析错误") + } + // 调度器初始化 + sche := new(MlsrScheduler) + sche.Init() + // LogicFace初始化(假设初始化,暂时用不到) + face := new(logicface.LogicFace) + // LSDB初始化 + lsdb := new(Lsdb) + lsdb.Init(mlsrConfig, sche, face) + + // 2. 构建三秒后过期的时间戳,并将之设置到namelsa中 + timeExpire := uint64(time.Now().Add(3 * time.Second).UnixMilli()) + // 构造info + namePrefixInfo := new(lsa.NameLsaNamePrefixInfo) + namePrefixInfo.NamePrefix, _ = component.CreateIdentifierByString("/min/pku") + namePrefixInfo.InsertSource("/wechat") + namePrefixInfo.InsertSource("/qq") + // 构造nameLSA + nameLsa := new(lsa.NameLsa) + nameLsa.LsaBase = lsa.LsaBase{ + SelfEncodingBase: encoding.SelfEncodingBase{}, + LsaExpirationTime: lsa.LsaExpirationTime{}, + LsaSequenceNumber: lsa.LsaSequenceNumber{}, + LsaOriginRouterIdentifier: nil, + } + nameLsa.SetLsaSequenceNumber(111) + nameLsa.SetLsaExpirationTime(timeExpire) + routerIdent, _ := component.CreateIdentifierByString("/pku/router") + nameLsa.SetOriginRouter(routerIdent) + nameLsa.InsertNamePrefixInfo(namePrefixInfo) + + // 3. 安装到lsdb + lsdb.InstallLsa(nameLsa) + + // 4. 不断循环查询lsdb中是否存在该lsa + i := 0 + for true { + b := lsdb.DoesLsaExist(nameLsa) + common2.LogInfo("是否存在:" + strconv.FormatBool(b)) + lsaCache := lsdb.FindLsa(nameLsa.GetOriginRouter(), nameLsa.GetType()) + if lsaCache != nil { + common2.LogInfo(lsaCache.ToString()) + } + time.Sleep(time.Second) + i++ + } +} + +// +// TestName_BuildAndInstallAdjLsa +// @Description: 测试构建本机的adjlsa +// @param t +// +func TestName_BuildAndInstallAdjLsa(t *testing.T) { // 1. 初始化LSDB // 配置文件初始化 mlsrConfig, err := common.ParseConfig(testConfigPath) @@ -151,5 +215,40 @@ func TestLsdb_InstallLsa_DoesExist(t *testing.T) { lsdb := new(Lsdb) lsdb.Init(mlsrConfig, sche, face) - // 2. + // 2. 安装本机adjlsa + lsdb.BuildAndInstallOwnAdjLsa() + + // 3. 打印lsdb中所有本机lsa + lsas, _ := lsdb.LsaContainer.GetLSAsByType(lsa.LsaADJACENCYType) + for i := 0; i < len(lsas); i++ { + common2.LogInfo(lsas[i].ToString()) + } + lsas, _ = lsdb.LsaContainer.GetLSAsByType(lsa.LsaNAMEType) + for i := 0; i < len(lsas); i++ { + common2.LogInfo(lsas[i].ToString()) + } +} + +// +// TestLsdb_InstallLsa +// @Description: 测试安装lsa +// @param t +// +func TestLsdb_InstallLsa_ScheduleAdjLsaBuild(t *testing.T) { + // 1. 初始化LSDB + // 配置文件初始化 + mlsrConfig, err := common.ParseConfig(testConfigPath) + if err != nil { + fmt.Println("配置文件解析错误") + } + // 调度器初始化 + sche := new(MlsrScheduler) + sche.Init() + // LogicFace初始化(假设初始化,暂时用不到) + face := new(logicface.LogicFace) + // LSDB初始化 + lsdb := new(Lsdb) + lsdb.Init(mlsrConfig, sche, face) + + // 2. todo 暂时不测,等linux机器上做实机测试 } From 925ad0e7c8d502d187baa356c12fd80199fe0d89 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Mon, 6 Jun 2022 18:05:28 +0800 Subject: [PATCH 56/70] =?UTF-8?q?=E6=B5=8B=E8=AF=95routermap=E4=BB=8Elsdb?= =?UTF-8?q?=E4=B8=AD=E6=9E=84=E5=BB=BAuri=E5=88=B0int=E7=9A=84=E6=98=A0?= =?UTF-8?q?=E5=B0=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/RouterMap.go | 22 ++++++++++++++++++++++ route/RouterMap_test.go | 28 ++++++++++++++++++++++++++-- 2 files changed, 48 insertions(+), 2 deletions(-) diff --git a/route/RouterMap.go b/route/RouterMap.go index a2f6719..58d30f2 100644 --- a/route/RouterMap.go +++ b/route/RouterMap.go @@ -10,8 +10,10 @@ package route import ( + "encoding/json" "minlib/component" "mlsr/lsa" + "strconv" "sync" ) @@ -34,6 +36,26 @@ type RouterMap struct { mapLock *sync.RWMutex } +// +// ToString +// @Description: 转string,便于测试查看map的状态 +// @receiver m +// @return string +// +func (m *RouterMap) ToString() string { + s := "" + s += "MappingIndex:" + strconv.Itoa(m.mappingIndex) + " " + // 第一个map + dataType, _ := json.Marshal(m.routerToNumberMap) + dataString := string(dataType) + s += dataString + " " + // 第二个map + dataType, _ = json.Marshal(m.routerToNumberMap) + dataString = string(dataType) + s += dataString + " " + return s +} + // // Store // @Description: 存入一个路由器标识 diff --git a/route/RouterMap_test.go b/route/RouterMap_test.go index 118c83f..824de3b 100644 --- a/route/RouterMap_test.go +++ b/route/RouterMap_test.go @@ -12,24 +12,48 @@ import ( "fmt" common2 "minlib/common" "minlib/component" + "minlib/logicface" + "mlsr/common" "mlsr/lsa" "mlsr/lsdb" "testing" ) +const testConfigPath = "D:\\" + common.DefaultConfFileName + func TestRouterMap_CreateFromAdjLsdb(t *testing.T) { // 1. 构造LSDB - mLsdb := new(lsdb.Lsdb) + // 配置文件初始化 + mlsrConfig, err := common.ParseConfig(testConfigPath) + if err != nil { + fmt.Println("配置文件解析错误") + } + // 调度器初始化 + sche := new(lsdb.MlsrScheduler) + sche.Init() + // LogicFace初始化(假设初始化,暂时用不到) + face := new(logicface.LogicFace) + // LSDB初始化 + lsdb := new(lsdb.Lsdb) + lsdb.Init(mlsrConfig, sche, face) + // 强行构建邻接lsa + lsdb.BuildAndInstallOwnAdjLsa() // 2. 取出LSDB中的邻接LSA - lsas, err := mLsdb.GetLSAsByType(lsa.LsaADJACENCYType) + lsas, err := lsdb.GetLSAsByType(lsa.LsaADJACENCYType) if err != nil { common2.LogError("Get Lsa in calculateLsRoutingTable error, ", err) } + common2.LogInfo("邻接lsa数目: ", len(lsas)) + // 3. 构造RouterMap rMap := new(RouterMap) rMap.Init() err = rMap.CreateFromAdjLsdb(lsas) + + // 4. 打印RouterMap状态 + common2.LogInfo(rMap) + common2.LogInfo(rMap.ToString()) } // From d8143d3ad9241457978fbeab70359543295cb21e Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Tue, 7 Jun 2022 17:23:33 +0800 Subject: [PATCH 57/70] =?UTF-8?q?=E5=AF=B9=E8=B7=AF=E7=94=B1=E8=A1=A8?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E5=99=A8=E8=BF=9B=E8=A1=8C=E5=88=9D=E6=AD=A5?= =?UTF-8?q?=E6=B5=8B=E8=AF=95=EF=BC=8C=E5=B9=B6=E4=BF=AE=E5=A4=8D=E8=8B=A5?= =?UTF-8?q?=E5=B9=B2=E5=B0=8FBUG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/LinkStateRoutingTableCalculator.go | 5 ++ route/RoutingTableCalculator.go | 54 ++++++++++++++++++-- route/RoutingTableCalculator_test.go | 64 +++++++++++++++++++++--- 3 files changed, 111 insertions(+), 12 deletions(-) diff --git a/route/LinkStateRoutingTableCalculator.go b/route/LinkStateRoutingTableCalculator.go index c552328..1f6fe4b 100644 --- a/route/LinkStateRoutingTableCalculator.go +++ b/route/LinkStateRoutingTableCalculator.go @@ -53,8 +53,13 @@ const ( func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, mConfig *common.MlsrConfig, lsdb *lsdb.Lsdb) ([]*component.Identifier, []*NextHop, error) { + // 设置路由器数目 + c.SetRouterNum(routerMap.GetMapSize()) + // 分配矩阵空间 c.allocateAdjMatrix() + // 初始化矩阵数值 c.initMatrix() + // 根据Lsdb邻接信息构造邻接矩阵 _ = c.makeAdjMatrix(lsdb, routerMap) // 从配置文件中获取源路由器前缀,并根据routerMap获取其映射号 sourceRouter, b := routerMap.GetMappingNoByRouterName(mConfig.GetRouterPrefix()) diff --git a/route/RoutingTableCalculator.go b/route/RoutingTableCalculator.go index 4cbcfb1..8b65e05 100644 --- a/route/RoutingTableCalculator.go +++ b/route/RoutingTableCalculator.go @@ -12,6 +12,7 @@ import ( "errors" "mlsr/lsa" "mlsr/lsdb" + "strconv" "sync" ) @@ -21,9 +22,54 @@ type RoutingTableCalculator struct { // 路由器数目 m_nRouters int - vNoLink int - links []int - linkCosts []uint64 + // 稀疏矩阵的形式存储本机路由器的邻接链路信息 + vNoLink int // 链路数 + links []int // 链路索引号 + linkCosts []uint64 // 链路开销 +} + +// +// ToString +// @Description: 将路由表计算器的成员变量转为string。用于测试。 +// @receiver c +// @return string +// +func (c *RoutingTableCalculator) ToString() string { + res := "\n" + res += "路由器数目:" + strconv.Itoa(c.m_nRouters) + "\n" + res += "邻接矩阵:\n" + for i := 0; i < len(c.adjMatrix); i++ { + for j := 0; j < len(c.adjMatrix[i]); j++ { + res += "[" + res += strconv.Itoa(i) + res += "," + res += strconv.Itoa(j) + res += "," + res += strconv.FormatUint(c.adjMatrix[i][j], 10) + res += "] " + } + res += "\n" + } + res += "本机相邻链路数:" + strconv.Itoa(c.vNoLink) + "\n" + res += "本机相邻链路索引:" + res += "[" + for i := 0; i < len(c.links); i++ { + res += strconv.Itoa(c.links[i]) + if i < (len(c.links) - 1) { + res += "," + } + } + res += "]\n" + res += "本机相邻链路开销:" + res += "[" + for i := 0; i < len(c.linkCosts); i++ { + res += strconv.Itoa(int(c.linkCosts[i])) + if i < (len(c.linkCosts) - 1) { + res += "," + } + } + res += "]\n" + return res } // @@ -57,7 +103,7 @@ func (c *RoutingTableCalculator) allocateAdjMatrix() { func (c *RoutingTableCalculator) initMatrix() { for i := 0; i < c.m_nRouters; i++ { for j := 0; j < c.m_nRouters; j++ { - c.adjMatrix[0][0] = NON_ADJACENT_COST + c.adjMatrix[i][j] = NON_ADJACENT_COST } } } diff --git a/route/RoutingTableCalculator_test.go b/route/RoutingTableCalculator_test.go index 922d849..6f852ac 100644 --- a/route/RoutingTableCalculator_test.go +++ b/route/RoutingTableCalculator_test.go @@ -8,18 +8,66 @@ package route -import "testing" +import ( + "fmt" + common2 "minlib/common" + "minlib/logicface" + "mlsr/common" + "mlsr/lsa" + "mlsr/lsdb" + "testing" +) func TestRoutingTableCalculator_Init(t *testing.T) { - // 1. 路由计算器 + // 构造路由计算器 rtc := new(RoutingTableCalculator) - // 1.1 分配矩阵空间 + + // 1. 根据LSDB构造邻接矩阵 + // 1.1 构造LSDB + // 配置文件初始化 + mlsrConfig, err := common.ParseConfig(testConfigPath) + if err != nil { + fmt.Println("配置文件解析错误") + } + // 调度器初始化 + sche := new(lsdb.MlsrScheduler) + sche.Init() + // LogicFace初始化(假设初始化,暂时用不到) + face := new(logicface.LogicFace) + // LSDB初始化 + mlsdb := new(lsdb.Lsdb) + mlsdb.Init(mlsrConfig, sche, face) + // 安装本机adjlsa + mlsdb.BuildAndInstallOwnAdjLsa() + // todo 传入一些其它虚拟lsa,这些lsa与本机lsa共同形成一个小型路由拓扑 + + // 1.2 构造RouterMap + lsas, err := mlsdb.GetLSAsByType(lsa.LsaADJACENCYType) + if err != nil { + common2.LogError("Get Lsa in calculateLsRoutingTable error, ", err) + } + common2.LogInfo("邻接lsa数目: ", len(lsas)) + rMap := new(RouterMap) + rMap.Init() + err = rMap.CreateFromAdjLsdb(lsas) + // 打印rm + common2.LogInfo(rMap.ToString()) + + // 1.3 根据RouterMap,和lsdb中的adjlsa,构造邻接矩阵 + // 设置路由器数目 + rtc.SetRouterNum(rMap.GetMapSize()) + // 分配矩阵空间 rtc.allocateAdjMatrix() - // 1.2 初始化矩阵 + // 初始化矩阵值 rtc.initMatrix() - // 1.3 根据LSDB构造邻接矩阵 - - // 1.3.1 构造LSDB - // 1.3.2 构造RouterMap + // 构造矩阵 + err = rtc.makeAdjMatrix(mlsdb, rMap) + if err != nil { + common2.LogError("邻接矩阵构造失败") + } + // 2. 打印输出路由表计算器 + fmt.Println(rtc.ToString()) + fmt.Println("源路由器的邻接数目:", rtc.getNumOfLinkfromAdjMatrix(0)) + fmt.Println("另一个路由器的邻接数目:", rtc.getNumOfLinkfromAdjMatrix(1)) } From 3afa39df5f2e031c5e932fb2a56a92f7dd15fbb6 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Tue, 7 Jun 2022 17:30:53 +0800 Subject: [PATCH 58/70] =?UTF-8?q?=E7=9D=80=E6=89=8B=E5=AF=B9=E9=82=BB?= =?UTF-8?q?=E6=8E=A5=E7=8A=B6=E6=80=81=E8=B7=AF=E7=94=B1=E8=A1=A8=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E5=99=A8=E8=BF=9B=E8=A1=8C=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/LinkStateRoutingTableCalculator_test.go | 81 ++++++++++++++++++- 1 file changed, 79 insertions(+), 2 deletions(-) diff --git a/route/LinkStateRoutingTableCalculator_test.go b/route/LinkStateRoutingTableCalculator_test.go index c09b219..62db6c5 100644 --- a/route/LinkStateRoutingTableCalculator_test.go +++ b/route/LinkStateRoutingTableCalculator_test.go @@ -8,7 +8,84 @@ package route -import "testing" +import ( + "fmt" + common2 "minlib/common" + "minlib/logicface" + "mlsr/common" + "mlsr/lsa" + "mlsr/lsdb" + "testing" +) + +// +// TestLinkStateRoutingTableCalculator_CalculateOnePath +// @Description: 测试普通的路径计算 +// @param t +// +func TestLinkStateRoutingTableCalculator_CalculateOnePath(t *testing.T) { + // 1. 构造邻接状态路由表计算器 + rtc := new(LinkStateRoutingTableCalculator) + + // 1.1 构造LSDB + // 配置文件初始化 + mlsrConfig, err := common.ParseConfig(testConfigPath) + if err != nil { + fmt.Println("配置文件解析错误") + } + // 调度器初始化 + sche := new(lsdb.MlsrScheduler) + sche.Init() + // LogicFace初始化(假设初始化,暂时用不到) + face := new(logicface.LogicFace) + // LSDB初始化 + mlsdb := new(lsdb.Lsdb) + mlsdb.Init(mlsrConfig, sche, face) + // 安装本机adjlsa + mlsdb.BuildAndInstallOwnAdjLsa() + // todo 传入一些其它虚拟lsa,这些lsa与本机lsa共同形成一个小型路由拓扑 + + // 1.2 构造RouterMap + lsas, err := mlsdb.GetLSAsByType(lsa.LsaADJACENCYType) + if err != nil { + common2.LogError("Get Lsa in calculateLsRoutingTable error, ", err) + } + common2.LogInfo("邻接lsa数目: ", len(lsas)) + rMap := new(RouterMap) + rMap.Init() + err = rMap.CreateFromAdjLsdb(lsas) + // 打印rm + common2.LogInfo(rMap.ToString()) + + // 1.3 根据RouterMap,和lsdb中的adjlsa,构造邻接矩阵 + // 设置路由器数目 + rtc.SetRouterNum(rMap.GetMapSize()) + // 分配矩阵空间 + rtc.allocateAdjMatrix() + // 初始化矩阵值 + rtc.initMatrix() + // 构造矩阵 + err = rtc.makeAdjMatrix(mlsdb, rMap) + if err != nil { + common2.LogError("邻接矩阵构造失败") + } + + // 1.4 打印输出路由表计算器 + fmt.Println(rtc.ToString()) + fmt.Println("源路由器的邻接数目:", rtc.getNumOfLinkfromAdjMatrix(0)) + fmt.Println("另一个路由器的邻接数目:", rtc.getNumOfLinkfromAdjMatrix(1)) + + // 2. 执行单源最短路径算法 + rtc.doDijkstraPathCalculation(0) + // todo 查看执行结果 + +} + +// +// TestLinkStateRoutingTableCalculator_CalculateMutilPath +// @Description: 测试多路径计算 +// @param t +// +func TestLinkStateRoutingTableCalculator_CalculateMutilPath(t *testing.T) { -func TestLinkStateRoutingTableCalculator_CalculatePath(t *testing.T) { } From fbb7712d4ebc90089eba8d9f90c2a827a5dd16c7 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 8 Jun 2022 16:55:04 +0800 Subject: [PATCH 59/70] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E4=BA=94=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E6=8B=93=E6=89=91=E6=9D=A5=E6=B5=8B=E8=AF=95=E9=93=BE?= =?UTF-8?q?=E8=B7=AF=E7=8A=B6=E6=80=81=E8=B7=AF=E7=94=B1=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E5=99=A8=EF=BC=8C=E6=89=A7=E8=A1=8C=E5=8D=95=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=EF=BC=8C=E6=B5=8B=E8=AF=95=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/LinkStateRoutingTableCalculator.go | 40 +++++++- route/LinkStateRoutingTableCalculator_test.go | 95 ++++++++++++++++++- route/RouterMap.go | 2 +- 3 files changed, 126 insertions(+), 11 deletions(-) diff --git a/route/LinkStateRoutingTableCalculator.go b/route/LinkStateRoutingTableCalculator.go index 1f6fe4b..aedd971 100644 --- a/route/LinkStateRoutingTableCalculator.go +++ b/route/LinkStateRoutingTableCalculator.go @@ -15,6 +15,7 @@ import ( "mlsr/common" "mlsr/lsa" "mlsr/lsdb" + "strconv" ) // @@ -23,8 +24,6 @@ import ( // type LinkStateRoutingTableCalculator struct { RoutingTableCalculator - NO_NEXT_HOP int - // 私有变量区 // 表示源路由器想要到达某路由器,其最短路径上经过的上一个路由器。 m_parent []int @@ -32,6 +31,33 @@ type LinkStateRoutingTableCalculator struct { m_distance []uint64 } +// +// ToString +// @Description: 转string +// @receiver c +// @return string +// +func (c *LinkStateRoutingTableCalculator) ToString() string { + str := "" + str += "每个节点最佳路径的上一跳:[" + for i := 0; i < len(c.m_parent); i++ { + str += "(" + strconv.Itoa(i) + str += ", " + str += strconv.Itoa(c.m_parent[i]) + str += ")" + } + str += "\n" + str += "每个节点最佳路径的总开销:[" + for i := 0; i < len(c.m_distance); i++ { + str += "(" + strconv.Itoa(i) + str += ", " + str += strconv.FormatUint(c.m_distance[i], 10) + str += ")" + } + str += "\n" + return str +} + // 一些在最短路径计算时会用到的常量 const ( EMPTY_PARENT = -12345 // 没有父节点 -12345 @@ -61,6 +87,9 @@ func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, c.initMatrix() // 根据Lsdb邻接信息构造邻接矩阵 _ = c.makeAdjMatrix(lsdb, routerMap) + // 为路由计算中记录路径和距离的两个数组分配空间 + c.allocateParent() + c.allocateDistance() // 从配置文件中获取源路由器前缀,并根据routerMap获取其映射号 sourceRouter, b := routerMap.GetMappingNoByRouterName(mConfig.GetRouterPrefix()) if !b { @@ -74,7 +103,7 @@ func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, if mConfig.GetMaxFacesPerPrefix() == 1 { // 在单路径的情况下,我们可以简单地运行Dijkstra算法。 c.doDijkstraPathCalculation(sourceRouter) - // 将新的下一跳通知路由表。// todo: 注意,当前版本中,本机的邻接信息是从配置文件中读取出来的。 + // 将新的下一跳通知路由表。// 注意,当前版本中,本机的邻接信息是从配置文件中读取出来的。 rs, ns := c.addAllLsNextHopsToRoutingTable(mConfig.GetAdjacencys(), routerMap, sourceRouter) return rs, ns, nil } else { @@ -169,9 +198,10 @@ func (c *LinkStateRoutingTableCalculator) doDijkstraPathCalculation(sourceRouter // // sortQueueByDistance -// @Description: 对列表中的元素进行交换排序 +// @Description: 对切片中的元素进行交换排序 +// 注意,切片是引用传递,因此这里实际修改了Q的值。 // @receiver c -// @param Q 要排序元素的数组 +// @param Q 要排序元素的切片 // @param dist 包含距离的数组 // @param start 列表中要排序的第一个元素 // @param element 列表元素数目 diff --git a/route/LinkStateRoutingTableCalculator_test.go b/route/LinkStateRoutingTableCalculator_test.go index 62db6c5..9c9c59d 100644 --- a/route/LinkStateRoutingTableCalculator_test.go +++ b/route/LinkStateRoutingTableCalculator_test.go @@ -11,16 +11,54 @@ package route import ( "fmt" common2 "minlib/common" + "minlib/component" "minlib/logicface" "mlsr/common" "mlsr/lsa" "mlsr/lsdb" + "strconv" "testing" + "time" ) +// +// testCreateAdjLsa +// @Description: 构造邻接lsa +// @param uri +// @return *lsa.AdjLsa +// +func testCreateAdjLsa(uri string) *lsa.AdjLsa { + base := new(lsa.AdjLsa) + timeExpire := time.Now() + timeExpire = timeExpire.Add(30 * time.Minute) + base.SetLsaExpirationTime(uint64(timeExpire.UnixMilli())) + base.SetLsaSequenceNumber(1234) + base.LsaOriginRouterIdentifier, _ = component.CreateIdentifierByString(uri) + return base +} + +// +// testCreateAdjInfo +// @Description: 构造邻接信息 +// @param cost +// @param uri +// @return *lsa.AdjLsaAdjacencyInfo +// +func testCreateAdjInfo(cost uint64, uri string) *lsa.AdjLsaAdjacencyInfo { + linkCost := lsa.AdjLsaLinkCost{} + linkCost.SetLinkCost(cost) + faceUri := lsa.AdjLsaLogicFaceUri{} + faceUri.SetLogicFaceUri("uri") + faceId := lsa.AdjLsaLogicFaceId{} + faceId.SetLogicFaceId(77) + iden, _ := component.CreateIdentifierByString(uri) + adjInfo := lsa.NewAdjLsaAdjacencyInfo(linkCost, faceUri, faceId, iden, 123, 1) + return adjInfo +} + // // TestLinkStateRoutingTableCalculator_CalculateOnePath -// @Description: 测试普通的路径计算 +// @Description: 测试普通的最短路径计算。测试已通过。 // @param t // func TestLinkStateRoutingTableCalculator_CalculateOnePath(t *testing.T) { @@ -43,8 +81,41 @@ func TestLinkStateRoutingTableCalculator_CalculateOnePath(t *testing.T) { mlsdb.Init(mlsrConfig, sche, face) // 安装本机adjlsa mlsdb.BuildAndInstallOwnAdjLsa() - // todo 传入一些其它虚拟lsa,这些lsa与本机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) // 1.2 构造RouterMap lsas, err := mlsdb.GetLSAsByType(lsa.LsaADJACENCYType) if err != nil { @@ -71,14 +142,28 @@ func TestLinkStateRoutingTableCalculator_CalculateOnePath(t *testing.T) { } // 1.4 打印输出路由表计算器 + fmt.Println(rMap.ToString()) fmt.Println(rtc.ToString()) fmt.Println("源路由器的邻接数目:", rtc.getNumOfLinkfromAdjMatrix(0)) fmt.Println("另一个路由器的邻接数目:", rtc.getNumOfLinkfromAdjMatrix(1)) // 2. 执行单源最短路径算法 + rtc.allocateParent() + rtc.allocateDistance() rtc.doDijkstraPathCalculation(0) - // todo 查看执行结果 - + // 查看执行结果 + // 计算器中的上一跳路径,以及开销 + fmt.Println(rtc.ToString()) + // 计算器获取的针对每个目的路由器的下一跳,及开销。 + names, nexthops := rtc.addAllLsNextHopsToRoutingTable(mlsrConfig.GetAdjacencys(), rMap, 0) + for i := 0; i < len(names); i++ { + fmt.Println(names[i].ToUri() + " ") + } + fmt.Println("") + for i := 0; i < len(nexthops); i++ { + fmt.Println(nexthops[i].LogicFaceUri() + "-" + + strconv.FormatUint(nexthops[i].RouteCost.RouteCost(), 10) + " ") + } } // diff --git a/route/RouterMap.go b/route/RouterMap.go index 58d30f2..80834c6 100644 --- a/route/RouterMap.go +++ b/route/RouterMap.go @@ -50,7 +50,7 @@ func (m *RouterMap) ToString() string { dataString := string(dataType) s += dataString + " " // 第二个map - dataType, _ = json.Marshal(m.routerToNumberMap) + dataType, _ = json.Marshal(m.numberToRouterMap) dataString = string(dataType) s += dataString + " " return s From 5894ac326b15e5ddf4fc24fb0985b4b29fdf3ad5 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 8 Jun 2022 17:16:35 +0800 Subject: [PATCH 60/70] =?UTF-8?q?=E4=BD=BF=E7=94=A8=E4=BA=94=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E6=8B=93=E6=89=91=E6=9D=A5=E6=B5=8B=E8=AF=95=E9=93=BE?= =?UTF-8?q?=E8=B7=AF=E7=8A=B6=E6=80=81=E8=B7=AF=E7=94=B1=E8=AE=A1=E7=AE=97?= =?UTF-8?q?=E5=99=A8=EF=BC=8C=E6=89=A7=E8=A1=8C=E5=A4=9A=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=EF=BC=8C=E6=B5=8B=E8=AF=95=E9=80=9A=E8=BF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/LinkStateRoutingTableCalculator.go | 2 +- route/LinkStateRoutingTableCalculator_test.go | 117 ++++++++++++++++++ 2 files changed, 118 insertions(+), 1 deletion(-) diff --git a/route/LinkStateRoutingTableCalculator.go b/route/LinkStateRoutingTableCalculator.go index aedd971..bc9767e 100644 --- a/route/LinkStateRoutingTableCalculator.go +++ b/route/LinkStateRoutingTableCalculator.go @@ -114,7 +114,7 @@ func (c *LinkStateRoutingTableCalculator) CalculatePath(routerMap *RouterMap, c.allocateLinkCosts() // 2. 获取用于路径计算的稀疏邻接列表。具体操作是填充:c.links,c.linkCosts c.getLinksFromAdjMatrix(sourceRouter) - // + // 3. 遍历每个外接链路能够达到其它目的路由器的所有下一跳及其开销 for i := 0; i < c.vNoLink; i++ { // 模拟只有当前邻居i可以访问的情形。即:砍掉除当前邻居路由器外的其他邻接链路 c.adjustAdMatrix(sourceRouter, c.links[i], c.linkCosts[i]) diff --git a/route/LinkStateRoutingTableCalculator_test.go b/route/LinkStateRoutingTableCalculator_test.go index 9c9c59d..c43c644 100644 --- a/route/LinkStateRoutingTableCalculator_test.go +++ b/route/LinkStateRoutingTableCalculator_test.go @@ -172,5 +172,122 @@ func TestLinkStateRoutingTableCalculator_CalculateOnePath(t *testing.T) { // @param t // func TestLinkStateRoutingTableCalculator_CalculateMutilPath(t *testing.T) { + // 1. 构造邻接状态路由表计算器 + rtc := new(LinkStateRoutingTableCalculator) + // 1.1 构造LSDB + // 配置文件初始化 + mlsrConfig, err := common.ParseConfig(testConfigPath) + if err != nil { + fmt.Println("配置文件解析错误") + } + // 调度器初始化 + sche := new(lsdb.MlsrScheduler) + sche.Init() + // LogicFace初始化(假设初始化,暂时用不到) + face := new(logicface.LogicFace) + // LSDB初始化 + mlsdb := new(lsdb.Lsdb) + mlsdb.Init(mlsrConfig, sche, face) + // 安装本机adjlsa + mlsdb.BuildAndInstallOwnAdjLsa() + // 传入一些其它虚拟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) + // 1.2 构造RouterMap + lsas, err := mlsdb.GetLSAsByType(lsa.LsaADJACENCYType) + if err != nil { + common2.LogError("Get Lsa in calculateLsRoutingTable error, ", err) + } + common2.LogInfo("邻接lsa数目: ", len(lsas)) + rMap := new(RouterMap) + rMap.Init() + err = rMap.CreateFromAdjLsdb(lsas) + // 打印rm + common2.LogInfo(rMap.ToString()) + + // 1.3 根据RouterMap,和lsdb中的adjlsa,构造邻接矩阵 + // 设置路由器数目 + rtc.SetRouterNum(rMap.GetMapSize()) + // 分配矩阵空间 + rtc.allocateAdjMatrix() + // 初始化矩阵值 + rtc.initMatrix() + // 构造矩阵 + err = rtc.makeAdjMatrix(mlsdb, rMap) + if err != nil { + common2.LogError("邻接矩阵构造失败") + } + + // 1.4 打印输出路由表计算器 + fmt.Println(rMap.ToString()) + fmt.Println(rtc.ToString()) + fmt.Println("源路由器的邻接数目:", rtc.getNumOfLinkfromAdjMatrix(0)) + fmt.Println("另一个路由器的邻接数目:", rtc.getNumOfLinkfromAdjMatrix(1)) + + // 2. 执行多路径算法 + rtc.allocateParent() + rtc.allocateDistance() + // 2.1. 先确定源路由器的邻居路由器数目 + rtc.setNoLink(rtc.getNumOfLinkfromAdjMatrix(0)) + rtc.allocateLinks() + rtc.allocateLinkCosts() + // 2.2. 获取用于路径计算的稀疏邻接列表。具体操作是填充:c.links,c.linkCosts + rtc.getLinksFromAdjMatrix(0) + // + routers := []*component.Identifier{} // 路由器标识 + nexthops := []*NextHop{} // 下一跳 + for i := 0; i < rtc.vNoLink; i++ { + // 模拟只有当前邻居i可以访问的情形。即:砍掉除当前邻居路由器外的其他邻接链路 + rtc.adjustAdMatrix(0, rtc.links[i], rtc.linkCosts[i]) + // 以当前邻居为起点,执行Dijkstra算法。 + rtc.doDijkstraPathCalculation(0) + // 用计算结果更新路由表。 + rs, ns := rtc.addAllLsNextHopsToRoutingTable(mlsrConfig.GetAdjacencys(), rMap, 0) + routers = append(routers, rs...) + nexthops = append(nexthops, ns...) + } + // 查看执行结果 + // 计算器中的上一跳路径,以及开销 + fmt.Println(rtc.ToString()) + for i := 0; i < len(routers); i++ { + fmt.Println(routers[i].ToUri() + " ") + } + fmt.Println("") + for i := 0; i < len(nexthops); i++ { + fmt.Println(nexthops[i].LogicFaceUri() + "-" + + strconv.FormatUint(nexthops[i].RouteCost.RouteCost(), 10) + " ") + } } From 19aae6745a98df5748c8198078dd312a99efeb16 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 9 Jun 2022 15:59:20 +0800 Subject: [PATCH 61/70] =?UTF-8?q?add=20=E5=90=8D=E7=A7=B0=E5=89=8D?= =?UTF-8?q?=E7=BC=80=E8=A1=A8=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NamePrefixTableEntry.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 route/NamePrefixTableEntry.go diff --git a/route/NamePrefixTableEntry.go b/route/NamePrefixTableEntry.go new file mode 100644 index 0000000..db86a1b --- /dev/null +++ b/route/NamePrefixTableEntry.go @@ -0,0 +1,16 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/6/9 15:07 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import "minlib/component" + +type NamePrefixTableEntry struct { + m_namePrefix *component.Identifier + NextHopList +} From d6c79db4cb89aadede1fd6bc6ed1afbeaaab6aa6 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 10 Jun 2022 15:14:23 +0800 Subject: [PATCH 62/70] =?UTF-8?q?=E6=96=B0=E5=BB=BA=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E8=A1=A8=E6=B1=A0=E6=9D=A1=E7=9B=AE=E3=80=81=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E5=89=8D=E7=BC=80=E8=A1=A8=E6=9D=A1=E7=9B=AE=E3=80=81=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E5=89=8D=E7=BC=80=E8=A1=A8=E4=B8=89=E4=B8=AA=E7=BB=93?= =?UTF-8?q?=E6=9E=84=E4=BD=93=EF=BC=8C=E5=B9=B6=E5=AE=9E=E7=8E=B0=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E8=A1=A8=E6=B1=A0=E6=9D=A1=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NamePrefixTable.go | 31 ++++++++++ route/NamePrefixTableEntry.go | 22 ++++++- route/RoutingTablePoolEntry.go | 105 +++++++++++++++++++++++++++++++++ 3 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 route/NamePrefixTable.go create mode 100644 route/RoutingTablePoolEntry.go diff --git a/route/NamePrefixTable.go b/route/NamePrefixTable.go new file mode 100644 index 0000000..a092bfd --- /dev/null +++ b/route/NamePrefixTable.go @@ -0,0 +1,31 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/6/10 11:16 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import ( + "container/list" + "minlib/component" +) + +// +// NamePrefixTable +// @Description: 名称前缀表 +// +type NamePrefixTable struct { + // 路由表池:存储“目的路由器标识->RTPE”的映射 + // 相当于存储了所有拥有前缀的路由表项,并包含每个路由表项对应的前缀列表信息,以及该前缀列表长度useCount + m_rtpool map[*component.Identifier]*RoutingTablePoolEntry + // 名称前缀表项列表 + nptEntryList list.List + // 该名称前缀表所属的本机路由器标识 + m_ownRouterName *component.Identifier + // 路由表。包含路由计算器计算出来的每个路由表标识及其对应的下一跳列表 + m_routingTable *RoutingTable + // todo fib +} diff --git a/route/NamePrefixTableEntry.go b/route/NamePrefixTableEntry.go index db86a1b..daed3f9 100644 --- a/route/NamePrefixTableEntry.go +++ b/route/NamePrefixTableEntry.go @@ -8,9 +8,29 @@ package route -import "minlib/component" +import ( + "container/list" + "minlib/component" +) +// +// NamePrefixTableEntry +// @Description: 名称前缀表项 +// type NamePrefixTableEntry struct { + // 名称前缀 m_namePrefix *component.Identifier + + // 保存路由表池项列表。 + // 这是因为,由于支持网内缓存,一个名称前缀可能对应多个路由器标识符。 + // 名称前缀标项,和路由表项,是多对多的关系。 + m_rteList list.List + // 下一跳列表 NextHopList } + +func (e *NamePrefixTableEntry) TestList() { + e.m_rteList.Init() + rtpe := new(RoutingTablePoolEntry) + e.m_rteList.PushBack(rtpe) +} diff --git a/route/RoutingTablePoolEntry.go b/route/RoutingTablePoolEntry.go new file mode 100644 index 0000000..88feeb3 --- /dev/null +++ b/route/RoutingTablePoolEntry.go @@ -0,0 +1,105 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/6/10 11:02 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import ( + "minlib/component" +) + +// +// RoutingTablePoolEntry +// @Description: 路由表池条目。 +// +type RoutingTablePoolEntry struct { + RoutingTableEntry + // 记录使用本池条目的所有名称前缀 + NamePrefixTableEntries map[*component.Identifier]*NamePrefixTableEntry + m_useCount uint64 // 记录本条目被多少条名称前缀所使用 +} + +// +// Init +// @Description: 初始化目的路由器 +// @receiver pe +// @param dest +// +func (pe *RoutingTablePoolEntry) Init(dest *component.Identifier) { + pe.m_destination = dest + pe.m_useCount = 1 +} + +// +// InitRTE +// @Description: 初始化路由表项和使用数 +// @receiver pe +// @param rte +// @param useCount +// +func (pe *RoutingTablePoolEntry) InitRTE(rte *RoutingTableEntry, useCount uint64) { + pe.m_destination = rte.m_destination + pe.nextHops = rte.GetNextHops() + pe.m_useCount = useCount +} + +// +// InitDest +// @Description: 初始化目的路由器和使用数 +// @receiver pe +// @param dest +// @param useCount +// +func (pe *RoutingTablePoolEntry) InitDest(dest *component.Identifier, useCount uint64) { + pe.m_destination = dest + pe.m_useCount = useCount +} + +// +// GetUseCount +// @Description: 获取使用数 +// @receiver pe +// @return uint64 +// +func (pe *RoutingTablePoolEntry) GetUseCount() uint64 { + return pe.m_useCount +} + +// +// IncrementUseCount +// @Description: 使用数加一,并返回 +// @receiver pe +// @return uint64 +// +func (pe *RoutingTablePoolEntry) IncrementUseCount() uint64 { + pe.m_useCount++ + return pe.m_useCount +} + +// +// DecrementUseCount +// @Description: 使用数减一,并返回 +// @receiver pe +// @return uint64 +// +func (pe *RoutingTablePoolEntry) DecrementUseCount() uint64 { + if pe.m_useCount != 0 { + pe.m_useCount-- + return pe.m_useCount + } + return 0 +} + +// +// SetNexthopList +// @Description: 设置下一跳列表 +// @receiver pe +// @param list +// +func (pe *RoutingTablePoolEntry) SetNexthopList(list NextHopList) { + pe.NextHopList = list +} From 127c58776c0a5a41bde62b8f4616b92d1f7579d7 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 10 Jun 2022 16:46:33 +0800 Subject: [PATCH 63/70] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=E5=90=8D?= =?UTF-8?q?=E7=A7=B0=E5=89=8D=E7=BC=80=E8=A1=A8=E6=9D=A1=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NamePrefixTableEntry.go | 151 +++++++++++++++++++++++++++++++-- route/RoutingTablePoolEntry.go | 22 +++++ 2 files changed, 166 insertions(+), 7 deletions(-) diff --git a/route/NamePrefixTableEntry.go b/route/NamePrefixTableEntry.go index daed3f9..cd251f4 100644 --- a/route/NamePrefixTableEntry.go +++ b/route/NamePrefixTableEntry.go @@ -9,7 +9,7 @@ package route import ( - "container/list" + common2 "minlib/common" "minlib/component" ) @@ -21,16 +21,153 @@ type NamePrefixTableEntry struct { // 名称前缀 m_namePrefix *component.Identifier - // 保存路由表池项列表。 + // 保存路由表池项的切片。切片真好用。 // 这是因为,由于支持网内缓存,一个名称前缀可能对应多个路由器标识符。 // 名称前缀标项,和路由表项,是多对多的关系。 - m_rteList list.List + m_rteList []*RoutingTablePoolEntry // 下一跳列表 NextHopList } -func (e *NamePrefixTableEntry) TestList() { - e.m_rteList.Init() - rtpe := new(RoutingTablePoolEntry) - e.m_rteList.PushBack(rtpe) +// +// GetNamePrefix +// @Description: 获取所表示的名称前缀 +// @receiver e +// @return *component.Identifier +// +func (e *NamePrefixTableEntry) GetNamePrefix() *component.Identifier { + return e.m_namePrefix +} + +// +// GetRteList +// @Description: 获取与该名称前缀所关联的路由表池项 +// @receiver e +// @return []*RoutingTablePoolEntry +// +func (e *NamePrefixTableEntry) GetRteList() []*RoutingTablePoolEntry { + return e.m_rteList +} + +// +// ResetRteListNextHop +// @Description: 重置播发此名称前缀的所有路由表项的下一跳列表。 +// @receiver e +// +func (e *NamePrefixTableEntry) ResetRteListNextHop() { + for i := 0; i < len(e.m_rteList); i++ { + e.m_rteList[i].Clear() + } +} + +// +// GetRteListSize +// @Description: 返回所关联的路由表池项的数目。即当前名称前缀被哪些路由器所拥有。 +// @receiver e +// @return int +// +func (e *NamePrefixTableEntry) GetRteListSize() int { + return len(e.m_rteList) +} + +// +// GetNexthopList +// @Description: 获取本名称前缀所关联的下一跳列表。 +// @receiver e +// @return []*NextHop +// +func (e *NamePrefixTableEntry) GetNexthopList() *NextHopList { + return &e.NextHopList +} + +// +// GenerateNhlfromRteList +// @Description: 收集此条目的路由条目播发的所有下一个跃点。 +// 其逻辑主要是将所有关联的路由表项的下一跳全部加进来。 +// @receiver e +// +func (e *NamePrefixTableEntry) GenerateNhlfromRteList() { + // 清空旧的下一跳列表 + e.NextHopList.Clear() + // 遍历关联的每个路由表条目 + 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]) + } + } +} + +// +// findRtpe +// @Description: 查找指定池条目 +// @receiver e +// @param rtpePtr +// @return int 没找到时返回-1 +// +func (e *NamePrefixTableEntry) findRtpe(rtpePtr *RoutingTablePoolEntry) int { + for i := 0; i < len(e.m_rteList); i++ { + if e.m_rteList[i].IsEqual(rtpePtr) { + return i + } + } + return -1 +} + +// +// deleteRtpe +// @Description: 删除指定索引位置的rtpe +// @receiver e +// @param index +// +func (e *NamePrefixTableEntry) deleteRtpe(index int) { + var tmpList []*RoutingTablePoolEntry + for i := 0; i < len(e.m_rteList); i++ { + if i != index { + tmpList = append(tmpList, e.m_rteList[i]) + } + } + e.m_rteList = tmpList +} + +// +// RemoveRoutingTableEntry +// @Description: 从该NPT条目中删除一个路由表条目 +// @receiver e +// @param rtpePtr +// @return uint64 使用刚刚删除的路由条目的NPT数。 +// +func (e *NamePrefixTableEntry) RemoveRoutingTableEntry(rtpePtr *RoutingTablePoolEntry) uint64 { + index := e.findRtpe(rtpePtr) + if index >= 0 { + // 该条目的使用数减一 + e.m_rteList[index].DecrementUseCount() + // 删除该条目与本名称前缀的关联 + // 1. 删掉:条目 -> 前缀 + delete(e.m_rteList[index].NamePrefixTableEntries, e.GetNamePrefix()) + // 2. 删掉:前缀 -> 条目 + e.deleteRtpe(index) + } else { + common2.LogError("Routing entry for: " + rtpePtr.GetDestination().ToUri() + + " not found in NPT entry: " + e.GetNamePrefix().ToUri()) + } + return rtpePtr.m_useCount +} + +// +// AddRoutingTableEntry +// @Description:将路由表池项添加到此NPT项的列表中 +// (提醒:每个RTPE都有下一个跃点列表)。它们用于计算此条目的整体下一跳列表。 +// @receiver e +// @param rtpePtr +// +func (e *NamePrefixTableEntry) AddRoutingTableEntry(rtpePtr *RoutingTablePoolEntry) { + index := e.findRtpe(rtpePtr) + // 先确定它是一个新的路由表条目 + if index < 0 { + // 其使用数加一 + rtpePtr.IncrementUseCount() + // 将其加入list + e.m_rteList = append(e.m_rteList, rtpePtr) + } } diff --git a/route/RoutingTablePoolEntry.go b/route/RoutingTablePoolEntry.go index 88feeb3..bd93736 100644 --- a/route/RoutingTablePoolEntry.go +++ b/route/RoutingTablePoolEntry.go @@ -59,6 +59,28 @@ func (pe *RoutingTablePoolEntry) InitDest(dest *component.Identifier, useCount u pe.m_useCount = useCount } +// +// IsEqual +// @Description: 判断两个路由表池条目是否相等 +// @receiver pe +// @param npe +// @return bool +// +func (pe *RoutingTablePoolEntry) IsEqual(npe *RoutingTablePoolEntry) bool { + if pe.GetDestination().ToUri() == npe.GetDestination().ToUri() && + pe.NextHopList.Size() == pe.NextHopList.Size() { + b := true + for i := 0; i < pe.NextHopList.Size(); i++ { + if pe.GetNextHops()[i].LogicFaceUri() != npe.GetNextHops()[i].LogicFaceUri() || + pe.GetNextHops()[i].RouteCost.RouteCost() != npe.GetNextHops()[i].RouteCost.RouteCost() { + b = false + } + } + return b + } + return false +} + // // GetUseCount // @Description: 获取使用数 From 26cca32cc1e9864cef976104492821a8f5b77c04 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Tue, 14 Jun 2022 17:29:41 +0800 Subject: [PATCH 64/70] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=90=8D=E7=A7=B0?= =?UTF-8?q?=E5=89=8D=E7=BC=80=E8=A1=A8=E4=B8=AD=E7=9A=84=E4=B8=A4=E4=B8=AA?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lsdb/Lsdb.go | 8 +- route/NamePrefixTable.go | 226 ++++++++++++++++++++++++++++++++- route/NamePrefixTableEntry.go | 2 +- route/RoutingTablePoolEntry.go | 4 +- 4 files changed, 230 insertions(+), 10 deletions(-) diff --git a/lsdb/Lsdb.go b/lsdb/Lsdb.go index 7bcc44b..657f38f 100644 --- a/lsdb/Lsdb.go +++ b/lsdb/Lsdb.go @@ -21,11 +21,13 @@ import ( "time" ) +type LsdbUpdate int + // Lsdb更新状态 const ( - INSTALLED = 0 // 已安装 - UPDATED = 1 // 已更新 - REMOVED = -1 // 已移除 + INSTALLED LsdbUpdate = 0 // 安装 + UPDATED LsdbUpdate = 1 // 更新 + REMOVED LsdbUpdate = -1 // 移除 ) const GRACE_PERIOD = 10 * time.Second // 超期宽限期。LSA比设定时间晚几秒钟被删除,以避免信息过早失效。 diff --git a/route/NamePrefixTable.go b/route/NamePrefixTable.go index a092bfd..4093818 100644 --- a/route/NamePrefixTable.go +++ b/route/NamePrefixTable.go @@ -9,8 +9,10 @@ package route import ( - "container/list" + common2 "minlib/common" "minlib/component" + "mlsr/lsa" + "mlsr/lsdb" ) // @@ -18,14 +20,230 @@ import ( // @Description: 名称前缀表 // type NamePrefixTable struct { - // 路由表池:存储“目的路由器标识->RTPE”的映射 + // 路由表池:存储“目的路由器标识URI->RTPE”的映射 // 相当于存储了所有拥有前缀的路由表项,并包含每个路由表项对应的前缀列表信息,以及该前缀列表长度useCount - m_rtpool map[*component.Identifier]*RoutingTablePoolEntry + m_rtpool map[string]*RoutingTablePoolEntry // 名称前缀表项列表 - nptEntryList list.List + nptEntryList []*NamePrefixTableEntry // 该名称前缀表所属的本机路由器标识 m_ownRouterName *component.Identifier // 路由表。包含路由计算器计算出来的每个路由表标识及其对应的下一跳列表 m_routingTable *RoutingTable // todo fib } + +// +// UpdateFromLsdb +// @Description: 根据lsdb的更新,对名称进行增加、更新或移除 +// @receiver t +// @param lsa +// @param updateType +// @param namesToAdd +// @param namesToRemove +// +func (t *NamePrefixTable) UpdateFromLsdb(ilsa lsa.ILsa, + updateType lsdb.LsdbUpdate, namesToAdd []*component.Identifier, + namesToRemove []*component.Identifier) { + // 如果是本地Lsa的增删更操作,则不做响应 + if ilsa.GetOriginRouter().ToUri() == t.m_ownRouterName.ToUri() { + return + } + + common2.LogInfo("Got update from Lsdb for router: ", ilsa.GetOriginRouter().ToUri()) + + // lsa安装操作 + if updateType == lsdb.INSTALLED { + // 先增加对该路由器标识的条目 + t.AddEntry(ilsa.GetOriginRouter(), ilsa.GetOriginRouter()) + + // 只针对名称LSA进行更新 + if ilsa.GetType() == lsa.LsaNAMEType { + // 获取该lsa中的名称前缀列表 + nlsa := ilsa.(*lsa.NameLsa) + names := nlsa.GetNamePrefixes() + // 遍历所有名称前缀,将其添加到名称前缀表中 + for i := 0; i < len(names); i++ { + if names[i].ToUri() != t.m_ownRouterName.ToUri() { + t.AddEntry(names[i], ilsa.GetOriginRouter()) + } + } + } + } else if updateType == lsdb.UPDATED { + // lsa更新操作(增加、删除) + if ilsa.GetType() == lsa.LsaNAMEType { + // 增加 + for i := 0; i < len(namesToAdd); i++ { + if namesToAdd[i].ToUri() != t.m_ownRouterName.ToUri() { + t.AddEntry(namesToAdd[i], ilsa.GetOriginRouter()) + } + } + // 删除 + for i := 0; i < len(namesToRemove); i++ { + if namesToRemove[i].ToUri() != t.m_ownRouterName.ToUri() { + t.RemoveEntry(namesToRemove[i], ilsa.GetOriginRouter()) + } + } + } + } else { + // 既不是安装,又不是更新(增加或删除lsa的某些部分) => 那就是删除整个LSA + t.RemoveEntry(ilsa.GetOriginRouter(), ilsa.GetOriginRouter()) + if ilsa.GetType() == lsa.LsaNAMEType { + // 获取该lsa中的名称前缀列表 + nlsa := ilsa.(*lsa.NameLsa) + names := nlsa.GetNamePrefixes() + // 遍历所有名称前缀,将其添加到名称前缀表中 + for i := 0; i < len(names); i++ { + if names[i].ToUri() != t.m_ownRouterName.ToUri() { + t.RemoveEntry(names[i], ilsa.GetOriginRouter()) + } + } + } + } +} + +// +// findNamePrefix +// @Description: 查找名称前缀 +// @receiver t +// @param name +// @return int 返回-1时表示没有查找到 +// +func (t *NamePrefixTable) findNamePrefix(name *component.Identifier) int { + for i := 0; i < len(t.nptEntryList); i++ { + if t.nptEntryList[i].GetNamePrefix().ToUri() == name.ToUri() { + return i + } + } + return -1 +} + +// +// AddEntry +// @Description: 此方法将路由器添加到名称前缀表条目中。如果名称前缀表条目不存在,则会创建它。 +// 该方法将首先查看其缓存项的本地池,以找到destRouter的路由信息。 +// 如果在那里找不到,它将构造一个,并用路由表中适当的RoutingTable条目中的信息填充它。 +// 如果没有匹配项,它将实例化它,但没有下一跳。FIB也将收到NPT条目变更的通知。 +// @receiver t +// @param name +// @param destRouter +// +func (t *NamePrefixTable) AddEntry(name *component.Identifier, destRouter *component.Identifier) { + // 检查播发的名称前缀是否已在表中。 + nameIndex := t.findNamePrefix(name) + + // 查找目的路由器标识是否在路由表项缓存池中 + v, ok := t.m_rtpool[destRouter.ToUri()] + + // 如果池中没有该目的路由器的路由表项,也即找不到去到name的路由路径,就加一个缓存池项 + if !ok { + // 查看路由表,看是否有包含该目的路由器的条目 + rte := t.m_routingTable.FindRoutingTableEntry(destRouter) + + // 如果路由表里也没有,那我们在缓存里加一个新的条目(虽然没路径) + rtpe := new(RoutingTablePoolEntry) + if rte == nil { + rtpe.InitDest(destRouter, 0) + } else { + // 有的话,直接从路由器中取出该条目,放入缓存池 + rtpe.InitRTE(rte, 0) + } + + // 放入缓存池,并将v刷新为该缓存池项 + v = t.AddRtpeToPool(rtpe) + } + + // 更新npt项,并通知给fib + if nameIndex < 0 { + // 如果NPT中没有该name + common2.LogDebug("Adding origin: " + v.GetDestination().ToUri() + + " to a new name prefix: " + name.ToUri()) + // 构造名称前缀表项,并添加之 + npte := new(NamePrefixTableEntry) + npte.m_namePrefix = name + npte.AddRoutingTableEntry(v) // useCount在这个时候会+1 + npte.GenerateNhlfromRteList() + t.nptEntryList = append(t.nptEntryList, npte) + nameIndex = t.findNamePrefix(name) + + // 如果这个条目有下一跳,我们需要通知FIB + if len(npte.GetNextHops()) > 0 { + common2.LogDebug("Updating FIB with next hops for ", npte.GetNamePrefix().ToUri()) + // todo 更新fib m_fib.update(name, npte->getNexthopList()); + } else { + // 如果没有下一跳 + // 路由表可以重新计算并添加一个没有下一跳的路由表条目,以替换现有的路由表条目。 + // 在这种情况下,通过下一个跃点无法再访问名称前缀,应将其从FIB中删除。 + // 但是,前缀应该保留在名称前缀表中,因为未来的路由表计算可能会添加下一跳。 + common2.LogDebug(npte.GetNamePrefix().ToUri() + " has no next hops; removing from FIB") + // todo 更新fib m_fib.remove(name); + } + } else { + // 如果NPT有这个name + common2.LogDebug("Adding origin: " + v.GetDestination().ToUri() + + " to existing prefix: " + name.ToUri()) + // 更新之 + t.nptEntryList[nameIndex].AddRoutingTableEntry(v) // useCount在这个时候会+1 + t.nptEntryList[nameIndex].GenerateNhlfromRteList() + + // FIB通知 + if len(t.nptEntryList[nameIndex].GetNextHops()) > 0 { + common2.LogDebug("Updating FIB with next hops for ", + t.nptEntryList[nameIndex].GetNamePrefix().ToUri()) + // todo 更新fib m_fib.update(name, npte->getNexthopList()); + } else { + common2.LogDebug(t.nptEntryList[nameIndex].GetNamePrefix().ToUri() + + " has no next hops; removing from FIB") + // todo 更新fib m_fib.remove(name); + } + } + + // 将此NPT的引用添加到RTPE中。 + v.NamePrefixTableEntries[t.nptEntryList[nameIndex].GetNamePrefix().ToUri()] = t.nptEntryList[nameIndex] +} + +// +// RemoveEntry +// @Description: 此方法从条目中删除目标。如果传递了无效的“名称-目标”对,也不会失败。 +// 删除后,如果RoutingTablePoolEntry的使用计数为0,则会将其从表中删除。 +// 此外,如果名称前缀没有与之关联的路由表条目,则会将其从NPT中删除。 +// 在任何情况下,FIB都会被告知这些变化。 +// @receiver t +// @param name +// @param destRouter +// +func (t *NamePrefixTable) RemoveEntry(name *component.Identifier, destRouter *component.Identifier) { + common2.LogDebug() +} + +// +// UpdateWithNewRoute +// @Description: 接收假定为详尽的条目列表,并使用条目中相应条目中包含的下一跳信息更新每个池条目。 +// 如果找不到条目,则假定该池条目的目标不可访问,其下一跳信息将被删除。 +// @receiver t +// @param entries +// +func (t *NamePrefixTable) UpdateWithNewRoute(entries []*RoutingTableEntry) { + +} + +// +// AddRtpeToPool +// @Description: 将RoutingTablePoolEntry添加到NPT的本地池。 +// 在C++版实现中,返回值将使用共享指针,因为它消除了处理生命周期问题的复杂hacks,并简化了内存管理。 +// @receiver t +// @param rtpe +// @return *RoutingTablePoolEntry +// +func (t *NamePrefixTable) AddRtpeToPool(rtpe *RoutingTablePoolEntry) *RoutingTablePoolEntry { + +} + +// +// DeleteRtpeFromPool +// @Description: 从池中删除池项。 +// @receiver t +// @param rtpe +// +func (t *NamePrefixTable) DeleteRtpeFromPool(rtpe *RoutingTablePoolEntry) { + +} diff --git a/route/NamePrefixTableEntry.go b/route/NamePrefixTableEntry.go index cd251f4..020111e 100644 --- a/route/NamePrefixTableEntry.go +++ b/route/NamePrefixTableEntry.go @@ -144,7 +144,7 @@ func (e *NamePrefixTableEntry) RemoveRoutingTableEntry(rtpePtr *RoutingTablePool e.m_rteList[index].DecrementUseCount() // 删除该条目与本名称前缀的关联 // 1. 删掉:条目 -> 前缀 - delete(e.m_rteList[index].NamePrefixTableEntries, e.GetNamePrefix()) + delete(e.m_rteList[index].NamePrefixTableEntries, e.GetNamePrefix().ToUri()) // 2. 删掉:前缀 -> 条目 e.deleteRtpe(index) } else { diff --git a/route/RoutingTablePoolEntry.go b/route/RoutingTablePoolEntry.go index bd93736..2fbc287 100644 --- a/route/RoutingTablePoolEntry.go +++ b/route/RoutingTablePoolEntry.go @@ -18,8 +18,8 @@ import ( // type RoutingTablePoolEntry struct { RoutingTableEntry - // 记录使用本池条目的所有名称前缀 - NamePrefixTableEntries map[*component.Identifier]*NamePrefixTableEntry + // 记录使用本池条目的所有名称前缀 NamePrefix-名称前缀表项 + NamePrefixTableEntries map[string]*NamePrefixTableEntry m_useCount uint64 // 记录本条目被多少条名称前缀所使用 } From 22092bbb7e4237f29eb865045c0eb062c64a6770 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 15 Jun 2022 15:45:31 +0800 Subject: [PATCH 65/70] =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=89=8D=E7=BC=80?= =?UTF-8?q?=E8=A1=A8=EF=BC=9A=E7=A7=BB=E9=99=A4=E8=A1=A8=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NamePrefixTable.go | 61 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/route/NamePrefixTable.go b/route/NamePrefixTable.go index 4093818..7fd2c3b 100644 --- a/route/NamePrefixTable.go +++ b/route/NamePrefixTable.go @@ -117,6 +117,22 @@ func (t *NamePrefixTable) findNamePrefix(name *component.Identifier) int { return -1 } +// +// deleteNamePrefix +// @Description: 根据名称前缀的索引坐标,删除指定名称前缀 +// @receiver t +// @param nameIndex +// +func (t *NamePrefixTable) deleteNamePrefix(nameIndex int) { + var newList []*NamePrefixTableEntry + for i := 0; i < len(t.nptEntryList); i++ { + if i != nameIndex { + newList = append(newList, t.nptEntryList[i]) + } + } + t.nptEntryList = newList +} + // // AddEntry // @Description: 此方法将路由器添加到名称前缀表条目中。如果名称前缀表条目不存在,则会创建它。 @@ -212,7 +228,50 @@ func (t *NamePrefixTable) AddEntry(name *component.Identifier, destRouter *compo // @param destRouter // func (t *NamePrefixTable) RemoveEntry(name *component.Identifier, destRouter *component.Identifier) { - common2.LogDebug() + common2.LogDebug("Removing origin: " + destRouter.ToUri() + " from " + name.ToUri()) + + // 根据目的路由器标识,获取其在路由条目缓存池中的条目 + rtpe, ok := t.m_rtpool[destRouter.ToUri()] + if !ok { + // 如果没有找到,则不进行后续处理 + common2.LogDebug("No entry for origin: " + destRouter.ToUri() + + " found, so it cannot be removed from prefix: " + name.ToUri()) + return + } + + // 查找名称前缀 + nameIndex := t.findNamePrefix(name) + if nameIndex >= 0 { + common2.LogDebug("Removing origin: " + rtpe.GetDestination().ToUri() + + " from prefix: " + name.ToUri()) + + // 判断该缓存表项在被删除一个与某前缀的关联之后,其使用数是否为零,如果是,则删除该引用。 + useCount := t.nptEntryList[nameIndex].RemoveRoutingTableEntry(rtpe) + if useCount == 0 { + t.DeleteRtpeFromPool(rtpe) + } + + // 1 如果前缀是路由器前缀,并且没有任何其他路由表条目,则已从LSDB中删除与该原始路由器关联的邻接/坐标LSA, + // 因此应从名称前缀表中删除路由器前缀。 + // 2 如果前缀是播发的名称前缀:如果另一个路由器播发此名称前缀, + // 则RteList应具有该路由器的另一个条目;下一个跃点应重新计算并安装在FIB中。 + // 3 如果没有其他路由器播发此名称前缀,则RteList应为空,并且可以从名称前缀表中删除前缀。 + // 一旦新名称LSA播发此前缀,将创建前缀的新条目。 + if t.nptEntryList[nameIndex].GetRteListSize() == 0 { + common2.LogDebug(name.ToUri() + " has no routing table entries;" + + " removing from table and FIB") + t.deleteNamePrefix(nameIndex) + // todo 删除fib中的该name m_fib.remove(name); + } else { + common2.LogDebug(name.ToUri() + " has other routing table entries;" + + " updating FIB with next hops") + t.nptEntryList[nameIndex].GenerateNhlfromRteList() + // todo 更新fib m_fib.update(name, (*nameItr)->getNexthopList()); + } + } else { + common2.LogDebug("Attempted to remove origin: " + rtpe.GetDestination().ToUri() + + " from non-existent prefix: " + name.ToUri()) + } } // From 245e1f0e9a755a7b4a80823a1f892b0f61681c19 Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 15 Jun 2022 16:22:02 +0800 Subject: [PATCH 66/70] =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=89=8D=E7=BC=80?= =?UTF-8?q?=E8=A1=A8=EF=BC=9A=E6=A0=B9=E6=8D=AE=E8=B7=AF=E7=94=B1=E8=A1=A8?= =?UTF-8?q?=E8=BF=9B=E8=A1=8C=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NamePrefixTable.go | 58 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/route/NamePrefixTable.go b/route/NamePrefixTable.go index 7fd2c3b..5324867 100644 --- a/route/NamePrefixTable.go +++ b/route/NamePrefixTable.go @@ -274,6 +274,28 @@ func (t *NamePrefixTable) RemoveEntry(name *component.Identifier, destRouter *co } } +// +// isNextHopsEqual +// @Description: 遍历查看两个下一跳列表是否完全一致 +// @param hops1 +// @param hops2 +// @return bool +// +func isNextHopsEqual(hops1 []*NextHop, hops2 []*NextHop) bool { + // 长度不等,则false + if len(hops1) != len(hops2) { + return false + } + // 遍历,如果有一个不相等,则false + for i := 0; i < len(hops1); i++ { + if hops1[i].LogicFaceUri() != hops2[i].LogicFaceUri() || + hops1[i].RouteCost.RouteCost() != hops2[i].RouteCost.RouteCost() { + return false + } + } + return true +} + // // UpdateWithNewRoute // @Description: 接收假定为详尽的条目列表,并使用条目中相应条目中包含的下一跳信息更新每个池条目。 @@ -282,7 +304,43 @@ func (t *NamePrefixTable) RemoveEntry(name *component.Identifier, destRouter *co // @param entries // func (t *NamePrefixTable) UpdateWithNewRoute(entries []*RoutingTableEntry) { + common2.LogDebug("Updating table with newly calculated routes") + // 遍历名称前缀表中的路由表缓存池 + for _, rtpe := range t.m_rtpool { + // 查看当前缓存表项的目的路由器,是否在传入的真路由表项里可以找到对应的 + sameIndex := -1 // 默认没找到 + for i := 0; i < len(entries); i++ { + if entries[i].GetDestination().ToUri() == rtpe.GetDestination().ToUri() { + sameIndex = i + } + } + + // 根据缓存池与原路由表项的差异,将缓存池更新 + if sameIndex >= 0 && !isNextHopsEqual(rtpe.GetNextHops(), entries[sameIndex].GetNextHops()) { + // 如果找到了对应条目,且两个路由表条目的下一跳列表不一致 + common2.LogDebug("Routing entry: " + rtpe.GetDestination().ToUri() + " has changed next-hops.") + // 更新rtpe的下一跳列表 + rtpe.SetNexthopList(entries[sameIndex].NextHopList) + // 更新rtpe的每个名称前缀表项 + for _, nameEntry := range rtpe.NamePrefixTableEntries { + t.AddEntry(nameEntry.GetNamePrefix(), rtpe.GetDestination()) + } + } else if sameIndex < 0 { + // 没有找到对应条目,说明到该路由器的路径已经无了无了无了~ + common2.LogDebug("Routing entry: " + rtpe.GetDestination().ToUri() + " now has no next-hops.") + // 更新rtpe的下一跳列表:清空 + rtpe.Clear() + // 更新rtpe的每个名称前缀表项 + for _, nameEntry := range rtpe.NamePrefixTableEntries { + t.AddEntry(nameEntry.GetNamePrefix(), rtpe.GetDestination()) + } + } else { + // 有找到对应条目,但是两个条目的下一跳列表完全一致 + common2.LogDebug("No change in routing entry:" + rtpe.GetDestination().ToUri() + + ", no action necessary.") + } + } } // From 8d52bcf7fc92e97dd4c9afe4c5fc464cf30493dc Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Wed, 15 Jun 2022 16:28:22 +0800 Subject: [PATCH 67/70] =?UTF-8?q?=E5=90=8D=E7=A7=B0=E5=89=8D=E7=BC=80?= =?UTF-8?q?=E8=A1=A8=EF=BC=9A=E5=A2=9E=E5=8A=A0=E3=80=81=E5=88=A0=E9=99=A4?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E6=B1=A0=E8=A1=A8=E9=A1=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NamePrefixTable.go | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/route/NamePrefixTable.go b/route/NamePrefixTable.go index 5324867..09fd953 100644 --- a/route/NamePrefixTable.go +++ b/route/NamePrefixTable.go @@ -352,7 +352,8 @@ func (t *NamePrefixTable) UpdateWithNewRoute(entries []*RoutingTableEntry) { // @return *RoutingTablePoolEntry // func (t *NamePrefixTable) AddRtpeToPool(rtpe *RoutingTablePoolEntry) *RoutingTablePoolEntry { - + t.m_rtpool[rtpe.GetDestination().ToUri()] = rtpe + return rtpe } // @@ -362,5 +363,11 @@ func (t *NamePrefixTable) AddRtpeToPool(rtpe *RoutingTablePoolEntry) *RoutingTab // @param rtpe // func (t *NamePrefixTable) DeleteRtpeFromPool(rtpe *RoutingTablePoolEntry) { - + // 查看是否有该条目 + _, ok := t.m_rtpool[rtpe.GetDestination().ToUri()] + if !ok { + common2.LogDebug("Attempted to delete non-existent origin: " + + rtpe.GetDestination().ToUri() + " from NPT routing table entry storage pool.") + } + delete(t.m_rtpool, rtpe.GetDestination().ToUri()) } From 3eb8fb51bbb0c21624048891000f0c3cda9d006b Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 16 Jun 2022 17:36:17 +0800 Subject: [PATCH 68/70] =?UTF-8?q?=E6=B5=8B=E8=AF=95NextHop=E5=8F=8ANextHop?= =?UTF-8?q?List?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/NextHopList.go | 40 +++++--- route/NextHopList_test.go | 190 ++++++++++++++++++++++++++++++++++++++ route/NextHop_test.go | 96 +++++++++++++++++++ 3 files changed, 315 insertions(+), 11 deletions(-) create mode 100644 route/NextHopList_test.go create mode 100644 route/NextHop_test.go diff --git a/route/NextHopList.go b/route/NextHopList.go index 5c74356..e904b4b 100644 --- a/route/NextHopList.go +++ b/route/NextHopList.go @@ -12,6 +12,7 @@ import ( "errors" "minlib/encoding" "mlsr/extensions" + "strconv" ) type NextHopContainer []*NextHop @@ -25,6 +26,23 @@ type NextHopList struct { nextHops NextHopContainer } +// +// ToString +// @Description: 转string。用于测试 +// @receiver l +// @return string +// +func (l *NextHopList) ToString() string { + res := "----------------\n" + for i := 0; i < len(l.nextHops); i++ { + res += l.nextHops[i].LogicFaceUri() + " " + res += strconv.FormatUint(l.nextHops[i].RouteCost.RouteCost(), 10) + " " + res += strconv.FormatBool(l.nextHops[i].IsHyperbolic) + " \n" + } + res += "----------------\n" + return res +} + // // GetNextHops // @Description: 获取下一跳列表 @@ -44,7 +62,7 @@ func (l *NextHopList) GetNextHops() []*NextHop { // func (l *NextHopList) findSameUriNextHop(hop *NextHop) int { for i := 0; i < len(l.nextHops); i++ { - if l.nextHops[i].LogicFaceUri() == hop.LogicFaceUri(){ + if l.nextHops[i].LogicFaceUri() == hop.LogicFaceUri() { return i } } @@ -61,7 +79,7 @@ func (l *NextHopList) findSameUriNextHop(hop *NextHop) int { func (l *NextHopList) findSameNextHop(hop *NextHop) int { for i := 0; i < len(l.nextHops); i++ { if (l.nextHops[i].LogicFaceUri() == hop.LogicFaceUri()) && - (l.nextHops[i].RouteCost.RouteCost() == hop.RouteCost.RouteCost()){ + (l.nextHops[i].RouteCost.RouteCost() == hop.RouteCost.RouteCost()) { return i } } @@ -74,11 +92,11 @@ func (l *NextHopList) findSameNextHop(hop *NextHop) int { // @receiver l // @param hop // -func (l *NextHopList) AddNextHop(hop *NextHop) { +func (l *NextHopList) AddNextHop(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(){ + 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()) } } @@ -92,8 +110,8 @@ func (l *NextHopList) AddNextHop(hop *NextHop) { func (l *NextHopList) RemoveNextHop(hop *NextHop) { // 查找该条目索引 index := l.findSameUriNextHop(hop) - if index>0 { - l.nextHops = append(l.nextHops[:index],l.nextHops[index+1:]...) + if index >= 0 { + l.nextHops = append(l.nextHops[:index], l.nextHops[index+1:]...) } } @@ -112,8 +130,8 @@ func (l *NextHopList) Size() int { // @Description: 清空列表 // @receiver l // -func (l *NextHopList) Clear() { - l.nextHops=[]*NextHop{} +func (l *NextHopList) Clear() { + l.nextHops = []*NextHop{} } // @@ -188,4 +206,4 @@ func (l *NextHopList) WireDecode(block *encoding.Block) error { } l.nextHops = hopContainer return nil -} \ No newline at end of file +} diff --git a/route/NextHopList_test.go b/route/NextHopList_test.go new file mode 100644 index 0000000..c2a4c1c --- /dev/null +++ b/route/NextHopList_test.go @@ -0,0 +1,190 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/6/16 17:08 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import ( + "fmt" + "minlib/encoding" + "testing" +) + +// +// TestNextHopList_AddNextHop +// @Description: 测试构造下一跳列表 +// @param t +// +func TestNextHopList_AddNextHop(t *testing.T) { + // 构造三个下一跳 + nthop1, _ := NewNextHop("/hop1", 10) + nthop2, _ := NewNextHop("/hop2", 20) + nthop3, _ := NewNextHop("/hop3", 30) + + // 构造hoplist + hopList := new(NextHopList) + hopList.AddNextHop(nthop1) + hopList.AddNextHop(nthop2) + hopList.AddNextHop(nthop3) + + // 打印长度 + fmt.Println(hopList.Size()) + + // 打印所有下一跳 + fmt.Println(hopList.ToString()) +} + +// +// TestNextHopList_find +// @Description: 测试查找 +// @param t +// +func TestNextHopList_find(t *testing.T) { + // 构造三个下一跳 + nthop1, _ := NewNextHop("/hop1", 10) + nthop2, _ := NewNextHop("/hop2", 20) + nthop3, _ := NewNextHop("/hop3", 30) + + // 构造hoplist + hopList := new(NextHopList) + hopList.AddNextHop(nthop1) + hopList.AddNextHop(nthop2) + hopList.AddNextHop(nthop3) + + // 测试查找相同Uri + ntTest, _ := NewNextHop("/hop2", 111) + i1 := hopList.findSameUriNextHop(ntTest) + fmt.Println("第二个下标:", i1) + ntTest, _ = NewNextHop("/hopTest", 111) + i2 := hopList.findSameUriNextHop(ntTest) + fmt.Println("没找到下标:", i2) + + // 测试查找完全相同下一跳 + ntTest, _ = NewNextHop("/hop2", 20) + i1 = hopList.findSameNextHop(ntTest) + fmt.Println("第二个下标:", i1) + ntTest.SetRouteCost(555) + i2 = hopList.findSameNextHop(ntTest) + fmt.Println("没找到下标:", i2) +} + +// +// TestNextHopList_RemoveNextHop +// @Description: 测试删除 +// @param t +// +func TestNextHopList_RemoveNextHop(t *testing.T) { + // 构造三个下一跳 + nthop1, _ := NewNextHop("/hop1", 10) + nthop2, _ := NewNextHop("/hop2", 20) + nthop3, _ := NewNextHop("/hop3", 30) + + // 构造hoplist + hopList := new(NextHopList) + hopList.AddNextHop(nthop1) + hopList.AddNextHop(nthop2) + hopList.AddNextHop(nthop3) + + // 打印长度 + fmt.Println(hopList.Size()) + // 打印所有下一跳 + fmt.Println(hopList.ToString()) + + // 删除 + npTest, _ := NewNextHop("/hop1", 10) + hopList.RemoveNextHop(npTest) + // 打印长度 + fmt.Println(hopList.Size()) + // 打印所有下一跳 + fmt.Println(hopList.ToString()) + + // 删除一个只有uri相同 + npTest, _ = NewNextHop("/hop3", 100) + hopList.RemoveNextHop(npTest) + // 打印长度 + fmt.Println(hopList.Size()) + // 打印所有下一跳 + fmt.Println(hopList.ToString()) + + // 删除一个uri不同 + npTest, _ = NewNextHop("/hoppp", 100) + hopList.RemoveNextHop(npTest) + // 打印长度 + fmt.Println(hopList.Size()) + // 打印所有下一跳 + fmt.Println(hopList.ToString()) +} + +// +// TestNextHopList_WireEncode +// @Description: 测试编码 +// @param t +// +func TestNextHopList_WireEncode(t *testing.T) { + // 构造三个下一跳 + nthop1, _ := NewNextHop("/hop1", 10) + nthop2, _ := NewNextHop("/hop2", 20) + nthop3, _ := NewNextHop("/hop3", 30) + // 构造hoplist + hopList := new(NextHopList) + hopList.AddNextHop(nthop1) + hopList.AddNextHop(nthop2) + hopList.AddNextHop(nthop3) + + // 编码 + encoder := encoding.Encoder{} + err := encoder.EncoderReset(encoding.MaxPacketSize, 0) + if err != nil { + fmt.Println("NextHopList编码报错,", err.Error()) + return + } + length, err := hopList.WireEncode(&encoder) + if err != nil { + t.Fatal("NextHopList编码失败", err.Error()) + } + + // 获取编码 + buf, err := encoder.GetBuffer() + if err != nil { + t.Fatal("NextHopList获取buffer结果失败", err.Error()) + } + + // 打印编码结果。如果可以正确解码,则说明编码成功 + fmt.Println(length) + for i := 0; i < len(buf); i++ { + fmt.Print(buf[i], ", ") + } + fmt.Println() +} + +// +// TestNextHopList_WireDecode +// @Description: 测试解码 +// @param t +// +func TestNextHopList_WireDecode(t *testing.T) { + // 由数组构建block + var buf = [58]byte{241, 1, 188, 54, 241, 1, 187, 14, 241, 1, 186, + 1, 10, 241, 1, 185, 5, 47, 104, 111, 112, 49, 241, 1, 187, 14, + 241, 1, 186, 1, 20, 241, 1, 185, 5, 47, 104, 111, 112, 50, 241, + 1, 187, 14, + 241, 1, 186, 1, 30, 241, 1, 185, 5, 47, 104, 111, 112, 51} + block, err := encoding.CreateBlockByBuffer(buf[:], true) + if err != nil { + fmt.Println("创建block失败 ", err.Error()) + return + } + + // 由Block构建结构体,并打印变量 + base := new(NextHopList) + err = base.WireDecode(block) + if err != nil { + fmt.Println("线性解码失败 ", err.Error()) + return + } + fmt.Println(base.ToString()) +} diff --git a/route/NextHop_test.go b/route/NextHop_test.go new file mode 100644 index 0000000..e4ad2e2 --- /dev/null +++ b/route/NextHop_test.go @@ -0,0 +1,96 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/6/16 16:52 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import ( + "fmt" + "minlib/encoding" + "testing" +) + +// +// TestNewNextHop +// @Description: 测试构造 +// @param t +// +func TestNewNextHop(t *testing.T) { + nexthop, err := NewNextHop("/test", 543) + if err == nil { + fmt.Println(nexthop.IsHyperbolic) + fmt.Println(nexthop.RouteCost.RouteCost()) + fmt.Println(nexthop.LogicFaceUri()) + } else { + fmt.Println("测试NewNextHop报错,", err.Error()) + } +} + +// +// TestNextHop_WireEncode +// @Description: 测试编码 +// @param t +// +func TestNextHop_WireEncode(t *testing.T) { + // 构造 + nexthop, err := NewNextHop("/test", 543) + if err != nil { + fmt.Println("NewNextHop报错,", err.Error()) + return + } + + // 编码 + encoder := encoding.Encoder{} + err = encoder.EncoderReset(encoding.MaxPacketSize, 0) + if err != nil { + fmt.Println("NextHop编码报错,", err.Error()) + return + } + length, err := nexthop.WireEncode(&encoder) + if err != nil { + t.Fatal("NextHop编码失败", err.Error()) + } + + // 获取编码 + buf, err := encoder.GetBuffer() + if err != nil { + t.Fatal("NextHop获取buffer结果失败", err.Error()) + } + + // 打印编码结果。如果可以正确解码,则说明编码成功 + fmt.Println(length) + for i := 0; i < len(buf); i++ { + fmt.Print(buf[i], ", ") + } + fmt.Println() +} + +// +// TestNextHop_WireDecode +// @Description: 测试解码 +// @param t +// +func TestNextHop_WireDecode(t *testing.T) { + // 由数组构建block + var buf = [19]byte{241, 1, 187, 15, 241, 1, 186, 2, 2, 31, 241, 1, 185, 5, 47, 116, 101, 115, 116} + block, err := encoding.CreateBlockByBuffer(buf[:], true) + if err != nil { + fmt.Println("创建block失败 ", err.Error()) + return + } + + // 由Block构建结构体,并打印变量 + base := new(NextHop) + err = base.WireDecode(block) + if err != nil { + fmt.Println("线性解码失败 ", err.Error()) + return + } + fmt.Println(base.IsHyperbolic) + fmt.Println(base.RouteCost.RouteCost()) + fmt.Println(base.LogicFaceUri()) +} From cc433661f6dba1da500bfd7185fdf3b21b8a823a Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Fri, 17 Jun 2022 12:15:24 +0800 Subject: [PATCH 69/70] =?UTF-8?q?=E6=B5=8B=E8=AF=95RoutingTableEntry?= =?UTF-8?q?=E9=80=9A=E8=BF=87=EF=BC=8C=E5=87=86=E5=A4=87=E6=B5=8B=E8=AF=95?= =?UTF-8?q?RoutingTable?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- route/RoutingTable.go | 35 ++++++++++- route/RoutingTableEntry.go | 13 ++++ route/RoutingTableEntry_test.go | 105 ++++++++++++++++++++++++++++++++ route/RoutingTable_test.go | 69 +++++++++++++++++++++ 4 files changed, 219 insertions(+), 3 deletions(-) create mode 100644 route/RoutingTableEntry_test.go create mode 100644 route/RoutingTable_test.go diff --git a/route/RoutingTable.go b/route/RoutingTable.go index 639ec36..1958963 100644 --- a/route/RoutingTable.go +++ b/route/RoutingTable.go @@ -43,10 +43,39 @@ type RoutingTable struct { m_hyperbolicState uint32 } -func (t *RoutingTable) Init() { +// +// Init +// @Description: 初始化 +// @receiver t +// @param mc +// @param ms +// @param mlsdb +// +func (t *RoutingTable) Init(mc *common.MlsrConfig, + ms *lsdb.MlsrScheduler, mlsdb *lsdb.Lsdb) { // 初始化任务调度器 - t.scheduler = new(lsdb.MlsrScheduler) - t.scheduler.Init() + t.scheduler = ms + // 初始化配置项 + t.mlsrConfig = mc + // 初始化lsdb + t.lsdb = mlsdb + + // 路由计算间隔时间 + t.m_routingCalcInterval = mc.GetRoutingCalcInterval() + // 路由计算状态 + t.m_isRoutingTableCalculating = false + t.m_isRouteCalculationScheduled = false + + // todo 事件监听:如果监听到了传来的删除本地邻接LSA操作 + + // todo 事件监听:如果监听到了传来的安装本地邻接LSA操作 + t.m_ownAdjLsaExist = true + + // todo 事件监听:如果监听到了传来的安装或更新本地邻接LSA操作 + //err := t.ScheduleRoutingTableCalculation() + //if err != nil { + // common2.LogError("RoutingTable.Init ScheduleRoutingTableCalculation error.") + //} } // diff --git a/route/RoutingTableEntry.go b/route/RoutingTableEntry.go index ddc8eb3..c059b3c 100644 --- a/route/RoutingTableEntry.go +++ b/route/RoutingTableEntry.go @@ -23,6 +23,19 @@ type RoutingTableEntry struct { NextHopList } +// +// ToString +// @Description: 转string。用于测试 +// @receiver e +// @return string +// +func (e *RoutingTableEntry) ToString() string { + res := "" + res += "目的路由器: " + e.m_destination.ToUri() + "\n" + res += e.NextHopList.ToString() + return res +} + // // NewRoutingTableEntry // @Description: 新建一个路由表条目 diff --git a/route/RoutingTableEntry_test.go b/route/RoutingTableEntry_test.go new file mode 100644 index 0000000..69562ea --- /dev/null +++ b/route/RoutingTableEntry_test.go @@ -0,0 +1,105 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/6/17 11:29 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import ( + "fmt" + "minlib/component" + "minlib/encoding" + "testing" +) + +// +// TestNewRoutingTableEntry +// @Description: 测试构造路由表项 +// @param t +// +func TestNewRoutingTableEntry(t *testing.T) { + // 构造 + iden, _ := component.CreateIdentifierByString("/pku/abc") + rte, err := NewRoutingTableEntry(iden) + if err != nil { + fmt.Println("构造路由表项失败") + } + // 打印 + fmt.Println(rte.GetDestination().ToUri()) +} + +// +// TestRoutingTableEntry_WireEncode +// @Description: 测试编码 +// @param t +// +func TestRoutingTableEntry_WireEncode(t *testing.T) { + // 构造三个下一跳 + nthop1, _ := NewNextHop("/hop1", 10) + nthop2, _ := NewNextHop("/hop2", 20) + nthop3, _ := NewNextHop("/hop3", 30) + // 构造路由表项 + iden, _ := component.CreateIdentifierByString("/pku/run") + hopList, _ := NewRoutingTableEntry(iden) + hopList.AddNextHop(nthop1) + hopList.AddNextHop(nthop2) + hopList.AddNextHop(nthop3) + + // 编码 + encoder := encoding.Encoder{} + err := encoder.EncoderReset(encoding.MaxPacketSize, 0) + if err != nil { + fmt.Println("RoutingTableEntry编码报错,", err.Error()) + return + } + length, err := hopList.WireEncode(&encoder) + if err != nil { + t.Fatal("RoutingTableEntry编码失败", err.Error()) + } + + // 获取编码 + buf, err := encoder.GetBuffer() + if err != nil { + t.Fatal("RoutingTableEntry获取buffer结果失败", err.Error()) + } + + // 打印编码结果。如果可以正确解码,则说明编码成功 + fmt.Println(length) + for i := 0; i < len(buf); i++ { + fmt.Print(buf[i], ", ") + } + fmt.Println() +} + +// +// TestRoutingTableEntry_WireDecode +// @Description: 测试解码 +// @param t +// +func TestRoutingTableEntry_WireDecode(t *testing.T) { + // 由数组构建block + var buf = [80]byte{241, 1, 189, 76, 101, 16, 100, 2, 0, 47, + 100, 4, 0, 112, 107, 117, 100, 4, 0, 114, 117, 110, 241, + 1, 188, 54, 241, 1, 187, 14, 241, 1, 186, 1, 10, 241, 1, + 185, 5, 47, 104, 111, 112, 49, 241, 1, 187, 14, 241, 1, + 186, 1, 20, 241, 1, 185, 5, 47, 104, 111, 112, 50, 241, + 1, 187, 14, + 241, 1, 186, 1, 30, 241, 1, 185, 5, 47, 104, 111, 112, 51} + block, err := encoding.CreateBlockByBuffer(buf[:], true) + if err != nil { + fmt.Println("创建block失败 ", err.Error()) + return + } + + // 由Block构建结构体,并打印变量 + base := new(RoutingTableEntry) + err = base.WireDecode(block) + if err != nil { + fmt.Println("线性解码失败 ", err.Error()) + return + } + fmt.Println(base.ToString()) +} diff --git a/route/RoutingTable_test.go b/route/RoutingTable_test.go new file mode 100644 index 0000000..74ec4f6 --- /dev/null +++ b/route/RoutingTable_test.go @@ -0,0 +1,69 @@ +// Package route +// @Author: Wang Feng +// @Description: +// @Version: 0.1.0 +// @Date: 2022/6/17 11:28 +// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 +// + +package route + +import ( + common2 "minlib/common" + "minlib/logicface" + "mlsr/common" + "mlsr/lsdb" + "testing" +) + +// +// TestRoutingTable_Init +// @Description: 测试初始化 +// @param t +// +func TestRoutingTable_Init(t *testing.T) { + // 1. 组件初始化 + // 配置文件初始化 + mlsrConfig, err := common.ParseConfig(testConfigPath) + if err != nil { + common2.LogInfo("配置文件解析错误") + } + // 调度器初始化 + sche := new(lsdb.MlsrScheduler) + sche.Init() + // LogicFace初始化(假设初始化,暂时用不到) + face := new(logicface.LogicFace) + // LSDB初始化 + mlsdb := new(lsdb.Lsdb) + mlsdb.Init(mlsrConfig, sche, face) + + // 2. 路由表初始化 + rt := new(RoutingTable) + rt.Init(mlsrConfig, sche, mlsdb) +} + +// +// TestRoutingTable_AddNextHop +// @Description: 测试构造路由表及其拓扑 +// @param t +// +func TestRoutingTable_AddNextHop(t *testing.T) { +} + +// +// TestRoutingTable_Calculate +// @Description: 测试计算 +// @param t +// +func TestRoutingTable_Calculate(t *testing.T) { + +} + +// +// TestRoutingTable_ScheduleRoutingTableCalculation +// @Description: 测试安排路由计算 +// @param t +// +func TestRoutingTable_ScheduleRoutingTableCalculation(t *testing.T) { + +} From 65dbd2b8d2486fb4a33b4bee992c7e6dd0384a7f Mon Sep 17 00:00:00 2001 From: free will <2647778488@qq.com> Date: Thu, 23 Jun 2022 11:30:53 +0800 Subject: [PATCH 70/70] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BF=A1=E5=8F=B7?= =?UTF-8?q?=E9=87=8F=EF=BC=88=E5=AE=9E=E7=8E=B0=E8=87=AAMINSync=EF=BC=8Ccp?= =?UTF-8?q?=E5=88=B0=E8=BF=99=E9=87=8C=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 1 + go.sum | 4 + utils/Signal.go | 287 +++++++++++++++++++++++++++++++++++ utils/Signal_test.go | 354 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 646 insertions(+) create mode 100644 utils/Signal.go create mode 100644 utils/Signal_test.go diff --git a/go.mod b/go.mod index 0629455..b7fd07b 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,7 @@ go 1.16 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 diff --git a/go.sum b/go.sum index d83584c..4583ce7 100644 --- a/go.sum +++ b/go.sum @@ -13,6 +13,8 @@ github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7 github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/liyue201/gostl v1.0.1 h1:VQdvogZ90WpCb5WdG9UxS6r5ulnYEp8VfEMEZXVtpIs= +github.com/liyue201/gostl v1.0.1/go.mod h1:rgK+T1a0sQ1+CsAonfuD1J8C4iuGfOU9VAt9mmR/m10= github.com/mutecomm/go-sqlcipher/v4 v4.4.2 h1:eM10bFtI4UvibIsKr10/QT7Yfz+NADfjZYh0GKrXUNc= github.com/mutecomm/go-sqlcipher/v4 v4.4.2/go.mod h1:mF2UmIpBnzFeBdu/ypTDb/LdbS0nk0dfSN1WUsWTjMA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -30,6 +32,7 @@ github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/tidwall/assert v0.1.0 h1:aWcKyRBUAdLoVebxo95N7+YZVTFF/ASTr7BN4sLP6XI= @@ -71,6 +74,7 @@ golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU= gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +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= diff --git a/utils/Signal.go b/utils/Signal.go new file mode 100644 index 0000000..54dfc49 --- /dev/null +++ b/utils/Signal.go @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2014-2022, Peking University Shenzhen Graduate School + * + * This file is part of MIN-Sync. + * See AUTHORS.md for complete list of MIN-Sync authors and contributors. + * + * MIN-Sync is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * MIN-Sync is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along with + * MIN-Sync, e.g., in COPYING.md file. If not, see . + * + + * This file incorporates work covered by the following copyright and + * permission notice: + + * The MIT License (MIT) + + * Copyright (c) 2000 Arash Partow + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package utils + +import ( + "minlib/common" + "reflect" + + "github.com/liyue201/gostl/ds/vector" +) + +type DisconnectFunction = func() + +/** \brief represents a connection to a signal + * \note This type is copyable. Any copy can be used to disconnect. + */ +type Connection struct { + disconnect DisconnectFunction +} + +/** \brief disconnects from the signal + * \note If the connection is already disconnected, or if the Signal has been cleared, + * this operation has no effect. + * \warning During signal emission, attempting to disconnect a connection other than + * the executing handler's own connection results in undefined behavior. + */ +func (c *Connection) Disconnect() { + if c.IsConnected() { + c.disconnect() + } +} + +/** \brief check if connected to the signal + */ +func (c *Connection) IsConnected() bool { + return c.disconnect != nil +} + +/** \brief compare for equality + * + * Two connections are equal if they both point to the same connection that isn't disconnected, + * or they are both disconnected. + */ +func (c *Connection) Equals(other *Connection) bool { + return (!c.IsConnected() && !other.IsConnected()) || reflect.ValueOf(c.disconnect).Pointer() == reflect.ValueOf(other.disconnect).Pointer() +} + +/* Factory Method for Connection */ +func NewConnectionByDisconnectFunc(df DisconnectFunction) *Connection { + c := new(Connection) + c.disconnect = df + return c +} + +/** \brief represents a function that can connect to the signal + */ +type Handler = func(...interface{}) + +/** \brief provides a lightweight signal / event system + * + * To declare a signal: + * factory method; + * To connect to a signal: + * owner.signalName.connect(f); + * Multiple functions can connect to the same signal. + * To emit a signal from owner: + * this->signalName.emit(arg1, arg2); + * + * \sa signal-emit.hpp allows owner's derived classes to emit signals + */ + +type Signal struct { + slots SlotList + /** \brief is a signal handler executing? + */ + isExecuting bool + currentSlot SlotIterator +} + +/** \brief connects a handler to the signal + * \note If invoked from a handler, the new handler won't receive the current emitted signal. + * \warning The handler is permitted to disconnect itself, but it must ensure its validity. + */ +func (s *Signal) Connect(handler Handler) *Connection { + slot := NewSlotByHandler(handler) + slotIterator := s.slots.Insert(s.slots.End(), slot) + + /* disconnect management */ + df := func() { + s.disconnect(slotIterator) + } + slot.Disconnect = df /* strong reference */ + weakPtr := NewConnectionByDisconnectFunc(df) /* weak reference */ + slot.Connection = weakPtr /* slot takes over connection */ + return weakPtr +} + +/** \brief connects a single-shot handler to the signal + * + * After the handler is executed once, it is automatically disconnected. + */ +func (s *Signal) ConnectSingleShot(handler Handler) *Connection { + slot := new(Slot) + slotIterator := s.slots.Insert(s.slots.End(), slot) + + df := func() { + s.disconnect(slotIterator) + } + conn := NewConnectionByDisconnectFunc(df) + + slot.Disconnect = df + slot.Connection = conn + slot.Handler = func(args ...interface{}) { + handler(args) + conn.Disconnect() + } + + return conn +} + +/** \retval true if there is no connection + */ +func (s *Signal) IsEmpty() bool { + return !s.isExecuting && s.slots.Empty() +} + +/** \brief emits a signal + * \param args arguments passed to all handlers + * \warning Emitting the signal from a handler is undefined behavior. + * \note If a handler throws, the exception will be propagated to the caller + * who emits this signal, and some handlers may not be executed. + */ +func (s *Signal) Emit(args ...interface{}) { + if s.IsEmpty() { + return + } + + defer func() { + s.isExecuting = false + }() + s.isExecuting = true + + it := s.slots.Begin() + last := s.slots.Last() + isLast := false + for !isLast { + isLast = it.Equal(last) + s.currentSlot = it + s.currentSlot.Value().(*Slot).Handler(args...) + + // disconnect while executing current slot + if s.currentSlot.Equal(s.slots.End()) { + it = s.slots.Erase(it) + } else { + it = it.Next().(SlotIterator) + } + } +} + +/** \brief disconnects the handler in a slot + */ +func (s *Signal) disconnect(iterator SlotIterator) { + if s.isExecuting { + // during signal emission, only the currently executing handler can be disconnected + if !s.currentSlot.Equal(iterator) { + common.LogWarn("cannot disconnect another handler from a handler") + return + } + + // this serves to indicate that the current slot needs to be erased from the list + // after it finishes executing; we cannot do it here because of bug #2333 + s.currentSlot = s.slots.End() + // destruct + iterator.Value().(*Slot).Destruct() + } else { + iterator.Value().(*Slot).Destruct() + s.slots.Erase(iterator) + } +} + +/* Clear + */ +func (s *Signal) Clear() { + /* \warn should only called when signal is not executing */ + s.currentSlot = nil + + /* clean all slots */ + it := s.slots.Begin() + for !it.Equal(s.slots.End()) { + it.Value().(*Slot).Destruct() + it = it.Next().(*vector.VectorIterator) + } + + /* clean slots container */ + s.slots.Clear() + // s.slots = nil is not needed +} + +/* factory method for Signal */ +func NewSignal() *Signal { + s := new(Signal) + s.isExecuting = false + s.slots = vector.New() + return s +} + +type SlotList = *vector.Vector + +type SlotIterator = *vector.VectorIterator + +type Slot struct { + /** \brief weak reference of disconnect function + connection's lifetime is taken over by slot + */ + *Connection + /** \brief the handler function who will receive emitted signals + */ + Handler Handler + /** \brief the disconnect function which will disconnect this handler + * + * In practice this is the Signal.Disconnect method bound to a ptr + * pointing at this slot. + * + * Connection also has a ptr which references the same function object. + * When the slot is erased or the signal is destructed, this function object is + * destructed, and the related Connections cannot disconnect this slot again. + */ + Disconnect DisconnectFunction +} + +/* Clear +\warn cannot use the slot which has been already Destructed +*/ +func (s *Slot) Destruct() { + s.Handler = nil + s.Disconnect = nil + s.Connection.disconnect = nil + s.Connection = nil +} + +func NewSlotByHandler(handler Handler) *Slot { + s := new(Slot) + s.Handler = handler + return s +} diff --git a/utils/Signal_test.go b/utils/Signal_test.go new file mode 100644 index 0000000..fabb674 --- /dev/null +++ b/utils/Signal_test.go @@ -0,0 +1,354 @@ +/* + * Copyright (c) 2014-2022, Peking University Shenzhen Graduate School + * + * This file is part of MIN-Sync. + * See AUTHORS.md for complete list of MIN-Sync authors and contributors. + * + * MIN-Sync is free software: you can redistribute it and/or modify it under the terms + * of the GNU Lesser General Public License as published by the Free Software Foundation, + * either version 3 of the License, or (at your option) any later version. + * + * MIN-Sync is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License along with + * MIN-Sync, e.g., in COPYING.md file. If not, see . + * + + * This file incorporates work covered by the following copyright and + * permission notice: + + * The MIT License (MIT) + + * Copyright (c) 2000 Arash Partow + + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package utils + +import ( + "testing" +) + +func TestZeroSlot(t *testing.T) { + s := NewSignal() + s.Emit() +} + +func TestTwoListener(t *testing.T) { + s := NewSignal() + + hit1 := 0 + hit2 := 0 + + func1 := func(...interface{}) { + hit1 += 1 + } + func2 := func(...interface{}) { + hit2 += 1 + } + + s.Connect(func1) + s.Connect(func2) + + s.Emit() + + if hit1 != 1 || hit2 != 1 { + t.Fatalf("Two listener failed.") + } +} + +func TestOneArgument(t *testing.T) { + s := NewSignal() + + hit1 := 0 + + func1 := func(args ...interface{}) { + hit1 += 1 + num := args[0].(int) + if num != 8106 { + panic("Test one argument failed.") + } + } + + s.Connect(func1) + + s.Emit(8106) + + if hit1 != 1 { + t.Fatalf("Two listener failed.") + } +} + +func TestTwoArguments(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.") + } + } + + s.Connect(func1) + + s.Emit(8106, 8107) + + if hit1 != 1 { + t.Fatalf("Two listener failed.") + } +} + +func TestManualDisconnect(t *testing.T) { + s := NewSignal() + + hit1 := 0 + + func1 := func(args ...interface{}) { + hit1 += 1 + } + + conn := s.Connect(func1) + + s.Emit() + 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() +} + +func TestManualDisconnectDestructed(t *testing.T) { + s := NewSignal() + + hit1 := 0 + + func1 := func(args ...interface{}) { + hit1 += 1 + } + + conn := s.Connect(func1) + + s.Emit() + if hit1 != 1 { + t.Fatalf("ManualDisconnectDestructed failed.") + } + + s.Clear() + if conn.IsConnected() { + t.Fatalf("ManualDisconnectDestructed failed.") + } + s.Clear() + s.Emit() + s.Clear() + s.Emit() + if hit1 != 1 { + t.Fatalf("ManualDisconnectDestructed failed.") + } +} + +func TestConnectSingleSlot(t *testing.T) { + s := NewSignal() + + hit1 := 0 + + func1 := func(args ...interface{}) { + hit1 += 1 + } + + conn := s.ConnectSingleShot(func1) + + s.Emit() + if hit1 != 1 { + t.Fatalf("ConnectSingleSlot failed.") + } + + if conn.IsConnected() { + t.Fatalf("ConnectSingleSlot failed.") + } +} + +func TestConnectSingleShotDisconnected(t *testing.T) { + s := NewSignal() + + hit1 := 0 + + func1 := func(args ...interface{}) { + hit1 += 1 + } + + conn := s.ConnectSingleShot(func1) + + if !conn.IsConnected() { + t.Fatalf("ConnectSingleShotDisconnected failed.") + } + + conn.Disconnect() + + if conn.IsConnected() { + t.Fatalf("ConnectSingleShotDisconnected failed.") + } + + s.Emit() + if hit1 != 0 { + t.Fatalf("ConnectSingleShotDisconnected failed.") + } +} + +func TestConnectSingleShot1(t *testing.T) { + s := NewSignal() + + hit1 := 0 + + func1 := func(args ...interface{}) { + hit1 += 1 + } + + conn := s.ConnectSingleShot(func1) + + s.Emit() + if hit1 != 1 { + t.Fatalf("ConnectSingleShot1 failed.") + } + + if conn.IsConnected() { + t.Fatalf("ConnectSingleShot1 failed.") + } + + s.Emit() + if hit1 != 1 { + t.Fatalf("ConnectSingleShot1 failed.") + } +} + +func TestConnectInHandler(t *testing.T) { + s := NewSignal() + + hit1 := 0 + hit2 := 0 + hasHandler2 := false + + func1 := func(args ...interface{}) { + hit1 += 1 + if !hasHandler2 { + s.Connect(func(i ...interface{}) { + hit2 += 1 + hasHandler2 = true + }) + } + } + + s.Connect(func1) + + s.Emit() + if hit1 != 1 || hit2 != 0 { + t.Fatalf("ConnectInHandler failed.") + } + + s.Emit() + if hit1 != 2 || hit2 != 1 { + t.Fatalf("ConnectInHandler failed.") + } +} + +func TestDisconnectSelfInHandler(t *testing.T) { + s := NewSignal() + + hit1 := 0 + + var conn *Connection + func1 := func(args ...interface{}) { + hit1 += 1 + if !conn.IsConnected() { + t.Fatalf("DisconnectSelfInHandler failed.") + } + conn.Disconnect() + if conn.IsConnected() { + t.Fatalf("DisconnectSelfInHandler failed.") + } + if s.IsEmpty() { + t.Fatalf("DisconnectSelfInHandler failed.") + } + } + + conn = s.Connect(func1) + s.Emit() + + if hit1 != 1 { + t.Fatalf("DisconnectSelfInHandler failed.") + } + + if conn.IsConnected() { + t.Fatalf("DisconnectSelfInHandler failed.") + } + + if !s.IsEmpty() { + t.Fatalf("DisconnectSelfInHandler failed.") + } + + s.Emit() + + if hit1 != 1 { + t.Fatalf("DisconnectSelfInHandler failed.") + } +} + +func TestThrowInHandler(t *testing.T) { + s := NewSignal() + + hit1 := 0 + func1 := func(args ...interface{}) { + hit1 += 1 + panic("hello") + } + + s.Connect(func1) + defer func() { + if r := recover(); r != nil { + if hit1 != 1 { + t.Fatalf("ThrowInHandler failed.") + } + } + }() + s.Emit() +}