From 5c7daac2e3d9020185699ba554d763b825ab1778 Mon Sep 17 00:00:00 2001 From: Lorenzo Colitti Date: Mon, 5 Aug 2013 10:39:37 +0900 Subject: Notify IP address changes to interface observers. 1. Add addressUpdated and addressRemoved methods to INetworkManagementEventObserver. (The -Updated method is not called -Added because it gets called for both adds and changes.) Update all its callers in the tree. 2. Make NetworkManagementService parse IP address notifications from NetlinkHandler and call the address{Removed,Updated} on its observers. Bug: 10232006 Change-Id: Ieb185dbba052bdbff03caafc0cf5397a7f04dc6d --- .../android/server/NetworkManagementService.java | 57 ++++++++++++++++++++++ .../com/android/server/connectivity/Tethering.java | 4 ++ 2 files changed, 61 insertions(+) (limited to 'services/java/com/android/server') diff --git a/services/java/com/android/server/NetworkManagementService.java b/services/java/com/android/server/NetworkManagementService.java index 988b1f2..16cfa66 100644 --- a/services/java/com/android/server/NetworkManagementService.java +++ b/services/java/com/android/server/NetworkManagementService.java @@ -133,6 +133,7 @@ public class NetworkManagementService extends INetworkManagementService.Stub public static final int InterfaceChange = 600; public static final int BandwidthControl = 601; public static final int InterfaceClassActivity = 613; + public static final int InterfaceAddressChange = 614; } /** @@ -393,6 +394,36 @@ public class NetworkManagementService extends INetworkManagementService.Stub setFirewallEnabled(mFirewallEnabled || LockdownVpnTracker.isEnabled()); } + /** + * Notify our observers of a new or updated interface address. + */ + private void notifyAddressUpdated(String address, String iface, int flags, int scope) { + final int length = mObservers.beginBroadcast(); + for (int i = 0; i < length; i++) { + try { + mObservers.getBroadcastItem(i).addressUpdated(address, iface, flags, scope); + } catch (RemoteException e) { + } catch (RuntimeException e) { + } + } + mObservers.finishBroadcast(); + } + + /** + * Notify our observers of a deleted interface address. + */ + private void notifyAddressRemoved(String address, String iface, int flags, int scope) { + final int length = mObservers.beginBroadcast(); + for (int i = 0; i < length; i++) { + try { + mObservers.getBroadcastItem(i).addressRemoved(address, iface, flags, scope); + } catch (RemoteException e) { + } catch (RuntimeException e) { + } + } + mObservers.finishBroadcast(); + } + // // Netd Callback handling // @@ -475,6 +506,32 @@ public class NetworkManagementService extends INetworkManagementService.Stub notifyInterfaceClassActivity(cooked[3], isActive); return true; // break; + case NetdResponseCode.InterfaceAddressChange: + /* + * A network address change occurred + * Format: "NNN Address updated " + * "NNN Address removed " + */ + String msg = String.format("Invalid event from daemon (%s)", raw); + if (cooked.length < 6 || !cooked[1].equals("Address")) { + throw new IllegalStateException(msg); + } + + int flags, scope; + try { + flags = Integer.parseInt(cooked[5]); + scope = Integer.parseInt(cooked[6]); + } catch(NumberFormatException e) { + throw new IllegalStateException(msg); + } + + if (cooked[2].equals("updated")) { + notifyAddressUpdated(cooked[3], cooked[4], flags, scope); + } else { + notifyAddressRemoved(cooked[3], cooked[4], flags, scope); + } + return true; + // break; default: break; } return false; diff --git a/services/java/com/android/server/connectivity/Tethering.java b/services/java/com/android/server/connectivity/Tethering.java index 22a7841..fb4c1cf 100644 --- a/services/java/com/android/server/connectivity/Tethering.java +++ b/services/java/com/android/server/connectivity/Tethering.java @@ -315,6 +315,10 @@ public class Tethering extends INetworkManagementEventObserver.Stub { } } + public void addressUpdated(String address, String iface, int flags, int scope) {} + + public void addressRemoved(String address, String iface, int flags, int scope) {} + public void limitReached(String limitName, String iface) {} public void interfaceClassDataActivityChanged(String label, boolean active) {} -- cgit v1.1