diff options
author | Robert Quattlebaum <rquattle@google.com> | 2017-07-06 11:39:20 -0700 |
---|---|---|
committer | Robert Quattlebaum <rquattle@google.com> | 2017-07-17 19:39:55 -0700 |
commit | 902d8a9f8531b8819d732572d2538e74daaf63ba (patch) | |
tree | f184e823d39ab8de24ca46a4dd065c332800cd7a | |
parent | 9fc6ffb261beafe4becb5972f2c38437e5c211dd (diff) | |
download | lowpan-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.java | 77 |
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 |