summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Quattlebaum <rquattle@google.com>2017-07-06 11:39:20 -0700
committerRobert Quattlebaum <rquattle@google.com>2017-07-17 19:39:55 -0700
commit902d8a9f8531b8819d732572d2538e74daaf63ba (patch)
treef184e823d39ab8de24ca46a4dd065c332800cd7a
parent9fc6ffb261beafe4becb5972f2c38437e5c211dd (diff)
downloadlowpan-902d8a9f8531b8819d732572d2538e74daaf63ba.tar.gz
LowpanInterfaceTracker: Add support for IpManager.InitialConfiguration
Note that this commit depends on the following change-id: I2c20ddee41d9a22b9c5f19a643072ffe99d6ed3f Bug: b/62988545 b/33073713 Test: Compiled and manually tested for any obvious regressions Change-Id: I08b55261b0444f0b023bd8f8fea4dcc378fbc529
-rw-r--r--service/java/com/android/server/lowpan/LowpanInterfaceTracker.java77
1 files changed, 67 insertions, 10 deletions
diff --git a/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java b/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java
index cdfab75..89b058c 100644
--- a/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java
+++ b/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java
@@ -28,6 +28,7 @@ import android.net.NetworkFactory;
import android.net.NetworkInfo;
import android.net.NetworkInfo.DetailedState;
import android.net.ip.IpManager;
+import android.net.ip.IpManager.InitialConfiguration;
import android.net.ip.IpManager.ProvisioningConfiguration;
import android.net.lowpan.ILowpanInterface;
import android.net.lowpan.LowpanException;
@@ -406,19 +407,75 @@ class LowpanInterfaceTracker extends StateMachine {
class ObtainingIpState extends State {
@Override
public void enter() {
- mNetworkInfo.setDetailedState(DetailedState.OBTAINING_IPADDR, null, mHwAddr);
- mNetworkAgent.sendNetworkInfo(mNetworkInfo);
+ InitialConfiguration initialConfiguration = new InitialConfiguration();
+
+ try {
+ for (LinkAddress address : mLowpanInterface.getLinkAddresses()) {
+ if (DBG) {
+ Log.i(TAG, "Adding link address: " + address);
+ }
+ initialConfiguration.ipAddresses.add(address);
- final ProvisioningConfiguration provisioningConfiguration =
- mIpManager
- .buildProvisioningConfiguration()
- .withProvisioningTimeoutMs(0)
- .withoutIpReachabilityMonitor()
- .withoutIPv4()
- .build();
+ IpPrefix prefix = new IpPrefix(address.getAddress(), address.getPrefixLength());
- mIpManager.startProvisioning(provisioningConfiguration);
+ initialConfiguration.directlyConnectedRoutes.add(prefix);
+ }
+
+ for (IpPrefix prefix : mLowpanInterface.getLinkNetworks()) {
+ if (DBG) {
+ Log.i(TAG, "Adding directly connected route: " + prefix);
+ }
+
+ initialConfiguration.directlyConnectedRoutes.add(prefix);
+ }
+
+ } catch (LowpanException | LowpanRuntimeException x) {
+ Log.e(TAG, "Exception while populating InitialConfiguration: " + x);
+ transitionTo(mFaultState);
+ return;
+
+ } catch (RuntimeException x) {
+ if (x.getCause() instanceof RemoteException) {
+ // Don't let misbehavior of an interface service
+ // crash the system service.
+ Log.e(TAG, x.toString());
+ transitionTo(mFaultState);
+
+ } else {
+ // This exception wasn't remote in origin, so we rethrow.
+ throw x;
+ }
+ }
+
+ if (!initialConfiguration.isValid()) {
+ Log.e(TAG, "Invalid initial configuration: " + initialConfiguration);
+ transitionTo(mFaultState);
+ return;
+ }
+
+ if (DBG) {
+ Log.d(TAG, "Using Initial configuration: " + initialConfiguration);
+ }
+
+ final ProvisioningConfiguration.Builder builder =
+ mIpManager.buildProvisioningConfiguration();
+
+ builder.withInitialConfiguration(initialConfiguration).withProvisioningTimeoutMs(0);
+
+ // LoWPAN networks generally don't have internet connectivity,
+ // so the reachability monitor would almost always fail.
+ builder.withoutIpReachabilityMonitor();
+
+ // We currently only support IPv6 on LoWPAN networks, although
+ // theoretically we could make this determination by examining
+ // the InitialConfiguration for any IPv4 addresses.
+ builder.withoutIPv4();
+
+ mIpManager.startProvisioning(builder.build());
+
+ mNetworkInfo.setDetailedState(DetailedState.OBTAINING_IPADDR, null, mHwAddr);
+ mNetworkAgent.sendNetworkInfo(mNetworkInfo);
}
@Override