-
Notifications
You must be signed in to change notification settings - Fork 296
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add early FreeBSD, NetBSD, OpenBSD support #37
base: master
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
// +build openbsd freebsd netbsd | ||
|
||
package water | ||
|
||
// PlatformSpecificParams defines parameters in Config that are specific to | ||
// Linux. A zero-value of such type is valid, yielding an interface | ||
// with OS defined name. | ||
type PlatformSpecificParams struct { | ||
// Name is the name to be set for the interface to be created. This overrides | ||
// the default name assigned by OS such as tap0 or tun0. A zero-value of this | ||
// field, i.e. an empty string, indicates that the default name should be | ||
// used. | ||
Name string | ||
} | ||
|
||
func defaultPlatformSpecificParams() PlatformSpecificParams { | ||
return PlatformSpecificParams{ | ||
Name: "/dev/tap0", | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
// +build !linux,!darwin,!windows | ||
// +build !linux,!darwin,!windows,!freebsd,!netbsd,!openbsd | ||
|
||
package water | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
// +build openbsd freebsd netbsd | ||
|
||
package water | ||
|
||
import ( | ||
"errors" | ||
"os" | ||
) | ||
|
||
func openDev(config Config) (ifce *Interface, err error) { | ||
switch config.Name[:8] { | ||
case "/dev/tap": | ||
return newTAP(config) | ||
case "/dev/tun": | ||
return newTUN(config) | ||
default: | ||
return nil, errors.New("unrecognized driver") | ||
} | ||
} | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Do these fields need to be exported? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Actually it seems lines above this are not used at all. I was imagining you needed to make some syscalls to setup the tun/tap device. In your use case, do you call external commands to set them up? I think if that's the preferred use case, you wouldn't need this package at all. You can just use I see there the second commit removed a ioctl function. Did you attempt to implement it first and removed it? I think it'd be nice to have syscalls handled in Go! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I do appear to have left this definition in by accident, as this would be handled elsewhere in my code (with the help of I did attempt to implement an There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
I think all three platforms that this package has support for already handle syscalls properly. They might be structured in different ways because of different underlying designs of the OS APIs, but the goal is a user of the package doesn't need to make syscalls before or after creating the interface using this package. I imagine the OpenBSD version could be similar to |
||
|
||
func newTAP(config Config) (ifce *Interface, err error) { | ||
if config.Name[:8] != "/dev/tap" { | ||
panic("TUN/TAP name must be in format /dev/tunX or /dev/tapX") | ||
} | ||
|
||
file, err := os.OpenFile(config.Name, os.O_RDWR, 0) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
ifce = &Interface{isTAP: true, ReadWriteCloser: file, name: config.Name[5:]} | ||
return | ||
} | ||
|
||
func newTUN(config Config) (ifce *Interface, err error) { | ||
if config.Name[:8] != "/dev/tun" { | ||
panic("TUN/TAP name must be in format /dev/tunX or /dev/tapX") | ||
} | ||
|
||
file, err := os.OpenFile(config.Name, os.O_RDWR, 0) | ||
if err != nil { | ||
return nil, err | ||
} | ||
|
||
ifce = &Interface{isTAP: false, ReadWriteCloser: file, name: config.Name[5:]} | ||
return | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,4 +1,4 @@ | ||
// +build !linux,!darwin,!windows | ||
// +build !linux,!darwin,!windows,!freebsd,!netbsd,!openbsd | ||
|
||
package water | ||
|
||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
s/Linux/BSD