Просмотр исходного кода

Add ReplayTargetTunnelDuration

Rod Hynes 6 лет назад
Родитель
Сommit
9899bc9060
3 измененных файлов с 34 добавлено и 12 удалено
  1. 2 0
      psiphon/common/parameters/clientParameters.go
  2. 15 0
      psiphon/config.go
  3. 17 12
      psiphon/tunnel.go

+ 2 - 0
psiphon/common/parameters/clientParameters.go

@@ -198,6 +198,7 @@ const (
 	ReplayDialParametersTTL                          = "ReplayDialParametersTTL"
 	ReplayTargetUpstreamBytes                        = "ReplayTargetUpstreamBytes"
 	ReplayTargetDownstreamBytes                      = "ReplayTargetDownstreamBytes"
+	ReplayTargetTunnelDuration                       = "ReplayTargetTunnelDuration"
 	ReplaySSH                                        = "ReplaySSH"
 	ReplayObfuscatorPadding                          = "ReplayObfuscatorPadding"
 	ReplayFragmentor                                 = "ReplayFragmentor"
@@ -430,6 +431,7 @@ var defaultClientParameters = map[string]struct {
 	ReplayDialParametersTTL:                {value: 24 * time.Hour, minimum: time.Duration(0)},
 	ReplayTargetUpstreamBytes:              {value: 0, minimum: 0},
 	ReplayTargetDownstreamBytes:            {value: 0, minimum: 0},
+	ReplayTargetTunnelDuration:             {value: 1 * time.Second, minimum: time.Duration(0)},
 	ReplaySSH:                              {value: true},
 	ReplayObfuscatorPadding:                {value: true},
 	ReplayFragmentor:                       {value: true},

+ 15 - 0
psiphon/config.go

@@ -545,6 +545,9 @@ type Config struct {
 	// testing purposes.
 	ReplayCandidateCount                   *int
 	ReplayDialParametersTTLSeconds         *int
+	ReplayTargetUpstreamBytes              *int
+	ReplayTargetDownstreamBytes            *int
+	ReplayTargetTunnelDurationSeconds      *int
 	ReplayLaterRoundMoveToFrontProbability *float64
 	ReplayRetainFailedProbability          *float64
 
@@ -1075,6 +1078,18 @@ func (config *Config) makeConfigParameters() map[string]interface{} {
 		applyParameters[parameters.ReplayDialParametersTTL] = fmt.Sprintf("%ds", *config.ReplayDialParametersTTLSeconds)
 	}
 
+	if config.ReplayTargetUpstreamBytes != nil {
+		applyParameters[parameters.ReplayTargetUpstreamBytes] = *config.ReplayTargetUpstreamBytes
+	}
+
+	if config.ReplayTargetDownstreamBytes != nil {
+		applyParameters[parameters.ReplayTargetDownstreamBytes] = *config.ReplayTargetDownstreamBytes
+	}
+
+	if config.ReplayTargetTunnelDurationSeconds != nil {
+		applyParameters[parameters.ReplayTargetTunnelDuration] = fmt.Sprintf("%ds", *config.ReplayTargetTunnelDurationSeconds)
+	}
+
 	if config.ReplayLaterRoundMoveToFrontProbability != nil {
 		applyParameters[parameters.ReplayLaterRoundMoveToFrontProbability] = *config.ReplayLaterRoundMoveToFrontProbability
 	}

+ 17 - 12
psiphon/tunnel.go

@@ -1009,12 +1009,12 @@ func performLivenessTest(
 func (tunnel *Tunnel) operateTunnel(tunnelOwner TunnelOwner) {
 	defer tunnel.operateWaitGroup.Done()
 
-	lastBytesReceivedTime := monotime.Now()
-
-	lastTotalBytesTransferedTime := monotime.Now()
+	now := monotime.Now()
+	lastBytesReceivedTime := now
+	lastTotalBytesTransferedTime := now
 	totalSent := int64(0)
 	totalReceived := int64(0)
-	dialParamsSucceeded := false
+	setDialParamsSucceeded := false
 
 	noticeBytesTransferredTicker := time.NewTicker(1 * time.Second)
 	defer noticeBytesTransferredTicker.Stop()
@@ -1109,6 +1109,7 @@ func (tunnel *Tunnel) operateTunnel(tunnelOwner TunnelOwner) {
 			noticePeriod := p.Duration(parameters.TotalBytesTransferredNoticePeriod)
 			replayTargetUpstreamBytes := p.Int(parameters.ReplayTargetUpstreamBytes)
 			replayTargetDownstreamBytes := p.Int(parameters.ReplayTargetDownstreamBytes)
+			replayTargetTunnelDuration := p.Duration(parameters.ReplayTargetTunnelDuration)
 
 			if lastTotalBytesTransferedTime.Add(noticePeriod).Before(monotime.Now()) {
 				NoticeTotalBytesTransferred(
@@ -1122,18 +1123,22 @@ func (tunnel *Tunnel) operateTunnel(tunnelOwner TunnelOwner) {
 					tunnel.dialParams.ServerEntry.GetDiagnosticID(), sent, received)
 			}
 
-			// Once the tunnel has connected, activated, and successfully
-			// transmitted the targetted number of bytes, store its dial
-			// parameters for subsequent replay.
+			// Once the tunnel has connected, activated, successfully transmitted the
+			// targeted number of bytes, and been up for the targeted duration
+			// (measured from the end of establishment), store its dial parameters for
+			// subsequent replay.
 			//
-			// Even when target bytes are both 0, tunnel must remain up for at
-			// least 1 second due to use of noticeBytesTransferredTicker.
-			if totalSent >= int64(replayTargetUpstreamBytes) &&
+			// Even when target bytes and duration are all 0, the tunnel must remain up
+			// for at least 1 second due to use of noticeBytesTransferredTicker; for
+			// the same reason the granularity of ReplayTargetTunnelDuration is
+			// seconds.
+			if !setDialParamsSucceeded &&
+				totalSent >= int64(replayTargetUpstreamBytes) &&
 				totalReceived >= int64(replayTargetDownstreamBytes) &&
-				!dialParamsSucceeded {
+				monotime.Since(tunnel.establishedTime) >= replayTargetTunnelDuration {
 
 				tunnel.dialParams.Succeeded()
-				dialParamsSucceeded = true
+				setDialParamsSucceeded = true
 			}
 
 		case <-statsTimer.C: