98 lines
1.9 KiB
Go
98 lines
1.9 KiB
Go
package chain
|
|
|
|
import (
|
|
"context"
|
|
"net"
|
|
"time"
|
|
|
|
"github.com/go-gost/core/hosts"
|
|
"github.com/go-gost/core/logger"
|
|
"github.com/go-gost/core/recorder"
|
|
"github.com/go-gost/core/resolver"
|
|
)
|
|
|
|
type SockOpts struct {
|
|
Mark int
|
|
}
|
|
|
|
type RouterOptions struct {
|
|
Retries int
|
|
Timeout time.Duration
|
|
IfceName string
|
|
Netns string
|
|
SockOpts *SockOpts
|
|
Chain Chainer
|
|
Resolver resolver.Resolver
|
|
HostMapper hosts.HostMapper
|
|
Recorders []recorder.RecorderObject
|
|
Logger logger.Logger
|
|
}
|
|
|
|
type RouterOption func(*RouterOptions)
|
|
|
|
func InterfaceRouterOption(ifceName string) RouterOption {
|
|
return func(o *RouterOptions) {
|
|
o.IfceName = ifceName
|
|
}
|
|
}
|
|
|
|
func NetnsRouterOption(netns string) RouterOption {
|
|
return func(o *RouterOptions) {
|
|
o.Netns = netns
|
|
}
|
|
}
|
|
|
|
func SockOptsRouterOption(so *SockOpts) RouterOption {
|
|
return func(o *RouterOptions) {
|
|
o.SockOpts = so
|
|
}
|
|
}
|
|
|
|
func TimeoutRouterOption(timeout time.Duration) RouterOption {
|
|
return func(o *RouterOptions) {
|
|
o.Timeout = timeout
|
|
}
|
|
}
|
|
|
|
func RetriesRouterOption(retries int) RouterOption {
|
|
return func(o *RouterOptions) {
|
|
o.Retries = retries
|
|
}
|
|
}
|
|
|
|
func ChainRouterOption(chain Chainer) RouterOption {
|
|
return func(o *RouterOptions) {
|
|
o.Chain = chain
|
|
}
|
|
}
|
|
|
|
func ResolverRouterOption(resolver resolver.Resolver) RouterOption {
|
|
return func(o *RouterOptions) {
|
|
o.Resolver = resolver
|
|
}
|
|
}
|
|
|
|
func HostMapperRouterOption(m hosts.HostMapper) RouterOption {
|
|
return func(o *RouterOptions) {
|
|
o.HostMapper = m
|
|
}
|
|
}
|
|
|
|
func RecordersRouterOption(recorders ...recorder.RecorderObject) RouterOption {
|
|
return func(o *RouterOptions) {
|
|
o.Recorders = recorders
|
|
}
|
|
}
|
|
|
|
func LoggerRouterOption(logger logger.Logger) RouterOption {
|
|
return func(o *RouterOptions) {
|
|
o.Logger = logger
|
|
}
|
|
}
|
|
|
|
type Router interface {
|
|
Options() *RouterOptions
|
|
Dial(ctx context.Context, network, address string) (net.Conn, error)
|
|
Bind(ctx context.Context, network, address string, opts ...BindOption) (net.Listener, error)
|
|
}
|