feat: 实现路由添加

This commit is contained in:
lynx
2023-08-04 13:02:58 +08:00
parent 4af09153bf
commit bd80dfc524
3 changed files with 71 additions and 0 deletions

1
core/route/route.go Normal file
View File

@@ -0,0 +1 @@
package route

56
core/route/route_linux.go Normal file
View 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
}

View 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
}