aboutsummaryrefslogtreecommitdiffhomepage
path: root/vendor/golang.org/x/net/icmp/interface.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/golang.org/x/net/icmp/interface.go')
-rw-r--r--vendor/golang.org/x/net/icmp/interface.go100
1 files changed, 93 insertions, 7 deletions
diff --git a/vendor/golang.org/x/net/icmp/interface.go b/vendor/golang.org/x/net/icmp/interface.go
index 78b5b98..617f757 100644
--- a/vendor/golang.org/x/net/icmp/interface.go
+++ b/vendor/golang.org/x/net/icmp/interface.go
@@ -14,9 +14,6 @@ import (
const (
classInterfaceInfo = 2
-
- afiIPv4 = 1
- afiIPv6 = 2
)
const (
@@ -127,11 +124,11 @@ func (ifi *InterfaceInfo) parseIfIndex(b []byte) ([]byte, error) {
func (ifi *InterfaceInfo) marshalIPAddr(proto int, b []byte) []byte {
switch proto {
case iana.ProtocolICMP:
- binary.BigEndian.PutUint16(b[:2], uint16(afiIPv4))
+ binary.BigEndian.PutUint16(b[:2], uint16(iana.AddrFamilyIPv4))
copy(b[4:4+net.IPv4len], ifi.Addr.IP.To4())
b = b[4+net.IPv4len:]
case iana.ProtocolIPv6ICMP:
- binary.BigEndian.PutUint16(b[:2], uint16(afiIPv6))
+ binary.BigEndian.PutUint16(b[:2], uint16(iana.AddrFamilyIPv6))
copy(b[4:4+net.IPv6len], ifi.Addr.IP.To16())
b = b[4+net.IPv6len:]
}
@@ -145,14 +142,14 @@ func (ifi *InterfaceInfo) parseIPAddr(b []byte) ([]byte, error) {
afi := int(binary.BigEndian.Uint16(b[:2]))
b = b[4:]
switch afi {
- case afiIPv4:
+ case iana.AddrFamilyIPv4:
if len(b) < net.IPv4len {
return nil, errMessageTooShort
}
ifi.Addr.IP = make(net.IP, net.IPv4len)
copy(ifi.Addr.IP, b[:net.IPv4len])
b = b[net.IPv4len:]
- case afiIPv6:
+ case iana.AddrFamilyIPv6:
if len(b) < net.IPv6len {
return nil, errMessageTooShort
}
@@ -234,3 +231,92 @@ func parseInterfaceInfo(b []byte) (Extension, error) {
}
return ifi, nil
}
+
+const (
+ classInterfaceIdent = 3
+ typeInterfaceByName = 1
+ typeInterfaceByIndex = 2
+ typeInterfaceByAddress = 3
+)
+
+// An InterfaceIdent represents interface identification.
+type InterfaceIdent struct {
+ Class int // extension object class number
+ Type int // extension object sub-type
+ Name string // interface name
+ Index int // interface index
+ AFI int // address family identifier; see address family numbers in IANA registry
+ Addr []byte // address
+}
+
+// Len implements the Len method of Extension interface.
+func (ifi *InterfaceIdent) Len(_ int) int {
+ switch ifi.Type {
+ case typeInterfaceByName:
+ l := len(ifi.Name)
+ if l > 255 {
+ l = 255
+ }
+ return 4 + (l+3)&^3
+ case typeInterfaceByIndex:
+ return 4 + 8
+ case typeInterfaceByAddress:
+ return 4 + 4 + (len(ifi.Addr)+3)&^3
+ default:
+ return 4
+ }
+}
+
+// Marshal implements the Marshal method of Extension interface.
+func (ifi *InterfaceIdent) Marshal(proto int) ([]byte, error) {
+ b := make([]byte, ifi.Len(proto))
+ if err := ifi.marshal(proto, b); err != nil {
+ return nil, err
+ }
+ return b, nil
+}
+
+func (ifi *InterfaceIdent) marshal(proto int, b []byte) error {
+ l := ifi.Len(proto)
+ binary.BigEndian.PutUint16(b[:2], uint16(l))
+ b[2], b[3] = classInterfaceIdent, byte(ifi.Type)
+ switch ifi.Type {
+ case typeInterfaceByName:
+ copy(b[4:], ifi.Name)
+ case typeInterfaceByIndex:
+ binary.BigEndian.PutUint64(b[4:4+8], uint64(ifi.Index))
+ case typeInterfaceByAddress:
+ binary.BigEndian.PutUint16(b[4:4+2], uint16(ifi.AFI))
+ b[4+2] = byte(len(ifi.Addr))
+ copy(b[4+4:], ifi.Addr)
+ }
+ return nil
+}
+
+func parseInterfaceIdent(b []byte) (Extension, error) {
+ ifi := &InterfaceIdent{
+ Class: int(b[2]),
+ Type: int(b[3]),
+ }
+ switch ifi.Type {
+ case typeInterfaceByName:
+ ifi.Name = strings.Trim(string(b[4:]), string(0))
+ case typeInterfaceByIndex:
+ if len(b[4:]) < 8 {
+ return nil, errInvalidExtension
+ }
+ ifi.Index = int(binary.BigEndian.Uint64(b[4 : 4+8]))
+ case typeInterfaceByAddress:
+ if len(b[4:]) < 4 {
+ return nil, errInvalidExtension
+ }
+ ifi.AFI = int(binary.BigEndian.Uint16(b[4 : 4+2]))
+ l := int(b[4+2])
+ if len(b[4+4:]) < l {
+ return nil, errInvalidExtension
+ }
+ ifi.Addr = make([]byte, l)
+ copy(ifi.Addr, b[4+4:])
+ }
+ return ifi, nil
+}