icmp: fix InterfaceIdent.Index handling

RFC 7223, Section 3 defines 32 bits for if-index.
RFC 8335, Section 2.1 defines
"If the Interface Identification Object identifies the probed
interface by index, the length is equal to 8 and the payload contains
the if-index [RFC7223]."
The object should be comprised of a 4-byte object header and a 4-byte interface index.

Fixes golang/go#28530

Change-Id: Ib3ac729b7ec738a90a8c76ef984da0d5b28fa9c9
GitHub-Last-Rev: eba6714ed4c7af61e89f6e54d6a7544c570acebb
GitHub-Pull-Request: golang/net#23
Reviewed-on: https://go-review.googlesource.com/c/146637
Run-TryBot: Mikio Hara <mikioh.public.networking@gmail.com>
Reviewed-by: Mikio Hara <mikioh.public.networking@gmail.com>
diff --git a/icmp/extension_test.go b/icmp/extension_test.go
index a7669da..ff51309 100644
--- a/icmp/extension_test.go
+++ b/icmp/extension_test.go
@@ -277,8 +277,7 @@
 					0x20, 0x00, 0x00, 0x00,
 				},
 				obj: []byte{
-					0x00, 0x0c, 0x03, 0x02,
-					0x00, 0x00, 0x00, 0x00,
+					0x00, 0x08, 0x03, 0x02,
 					0x00, 0x00, 0x03, 0x8f,
 				},
 				ext: &InterfaceIdent{
diff --git a/icmp/interface.go b/icmp/interface.go
index 617f757..ae14818 100644
--- a/icmp/interface.go
+++ b/icmp/interface.go
@@ -259,7 +259,7 @@
 		}
 		return 4 + (l+3)&^3
 	case typeInterfaceByIndex:
-		return 4 + 8
+		return 4 + 4
 	case typeInterfaceByAddress:
 		return 4 + 4 + (len(ifi.Addr)+3)&^3
 	default:
@@ -284,7 +284,7 @@
 	case typeInterfaceByName:
 		copy(b[4:], ifi.Name)
 	case typeInterfaceByIndex:
-		binary.BigEndian.PutUint64(b[4:4+8], uint64(ifi.Index))
+		binary.BigEndian.PutUint32(b[4:4+4], uint32(ifi.Index))
 	case typeInterfaceByAddress:
 		binary.BigEndian.PutUint16(b[4:4+2], uint16(ifi.AFI))
 		b[4+2] = byte(len(ifi.Addr))
@@ -302,10 +302,10 @@
 	case typeInterfaceByName:
 		ifi.Name = strings.Trim(string(b[4:]), string(0))
 	case typeInterfaceByIndex:
-		if len(b[4:]) < 8 {
+		if len(b[4:]) < 4 {
 			return nil, errInvalidExtension
 		}
-		ifi.Index = int(binary.BigEndian.Uint64(b[4 : 4+8]))
+		ifi.Index = int(binary.BigEndian.Uint32(b[4 : 4+4]))
 	case typeInterfaceByAddress:
 		if len(b[4:]) < 4 {
 			return nil, errInvalidExtension