feat: add Go SDK package (REST client + VL1 agent + TAP device)
This commit is contained in:
75
sdk/tap_linux.go
Normal file
75
sdk/tap_linux.go
Normal file
@@ -0,0 +1,75 @@
|
||||
//go:build linux
|
||||
|
||||
package sdk
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
type tapInterface struct {
|
||||
Name string
|
||||
MTU int
|
||||
fd int
|
||||
}
|
||||
|
||||
func openTap(name string, mtu int) (*tapInterface, error) {
|
||||
fd, err := syscall.Open("/dev/net/tun", syscall.O_RDWR, 0)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("open /dev/net/tun: %w", err)
|
||||
}
|
||||
var ifr struct {
|
||||
name [16]byte
|
||||
flags uint16
|
||||
}
|
||||
copy(ifr.name[:], []byte(name))
|
||||
ifr.flags = 0x0002 | 0x1000 // IFF_TAP | IFF_NO_PI
|
||||
if _, _, errno := syscall.Syscall(syscall.SYS_IOCTL, uintptr(fd), 0x400454ca, uintptr(unsafe.Pointer(&ifr))); errno != 0 {
|
||||
syscall.Close(fd)
|
||||
return nil, fmt.Errorf("TUNSETIFF: %w", errno)
|
||||
}
|
||||
devName := string(ifr.name[:])
|
||||
if idx := indexOfZero(devName); idx >= 0 {
|
||||
devName = devName[:idx]
|
||||
}
|
||||
ti := &tapInterface{Name: devName, MTU: mtu, fd: fd}
|
||||
|
||||
// Set MTU via socket ioctl
|
||||
s, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, 0)
|
||||
if err == nil {
|
||||
defer syscall.Close(s)
|
||||
var mtuReq struct {
|
||||
name [16]byte
|
||||
mtu int32
|
||||
}
|
||||
copy(mtuReq.name[:], []byte(devName))
|
||||
mtuReq.mtu = int32(mtu)
|
||||
syscall.Syscall(syscall.SYS_IOCTL, uintptr(s), 0x400c4a52, uintptr(unsafe.Pointer(&mtuReq))) // SIOCSIFMTU
|
||||
}
|
||||
return ti, nil
|
||||
}
|
||||
|
||||
func (ti *tapInterface) Read(buf []byte) (int, error) {
|
||||
return syscall.Read(ti.fd, buf)
|
||||
}
|
||||
|
||||
func (ti *tapInterface) Write(buf []byte) error {
|
||||
_, err := syscall.Write(ti.fd, buf)
|
||||
return err
|
||||
}
|
||||
|
||||
func (ti *tapInterface) Close() error {
|
||||
return syscall.Close(ti.fd)
|
||||
}
|
||||
|
||||
func indexOfZero(s string) int {
|
||||
for i, c := range []byte(s) {
|
||||
if c == 0 {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user