Add Network.fromNetworkHandle()

This is the counterpart to Network.getNetworkHandle() and facilitates
native code calling back to Java with network handle values from
getNetworkHandle.

Bug: 77210159
Bug: 64148938
Test: make CtsNetTestCases

Change-Id: I032b959d84180c063a79ddd97c35e7384b0f50a1
This commit is contained in:
Paul Jensen
2018-03-28 09:19:58 -04:00
parent 51f4d8a11d
commit b895ac0fe6

View File

@@ -77,6 +77,11 @@ public class Network implements Parcelable {
httpKeepAlive ? Integer.parseInt(System.getProperty("http.maxConnections", "5")) : 0;
private static final long httpKeepAliveDurationMs =
Long.parseLong(System.getProperty("http.keepAliveDuration", "300000")); // 5 minutes.
// Value used to obfuscate network handle longs.
// The HANDLE_MAGIC value MUST be kept in sync with the corresponding
// value in the native/android/net.c NDK implementation.
private static final long HANDLE_MAGIC = 0xcafed00dL;
private static final int HANDLE_MAGIC_SIZE = 32;
/**
* @hide
@@ -334,6 +339,25 @@ public class Network implements Parcelable {
}
}
/**
* Returns a {@link Network} object given a handle returned from {@link #getNetworkHandle}.
*
* @param networkHandle a handle returned from {@link #getNetworkHandle}.
* @return A {@link Network} object derived from {@code networkHandle}.
*/
public static Network fromNetworkHandle(long networkHandle) {
if (networkHandle == 0) {
throw new IllegalArgumentException(
"Network.fromNetworkHandle refusing to instantiate NETID_UNSET Network.");
}
if ((networkHandle & ((1L << HANDLE_MAGIC_SIZE) - 1)) != HANDLE_MAGIC
|| networkHandle < 0) {
throw new IllegalArgumentException(
"Value passed to fromNetworkHandle() is not a network handle.");
}
return new Network((int) (networkHandle >> HANDLE_MAGIC_SIZE));
}
/**
* Returns a handle representing this {@code Network}, for use with the NDK API.
*/
@@ -356,14 +380,10 @@ public class Network implements Parcelable {
// At some future date it may be desirable to realign the handle with
// Multiple Provisioning Domains API recommendations, as made by the
// IETF mif working group.
//
// The handleMagic value MUST be kept in sync with the corresponding
// value in the native/android/net.c NDK implementation.
if (netId == 0) {
return 0L; // make this zero condition obvious for debugging
}
final long handleMagic = 0xcafed00dL;
return (((long) netId) << 32) | handleMagic;
return (((long) netId) << HANDLE_MAGIC_SIZE) | HANDLE_MAGIC;
}
// implement the Parcelable interface