summaryrefslogtreecommitdiffhomepage
path: root/pkg/packet/bgp/prefix_sid_sstlv.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/packet/bgp/prefix_sid_sstlv.go')
-rw-r--r--pkg/packet/bgp/prefix_sid_sstlv.go107
1 files changed, 107 insertions, 0 deletions
diff --git a/pkg/packet/bgp/prefix_sid_sstlv.go b/pkg/packet/bgp/prefix_sid_sstlv.go
new file mode 100644
index 00000000..14ff621a
--- /dev/null
+++ b/pkg/packet/bgp/prefix_sid_sstlv.go
@@ -0,0 +1,107 @@
+package bgp
+
+import "encoding/binary"
+
+const (
+ subSubTLVHdrLen = 3
+)
+
+type SubSubTLVType uint8
+
+type SubSubTLV struct {
+ Type SubSubTLVType
+ Length uint16
+}
+
+func (s *SubSubTLV) Len() int {
+ return int(s.Length) + subSubTLVHdrLen
+}
+
+func (s *SubSubTLV) Serialize(value []byte) ([]byte, error) {
+ if len(value) != int(s.Length) {
+ return nil, malformedAttrListErr("serialization failed: Prefix SID TLV malformed")
+ }
+ // Extra byte is reserved
+ buf := make([]byte, subSubTLVHdrLen+len(value))
+ p := 0
+ buf[p] = byte(s.Type)
+ p++
+ binary.BigEndian.PutUint16(buf[p:p+2], uint16(s.Length))
+ p += 2
+ copy(buf[p:], value)
+
+ return buf, nil
+}
+
+func (s *SubSubTLV) DecodeFromBytes(data []byte) ([]byte, error) {
+ if len(data) < prefixSIDtlvHdrLen {
+ return nil, malformedAttrListErr("decoding failed: Prefix SID Sub Sub TLV malformed")
+ }
+ s.Type = SubSubTLVType(data[0])
+ s.Length = binary.BigEndian.Uint16(data[1:3])
+
+ if len(data) < s.Len() {
+ return nil, malformedAttrListErr("decoding failed: Prefix SID Sub Sub TLV malformed")
+ }
+
+ return data[prefixSIDtlvHdrLen:s.Len()], nil
+}
+
+// SRv6SIDStructureSubSubTLV defines a structure of SRv6 SID Structure Sub Sub TLV (type 1) object
+// https://tools.ietf.org/html/draft-dawra-bess-srv6-services-02#section-2.1.2.1
+type SRv6SIDStructureSubSubTLV struct {
+ SubSubTLV
+ LocalBlockLength uint8 `json:"local_block_length,omitempty"`
+ LocatorNodeLength uint8 `json:"locator_node_length,omitempty"`
+ FunctionLength uint8 `json:"function_length,omitempty"`
+ ArgumentLength uint8 `json:"argument_length,omitempty"`
+ TranspositionLength uint8 `json:"transposition_length,omitempty"`
+ TranspositionOffset uint8 `json:"transposition_offset,omitempty"`
+}
+
+func (s *SRv6SIDStructureSubSubTLV) Len() int {
+ return int(s.Length) + subSubTLVHdrLen
+}
+
+func (s *SRv6SIDStructureSubSubTLV) Serialize() ([]byte, error) {
+ buf := make([]byte, s.Length)
+ p := 0
+ buf[p] = s.LocalBlockLength
+ p++
+ buf[p] = s.LocatorNodeLength
+ p++
+ buf[p] = s.FunctionLength
+ p++
+ buf[p] = s.ArgumentLength
+ p++
+ buf[p] = s.TranspositionLength
+ p++
+ buf[p] = s.TranspositionOffset
+
+ return s.SubSubTLV.Serialize(buf)
+}
+
+func (s *SRv6SIDStructureSubSubTLV) DecodeFromBytes(data []byte) error {
+ if len(data) < subSubTLVHdrLen {
+ return malformedAttrListErr("decoding failed: Prefix SID Sub Sub TLV malformed")
+ }
+ s.Type = SubSubTLVType(data[0])
+ s.Length = binary.BigEndian.Uint16(data[1:3])
+
+ s.LocalBlockLength = data[3]
+ s.LocatorNodeLength = data[4]
+ s.FunctionLength = data[5]
+ s.ArgumentLength = data[6]
+ s.TranspositionLength = data[7]
+ s.TranspositionOffset = data[8]
+
+ return nil
+}
+
+func (s *SRv6SIDStructureSubSubTLV) MarshalJSON() ([]byte, error) {
+ return nil, nil
+}
+
+func (s *SRv6SIDStructureSubSubTLV) String() string {
+ return ""
+}