mirror of
https://gitee.com/willfree/mlsr.git
synced 2026-06-03 15:56:13 +08:00
116 lines
2.4 KiB
Go
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
|
|
}
|