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 }