// Package hello // @Author: Wang Feng // @Description: // @Version: 0.1.0 // @Date: 2022/7/14 22:01 // @Copyright: MIN-Group;国家重大科技基础设施——未来网络北大实验室;深圳市信息论与未来网络重点实验室 // package hello import ( common2 "minlib/common" "minlib/component" "minlib/packet" "mlsr/lsa" "time" "unsafe" ) // // @Description: 从管道读取并处理一个MIN包 // @receiver v // @return error // func (v *HelloProtocol) dealWithRecvPkt(interest *packet.Interest) 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: //NLSR/INFO// 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: //NLSR/INFO/ 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)) }