Merge pull request #1 from hsheth2/master

Multi-platform support
This commit is contained in:
Song Gao 2015-11-07 19:11:34 -06:00
commit ecf657aba3
5 changed files with 44 additions and 24 deletions

View file

@ -7,7 +7,7 @@
* exposes standard interfaces; plays well with standard packages like `io`, `bufio`, etc..
* does not handle memory management (allocating/destructing slice). It's up to user to decide how to deal with buffers; whether to use GC.
`water/waterutil` has some useful functions to interpret MAC farme headers and IP packet headers. It also contains some constants such as protocol numbers and ethernet frame types.
`water/waterutil` has some useful functions to interpret MAC frame headers and IP packet headers. It also contains some constants such as protocol numbers and ethernet frame types.
## Installation
```

22
if.go
View file

@ -15,32 +15,14 @@ type Interface struct {
// If ifName is empty, a default name (tap0, tap1, ... ) will be assigned.
// ifName should not exceed 16 bytes.
func NewTAP(ifName string) (ifce *Interface, err error) {
file, err := os.OpenFile("/dev/net/tun", os.O_RDWR, 0)
if err != nil {
return nil, err
}
name, err := createInterface(file.Fd(), ifName, cIFF_TAP|cIFF_NO_PI)
if err != nil {
return nil, err
}
ifce = &Interface{isTAP: true, file: file, name: name}
return
return newTAP(ifName)
}
// Create a new TUN interface whose name is ifName.
// If ifName is empty, a default name (tap0, tap1, ... ) will be assigned.
// ifName should not exceed 16 bytes.
func NewTUN(ifName string) (ifce *Interface, err error) {
file, err := os.OpenFile("/dev/net/tun", os.O_RDWR, 0)
if err != nil {
return nil, err
}
name, err := createInterface(file.Fd(), ifName, cIFF_TUN|cIFF_NO_PI)
if err != nil {
return nil, err
}
ifce = &Interface{isTAP: false, file: file, name: name}
return
return newTUN(ifName)
}
// Returns true if ifce is a TUN interface, otherwise returns false;

View file

@ -3,6 +3,7 @@
package water
import (
"os"
"strings"
"syscall"
"unsafe"
@ -20,6 +21,32 @@ type ifReq struct {
pad [0x28 - 0x10 - 2]byte
}
func newTAP(ifName string) (ifce *Interface, err error) {
file, err := os.OpenFile("/dev/net/tun", os.O_RDWR, 0)
if err != nil {
return nil, err
}
name, err := createInterface(file.Fd(), ifName, cIFF_TAP|cIFF_NO_PI)
if err != nil {
return nil, err
}
ifce = &Interface{isTAP: true, file: file, name: name}
return
}
func newTUN(ifName string) (ifce *Interface, err error) {
file, err := os.OpenFile("/dev/net/tun", os.O_RDWR, 0)
if err != nil {
return nil, err
}
name, err := createInterface(file.Fd(), ifName, cIFF_TUN|cIFF_NO_PI)
if err != nil {
return nil, err
}
ifce = &Interface{isTAP: false, file: file, name: name}
return
}
func createInterface(fd uintptr, ifName string, flags uint16) (createdIFName string, err error) {
var req ifReq
req.Flags = flags

11
syscalls_other.go Normal file
View file

@ -0,0 +1,11 @@
// +build !linux
package water
func newTAP(ifName string) (ifce *Interface, err error) {
panic("water: tap interface not implemented on this platform")
}
func newTUN(ifName string) (ifce *Interface, err error) {
panic("water: tap interface not implemented on this platform")
}