2022-09-06 00:15:09 +08:00
|
|
|
package wireguard
|
|
|
|
|
|
|
|
import (
|
2024-11-21 18:10:41 +08:00
|
|
|
"context"
|
|
|
|
"net/netip"
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/sagernet/sing-tun"
|
|
|
|
"github.com/sagernet/sing/common/logger"
|
2022-09-06 00:15:09 +08:00
|
|
|
N "github.com/sagernet/sing/common/network"
|
2024-11-21 18:10:41 +08:00
|
|
|
"github.com/sagernet/wireguard-go/device"
|
|
|
|
wgTun "github.com/sagernet/wireguard-go/tun"
|
2022-09-06 00:15:09 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
type Device interface {
|
2024-11-21 18:10:41 +08:00
|
|
|
wgTun.Device
|
2022-09-06 00:15:09 +08:00
|
|
|
N.Dialer
|
|
|
|
Start() error
|
2024-11-21 18:10:41 +08:00
|
|
|
SetDevice(device *device.Device)
|
|
|
|
}
|
|
|
|
|
|
|
|
type DeviceOptions struct {
|
|
|
|
Context context.Context
|
|
|
|
Logger logger.ContextLogger
|
|
|
|
System bool
|
|
|
|
Handler tun.Handler
|
|
|
|
UDPTimeout time.Duration
|
|
|
|
CreateDialer func(interfaceName string) N.Dialer
|
|
|
|
Name string
|
|
|
|
MTU uint32
|
|
|
|
GSO bool
|
|
|
|
Address []netip.Prefix
|
|
|
|
AllowedAddress []netip.Prefix
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewDevice(options DeviceOptions) (Device, error) {
|
|
|
|
if !options.System {
|
|
|
|
return newStackDevice(options)
|
|
|
|
} else if options.Handler == nil {
|
|
|
|
return newSystemDevice(options)
|
|
|
|
} else {
|
|
|
|
return newSystemStackDevice(options)
|
|
|
|
}
|
2022-09-06 00:15:09 +08:00
|
|
|
}
|