| // Copyright 2011 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. | 
 |  | 
 | // +build darwin dragonfly freebsd netbsd openbsd | 
 |  | 
 | package net | 
 |  | 
 | import ( | 
 | 	"os" | 
 | 	"runtime" | 
 | 	"syscall" | 
 | ) | 
 |  | 
 | func setDefaultSockopts(s, family, sotype int, ipv6only bool) error { | 
 | 	if runtime.GOOS == "dragonfly" && sotype != syscall.SOCK_RAW { | 
 | 		// On DragonFly BSD, we adjust the ephemeral port | 
 | 		// range because unlike other BSD systems its default | 
 | 		// port range doesn't conform to IANA recommendation | 
 | 		// as described in RFC 6056 and is pretty narrow. | 
 | 		switch family { | 
 | 		case syscall.AF_INET: | 
 | 			syscall.SetsockoptInt(s, syscall.IPPROTO_IP, syscall.IP_PORTRANGE, syscall.IP_PORTRANGE_HIGH) | 
 | 		case syscall.AF_INET6: | 
 | 			syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_PORTRANGE, syscall.IPV6_PORTRANGE_HIGH) | 
 | 		} | 
 | 	} | 
 | 	if supportsIPv4map() && family == syscall.AF_INET6 && sotype != syscall.SOCK_RAW { | 
 | 		// Allow both IP versions even if the OS default | 
 | 		// is otherwise. Note that some operating systems | 
 | 		// never admit this option. | 
 | 		syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, boolint(ipv6only)) | 
 | 	} | 
 | 	// Allow broadcast. | 
 | 	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1)) | 
 | } | 
 |  | 
 | func setDefaultListenerSockopts(s int) error { | 
 | 	// Allow reuse of recently-used addresses. | 
 | 	return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1)) | 
 | } | 
 |  | 
 | func setDefaultMulticastSockopts(s int) error { | 
 | 	// Allow multicast UDP and raw IP datagram sockets to listen | 
 | 	// concurrently across multiple listeners. | 
 | 	if err := syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEADDR, 1); err != nil { | 
 | 		return os.NewSyscallError("setsockopt", err) | 
 | 	} | 
 | 	// Allow reuse of recently-used ports. | 
 | 	// This option is supported only in descendants of 4.4BSD, | 
 | 	// to make an effective multicast application that requires | 
 | 	// quick draw possible. | 
 | 	if syscall.SO_REUSEPORT != 0 { | 
 | 		return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_REUSEPORT, 1)) | 
 | 	} | 
 | 	return nil | 
 | } |