1package nl
2
3import "encoding/binary"
4
5const (
6	MPLS_LS_LABEL_SHIFT = 12
7	MPLS_LS_S_SHIFT     = 8
8)
9
10func EncodeMPLSStack(labels ...int) []byte {
11	b := make([]byte, 4*len(labels))
12	for idx, label := range labels {
13		l := label << MPLS_LS_LABEL_SHIFT
14		if idx == len(labels)-1 {
15			l |= 1 << MPLS_LS_S_SHIFT
16		}
17		binary.BigEndian.PutUint32(b[idx*4:], uint32(l))
18	}
19	return b
20}
21
22func DecodeMPLSStack(buf []byte) []int {
23	if len(buf)%4 != 0 {
24		return nil
25	}
26	stack := make([]int, 0, len(buf)/4)
27	for len(buf) > 0 {
28		l := binary.BigEndian.Uint32(buf[:4])
29		buf = buf[4:]
30		stack = append(stack, int(l)>>MPLS_LS_LABEL_SHIFT)
31		if (l>>MPLS_LS_S_SHIFT)&1 > 0 {
32			break
33		}
34	}
35	return stack
36}
37