mirror of
https://github.com/wlynxg/NetHive.git
synced 2025-09-26 19:11:14 +08:00
feat: 实现路由添加
This commit is contained in:
1
core/route/route.go
Normal file
1
core/route/route.go
Normal file
@@ -0,0 +1 @@
|
||||
package route
|
56
core/route/route_linux.go
Normal file
56
core/route/route_linux.go
Normal file
@@ -0,0 +1,56 @@
|
||||
package route
|
||||
|
||||
import (
|
||||
"NetHive/pkgs/system"
|
||||
"net"
|
||||
"net/netip"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
type RtEntry struct {
|
||||
_ uint64
|
||||
Dst syscall.RawSockaddrInet4
|
||||
Gateway syscall.RawSockaddrInet4
|
||||
GenMask syscall.RawSockaddrInet4
|
||||
Flags uint16
|
||||
_ uint16
|
||||
_ uint64
|
||||
Tos byte
|
||||
Class byte
|
||||
_ [3]uint16
|
||||
Metric int16
|
||||
Dev uintptr
|
||||
Mtu uint64
|
||||
Window uint64
|
||||
IRtt uint16
|
||||
}
|
||||
|
||||
func Add(dev string, target netip.Prefix) error {
|
||||
fd, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, 0)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer syscall.Close(fd)
|
||||
|
||||
_, cidr, err := net.ParseCIDR(target.String())
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
mask := cidr.Mask
|
||||
|
||||
rt := RtEntry{}
|
||||
rt.Dst = syscall.RawSockaddrInet4{Family: syscall.AF_INET, Addr: target.Addr().As4()}
|
||||
rt.GenMask = syscall.RawSockaddrInet4{Family: syscall.AF_INET, Addr: [4]byte{mask[0], mask[1], mask[2], mask[3]}}
|
||||
rt.Flags = syscall.RTF_UP
|
||||
devName := [syscall.IFNAMSIZ]byte{}
|
||||
copy(devName[:], dev)
|
||||
rt.Dev = uintptr(unsafe.Pointer(&devName))
|
||||
rtBytes := *(*[unsafe.Sizeof(rt)]byte)(unsafe.Pointer(&rt))
|
||||
|
||||
err = system.Ioctl(uintptr(fd), syscall.SIOCADDRT, uintptr(unsafe.Pointer(&rtBytes[0])))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
14
pkgs/system/system_linux.go
Normal file
14
pkgs/system/system_linux.go
Normal file
@@ -0,0 +1,14 @@
|
||||
package system
|
||||
|
||||
import (
|
||||
"os"
|
||||
"syscall"
|
||||
)
|
||||
|
||||
func Ioctl(fd uintptr, request uintptr, argp uintptr) error {
|
||||
_, _, err := syscall.Syscall(syscall.SYS_IOCTL, fd, request, argp)
|
||||
if err != 0 {
|
||||
return os.NewSyscallError("ioctl: ", err)
|
||||
}
|
||||
return nil
|
||||
}
|
Reference in New Issue
Block a user