Skip to content

Commit

Permalink
refactoring PCUpdate
Browse files Browse the repository at this point in the history
  • Loading branch information
Motok1 committed Jun 2, 2022
1 parent 46b0066 commit c4e7a32
Show file tree
Hide file tree
Showing 3 changed files with 191 additions and 102 deletions.
189 changes: 111 additions & 78 deletions pkg/packet/pcep/pcep.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package pcep

import (
"encoding/binary"
"errors"
"fmt"
"log"
"math"
Expand Down Expand Up @@ -264,36 +265,13 @@ const (

const TL_LENGTH = 4

// func unmarshalPcepTLVs(tlvs *[]Tlv, pcepTLVs []uint8) {
// fmt.Printf("pcep TLVs byte: %#v\n", pcepTLVs)
// tlvType := binary.BigEndian.Uint16(pcepTLVs[0:2])
// tlvLength := uint16(math.Ceil(float64(binary.BigEndian.Uint16(pcepTLVs[2:4]))/4) * 4) // Include padding
// fmt.Printf(" TLV length: %d\n", tlvLength)
// tlv := &Tlv{
// Type: tlvType,
// Length: tlvLength,
// Value: pcepTLVs[4 : 4+tlvLength],
// }
// *tlvs = append(*tlvs, *tlv)
// switch tlvType {
// case TLV_IPV4_LSP_IDENTIFIERS:
// fmt.Printf(" Unmarshal TLV_IPV4_LSP_IDENTIFIERS (%v)\n", tlvType)
// case TLV_STATEFUL_PCE_CAPABILITY:
// fmt.Printf(" Unmarshal TLV_STATEFUL_PCE_CAPABILITY (%v)\n", tlvType)
// case TLV_SYMBOLIC_PATH_NAME:
// fmt.Printf(" Unmarshal TLV_SYMBOLIC_PATH_NAME (%v)\n", tlvType)
// case TLV_SR_PCE_CAPABILITY:
// fmt.Printf(" Unmarshal TLV_SR_PCE_CAPABILITY (%v)\n", tlvType)
// case TLV_ASSOC_TYPE_LIST:
// fmt.Printf(" Unmarshal TLV_ASSOC_TYPE_LIST (%v)\n", tlvType)
// default:
// fmt.Printf(" Unimplemented TLV: %v\n", tlvType)
// }
func (tlv *Tlv) DecodeFromBytes(data []uint8) error {
tlv.Type = binary.BigEndian.Uint16(data[0:2])
tlv.Length = binary.BigEndian.Uint16(data[2:4])
tlv.Value = data[4 : 4+tlv.Length]

// if len(pcepTLVs)-int(tlvLength+TL_LENGTH) >= 4 {
// unmarshalPcepTLVs(tlvs, pcepTLVs[(tlvLength+TL_LENGTH):])
// }
// }
return nil
}

func (tlv *Tlv) Serialize() []uint8 {
bytePcepTLV := []uint8{}
Expand All @@ -314,6 +292,23 @@ func (tlv *Tlv) Serialize() []uint8 {
return bytePcepTLV
}

func DecodeTLVsFromBytes(data []uint8) ([]Tlv, error) {
tlvs := []Tlv{}
for {
var tlv Tlv
tlv.DecodeFromBytes(data)
tlvs = append(tlvs, tlv)
if int(tlv.getByteLength()) < len(data) {
data = data[tlv.getByteLength():]
} else if int(tlv.getByteLength()) < len(data) {
break
} else {
return nil, errors.New("TLVs decode error.\n")
}
}
return tlvs, nil
}

type Path struct {
LspObject LspObject
SrEroSubobjects []SrEroSubobject
Expand Down Expand Up @@ -569,7 +564,23 @@ func (o *LspObject) DecodeFromBytes(data []uint8) error {
o.RFlag = (data[3] & 0x04) != 0
o.SFlag = (data[3] & 0x02) != 0
o.DFlag = (data[3] & 0x01) != 0
// lsp の decode をしたい
byteTlvs := data[4:]
for {
var tlv Tlv
tlv.DecodeFromBytes(byteTlvs)
if tlv.Type == uint16(TLV_SYMBOLIC_PATH_NAME) {
o.Name = string(tlv.Value)
}
o.Tlvs = append(o.Tlvs, tlv)

if int(tlv.getByteLength()) < len(byteTlvs) {
byteTlvs = byteTlvs[tlv.getByteLength():]
} else if int(tlv.getByteLength()) == len(byteTlvs) {
break
} else {
return errors.New("[pcep] Lsp TLV decode Error.\n")
}
}
return nil
}

Expand Down Expand Up @@ -638,6 +649,23 @@ func NewLspObject(lspName string, plspId uint32) LspObject {
return lspObject
}

func DecodeLspTLVsFromBytes(data []uint8) ([]Tlv, error) {
tlvs := []Tlv{}
for {
var tlv Tlv
tlv.DecodeFromBytes(data)
tlvs = append(tlvs, tlv)
if int(tlv.getByteLength()) < len(data) {
data = data[tlv.getByteLength():]
} else if int(tlv.getByteLength()) < len(data) {
break
} else {
return nil, errors.New("TLVs decode error.\n")
}
}
return tlvs, nil
}

//////////////////////// ero object //////////////////////////////
type EroObject struct {
SrEroSubobjects []SrEroSubobject
Expand Down Expand Up @@ -870,15 +898,15 @@ func (o *PCRptMessage) DecodeFromBytes(bytePcrptObject []uint8) error {
case OC_BANDWIDTH:
fmt.Printf(" Decode OC_BANDWIDTH (%v)\n", commonObjectHeader.ObjectClass)
var bandwidthObject BandwidthObject
err = bandwidthObject.DecodeFromBytes(bytePcrptObject[COMMON_OBJECT_HEADER_LENGTH:])
err = bandwidthObject.DecodeFromBytes(bytePcrptObject[COMMON_OBJECT_HEADER_LENGTH:commonObjectHeader.ObjectLength])
if err != nil {
return err
}
o.BandwidthObjects = append(o.BandwidthObjects, bandwidthObject)
case OC_METRIC:
fmt.Printf(" Decode OC_METRIC (%v)\n", commonObjectHeader.ObjectClass)
var metricObject MetricObject
err = metricObject.DecodeFromBytes(bytePcrptObject[COMMON_OBJECT_HEADER_LENGTH:])
err = metricObject.DecodeFromBytes(bytePcrptObject[COMMON_OBJECT_HEADER_LENGTH:commonObjectHeader.ObjectLength])
if err != nil {
fmt.Printf("parse error")
log.Fatal(nil)
Expand All @@ -889,36 +917,29 @@ func (o *PCRptMessage) DecodeFromBytes(bytePcrptObject []uint8) error {
// report.SrEroSubobject.DecodeFromBytes(buf[COMMON_OBJECT_HEADER_LENGTH:])
case OC_LSPA:
fmt.Printf(" Decode OC_LSPA (%v)\n", commonObjectHeader.ObjectClass)
err := o.LspaObject.DecodeFromBytes(bytePcrptObject[COMMON_OBJECT_HEADER_LENGTH:])
err := o.LspaObject.DecodeFromBytes(bytePcrptObject[COMMON_OBJECT_HEADER_LENGTH:commonObjectHeader.ObjectLength])
if err != nil {
fmt.Printf("parse error")
log.Fatal(nil)
}
case OC_LSP:
fmt.Printf(" Decode OC_LSP (%v)\n", commonObjectHeader.ObjectClass)
tlvLength := commonObjectHeader.ObjectLength - COMMON_OBJECT_HEADER_LENGTH
err := o.LspObject.DecodeFromBytes(bytePcrptObject[COMMON_OBJECT_HEADER_LENGTH : tlvLength+COMMON_OBJECT_HEADER_LENGTH])
fmt.Printf("PCRpt.LSPbyte: %#v\n\n", bytePcrptObject)
err := o.LspObject.DecodeFromBytes(bytePcrptObject[COMMON_OBJECT_HEADER_LENGTH:commonObjectHeader.ObjectLength])
if err != nil {
fmt.Printf("parse error")
log.Fatal(nil)
}
// decodefrombyte に変換
// unmarshalPcepTLVs(&report.LspObject.Tlvs, buf[8:tlvLength]) // common header: 4byte, [PLSP-ID, flag]: 4byte で 8byte 除いた
// for _, tlv := range report.LspObject.Tlvs {
// if tlv.Type == TLV_SYMBOLIC_PATH_NAME {
// report.LspObject.Name = string(tlv.Value)
// }
// }
case OC_SRP:
fmt.Printf(" Decode OC_SRP (%v)\n", commonObjectHeader.ObjectClass)
err := o.SrpObject.DecodeFromBytes(bytePcrptObject[COMMON_OBJECT_HEADER_LENGTH:])
err := o.SrpObject.DecodeFromBytes(bytePcrptObject[COMMON_OBJECT_HEADER_LENGTH:commonObjectHeader.ObjectLength])
if err != nil {
fmt.Printf("parse error")
log.Fatal(nil)
}
case OC_VENDOR_INFORMATION:
fmt.Printf(" Decode OC_VENDOR_INFORMATION (%v)\n", commonObjectHeader.ObjectClass)
err := o.VendorInformationObject.DecodeFromBytes(bytePcrptObject[COMMON_OBJECT_HEADER_LENGTH:])
err := o.VendorInformationObject.DecodeFromBytes(bytePcrptObject[COMMON_OBJECT_HEADER_LENGTH:commonObjectHeader.ObjectLength])
if err != nil {
fmt.Printf("parse error")
log.Fatal(nil)
Expand Down Expand Up @@ -988,44 +1009,56 @@ func (o *PCInitiateMessage) Serialize() ([]uint8, error) {
}

//////////////////////// PCUpdate Message //////////////////////////////
type PCUpdMessage struct {
SrpObject SrpObject
LspObject LspObject
EndpointObject EndpointObject
EroObject EroObject
VendorInformationObject VendorInformationObject
}

// func NewPCUpdObjects(path Path) []uint8 {
// // TODO: 経路のパラメータによってはObjectの数変わる?要調査
// byteSrpObject := NewSrpObject()
// byteLspObject := EncapLspObject(path.LspObject)
// byteEroObject := NewEroObject(path.SrEroSubobjects)
// byteLspaObject := EncapLspaObject(path.LspaObject)
// byteMetricObject := EncapMetricObject(path.MetricObject)
// byteObjects := appendByteSlices(byteSrpObject, byteLspObject, byteEroObject, byteLspaObject, byteMetricObject)
// return (byteObjects)
// }

// func (s *Server) SendPCUpd(conn net.Conn, path Path) {
// byteObjects := NewPCUpdObjects(path)

// messageLength := uint16(len(byteObjects) + COMMON_HEADER_LENGTH)
// byteCommonHeader := NewCommonHeader(MT_UPDATE, messageLength)
func NewPCUpdMessage(srpId uint32, lspName string, plspId uint32, labels []Label, color uint32, preference uint32, srcIPv4 []uint8, dstIPv4 []uint8) PCUpdMessage {
var pcUpdMessage PCUpdMessage
pcUpdMessage.SrpObject = NewSrpObject(srpId, false)
pcUpdMessage.LspObject = NewLspObject(lspName, plspId) // PLSP-ID = 0
pcUpdMessage.EndpointObject = NewEndpointObject(1, dstIPv4, srcIPv4) // objectType = 1 (IPv4)
pcUpdMessage.EroObject = NewEroObject(labels)
pcUpdMessage.VendorInformationObject = NewVendorInformationObject("Cisco", color, preference)
return pcUpdMessage
}

// pcupdMessage := append(byteCommonHeader, byteObjects...)
func (o *PCUpdMessage) Serialize() ([]uint8, error) {
byteSrpObject, err := o.SrpObject.Serialize()
if err != nil {
return nil, err
}
byteLspObject, err := o.LspObject.Serialize()
if err != nil {
return nil, err
}
byteEndpointObject, err := o.EndpointObject.Serialize()
if err != nil {
return nil, err
}
byteEroObject, err := o.EroObject.Serialize()
if err != nil {
return nil, err
}
byteVendorInformationObject, err := o.VendorInformationObject.Serialize()
if err != nil {
return nil, err
}
pcupdHeaderLength := COMMON_HEADER_LENGTH + o.SrpObject.getByteLength() + o.LspObject.getByteLength() + o.EndpointObject.getByteLength() + o.EroObject.getByteLength() + o.VendorInformationObject.getByteLength()

// fmt.Printf("[PCEP] Send PCUpd\n")
// _, err := conn.Write(pcupdMessage)
// if err != nil {
// fmt.Printf("pcupd error")
// log.Fatal(nil)
// }
// }
pcupdHeader := NewCommonHeader(MT_UPDATE, pcupdHeaderLength)
bytePCUpdHeader, err := pcupdHeader.Serialize()
if err != nil {
return nil, err
}
bytePCUpdMessage := AppendByteSlices(bytePCUpdHeader, byteSrpObject, byteLspObject, byteEndpointObject, byteEroObject, byteVendorInformationObject)

// func NewPCUpdObjects(path Path) []uint8 {
// // TODO: 経路のパラメータによってはObjectの数変わる?要調査
// byteSrpObject := NewSrpObject()
// byteLspObject := EncapLspObject(path.LspObject)
// byteEroObject := NewEroObject(path.SrEroSubobject)
// byteLspaObject := EncapLspaObject(path.LspaObject)
// byteMetricObject := EncapMetricObject(path.MetricObject)
// byteObjects := appendByteSlices(byteSrpObject, byteLspObject, byteEroObject, byteLspaObject, byteMetricObject)
// return (byteObjects)
// }
return bytePCUpdMessage, nil
}

/* utils */
func i32tob(value uint32) []uint8 {
Expand Down
59 changes: 46 additions & 13 deletions pkg/server/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,25 +127,26 @@ func (s *Server) grpcListen() error {
func (s *Server) CreateLsp(ctx context.Context, lspData *pb.LspData) (*pb.LspStatus, error) {
fmt.Printf("[gRPC] Get request\n")
pcepPeerAddr := net.IP(lspData.GetPcepSessionAddr())
for _, pcepSession := range s.sessionList {
if pcepSession.peerAddr.Equal(pcepPeerAddr) {
fmt.Printf("%#v\n", pcepSession)
if !pcepSession.isSynced {
break
if pcepSession := s.getSession(pcepPeerAddr); pcepSession != nil {
labels := []pcep.Label{}
for _, receivedLsp := range lspData.GetLabels() {
pcepLabel := pcep.Label{
Sid: receivedLsp.GetSid(),
LoAddr: receivedLsp.GetLoAddr(),
}
labels := []pcep.Label{}
for _, receivedLsp := range lspData.GetLabels() {
pcepLabel := pcep.Label{
Sid: receivedLsp.GetSid(),
LoAddr: receivedLsp.GetLoAddr(),
}
labels = append(labels, pcepLabel)
labels = append(labels, pcepLabel)
}
if plspId := s.getPlspId(lspData); plspId != 0 {
fmt.Printf("plspId check : %d\n\n", plspId)
if err := pcepSession.SendPCUpdate(lspData.GetPolicyName(), plspId, labels, lspData.GetColor(), uint32(100), lspData.GetSrcAddr(), lspData.GetDstAddr()); err != nil {
return &pb.LspStatus{IsSuccess: false}, err
}
} else {
if err := pcepSession.SendPCInitiate(lspData.GetPolicyName(), labels, lspData.GetColor(), uint32(100), lspData.GetSrcAddr(), lspData.GetDstAddr()); err != nil {
return &pb.LspStatus{IsSuccess: false}, err
}
return &pb.LspStatus{IsSuccess: true}, nil
}
return &pb.LspStatus{IsSuccess: true}, nil
}
return &pb.LspStatus{IsSuccess: false}, nil
}
Expand Down Expand Up @@ -183,6 +184,25 @@ func (s *Server) removeSession(sessionId uint8) {
}
}

func (s *Server) getPlspId(lspData *pb.LspData) uint32 {
for _, v := range s.lspList {
fmt.Printf("list name: %#v\n", []byte(v.name))
fmt.Printf("new name: %#v\n", []byte(lspData.GetPolicyName()))
fmt.Printf("list addr: %v\n", v.peerAddr)
fmt.Printf("new addr: %v\n\n", net.IP(lspData.GetPcepSessionAddr()))
fmt.Printf("first: %t\n", v.name == lspData.GetPolicyName())
fmt.Printf("second: %t\n\n", v.peerAddr.Equal(net.IP(lspData.GetPcepSessionAddr())))

if v.name == lspData.GetPolicyName() && v.peerAddr.Equal(net.IP(lspData.GetPcepSessionAddr())) {
fmt.Printf("[get!!!]PlspID: %d\n", v.plspId)
return v.plspId
}
}
// 存在しない場合は PCInitiate 用の PLSP-ID: 0 を返す
fmt.Printf("awefawefawefawe")
return 0
}

func (s *Server) removeLsp(e Lsp) {
// lspList から name, PLSP-ID, sessionAddr が一致するものを削除する
for i, v := range s.lspList {
Expand All @@ -193,3 +213,16 @@ func (s *Server) removeLsp(e Lsp) {
}
}
}

func (s *Server) getSession(peerAddr net.IP) *Session {
for _, pcepSession := range s.sessionList {
if pcepSession.peerAddr.Equal(peerAddr) {
fmt.Printf("%#v\n", pcepSession)
if !pcepSession.isSynced {
break
}
return pcepSession
}
}
return nil
}
Loading

0 comments on commit c4e7a32

Please sign in to comment.