| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- package dtls
- import (
- "context"
- "github.com/pion/dtls/v2"
- "github.com/v2fly/v2ray-core/v5/common"
- "github.com/v2fly/v2ray-core/v5/common/environment"
- "github.com/v2fly/v2ray-core/v5/common/environment/envctx"
- "github.com/v2fly/v2ray-core/v5/common/net"
- "github.com/v2fly/v2ray-core/v5/common/session"
- "github.com/v2fly/v2ray-core/v5/transport/internet"
- )
- func dialDTLS(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (net.Conn, error) {
- transportConfiguration := streamSettings.ProtocolSettings.(*Config)
- newError("dialing DTLS to ", dest).WriteToLog()
- transportEnvironment := envctx.EnvironmentFromContext(ctx).(environment.TransportEnvironment)
- dialer := transportEnvironment.Dialer()
- rawConn, err := dialer.Dial(ctx, nil, dest, streamSettings.SocketSettings)
- if err != nil {
- return nil, newError("failed to dial to dest: ", err).AtWarning().Base(err)
- }
- config := &dtls.Config{}
- config.MTU = int(transportConfiguration.Mtu)
- config.ReplayProtectionWindow = int(transportConfiguration.ReplayProtectionWindow)
- switch transportConfiguration.Mode {
- case DTLSMode_PSK:
- config.PSK = func(bytes []byte) ([]byte, error) {
- return transportConfiguration.Psk, nil
- }
- config.PSKIdentityHint = []byte("")
- config.CipherSuites = []dtls.CipherSuiteID{dtls.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256}
- default:
- return nil, newError("unknow dtls mode")
- }
- return dtls.Client(rawConn, config)
- }
- func dial(ctx context.Context, dest net.Destination, streamSettings *internet.MemoryStreamConfig) (internet.Connection, error) {
- newError("creating connection to ", dest).WriteToLog(session.ExportIDToError(ctx))
- conn, err := dialDTLS(ctx, dest, streamSettings)
- if err != nil {
- return nil, newError("failed to dial request to ", dest).Base(err)
- }
- return internet.Connection(conn), nil
- }
- func init() {
- common.Must(internet.RegisterTransportDialer(protocolName, dial))
- }
|