Skip to content

Commit

Permalink
add Extract for LsBgpPeerSegmentSID
Browse files Browse the repository at this point in the history
Co-authored-by: watal <watal.i27e@gmail.com>
  • Loading branch information
yas-nyan and watal committed Jan 10, 2023
1 parent 18b04d2 commit 033cfdb
Show file tree
Hide file tree
Showing 2 changed files with 85 additions and 116 deletions.
41 changes: 20 additions & 21 deletions pkg/apiutil/attribute.go
Original file line number Diff line number Diff line change
Expand Up @@ -1030,26 +1030,18 @@ func UnmarshalLsAttribute(a *api.LsAttribute) (*bgp.LsAttribute, error) {
}

// For AttributeBgpPeerSegment

if a.BgpPeerSegment != nil {
var bgpPeerNodeSid *uint32
var bgpPeerAdjacencySid *uint32
var bgpPeerSetSid *uint32
if a.BgpPeerSegment.BgpPeerNodeSid != 0 {
bgpPeerNodeSid = &a.BgpPeerSegment.BgpPeerNodeSid
}
if a.BgpPeerSegment.BgpPeerAdjacencySid != 0 {
bgpPeerNodeSid = &a.BgpPeerSegment.BgpPeerAdjacencySid
lsAttributeBgpPeerSegment := bgp.LsAttributeBgpPeerSegment{}
if a.BgpPeerSegment.BgpPeerNodeSid != nil {
lsAttributeBgpPeerSegment.BgpPeerNodeSid, _ = UnmarshalLsBgpPeerSegmentSid(a.BgpPeerSegment.BgpPeerNodeSid)
}
if a.BgpPeerSegment.BgpPeerSetSid != 0 {
bgpPeerSetSid = &a.BgpPeerSegment.BgpPeerSetSid
if a.BgpPeerSegment.BgpPeerAdjacencySid != nil {
lsAttributeBgpPeerSegment.BgpPeerAdjacencySid, _ = UnmarshalLsBgpPeerSegmentSid(a.BgpPeerSegment.BgpPeerAdjacencySid)
}

lsAttr.BgpPeerSegment = bgp.LsAttributeBgpPeerSegment{
BgpPeerNodeSid: bgpPeerNodeSid,
BgpPeerAdjacencySid: bgpPeerAdjacencySid,
BgpPeerSetSid: bgpPeerSetSid,
if a.BgpPeerSegment.BgpPeerSetSid != nil {
lsAttributeBgpPeerSegment.BgpPeerSetSid, _ = UnmarshalLsBgpPeerSegmentSid(a.BgpPeerSegment.BgpPeerSetSid)
}
lsAttr.BgpPeerSegment = lsAttributeBgpPeerSegment
}

return lsAttr, nil
Expand Down Expand Up @@ -2212,6 +2204,17 @@ func float32OrDefault(f *float32) float32 {
func NewLsAttributeFromNative(a *bgp.PathAttributeLs) (*api.LsAttribute, error) {
attr := a.Extract()

bgpPeerSegment := &api.LsAttributeBgpPeerSegment{}
if attr.BgpPeerSegment.BgpPeerNodeSid != nil {
bgpPeerSegment.BgpPeerNodeSid, _ = MarshalLsBgpPeerSegmentSid(attr.BgpPeerSegment.BgpPeerNodeSid)
}
if attr.BgpPeerSegment.BgpPeerAdjacencySid != nil {
bgpPeerSegment.BgpPeerAdjacencySid, _ = MarshalLsBgpPeerSegmentSid(attr.BgpPeerSegment.BgpPeerAdjacencySid)
}
if attr.BgpPeerSegment.BgpPeerSetSid != nil {
bgpPeerSegment.BgpPeerSetSid, _ = MarshalLsBgpPeerSegmentSid(attr.BgpPeerSegment.BgpPeerSetSid)
}

apiAttr := &api.LsAttribute{
Node: &api.LsAttributeNode{
Name: stringOrDefault(attr.Node.Name),
Expand Down Expand Up @@ -2242,11 +2245,7 @@ func NewLsAttributeFromNative(a *bgp.PathAttributeLs) (*api.LsAttribute, error)

SrPrefixSid: uint32OrDefault(attr.Prefix.SrPrefixSID),
},
BgpPeerSegment: &api.LsAttributeBgpPeerSegment{
BgpPeerNodeSid: uint32OrDefault(attr.BgpPeerSegment.BgpPeerNodeSid),
BgpPeerAdjacencySid: uint32OrDefault(attr.BgpPeerSegment.BgpPeerAdjacencySid),
BgpPeerSetSid: uint32OrDefault(attr.BgpPeerSegment.BgpPeerSetSid),
},
BgpPeerSegment: bgpPeerSegment,
}

if attr.Node.Flags != nil {
Expand Down
160 changes: 65 additions & 95 deletions pkg/packet/bgp/bgp.go
Original file line number Diff line number Diff line change
Expand Up @@ -7961,23 +7961,41 @@ type LsAttributeBgpPeerSegmentSIDFlags struct {
Persistent bool `json:"persistent"`
}

func NewBgpPeerSegmentSIDFlag(v uint8) LsAttributeBgpPeerSegmentSIDFlags {
var flags LsAttributeBgpPeerSegmentSIDFlags
if (v & (1 >> 7)) == 1 {
flags.Value = true
func (l *LsAttributeBgpPeerSegmentSIDFlags) FlagBits() uint8 {
var flags uint8
if l.Value {
flags = flags | (1 << 7)
}
if (v & (1 >> 6)) == 1 {
flags.Local = true
if l.Local {
flags = flags | (1 << 6)
}
if (v & (1 >> 5)) == 1 {
flags.Backup = true
if l.Backup {
flags = flags | (1 << 5)
}
if (v & (1 >> 4)) == 1 {
flags.Persistent = true
if l.Persistent {
flags = flags | (1 << 4)
}
return flags
}

func (l *LsAttributeBgpPeerSegmentSIDFlags) SidLen() uint16 {
// https://tools.ietf.org/html/rfc9086#section-5
if l.Value {
return 7
} else {
return 8
}
}

func NewLsBgpPeerSegmentSIDFlag(v uint8) LsAttributeBgpPeerSegmentSIDFlags {
return LsAttributeBgpPeerSegmentSIDFlags{
Value: (v & (1 << 7)) > 0,
Local: (v & (1 << 6)) > 0,
Backup: (v & (1 << 5)) > 0,
Persistent: (v & (1 << 4)) > 0,
}
}

type LsBgpPeerSegmentSID struct {
Flags LsAttributeBgpPeerSegmentSIDFlags `json:"flags"`
Weight uint8 `json:"weight"`
Expand All @@ -7992,34 +8010,12 @@ type LsTLVPeerNodeSID struct {
}

func NewLsTLVPeerNodeSID(l *LsBgpPeerSegmentSID) *LsTLVPeerNodeSID {
var flags uint8
if l.Flags.Value {
flags = flags & (1 >> 7)
}
if l.Flags.Local {
flags = flags & (1 >> 6)
}
if l.Flags.Backup {
flags = flags & (1 >> 5)
}
if l.Flags.Persistent {
flags = flags & (1 >> 4)
}

// https://tools.ietf.org/html/rfc9086#section-5
var sidlen uint16
if l.Flags.Value {
sidlen = 7
} else {
sidlen = 8
}

return &LsTLVPeerNodeSID{
LsTLV: LsTLV{
Type: BGP_ASPATH_ATTR_TYPE_SET,
Length: sidlen,
Length: l.Flags.SidLen(),
},
Flags: flags,
Flags: l.Flags.FlagBits(),
Weight: l.Weight,
SID: l.SID,
}
Expand Down Expand Up @@ -8058,6 +8054,14 @@ func (l *LsTLVPeerNodeSID) DecodeFromBytes(data []byte) error {
return nil
}

func (l *LsTLVPeerNodeSID) Extract() *LsBgpPeerSegmentSID {
return &LsBgpPeerSegmentSID{
Flags: NewLsBgpPeerSegmentSIDFlag(l.Flags),
Weight: l.Weight,
SID: l.SID,
}
}

func (l *LsTLVPeerNodeSID) Serialize() ([]byte, error) {
buf := make([]byte, 0)
buf = append(buf, l.Flags)
Expand Down Expand Up @@ -8096,35 +8100,13 @@ type LsTLVPeerAdjacencySID struct {
SID uint32
}

func NewLsTLVPeerAdjacencySID(l *LsBgpPeerSegmentSID) *LsTLVPeerNodeSID {
var flags uint8
if l.Flags.Value {
flags = flags & (1 >> 7)
}
if l.Flags.Local {
flags = flags & (1 >> 6)
}
if l.Flags.Backup {
flags = flags & (1 >> 5)
}
if l.Flags.Persistent {
flags = flags & (1 >> 4)
}

// https://tools.ietf.org/html/rfc9086#section-5
var sidlen uint16
if l.Flags.Value {
sidlen = 7
} else {
sidlen = 8
}

return &LsTLVPeerNodeSID{
func NewLsTLVPeerAdjacencySID(l *LsBgpPeerSegmentSID) *LsTLVPeerAdjacencySID {
return &LsTLVPeerAdjacencySID{
LsTLV: LsTLV{
Type: BGP_ASPATH_ATTR_TYPE_SET,
Length: sidlen,
Length: l.Flags.SidLen(),
},
Flags: flags,
Flags: l.Flags.FlagBits(),
Weight: l.Weight,
SID: l.SID,
}
Expand Down Expand Up @@ -8163,6 +8145,14 @@ func (l *LsTLVPeerAdjacencySID) DecodeFromBytes(data []byte) error {
return nil
}

func (l *LsTLVPeerAdjacencySID) Extract() *LsBgpPeerSegmentSID {
return &LsBgpPeerSegmentSID{
Flags: NewLsBgpPeerSegmentSIDFlag(l.Flags),
Weight: l.Weight,
SID: l.SID,
}
}

func (l *LsTLVPeerAdjacencySID) Serialize() ([]byte, error) {
buf := make([]byte, 0)
buf = append(buf, l.Flags)
Expand Down Expand Up @@ -8201,35 +8191,13 @@ type LsTLVPeerSetSID struct {
SID uint32
}

func NewLsTLVPeerSetSID(l *LsBgpPeerSegmentSID) *LsTLVPeerNodeSID {
var flags uint8
if l.Flags.Value {
flags = flags & (1 >> 7)
}
if l.Flags.Local {
flags = flags & (1 >> 6)
}
if l.Flags.Backup {
flags = flags & (1 >> 5)
}
if l.Flags.Persistent {
flags = flags & (1 >> 4)
}

// https://tools.ietf.org/html/rfc9086#section-5
var sidlen uint16
if l.Flags.Value {
sidlen = 7
} else {
sidlen = 8
}

return &LsTLVPeerNodeSID{
func NewLsTLVPeerSetSID(l *LsBgpPeerSegmentSID) *LsTLVPeerSetSID {
return &LsTLVPeerSetSID{
LsTLV: LsTLV{
Type: BGP_ASPATH_ATTR_TYPE_SET,
Length: sidlen,
Length: l.Flags.SidLen(),
},
Flags: flags,
Flags: l.Flags.FlagBits(),
Weight: l.Weight,
SID: l.SID,
}
Expand Down Expand Up @@ -8268,6 +8236,14 @@ func (l *LsTLVPeerSetSID) DecodeFromBytes(data []byte) error {
return nil
}

func (l *LsTLVPeerSetSID) Extract() *LsBgpPeerSegmentSID {
return &LsBgpPeerSegmentSID{
Flags: NewLsBgpPeerSegmentSIDFlag(l.Flags),
Weight: l.Weight,
SID: l.SID,
}
}

func (l *LsTLVPeerSetSID) Serialize() ([]byte, error) {
buf := make([]byte, 0)
buf = append(buf, l.Flags)
Expand Down Expand Up @@ -9246,19 +9222,13 @@ func (p *PathAttributeLs) Extract() *LsAttribute {
l.Prefix.SrPrefixSID = &v.SID

case *LsTLVPeerNodeSID:
l.BgpPeerSegment.BgpPeerNodeSid.Flags = NewBgpPeerSegmentSIDFlag(v.Flags)
l.BgpPeerSegment.BgpPeerNodeSid.Weight = v.Weight
l.BgpPeerSegment.BgpPeerNodeSid.SID = v.SID
l.BgpPeerSegment.BgpPeerNodeSid = v.Extract()

case *LsTLVPeerAdjacencySID:
l.BgpPeerSegment.BgpPeerAdjacencySid.Flags = NewBgpPeerSegmentSIDFlag(v.Flags)
l.BgpPeerSegment.BgpPeerAdjacencySid.Weight = v.Weight
l.BgpPeerSegment.BgpPeerAdjacencySid.SID = v.SID
l.BgpPeerSegment.BgpPeerAdjacencySid = v.Extract()

case *LsTLVPeerSetSID:
l.BgpPeerSegment.BgpPeerSetSid.Flags = NewBgpPeerSegmentSIDFlag(v.Flags)
l.BgpPeerSegment.BgpPeerSetSid.Weight = v.Weight
l.BgpPeerSegment.BgpPeerSetSid.SID = v.SID
l.BgpPeerSegment.BgpPeerSetSid = v.Extract()
}
}

Expand Down

0 comments on commit 033cfdb

Please sign in to comment.