12345678910111213141516171819202122232425262728293031323334353637 |
- package nl
- import "encoding/binary"
- const (
- MPLS_LS_LABEL_SHIFT = 12
- MPLS_LS_S_SHIFT = 8
- )
- func EncodeMPLSStack(labels ...int) []byte {
- b := make([]byte, 4*len(labels))
- for idx, label := range labels {
- l := label << MPLS_LS_LABEL_SHIFT
- if idx == len(labels)-1 {
- l |= 1 << MPLS_LS_S_SHIFT
- }
- binary.BigEndian.PutUint32(b[idx*4:], uint32(l))
- }
- return b
- }
- func DecodeMPLSStack(buf []byte) []int {
- if len(buf)%4 != 0 {
- return nil
- }
- stack := make([]int, 0, len(buf)/4)
- for len(buf) > 0 {
- l := binary.BigEndian.Uint32(buf[:4])
- buf = buf[4:]
- stack = append(stack, int(l)>>MPLS_LS_LABEL_SHIFT)
- if (l>>MPLS_LS_S_SHIFT)&1 > 0 {
- break
- }
- }
- return stack
- }
|