add sockopts config
This commit is contained in:
@ -19,24 +19,33 @@ var (
|
||||
)
|
||||
|
||||
type Route struct {
|
||||
chain *Chain
|
||||
ifceName string
|
||||
nodes []*Node
|
||||
logger logger.Logger
|
||||
chain *Chain
|
||||
nodes []*Node
|
||||
logger logger.Logger
|
||||
}
|
||||
|
||||
func (r *Route) addNode(node *Node) {
|
||||
r.nodes = append(r.nodes, node)
|
||||
}
|
||||
|
||||
func (r *Route) Dial(ctx context.Context, network, address string) (net.Conn, error) {
|
||||
func (r *Route) Dial(ctx context.Context, network, address string, opts ...DialOption) (net.Conn, error) {
|
||||
var options DialOptions
|
||||
for _, opt := range opts {
|
||||
opt(&options)
|
||||
}
|
||||
|
||||
if r.Len() == 0 {
|
||||
netd := dialer.NetDialer{
|
||||
Timeout: 30 * time.Second,
|
||||
Timeout: options.Timeout,
|
||||
Interface: options.Interface,
|
||||
}
|
||||
if options.SockOpts != nil {
|
||||
netd.Mark = options.SockOpts.Mark
|
||||
}
|
||||
if r != nil {
|
||||
netd.Interface = r.ifceName
|
||||
netd.Logger = r.logger
|
||||
}
|
||||
|
||||
return netd.Dial(ctx, network, address)
|
||||
}
|
||||
|
||||
@ -198,3 +207,29 @@ func (r *Route) bindLocal(ctx context.Context, network, address string, opts ...
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
type DialOptions struct {
|
||||
Timeout time.Duration
|
||||
Interface string
|
||||
SockOpts *SockOpts
|
||||
}
|
||||
|
||||
type DialOption func(opts *DialOptions)
|
||||
|
||||
func TimeoutDialOption(d time.Duration) DialOption {
|
||||
return func(opts *DialOptions) {
|
||||
opts.Timeout = d
|
||||
}
|
||||
}
|
||||
|
||||
func InterfaceDialOption(ifName string) DialOption {
|
||||
return func(opts *DialOptions) {
|
||||
opts.Interface = ifName
|
||||
}
|
||||
}
|
||||
|
||||
func SockOptsDialOption(so *SockOpts) DialOption {
|
||||
return func(opts *DialOptions) {
|
||||
opts.SockOpts = so
|
||||
}
|
||||
}
|
||||
|
@ -13,10 +13,15 @@ import (
|
||||
"github.com/go-gost/core/resolver"
|
||||
)
|
||||
|
||||
type SockOpts struct {
|
||||
Mark int
|
||||
}
|
||||
|
||||
type Router struct {
|
||||
ifceName string
|
||||
sockOpts *SockOpts
|
||||
timeout time.Duration
|
||||
retries int
|
||||
ifceName string
|
||||
chain Chainer
|
||||
resolver resolver.Resolver
|
||||
hosts hosts.HostMapper
|
||||
@ -38,6 +43,11 @@ func (r *Router) WithInterface(ifceName string) *Router {
|
||||
return r
|
||||
}
|
||||
|
||||
func (r *Router) WithSockOpts(so *SockOpts) *Router {
|
||||
r.sockOpts = so
|
||||
return r
|
||||
}
|
||||
|
||||
func (r *Router) WithChain(chain Chainer) *Router {
|
||||
r.chain = chain
|
||||
return r
|
||||
@ -109,10 +119,11 @@ func (r *Router) dial(ctx context.Context, network, address string) (conn net.Co
|
||||
if route == nil {
|
||||
route = &Route{}
|
||||
}
|
||||
route.ifceName = r.ifceName
|
||||
route.logger = r.logger
|
||||
|
||||
conn, err = route.Dial(ctx, network, address)
|
||||
conn, err = route.Dial(ctx, network, address,
|
||||
InterfaceDialOption(r.ifceName),
|
||||
SockOptsDialOption(r.sockOpts),
|
||||
)
|
||||
if err == nil {
|
||||
break
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ import (
|
||||
type Transport struct {
|
||||
addr string
|
||||
ifceName string
|
||||
sockOpts *SockOpts
|
||||
route *Route
|
||||
dialer dialer.Dialer
|
||||
connector connector.Connector
|
||||
@ -29,6 +30,11 @@ func (tr *Transport) WithInterface(ifceName string) *Transport {
|
||||
return tr
|
||||
}
|
||||
|
||||
func (tr *Transport) WithSockOpts(so *SockOpts) *Transport {
|
||||
tr.sockOpts = so
|
||||
return tr
|
||||
}
|
||||
|
||||
func (tr *Transport) WithDialer(dialer dialer.Dialer) *Transport {
|
||||
tr.dialer = dialer
|
||||
return tr
|
||||
@ -42,7 +48,10 @@ func (tr *Transport) WithConnector(connector connector.Connector) *Transport {
|
||||
func (tr *Transport) Dial(ctx context.Context, addr string) (net.Conn, error) {
|
||||
netd := &net_dialer.NetDialer{
|
||||
Interface: tr.ifceName,
|
||||
Timeout: 30 * time.Second,
|
||||
Timeout: 15 * time.Second,
|
||||
}
|
||||
if tr.sockOpts != nil {
|
||||
netd.Mark = tr.sockOpts.Mark
|
||||
}
|
||||
if tr.route.Len() > 0 {
|
||||
netd.DialFunc = func(ctx context.Context, network, addr string) (net.Conn, error) {
|
||||
|
Reference in New Issue
Block a user