refactor: add NewDialer and NewListener

This commit is contained in:
邹颖玖
2021-11-20 21:57:10 +08:00
parent 467369f4de
commit 38f5cc19c3
5 changed files with 77 additions and 44 deletions

View File

@@ -9,16 +9,14 @@ import (
type Forward struct { type Forward struct {
listener transport.Listener listener transport.Listener
dialer transport.Dialer
routeTable *RouteTable routeTable *RouteTable
mempool sync.Pool mempool sync.Pool
} }
func NewForward(listener transport.Listener, dialer transport.Dialer) *Forward { func NewForward(listener transport.Listener, routeTable *RouteTable) *Forward {
return &Forward{ return &Forward{
listener: listener, listener: listener,
dialer: dialer, routeTable: routeTable,
routeTable: NewRouteTable(),
mempool: sync.Pool{ mempool: sync.Pool{
New: func() interface{} { New: func() interface{} {
return make([]byte, 1024*4) return make([]byte, 1024*4)

View File

@@ -4,9 +4,7 @@ import (
"flag" "flag"
"fmt" "fmt"
"github.com/ICKelin/gtun/internal/logs" "github.com/ICKelin/gtun/internal/logs"
"github.com/ICKelin/gtun/transport" "github.com/ICKelin/gtun/transport/transport_api"
"github.com/ICKelin/gtun/transport/kcp"
"github.com/ICKelin/gtun/transport/mux"
) )
func Main() { func Main() {
@@ -22,39 +20,20 @@ func Main() {
logs.Init("forward.log", "debug", 10) logs.Init("forward.log", "debug", 10)
// initial local listener // initial local listener
var listener transport.Listener
lisCfg := cfg.ListenerConfig lisCfg := cfg.ListenerConfig
switch lisCfg.Scheme { listener, err := transport_api.NewListen(lisCfg.Scheme, lisCfg.ListenAddr, lisCfg.RawConfig)
case "kcp":
listener = kcp.NewListener(lisCfg.ListenAddr, []byte(lisCfg.RawConfig))
err := listener.Listen()
if err != nil { if err != nil {
logs.Error("new kcp server fail; %v", err) logs.Error("new listener fail: %v", err)
return return
} }
defer listener.Close() defer listener.Close()
default:
listener = mux.NewListener(lisCfg.ListenAddr)
err := listener.Listen()
if err != nil {
logs.Error("new mux server fail: %v", err)
return
}
defer listener.Close()
}
// initial next hop dialer // initial next hop dialer
var dialer transport.Dialer
dialerCfg := cfg.NexthopConfig dialerCfg := cfg.NexthopConfig
switch dialerCfg.Scheme { routeTable := NewRouteTable()
case "kcp": routeTable.Add(dialerCfg.Scheme, dialerCfg.NexthopAddr, dialerCfg.RawConfig)
dialer = kcp.NewDialer(dialerCfg.NexthopAddr, []byte(dialerCfg.RawConfig))
default:
dialer = mux.NewDialer(dialerCfg.NexthopAddr)
}
f := NewForward(listener, dialer) f := NewForward(listener, routeTable)
if err := f.Serve(); err != nil { if err := f.Serve(); err != nil {
logs.Error("forward exist: %v", err) logs.Error("forward exist: %v", err)

View File

@@ -3,17 +3,19 @@ package forward
import ( import (
"fmt" "fmt"
"github.com/ICKelin/gtun/transport" "github.com/ICKelin/gtun/transport"
"github.com/ICKelin/gtun/transport/transport_api"
"math"
"sync" "sync"
) )
var ( var (
errNoRoute = fmt.Errorf("no route to host") errNoRoute = fmt.Errorf("no route to host")
maxRtt = math.MinInt32
) )
type RouteEntry struct { type RouteEntry struct {
scheme, addr string scheme, addr string
rtt int32 rtt int32
lastActive int64
conn transport.Conn conn transport.Conn
} }
@@ -30,8 +32,8 @@ func NewRouteTable() *RouteTable {
} }
} }
func (r *RouteTable) Add(scheme, addr string) error { func (r *RouteTable) Add(scheme, addr, cfg string) error {
dialer, err := transport.Dial(scheme, addr) dialer, err := transport_api.NewDialer(scheme, addr, cfg)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -0,0 +1,54 @@
package transport_api
import (
"errors"
"github.com/ICKelin/gtun/transport"
"github.com/ICKelin/gtun/transport/kcp"
"github.com/ICKelin/gtun/transport/mux"
)
const (
protoKCP = "kcp"
protoTCPMux = "mux"
)
var (
errUnsupported = errors.New("transport_api: unsupported protocol")
)
func NewListen(scheme, addr, cfg string) (transport.Listener, error) {
var listener transport.Listener
switch scheme {
case protoKCP:
listener = kcp.NewListener(addr, []byte(cfg))
err := listener.Listen()
if err != nil {
return nil, err
}
case protoTCPMux:
listener = mux.NewListener(addr)
err := listener.Listen()
if err != nil {
return nil, err
}
default:
return nil, errUnsupported
}
return listener, nil
}
func NewDialer(scheme, addr, cfg string) (transport.Dialer, error) {
var dialer transport.Dialer
switch scheme {
case protoKCP:
dialer = kcp.NewDialer(addr, []byte(cfg))
case protoTCPMux:
dialer = mux.NewDialer(addr)
default:
return nil, errUnsupported
}
return dialer, nil
}

View File

@@ -5,12 +5,12 @@ import (
"time" "time"
) )
// Dialer defines transport dialer for client side // Dialer defines transport_api dialer for client side
type Dialer interface { type Dialer interface {
Dial() (Conn, error) Dial() (Conn, error)
} }
// Listener defines transport listener for server side // Listener defines transport_api listener for server side
type Listener interface { type Listener interface {
Listen() error Listen() error
// Accept returns a connection // Accept returns a connection
@@ -24,7 +24,7 @@ type Listener interface {
Addr() net.Addr Addr() net.Addr
} }
// Conn defines a transport connection // Conn defines a transport_api connection
type Conn interface { type Conn interface {
OpenStream() (Stream, error) OpenStream() (Stream, error)
AcceptStream() (Stream, error) AcceptStream() (Stream, error)
@@ -33,7 +33,7 @@ type Conn interface {
RemoteAddr() net.Addr RemoteAddr() net.Addr
} }
// Stream defines a transport stream base on // Stream defines a transport_api stream base on
// Conn.OpenStream or Conn.AcceptStream // Conn.OpenStream or Conn.AcceptStream
type Stream interface { type Stream interface {
Write(buf []byte) (int, error) Write(buf []byte) (int, error)