mirror of
https://github.com/luscis/openlan.git
synced 2025-10-06 09:06:54 +08:00
fea: access for ceci.
This commit is contained in:
101
pkg/switch/router_linux.go
Executable file
101
pkg/switch/router_linux.go
Executable file
@@ -0,0 +1,101 @@
|
||||
package cswitch
|
||||
|
||||
import (
|
||||
"github.com/luscis/openlan/pkg/api"
|
||||
co "github.com/luscis/openlan/pkg/config"
|
||||
nl "github.com/vishvananda/netlink"
|
||||
)
|
||||
|
||||
type RouterWorker struct {
|
||||
*WorkerImpl
|
||||
spec *co.RouterSpecifies
|
||||
}
|
||||
|
||||
func NewRouterWorker(c *co.Network) *RouterWorker {
|
||||
w := &RouterWorker{
|
||||
WorkerImpl: NewWorkerApi(c),
|
||||
}
|
||||
w.spec, _ = c.Specifies.(*co.RouterSpecifies)
|
||||
return w
|
||||
}
|
||||
|
||||
func (w *RouterWorker) Initialize() {
|
||||
w.WorkerImpl.Initialize()
|
||||
w.Forward()
|
||||
}
|
||||
|
||||
func (w *RouterWorker) Forward() {
|
||||
spec := w.spec
|
||||
// Enable MASQUERADE, and FORWARD it.
|
||||
w.out.Debug("RouterWorker.Forward %v", w.cfg)
|
||||
for _, sub := range spec.Subnets {
|
||||
if sub.CIDR == "" {
|
||||
continue
|
||||
}
|
||||
w.setR.Add(sub.CIDR)
|
||||
}
|
||||
w.toRelated(spec.Link, "Accept related")
|
||||
w.toForward_s(spec.Link, w.setR.Name, "", "From route")
|
||||
w.toMasq_s(w.setR.Name, "", "To Masq")
|
||||
}
|
||||
|
||||
func (w *RouterWorker) addAddress() error {
|
||||
spec := w.spec
|
||||
if spec.Loopback == "" {
|
||||
return nil
|
||||
}
|
||||
link, err := nl.LinkByName("lo")
|
||||
if err != nil {
|
||||
w.out.Warn("addAddress: %s", err)
|
||||
return err
|
||||
}
|
||||
addr, err := nl.ParseAddr(spec.Loopback)
|
||||
if err != nil {
|
||||
w.out.Warn("addAddress: %s", err)
|
||||
return err
|
||||
}
|
||||
if err := nl.AddrAdd(link, addr); err != nil {
|
||||
w.out.Warn("addAddress: %s", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w *RouterWorker) Start(v api.Switcher) {
|
||||
w.uuid = v.UUID()
|
||||
w.WorkerImpl.Start(v)
|
||||
w.addAddress()
|
||||
}
|
||||
|
||||
func (w *RouterWorker) delAddress() error {
|
||||
spec := w.spec
|
||||
if spec.Loopback == "" {
|
||||
return nil
|
||||
}
|
||||
link, err := nl.LinkByName("lo")
|
||||
if err != nil {
|
||||
w.out.Warn("delAddress: %s", err)
|
||||
return err
|
||||
}
|
||||
addr, err := nl.ParseAddr(spec.Loopback)
|
||||
if err != nil {
|
||||
w.out.Warn("delAddress: %s", err)
|
||||
return err
|
||||
}
|
||||
if err := nl.AddrDel(link, addr); err != nil {
|
||||
w.out.Warn("delAddress: %s", err)
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (w *RouterWorker) Stop() {
|
||||
w.delAddress()
|
||||
w.WorkerImpl.Stop()
|
||||
}
|
||||
|
||||
func (w *RouterWorker) Reload(v api.Switcher) {
|
||||
w.Stop()
|
||||
w.Initialize()
|
||||
w.Start(v)
|
||||
}
|
Reference in New Issue
Block a user