mirror of
https://github.com/yggdrasil-network/water.git
synced 2025-05-19 16:35:10 +03:00
initial commit
This commit is contained in:
parent
a9977e0a62
commit
4a028c3fe3
7 changed files with 377 additions and 0 deletions
71
if.go
Normal file
71
if.go
Normal file
|
@ -0,0 +1,71 @@
|
|||
package water
|
||||
|
||||
import (
|
||||
"os"
|
||||
)
|
||||
|
||||
// Interface is a TUN/TAP interface.
|
||||
type Interface struct {
|
||||
isTAP bool
|
||||
file *os.File
|
||||
name string
|
||||
}
|
||||
|
||||
// Create a new TAP interface whose name is ifName.
|
||||
// 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
|
||||
}
|
||||
|
||||
// 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
|
||||
}
|
||||
|
||||
// Returns true if ifce is a TUN interface, otherwise returns false;
|
||||
func (ifce *Interface) IsTUN() bool {
|
||||
return !ifce.isTAP
|
||||
}
|
||||
|
||||
// Returns true if ifce is a TAP interface, otherwise returns false;
|
||||
func (ifce *Interface) IsTAP() bool {
|
||||
return ifce.isTAP
|
||||
}
|
||||
|
||||
// Returns the interface name of ifce, e.g. tun0, tap1, etc..
|
||||
func (ifce *Interface) Name() string {
|
||||
return ifce.name
|
||||
}
|
||||
|
||||
// Implement io.Writer interface.
|
||||
func (ifce *Interface) Write(p []byte) (n int, err error) {
|
||||
n, err = ifce.file.Write(p)
|
||||
return
|
||||
}
|
||||
|
||||
// Implement io.Reader interface.
|
||||
func (ifce *Interface) Read(p []byte) (n int, err error) {
|
||||
n, err = ifce.file.Read(p)
|
||||
return
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue