mirror of
https://gitee.com/willfree/mlsr.git
synced 2026-06-15 20:04:48 +08:00
147 lines
4.1 KiB
Go
147 lines
4.1 KiB
Go
// Package hello
|
|
// @Author: Wang Feng
|
|
// @Description:
|
|
// @Version: 0.1.0
|
|
// @Date: 2022/7/14 22:01
|
|
// @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室
|
|
//
|
|
|
|
package hello
|
|
|
|
import (
|
|
"errors"
|
|
"log"
|
|
common2 "minlib/common"
|
|
"minlib/component"
|
|
"minlib/packet"
|
|
"mlsr/lsa"
|
|
"time"
|
|
"unsafe"
|
|
)
|
|
|
|
//
|
|
// @Description: 接收MIN包的协程
|
|
// @receiver v
|
|
//
|
|
func (v *HelloProtocol) recvPacketFromClientRoutine() {
|
|
for v.state {
|
|
err := v.recvPacketFromClient()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// @Description: 等待接收一个MIN包,并放入管道
|
|
// @receiver v
|
|
// @return error
|
|
//
|
|
func (v *HelloProtocol) recvPacketFromClient() error {
|
|
interest, err := v.m_face.ReceiveInterest(-1)
|
|
common2.LogDebug("HelloProtocol recv interest packet, the name is: ", interest.GetName().ToUri())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
v.receivePacketQue <- interest
|
|
return nil
|
|
}
|
|
|
|
//
|
|
// @Description: 处理收到的MIN包的协程
|
|
// @receiver v
|
|
//
|
|
func (v *HelloProtocol) dealWithRecvPktRoutine() {
|
|
for v.state {
|
|
err := v.dealWithRecvPkt()
|
|
if err != nil {
|
|
log.Println(err)
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// @Description: 从管道读取并处理一个MIN包
|
|
// @receiver v
|
|
// @return error
|
|
//
|
|
func (v *HelloProtocol) dealWithRecvPkt() error {
|
|
interest, ok := <-v.receivePacketQue
|
|
if !ok {
|
|
common2.LogDebug("HelloProtocol get interest packet from receivePacketQue error")
|
|
return errors.New("HelloProtocol get interest packet from receivePacketQue error")
|
|
}
|
|
// 取出兴趣包倒数第二个组件,对其进行校验
|
|
infoComponent, err := interest.GetName().Get(-2)
|
|
if err != nil {
|
|
common2.LogDebug("HelloProtocol deal with interest error, get(-2) err ", err)
|
|
return err
|
|
}
|
|
if infoComponent.ToUri() != INFO_COMPONENT {
|
|
common2.LogDebug("HelloProtocol deal with interest error, INFO_COMPONENT not found or interestName ", err)
|
|
return err
|
|
}
|
|
// 取出兴趣包最后一个组件,其为该兴趣包所包含的RouterPrefix信息。
|
|
prefixComponent, err := interest.GetName().Get(-1)
|
|
if err != nil {
|
|
common2.LogDebug("HelloProtocol deal with interest error, get(-1) err", err)
|
|
return err
|
|
}
|
|
routerPrefix, err := GetRawPrefixForHelloProtocol(prefixComponent.ToUri())
|
|
if err != nil {
|
|
common2.LogDebug("HelloProtocol deal with interest error, GetRawPrefixForHelloProtocol err ", err)
|
|
return err
|
|
}
|
|
routerIdentifier, err := component.CreateIdentifierByString(routerPrefix)
|
|
if err != nil {
|
|
common2.LogDebug("HelloProtocol deal with interest error, create identifier from prefix err ", err)
|
|
return err
|
|
}
|
|
if v.m_adjacencyList.IsNeighbor(routerIdentifier) {
|
|
// 构造Data,以向兴趣包做应答
|
|
data := packet.NewData()
|
|
// data name: /<neighbor>/NLSR/INFO/<router>/<version>
|
|
dataName := interest.GetName()
|
|
dataName.AppendVersionNumber(uint64(time.Now().UnixMilli()))
|
|
data.SetName(dataName)
|
|
data.SetFreshnessPeriod(10 * 1000)
|
|
data.Payload.SetValue([]byte(INFO_COMPONENT))
|
|
|
|
// todo 安全性:对该data包进行签名
|
|
|
|
// 使用face对兴趣包进行响应
|
|
err = v.m_face.SendData(data)
|
|
if err != nil {
|
|
common2.LogDebug("HelloProtocol deal with interest error, send data error ", err)
|
|
return err
|
|
}
|
|
|
|
// 找到该邻接路由器的状态信息
|
|
adjInfo := v.m_adjacencyList.FindAdjacencyByRouterIdentifier(routerIdentifier)
|
|
// 如果该路由器状态在本机这里被记为未激活,则向其发送hello包,来确认其已激活
|
|
if adjInfo.Status == lsa.STATUS_INACTIVE {
|
|
// interest name: /<neighbor>/NLSR/INFO/<router>
|
|
name, err := component.CreateIdentifierByString(routerPrefix +
|
|
"/" + MLSR_COMPONENT + "/" + INFO_COMPONENT +
|
|
"/" + GetSinglePrefixForHelloProtocol(v.mlsrConfig.GetRouterPrefix()))
|
|
if err != nil {
|
|
common2.LogDebug("HelloProtocol deal with interest error, hello name create wrong.")
|
|
return err
|
|
}
|
|
// 将data发出去
|
|
v.expressInterest(name, v.mlsrConfig.GetInterestResendTime())
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func stringToBytes(str string) []byte {
|
|
return *(*[]byte)(unsafe.Pointer(&str))
|
|
}
|
|
|
|
func byteToString(bytes []byte) string {
|
|
return *(*string)(unsafe.Pointer(&bytes))
|
|
}
|