1
0
mirror of https://gitee.com/willfree/mlsr.git synced 2026-06-03 15:56:13 +08:00
Files
mlsr/route/NextHop.go
T

116 lines
2.4 KiB
Go

// 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 {
encoding.SelfEncodingBase
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
}