1
0
mirror of https://gitee.com/willfree/mlsr.git synced 2026-06-15 18:44:53 +08:00
Files
mlsr/route/NamePrefixTableEntry.go
T

200 lines
5.1 KiB
Go

// Package route
// @Author: Wang Feng
// @Description:
// @Version: 0.1.0
// @Date: 2022/6/9 15:07
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
//
package route
import (
common2 "minlib/common"
"minlib/component"
)
//
// NamePrefixTableEntry
// @Description: 名称前缀表项
//
type NamePrefixTableEntry struct {
// 名称前缀
m_namePrefix *component.Identifier
// 保存路由表池项的切片。go语言切片真好用。
// 这是因为,由于支持网内缓存,一个名称前缀可能对应多个路由器标识符。
// 名称前缀标项,和路由表项,是多对多的关系。
m_rteList []*RoutingTablePoolEntry
// 下一跳列表
NextHopList
}
//
// ToString
// @Description: 转string,用于测试
// @receiver e
//
func (e *NamePrefixTableEntry) ToString() string {
str := "-------名称前缀表项 Start:" + e.m_namePrefix.ToUri() + "------------\n"
for i := 0; i < len(e.m_rteList); i++ {
str += e.m_rteList[i].ToString()
}
str += "下一跳列表:\n"
str += e.NextHopList.ToString()
str += "-------名称前缀表项 End :" + e.m_namePrefix.ToUri() + "------------\n"
return str
}
//
// Init
// @Description: 初始化参数
// @receiver e
// @param namePrefix
//
func (e *NamePrefixTableEntry) Init(namePrefix *component.Identifier) {
e.m_namePrefix = namePrefix
}
//
// GetNamePrefix
// @Description: 获取所表示的名称前缀
// @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.AddNextHopBySmallerPriciple(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().ToUri())
// 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)
}
}