Browse Source

Merge pull request #1 from hsheth2/master

Multi-platform support
Song Gao 9 years ago
parent
commit
ecf657aba3
5 changed files with 44 additions and 24 deletions
  1. 1 1
      README.md
  2. 2 20
      if.go
  3. 27 0
      syscalls_linux.go
  4. 11 0
      syscalls_other.go
  5. 3 3
      waterutil/doc.go

+ 1 - 1
README.md

@@ -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
 ```

+ 2 - 20
if.go

@@ -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;

+ 27 - 0
syscalls_linux.go

@@ -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 - 0
syscalls_other.go

@@ -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")
+}

+ 3 - 3
waterutil/doc.go

@@ -8,10 +8,10 @@ TAP - MAC Frame:
   +-----------------------------------------------------------------------------
   | Octet |00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|...
   +-----------------------------------------------------------------------------
-  | Field | MAC Destination |   MAC  Source   |EType| Payload        
+  | Field | MAC Destination |   MAC  Source   |EType| Payload
   +-----------------------------------------------------------------------------
 
-   Single-Tagged -- Octets [12,13] == {0x81, 0x00} 
+   Single-Tagged -- Octets [12,13] == {0x81, 0x00}
   +-----------------------------------------------------------------------------
   | Octet |00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|...
   +-----------------------------------------------------------------------------
@@ -22,7 +22,7 @@ TAP - MAC Frame:
   +-----------------------------------------------------------------------------
   | Octet |00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19|20|21|...
   +-----------------------------------------------------------------------------
-  | Field | MAC Destination |   MAC  Source   | Outer Tag | Inner Tag | Payload        
+  | Field | MAC Destination |   MAC  Source   | Outer Tag | Inner Tag | Payload
   +-----------------------------------------------------------------------------
 
 TUN - IPv4 Packet: