mirror of
				https://github.com/yggdrasil-network/water.git
				synced 2025-11-04 03:05:10 +03:00 
			
		
		
		
	
						commit
						ecf657aba3
					
				
					 5 changed files with 44 additions and 24 deletions
				
			
		| 
						 | 
					@ -7,7 +7,7 @@
 | 
				
			||||||
* exposes standard interfaces; plays well with standard packages like `io`, `bufio`, etc..
 | 
					* 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.
 | 
					* 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
 | 
					## Installation
 | 
				
			||||||
```
 | 
					```
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										22
									
								
								if.go
									
										
									
									
									
								
							
							
						
						
									
										22
									
								
								if.go
									
										
									
									
									
								
							| 
						 | 
					@ -15,32 +15,14 @@ type Interface struct {
 | 
				
			||||||
// If ifName is empty, a default name (tap0, tap1, ... ) will be assigned.
 | 
					// If ifName is empty, a default name (tap0, tap1, ... ) will be assigned.
 | 
				
			||||||
// ifName should not exceed 16 bytes.
 | 
					// ifName should not exceed 16 bytes.
 | 
				
			||||||
func NewTAP(ifName string) (ifce *Interface, err error) {
 | 
					func NewTAP(ifName string) (ifce *Interface, err error) {
 | 
				
			||||||
	file, err := os.OpenFile("/dev/net/tun", os.O_RDWR, 0)
 | 
						return newTAP(ifName)
 | 
				
			||||||
	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
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Create a new TUN interface whose name is ifName.
 | 
					// Create a new TUN interface whose name is ifName.
 | 
				
			||||||
// If ifName is empty, a default name (tap0, tap1, ... ) will be assigned.
 | 
					// If ifName is empty, a default name (tap0, tap1, ... ) will be assigned.
 | 
				
			||||||
// ifName should not exceed 16 bytes.
 | 
					// ifName should not exceed 16 bytes.
 | 
				
			||||||
func NewTUN(ifName string) (ifce *Interface, err error) {
 | 
					func NewTUN(ifName string) (ifce *Interface, err error) {
 | 
				
			||||||
	file, err := os.OpenFile("/dev/net/tun", os.O_RDWR, 0)
 | 
						return newTUN(ifName)
 | 
				
			||||||
	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
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Returns true if ifce is a TUN interface, otherwise returns false;
 | 
					// Returns true if ifce is a TUN interface, otherwise returns false;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,6 +3,7 @@
 | 
				
			||||||
package water
 | 
					package water
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import (
 | 
					import (
 | 
				
			||||||
 | 
						"os"
 | 
				
			||||||
	"strings"
 | 
						"strings"
 | 
				
			||||||
	"syscall"
 | 
						"syscall"
 | 
				
			||||||
	"unsafe"
 | 
						"unsafe"
 | 
				
			||||||
| 
						 | 
					@ -20,6 +21,32 @@ type ifReq struct {
 | 
				
			||||||
	pad   [0x28 - 0x10 - 2]byte
 | 
						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) {
 | 
					func createInterface(fd uintptr, ifName string, flags uint16) (createdIFName string, err error) {
 | 
				
			||||||
	var req ifReq
 | 
						var req ifReq
 | 
				
			||||||
	req.Flags = flags
 | 
						req.Flags = flags
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										11
									
								
								syscalls_other.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								syscalls_other.go
									
										
									
									
									
										Normal 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")
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue