Change reserveSecurityParameterIndex() to take a remoteAddress

To make the SPI reservation more semantically consistent with the
transform creation API, and to ensure that we always create SPI
reservations relative to a well-known remote, we should take the
SPI request relative to a remote (rather than to a destination).
This necessitates that we now consider direction separately, which
is used for keying the SA-Id.

Bug: 36073210
Test: compilation
Change-Id: I81e955c20128c1f8e04fd68eb26669561f827a78
(cherry picked from commit c4f879925b58b1b5ca9a3cfdc898c20cbf56355a)
This commit is contained in:
Nathan Harold
2017-03-29 10:47:59 -07:00
parent 8ea66052f2
commit 18fd608286
2 changed files with 13 additions and 17 deletions

View File

@@ -81,7 +81,7 @@ public final class IpSecManager {
public static final class SecurityParameterIndex implements AutoCloseable { public static final class SecurityParameterIndex implements AutoCloseable {
private final IIpSecService mService; private final IIpSecService mService;
private final InetAddress mDestinationAddress; private final InetAddress mRemoteAddress;
private final CloseGuard mCloseGuard = CloseGuard.get(); private final CloseGuard mCloseGuard = CloseGuard.get();
private int mSpi; private int mSpi;
@@ -91,10 +91,10 @@ public final class IpSecManager {
} }
private SecurityParameterIndex( private SecurityParameterIndex(
IIpSecService service, InetAddress destinationAddress, int spi) IIpSecService service, int direction, InetAddress remoteAddress, int spi)
throws ResourceUnavailableException, SpiUnavailableException { throws ResourceUnavailableException, SpiUnavailableException {
mService = service; mService = service;
mDestinationAddress = destinationAddress; mRemoteAddress = remoteAddress;
mSpi = spi; mSpi = spi;
mCloseGuard.open("open"); mCloseGuard.open("open");
} }
@@ -102,13 +102,9 @@ public final class IpSecManager {
/** /**
* Release an SPI that was previously reserved. * Release an SPI that was previously reserved.
* *
* <p>Release an SPI for use by other users in the system. This will fail if the SPI is * <p>Release an SPI for use by other users in the system. If a SecurityParameterIndex is
* currently in use by an IpSecTransform. * applied to an IpSecTransform, it will become unusable for future transforms but should
* * still be closed to ensure system resources are released.
* @param destinationAddress SPIs must be unique for each combination of SPI and destination
* address. Thus, the destinationAddress to which the SPI will communicate must be
* supplied.
* @param spi the previously reserved SPI to be freed.
*/ */
@Override @Override
public void close() { public void close() {
@@ -134,13 +130,13 @@ public final class IpSecManager {
public static final int INVALID_SECURITY_PARAMETER_INDEX = 0; public static final int INVALID_SECURITY_PARAMETER_INDEX = 0;
/** /**
* Reserve an SPI for traffic bound towards the specified destination address. * Reserve an SPI for traffic bound towards the specified remote address.
* *
* <p>If successful, this SPI is guaranteed available until released by a call to {@link * <p>If successful, this SPI is guaranteed available until released by a call to {@link
* SecurityParameterIndex#close()}. * SecurityParameterIndex#close()}.
* *
* @param destinationAddress SPIs must be unique for each combination of SPI and destination * @param direction {@link IpSecTransform#DIRECTION_IN} or {@link IpSecTransform#DIRECTION_OUT}
* address. * @param remoteAddress address of the remote. SPIs must be unique for each remoteAddress.
* @param requestedSpi the requested SPI, or '0' to allocate a random SPI. * @param requestedSpi the requested SPI, or '0' to allocate a random SPI.
* @return the reserved SecurityParameterIndex * @return the reserved SecurityParameterIndex
* @throws ResourceUnavailableException indicating that too many SPIs are currently allocated * @throws ResourceUnavailableException indicating that too many SPIs are currently allocated
@@ -148,9 +144,9 @@ public final class IpSecManager {
* @throws SpiUnavailableException indicating that a particular SPI cannot be reserved * @throws SpiUnavailableException indicating that a particular SPI cannot be reserved
*/ */
public SecurityParameterIndex reserveSecurityParameterIndex( public SecurityParameterIndex reserveSecurityParameterIndex(
InetAddress destinationAddress, int requestedSpi) int direction, InetAddress remoteAddress, int requestedSpi)
throws SpiUnavailableException, ResourceUnavailableException { throws SpiUnavailableException, ResourceUnavailableException {
return new SecurityParameterIndex(mService, destinationAddress, requestedSpi); return new SecurityParameterIndex(mService, direction, remoteAddress, requestedSpi);
} }
/** /**

View File

@@ -307,7 +307,7 @@ public final class IpSecTransform implements AutoCloseable {
* <p>Care should be chosen when selecting an SPI to ensure that is is as unique as * <p>Care should be chosen when selecting an SPI to ensure that is is as unique as
* possible. Random number generation is a reasonable approach to selecting an SPI. For * possible. Random number generation is a reasonable approach to selecting an SPI. For
* outbound SPIs, they must be reserved by calling {@link * outbound SPIs, they must be reserved by calling {@link
* IpSecManager#reserveSecurityParameterIndex(InetAddress, int)}. Otherwise, Transforms will * IpSecManager#reserveSecurityParameterIndex(int, InetAddress, int)}. Otherwise, Transforms will
* fail to build. * fail to build.
* *
* <p>Unless an SPI is set for a given direction, traffic in that direction will be * <p>Unless an SPI is set for a given direction, traffic in that direction will be
@@ -329,7 +329,7 @@ public final class IpSecTransform implements AutoCloseable {
* <p>Care should be chosen when selecting an SPI to ensure that is is as unique as * <p>Care should be chosen when selecting an SPI to ensure that is is as unique as
* possible. Random number generation is a reasonable approach to selecting an SPI. For * possible. Random number generation is a reasonable approach to selecting an SPI. For
* outbound SPIs, they must be reserved by calling {@link * outbound SPIs, they must be reserved by calling {@link
* IpSecManager#reserveSecurityParameterIndex(InetAddress, int)}. Otherwise, Transforms will * IpSecManager#reserveSecurityParameterIndex(int, InetAddress, int)}. Otherwise, Transforms will
* fail to activate. * fail to activate.
* *
* <p>Unless an SPI is set for a given direction, traffic in that direction will be * <p>Unless an SPI is set for a given direction, traffic in that direction will be