|
|
@@ -0,0 +1,32 @@
|
|
|
+// 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 nettest
|
|
|
+
|
|
|
+import (
|
|
|
+ "fmt"
|
|
|
+ "runtime"
|
|
|
+ "syscall"
|
|
|
+)
|
|
|
+
|
|
|
+// SupportsRawIPSocket reports whether the platform supports raw IP
|
|
|
+// sockets.
|
|
|
+func SupportsRawIPSocket() (string, bool) {
|
|
|
+ // From http://msdn.microsoft.com/en-us/library/windows/desktop/ms740548.aspx:
|
|
|
+ // Note: To use a socket of type SOCK_RAW requires administrative privileges.
|
|
|
+ // Users running Winsock applications that use raw sockets must be a member of
|
|
|
+ // the Administrators group on the local computer, otherwise raw socket calls
|
|
|
+ // will fail with an error code of WSAEACCES. On Windows Vista and later, access
|
|
|
+ // for raw sockets is enforced at socket creation. In earlier versions of Windows,
|
|
|
+ // access for raw sockets is enforced during other socket operations.
|
|
|
+ s, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_RAW, 0)
|
|
|
+ if err == syscall.WSAEACCES {
|
|
|
+ return fmt.Sprintf("no access to raw socket allowed on %s", runtime.GOOS), false
|
|
|
+ }
|
|
|
+ if err != nil {
|
|
|
+ return err.Error(), false
|
|
|
+ }
|
|
|
+ syscall.Closesocket(s)
|
|
|
+ return "", true
|
|
|
+}
|