1
0
mirror of https://gitee.com/willfree/mlsr.git synced 2026-06-15 20:04:48 +08:00
Files
mlsr/hello/HelloProtocolForHandleInterest.go
T
2022-07-15 22:18:58 +08:00

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))
}