1 // Copyright 2016 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build darwin dragonfly freebsd netbsd openbsd 6 7 package nettest 8 9 import ( 10 "runtime" 11 "strconv" 12 "strings" 13 "syscall" 14 ) 15 16 var darwinVersion int 17 18 func init() { 19 if runtime.GOOS == "darwin" { 20 // See http://support.apple.com/kb/HT1633. 21 s, err := syscall.Sysctl("kern.osrelease") 22 if err != nil { 23 return 24 } 25 ss := strings.Split(s, ".") 26 if len(ss) == 0 { 27 return 28 } 29 darwinVersion, _ = strconv.Atoi(ss[0]) 30 } 31 } 32 33 func supportsIPv6MulticastDeliveryOnLoopback() bool { 34 switch runtime.GOOS { 35 case "freebsd": 36 // See http://www.freebsd.org/cgi/query-pr.cgi?pr=180065. 37 // Even after the fix, it looks like the latest 38 // kernels don't deliver link-local scoped multicast 39 // packets correctly. 40 return false 41 case "darwin": 42 return !causesIPv6Crash() 43 default: 44 return true 45 } 46 } 47 48 func causesIPv6Crash() bool { 49 // We see some kernel crash when running IPv6 with IP-level 50 // options on Darwin kernel version 12 or below. 51 // See golang.org/issues/17015. 52 return darwinVersion < 13 53 } 54