.github
alerting
client
config
controller
core
docs
example
jsonpath
k8s
k8stest
metric
pattern
security
static
storage
vendor
cloud.google.com
github.com
golang.org
x
crypto
net
bpf
context
http
http2
icmp
dstunreach.go
echo.go
endpoint.go
extension.go
helper_posix.go
interface.go
ipv4.go
ipv6.go
listen_posix.go
listen_stub.go
message.go
messagebody.go
mpls.go
multipart.go
packettoobig.go
paramprob.go
sys_freebsd.go
timeexceeded.go
idna
internal
ipv4
ipv6
AUTHORS
CONTRIBUTORS
LICENSE
PATENTS
oauth2
sys
term
text
time
google.golang.org
gopkg.in
k8s.io
sigs.k8s.io
modules.txt
watchdog
.dockerignore
.gitattributes
.gitignore
Dockerfile
LICENSE.md
README.md
config.yaml
go.mod
go.sum
main.go
78 lines
1.9 KiB
Go
78 lines
1.9 KiB
Go
// Copyright 2015 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package icmp
|
|
|
|
import "encoding/binary"
|
|
|
|
// MPLSLabel represents an MPLS label stack entry.
|
|
type MPLSLabel struct {
|
|
Label int // label value
|
|
TC int // traffic class; formerly experimental use
|
|
S bool // bottom of stack
|
|
TTL int // time to live
|
|
}
|
|
|
|
const (
|
|
classMPLSLabelStack = 1
|
|
typeIncomingMPLSLabelStack = 1
|
|
)
|
|
|
|
// MPLSLabelStack represents an MPLS label stack.
|
|
type MPLSLabelStack struct {
|
|
Class int // extension object class number
|
|
Type int // extension object sub-type
|
|
Labels []MPLSLabel
|
|
}
|
|
|
|
// Len implements the Len method of Extension interface.
|
|
func (ls *MPLSLabelStack) Len(proto int) int {
|
|
return 4 + (4 * len(ls.Labels))
|
|
}
|
|
|
|
// Marshal implements the Marshal method of Extension interface.
|
|
func (ls *MPLSLabelStack) Marshal(proto int) ([]byte, error) {
|
|
b := make([]byte, ls.Len(proto))
|
|
if err := ls.marshal(proto, b); err != nil {
|
|
return nil, err
|
|
}
|
|
return b, nil
|
|
}
|
|
|
|
func (ls *MPLSLabelStack) marshal(proto int, b []byte) error {
|
|
l := ls.Len(proto)
|
|
binary.BigEndian.PutUint16(b[:2], uint16(l))
|
|
b[2], b[3] = classMPLSLabelStack, typeIncomingMPLSLabelStack
|
|
off := 4
|
|
for _, ll := range ls.Labels {
|
|
b[off], b[off+1], b[off+2] = byte(ll.Label>>12), byte(ll.Label>>4&0xff), byte(ll.Label<<4&0xf0)
|
|
b[off+2] |= byte(ll.TC << 1 & 0x0e)
|
|
if ll.S {
|
|
b[off+2] |= 0x1
|
|
}
|
|
b[off+3] = byte(ll.TTL)
|
|
off += 4
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func parseMPLSLabelStack(b []byte) (Extension, error) {
|
|
ls := &MPLSLabelStack{
|
|
Class: int(b[2]),
|
|
Type: int(b[3]),
|
|
}
|
|
for b = b[4:]; len(b) >= 4; b = b[4:] {
|
|
ll := MPLSLabel{
|
|
Label: int(b[0])<<12 | int(b[1])<<4 | int(b[2])>>4,
|
|
TC: int(b[2]&0x0e) >> 1,
|
|
TTL: int(b[3]),
|
|
}
|
|
if b[2]&0x1 != 0 {
|
|
ll.S = true
|
|
}
|
|
ls.Labels = append(ls.Labels, ll)
|
|
}
|
|
return ls, nil
|
|
}
|