ipv6: retry ENOBUFS errors in TestPacketConnConcurrentReadWriteUnicast

This change is sheer speculation based on the failures observed in
golang/go#37319.

(A deadlock in the test prevented us from seeing the actual failure
mode of golang/go#50455 up until CL 376094, and it isn't obvious to me
that we should wait for another failure before trying a likely — and
otherwise harmless — fix.)

Fixes golang/go#50455.
(Maybe.)

Change-Id: I7483eb2243832d07cb1f815da196b3978a50c6b3
Reviewed-on: https://go-review.googlesource.com/c/net/+/376095
Trust: Bryan Mills <bcmills@google.com>
Run-TryBot: Bryan Mills <bcmills@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
diff --git a/ipv6/readwrite_test.go b/ipv6/readwrite_test.go
index 9d1ed88..d319632 100644
--- a/ipv6/readwrite_test.go
+++ b/ipv6/readwrite_test.go
@@ -12,6 +12,7 @@
 	"strings"
 	"sync"
 	"testing"
+	"time"
 
 	"golang.org/x/net/internal/iana"
 	"golang.org/x/net/ipv6"
@@ -440,12 +441,22 @@
 		if err := p.SetControlMessage(cf, toggle); err != nil {
 			fatalf("%v", err)
 		}
-		n, err := p.WriteTo(data, &cm, dst)
-		if err != nil {
-			fatalf("%v", err)
-		}
-		if n != len(data) {
-			fatalf("got %d; want %d", n, len(data))
+
+		backoff := time.Millisecond
+		for {
+			n, err := p.WriteTo(data, &cm, dst)
+			if err != nil {
+				if n == 0 && isENOBUFS(err) {
+					time.Sleep(backoff)
+					backoff *= 2
+					continue
+				}
+				fatalf("%v", err)
+			}
+			if n != len(data) {
+				fatalf("got %d; want %d", n, len(data))
+			}
+			break
 		}
 	}
 	batchWriter := func(toggle bool) {
@@ -468,15 +479,25 @@
 				Addr:    dst,
 			},
 		}
-		n, err := p.WriteBatch(ms, 0)
-		if err != nil {
-			fatalf("%v", err)
-		}
-		if n != len(ms) {
-			fatalf("got %d; want %d", n, len(ms))
-		}
-		if ms[0].N != len(data) {
-			fatalf("got %d; want %d", ms[0].N, len(data))
+
+		backoff := time.Millisecond
+		for {
+			n, err := p.WriteBatch(ms, 0)
+			if err != nil {
+				if n == 0 && isENOBUFS(err) {
+					time.Sleep(backoff)
+					backoff *= 2
+					continue
+				}
+				fatalf("%v", err)
+			}
+			if n != len(ms) {
+				fatalf("got %d; want %d", n, len(ms))
+			}
+			if ms[0].N != len(data) {
+				fatalf("got %d; want %d", ms[0].N, len(data))
+			}
+			break
 		}
 	}