diff --git a/pkg/access/access_darwin.go b/pkg/access/access_darwin.go index 1eccbc9..01352d8 100755 --- a/pkg/access/access_darwin.go +++ b/pkg/access/access_darwin.go @@ -10,8 +10,9 @@ import ( type Access struct { MixAccess // private - brName string - addr string + brName string + addr string + gateway string } func NewAccess(config *config.Access) *Access { @@ -32,46 +33,51 @@ func (p *Access) Initialize() { func (p *Access) routeAdd(prefix string) ([]byte, error) { network.RouteDel("", prefix, "") - out, err := network.RouteAdd(p.IfName(), prefix, "") + out, err := network.RouteAdd("", prefix, p.gateway) return out, err } -func (p *Access) AddAddr(ipStr string) error { - if ipStr == "" { +func (p *Access) AddAddr(addr, gateway string) error { + if addr == "" { return nil } // add Access-to-Access - ips := strings.SplitN(ipStr, "/", 2) - out, err := network.AddrAdd(p.IfName(), ips[0], ips[0]) + ips := strings.SplitN(addr, "/", 2) + if gateway == "" { + gateway = ips[0] + } + out, err := network.AddrAdd(p.IfName(), ips[0], gateway) if err != nil { p.out.Warn("Access.AddAddr: %s, %s", err, out) return err } - p.out.Info("Access.AddAddr: %s", ipStr) + p.out.Info("Access.AddAddr: %s", addr) + + p.addr = addr + p.gateway = gateway // add directly route. - out, err = p.routeAdd(ipStr) + out, err = p.routeAdd(addr) if err != nil { p.out.Warn("Access.AddAddr: %s, %s", err, out) } - p.AddRoute() - p.addr = ipStr + p.AddRoute() return nil } -func (p *Access) DelAddr(ipStr string) error { +func (p *Access) DelAddr(addr string) error { // delete directly route. - out, err := network.RouteDel(p.IfName(), ipStr, "") + out, err := network.RouteDel(p.IfName(), addr, "") if err != nil { p.out.Warn("Access.DelAddr: %s, %s", err, out) } - p.out.Info("Access.DelAddr: route %s via %s", ipStr, p.IfName()) + p.out.Info("Access.DelAddr: route %s via %s", addr, p.IfName()) // delete Access-to-Access - ip4 := strings.SplitN(ipStr, "/", 2)[0] + ip4 := strings.SplitN(addr, "/", 2)[0] out, err = network.AddrDel(p.IfName(), ip4) if err != nil { p.out.Warn("Access.DelAddr: %s, %s", err, out) diff --git a/pkg/access/access_linux.go b/pkg/access/access_linux.go index e146e08..358fbba 100755 --- a/pkg/access/access_linux.go +++ b/pkg/access/access_linux.go @@ -42,30 +42,30 @@ func (p *Access) Initialize() { p.MixAccess.Initialize() } -func (p *Access) DelAddr(ipStr string) error { - if p.link == nil || ipStr == "" { +func (p *Access) DelAddr(addr string) error { + if p.link == nil || addr == "" { return nil } - ipAddr, err := netlink.ParseAddr(ipStr) + ipAddr, err := netlink.ParseAddr(addr) if err != nil { - p.out.Error("Access.AddAddr.ParseCIDR %s: %s", ipStr, err) + p.out.Error("Access.AddAddr.ParseCIDR %s: %s", addr, err) return err } if err := netlink.AddrDel(p.link, ipAddr); err != nil { p.out.Warn("Access.DelAddr.UnsetLinkIp: %s", err) } - p.out.Info("Access.DelAddr: %s", ipStr) + p.out.Info("Access.DelAddr: %s", addr) p.addr = "" return nil } -func (p *Access) AddAddr(ipStr string) error { - if ipStr == "" || p.link == nil { +func (p *Access) AddAddr(addr, gateway string) error { + if addr == "" || p.link == nil { return nil } - ipAddr, err := netlink.ParseAddr(ipStr) + ipAddr, err := netlink.ParseAddr(addr) if err != nil { - p.out.Error("Access.AddAddr.ParseCIDR %s: %s", ipStr, err) + p.out.Error("Access.AddAddr.ParseCIDR %s: %s", addr, err) return err } if err := netlink.AddrAdd(p.link, ipAddr); err != nil { @@ -73,11 +73,11 @@ func (p *Access) AddAddr(ipStr string) error { return err } - p.out.Info("Access.AddAddr: %s", ipStr) + p.addr = addr + p.out.Info("Access.AddAddr: %s", addr) p.AddRoute() - p.addr = ipStr return nil } diff --git a/pkg/access/access_others.go b/pkg/access/access_others.go index 4b92d19..4a8d95a 100644 --- a/pkg/access/access_others.go +++ b/pkg/access/access_others.go @@ -4,17 +4,10 @@ package access import "github.com/luscis/openlan/pkg/config" -type Point struct { +type Access struct { + MixAccess } -func NewPoint(config *config.Point) *Point { +func NewAccess(config *config.Access) *Access { return nil } - -func (p *Point) Initialize() { - -} - -func (p *Point) Start() { - -} diff --git a/pkg/access/access_windows.go b/pkg/access/access_windows.go index 23599a5..99e3cf9 100755 --- a/pkg/access/access_windows.go +++ b/pkg/access/access_windows.go @@ -49,8 +49,8 @@ func (p *Access) Trim(out []byte) string { return strings.TrimSpace(string(out)) } -func (p *Access) AddAddr(ipStr string) error { - if ipStr == "" { +func (p *Access) AddAddr(addr, gateway string) error { + if addr == "" { return nil } addrExisted := network.AddrShow(p.IfName()) @@ -59,13 +59,13 @@ func (p *Access) AddAddr(ipStr string) error { _, _ = network.AddrDel(p.IfName(), addr) } } - out, err := network.AddrAdd(p.IfName(), ipStr) + out, err := network.AddrAdd(p.IfName(), addr) if err != nil { p.out.Warn("Access.AddAddr: %s, %s", err, p.Trim(out)) return err } - p.out.Info("Access.AddAddr: %s", ipStr) - p.addr = ipStr + p.out.Info("Access.AddAddr: %s", addr) + p.addr = addr return nil } diff --git a/pkg/access/worker.go b/pkg/access/worker.go index 1081455..f8f2e22 100755 --- a/pkg/access/worker.go +++ b/pkg/access/worker.go @@ -68,7 +68,7 @@ func NewEvent(newType, reason string) *WorkerEvent { } type WorkerListener struct { - AddAddr func(ipStr string) error + AddAddr func(ipStr, gateway string) error DelAddr func(ipStr string) error OnTap func(w *TapWorker) error AddRoutes func(routes []*models.Route) error @@ -337,7 +337,7 @@ func (w *Worker) OnIpAddr(s *SocketWorker, n *models.Network) error { ipStr := fmt.Sprintf("%s/%d", n.Address, prefix) w.tapWorker.OnIpAddr(ipStr) if w.listener.AddAddr != nil { - _ = w.listener.AddAddr(ipStr) + _ = w.listener.AddAddr(ipStr, n.Gateway) } if n.Gateway != "" && runtime.GOOS == "darwin" { @@ -375,7 +375,7 @@ func (w *Worker) OnSuccess(s *SocketWorker) error { if !w.cfg.RequestAddr { w.out.Info("SocketWorker.AddAddr: notAllowed") } else if w.listener.AddAddr != nil { - _ = w.listener.AddAddr(w.ifAddr) + _ = w.listener.AddAddr(w.ifAddr, "") } return nil }