mirror of
https://github.com/openp2p-cn/openp2p.git
synced 2025-09-27 21:12:24 +08:00
89 lines
2.0 KiB
Go
89 lines
2.0 KiB
Go
package openp2p
|
|
|
|
import (
|
|
"fmt"
|
|
"net"
|
|
"os/exec"
|
|
"strings"
|
|
|
|
"github.com/openp2p-cn/wireguard-go/tun"
|
|
)
|
|
|
|
const (
|
|
tunIfaceName = "utun"
|
|
PIHeaderSize = 4 // utun has no IFF_NO_PI
|
|
)
|
|
|
|
func (t *optun) Start(localAddr string, detail *SDWANInfo) error {
|
|
var err error
|
|
t.tunName = tunIfaceName
|
|
t.dev, err = tun.CreateTUN(t.tunName, 1420)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
t.tunName, _ = t.dev.Name()
|
|
return nil
|
|
}
|
|
|
|
func (t *optun) Read(bufs [][]byte, sizes []int, offset int) (n int, err error) {
|
|
return t.dev.Read(bufs, sizes, offset)
|
|
}
|
|
|
|
func (t *optun) Write(bufs [][]byte, offset int) (int, error) {
|
|
return t.dev.Write(bufs, offset)
|
|
}
|
|
|
|
func setTunAddr(ifname, localAddr, remoteAddr string, wintun interface{}) error {
|
|
li, _, err := net.ParseCIDR(localAddr)
|
|
if err != nil {
|
|
return fmt.Errorf("parse local addr fail:%s", err)
|
|
}
|
|
ri, _, err := net.ParseCIDR(remoteAddr)
|
|
if err != nil {
|
|
return fmt.Errorf("parse remote addr fail:%s", err)
|
|
}
|
|
err = exec.Command("ifconfig", ifname, "inet", li.String(), ri.String(), "up").Run()
|
|
return err
|
|
}
|
|
|
|
func addRoute(dst, gw, ifname string) error {
|
|
err := exec.Command("route", "add", dst, gw).Run()
|
|
return err
|
|
}
|
|
|
|
func delRoute(dst, gw string) error {
|
|
err := exec.Command("route", "delete", dst, "-gateway", gw).Run()
|
|
return err
|
|
}
|
|
func delRoutesByGateway(gateway string) error {
|
|
cmd := exec.Command("netstat", "-rn")
|
|
output, err := cmd.Output()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
lines := strings.Split(string(output), "\n")
|
|
for _, line := range lines {
|
|
if !strings.Contains(line, gateway) {
|
|
continue
|
|
}
|
|
fields := strings.Fields(line)
|
|
if len(fields) >= 2 {
|
|
cmd := exec.Command("route", "delete", fields[0], gateway)
|
|
err := cmd.Run()
|
|
if err != nil {
|
|
gLog.Printf(LvERROR, "Delete route %s error:%s", fields[0], err)
|
|
continue
|
|
}
|
|
gLog.Printf(LvINFO, "Delete route ok: %s %s\n", fields[0], gateway)
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
func addTunAddr(localAddr, remoteAddr string) error {
|
|
return nil
|
|
}
|
|
func delTunAddr(localAddr, remoteAddr string) error {
|
|
return nil
|
|
}
|