瀏覽代碼

icmp: add support for multi-part messages

ICMP extension structures allow a few existing ICMP error messages to
convey extra information for troubleshooting; especially the root cause
of why the original datagram could not be delivered.

This CL adds generic support for ICMP extension stuructures to
DstUnreach, TimeExceeded and ParamProb structs. Specific extensions such
as MPLS label-stack, interface and next-hop identification will be
inplemneted in separate followup CLs.

Change-Id: I90798c135bdf76b806e2dde2bdd57c2c11d7e7e9
Mikio Hara 11 年之前
父節點
當前提交
e3b9e70d93
共有 5 個文件被更改,包括 24 次插入4 次删除
  1. 2 1
      icmp/dstunreach.go
  2. 16 0
      icmp/extension.go
  3. 1 0
      icmp/message.go
  4. 3 2
      icmp/paramprob.go
  5. 2 1
      icmp/timeexceeded.go

+ 2 - 1
icmp/dstunreach.go

@@ -7,7 +7,8 @@ package icmp
 // A DstUnreach represents an ICMP destination unreachable message
 // A DstUnreach represents an ICMP destination unreachable message
 // body.
 // body.
 type DstUnreach struct {
 type DstUnreach struct {
-	Data []byte // data
+	Data       []byte      // data, known as original datagram field
+	Extensions []Extension // extensions
 }
 }
 
 
 // Len implements the Len method of MessageBody interface.
 // Len implements the Len method of MessageBody interface.

+ 16 - 0
icmp/extension.go

@@ -0,0 +1,16 @@
+// 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
+
+// An Extension represents an ICMP extension.
+type Extension interface {
+	// Len returns the length of ICMP extension.
+	Len() int
+
+	// Marshal returns the binary enconding of ICMP extension.
+	Marshal() ([]byte, error)
+}
+
+const extensionVersion = 2

+ 1 - 0
icmp/message.go

@@ -7,6 +7,7 @@
 // ICMPv4 and ICMPv6.
 // ICMPv4 and ICMPv6.
 //
 //
 // ICMPv4 and ICMPv6 are defined in RFC 792 and RFC 4443.
 // ICMPv4 and ICMPv6 are defined in RFC 792 and RFC 4443.
+// Multi-part message support for ICMP is defined in RFC 4884.
 package icmp // import "golang.org/x/net/icmp"
 package icmp // import "golang.org/x/net/icmp"
 
 
 import (
 import (

+ 3 - 2
icmp/paramprob.go

@@ -8,8 +8,9 @@ import "golang.org/x/net/internal/iana"
 
 
 // A ParamProb represents an ICMP parameter problem message body.
 // A ParamProb represents an ICMP parameter problem message body.
 type ParamProb struct {
 type ParamProb struct {
-	Pointer uintptr // offset within the data where the error was detected
-	Data    []byte  // data
+	Pointer    uintptr     // offset within the data where the error was detected
+	Data       []byte      // data, known as original datagram field
+	Extensions []Extension // extensions
 }
 }
 
 
 // Len implements the Len method of MessageBody interface.
 // Len implements the Len method of MessageBody interface.

+ 2 - 1
icmp/timeexceeded.go

@@ -6,7 +6,8 @@ package icmp
 
 
 // A TimeExceeded represents an ICMP time exceeded message body.
 // A TimeExceeded represents an ICMP time exceeded message body.
 type TimeExceeded struct {
 type TimeExceeded struct {
-	Data []byte // data
+	Data       []byte      // data, known as original datagram field
+	Extensions []Extension // extensions
 }
 }
 
 
 // Len implements the Len method of MessageBody interface.
 // Len implements the Len method of MessageBody interface.