blob: 005065b4e2ef46031b5d53f7c584bbb0fe37a22e [file] [log] [blame]
/*
* Copyright 2018 The gRPC Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.grpc.alts.internal;
import com.google.common.annotations.VisibleForTesting;
import io.grpc.alts.internal.RpcProtocolVersions.Version;
import javax.annotation.Nullable;
/** Utility class for Rpc Protocol Versions. */
public final class RpcProtocolVersionsUtil {
private static final int MAX_RPC_VERSION_MAJOR = 2;
private static final int MAX_RPC_VERSION_MINOR = 1;
private static final int MIN_RPC_VERSION_MAJOR = 2;
private static final int MIN_RPC_VERSION_MINOR = 1;
private static final RpcProtocolVersions RPC_PROTOCOL_VERSIONS =
RpcProtocolVersions.newBuilder()
.setMaxRpcVersion(
RpcProtocolVersions.Version.newBuilder()
.setMajor(MAX_RPC_VERSION_MAJOR)
.setMinor(MAX_RPC_VERSION_MINOR)
.build())
.setMinRpcVersion(
RpcProtocolVersions.Version.newBuilder()
.setMajor(MIN_RPC_VERSION_MAJOR)
.setMinor(MIN_RPC_VERSION_MINOR)
.build())
.build();
/** Returns default Rpc Protocol Versions. */
public static RpcProtocolVersions getRpcProtocolVersions() {
return RPC_PROTOCOL_VERSIONS;
}
/**
* Returns true if first Rpc Protocol Version is greater than or equal to the second one. Returns
* false otherwise.
*/
@VisibleForTesting
static boolean isGreaterThanOrEqualTo(Version first, Version second) {
if ((first.getMajor() > second.getMajor())
|| (first.getMajor() == second.getMajor() && first.getMinor() >= second.getMinor())) {
return true;
}
return false;
}
/**
* Performs check between local and peer Rpc Protocol Versions. This function returns true and the
* highest common version if there exists a common Rpc Protocol Version to use, and returns false
* and null otherwise.
*/
static RpcVersionsCheckResult checkRpcProtocolVersions(
RpcProtocolVersions localVersions, RpcProtocolVersions peerVersions) {
Version maxCommonVersion;
Version minCommonVersion;
// maxCommonVersion is MIN(local.max, peer.max)
if (isGreaterThanOrEqualTo(localVersions.getMaxRpcVersion(), peerVersions.getMaxRpcVersion())) {
maxCommonVersion = peerVersions.getMaxRpcVersion();
} else {
maxCommonVersion = localVersions.getMaxRpcVersion();
}
// minCommonVersion is MAX(local.min, peer.min)
if (isGreaterThanOrEqualTo(localVersions.getMinRpcVersion(), peerVersions.getMinRpcVersion())) {
minCommonVersion = localVersions.getMinRpcVersion();
} else {
minCommonVersion = peerVersions.getMinRpcVersion();
}
if (isGreaterThanOrEqualTo(maxCommonVersion, minCommonVersion)) {
return new RpcVersionsCheckResult.Builder()
.setResult(true)
.setHighestCommonVersion(maxCommonVersion)
.build();
}
return new RpcVersionsCheckResult.Builder().setResult(false).build();
}
/** Wrapper class that stores results of Rpc Protocol Versions check. */
static final class RpcVersionsCheckResult {
private final boolean result;
@Nullable private final Version highestCommonVersion;
private RpcVersionsCheckResult(Builder builder) {
result = builder.result;
highestCommonVersion = builder.highestCommonVersion;
}
boolean getResult() {
return result;
}
Version getHighestCommonVersion() {
return highestCommonVersion;
}
static final class Builder {
private boolean result;
@Nullable private Version highestCommonVersion = null;
public Builder setResult(boolean result) {
this.result = result;
return this;
}
public Builder setHighestCommonVersion(Version highestCommonVersion) {
this.highestCommonVersion = highestCommonVersion;
return this;
}
public RpcVersionsCheckResult build() {
return new RpcVersionsCheckResult(this);
}
}
}
}