diff options
-rw-r--r-- | wifi/java/android/net/wifi/WifiNative.java | 24 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/p2p/WifiP2pDevice.java | 8 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/p2p/WifiP2pService.java | 33 |
3 files changed, 48 insertions, 17 deletions
diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java index bfc4d5e80ec2..6c6f149be1d3 100644 --- a/wifi/java/android/net/wifi/WifiNative.java +++ b/wifi/java/android/net/wifi/WifiNative.java @@ -304,4 +304,28 @@ public class WifiNative { return doBooleanCommand("P2P_INVITE group=" + group.getInterface() + " peer=" + deviceAddress + " go_dev_addr=" + group.getOwner().deviceAddress); } + + public static String p2pGetInterfaceAddress(String deviceAddress) { + if (deviceAddress == null) return null; + + // "p2p_peer deviceAddress" returns a multi-line result containing + // intended_addr=fa:7b:7a:42:82:13 + String peerInfo = p2pPeer(deviceAddress); + if (peerInfo == null) return null; + String[] tokens= peerInfo.split("\n"); + + for (String token : tokens) { + //TODO: update from interface_addr when wpa_supplicant implementation is fixed + if (token.startsWith("intended_addr=")) { + String[] nameValue = token.split("="); + if (nameValue.length != 2) break; + return nameValue[1]; + } + } + return null; + } + + public static String p2pPeer(String deviceAddress) { + return doStringCommand("P2P_PEER " + deviceAddress); + } } diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java b/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java index 83dc2856f4a4..790872656915 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pDevice.java @@ -158,9 +158,6 @@ public class WifiP2pDevice implements Parcelable { return; } - Pattern p = Pattern.compile("(?:[0-9a-f]{2}:){5}[0-9a-f]{2}", Pattern.CASE_INSENSITIVE); - if (p.matcher(tokens[1]).matches()) interfaceAddress = tokens[1]; - for (String token : tokens) { String[] nameValue = token.split("="); if (nameValue.length != 2) continue; @@ -177,6 +174,7 @@ public class WifiP2pDevice implements Parcelable { if (nameValue[0].equals("name")) { deviceName = trimQuotes(nameValue[1]); + continue; } if (nameValue[0].equals("config_methods")) { @@ -213,9 +211,7 @@ public class WifiP2pDevice implements Parcelable { if (other == null || other.deviceAddress == null) { return (deviceAddress == null); } - //STOPSHIP: fix later - //return other.deviceAddress.equals(deviceAddress); - return other.deviceAddress.startsWith(deviceAddress.substring(0,8)); + return other.deviceAddress.equals(deviceAddress); } public String toString() { diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java index 49ce1242d989..44479718b6a6 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java @@ -663,17 +663,20 @@ public class WifiP2pService extends IWifiP2pManager.Stub { if (DBG) Slog.d(TAG, getName() + message.toString()); switch (message.what) { case WifiMonitor.AP_STA_CONNECTED_EVENT: - String address = (String) message.obj; - mGroup.addClient(address); - updateDeviceStatus(address, Status.CONNECTED); + //After a GO setup, STA connected event comes with interface address + String interfaceAddress = (String) message.obj; + String deviceAddress = getDeviceAddress(interfaceAddress); + mGroup.addClient(deviceAddress); + updateDeviceStatus(deviceAddress, Status.CONNECTED); if (DBG) Slog.d(TAG, getName() + " ap sta connected"); sendP2pPeersChangedBroadcast(); break; case WifiMonitor.AP_STA_DISCONNECTED_EVENT: - address = (String) message.obj; - updateDeviceStatus(address, Status.AVAILABLE); - if (mGroup.removeClient(address)) { - if (DBG) Slog.d(TAG, "Removed client " + address); + interfaceAddress = (String) message.obj; + deviceAddress = getDeviceAddress(interfaceAddress); + updateDeviceStatus(deviceAddress, Status.AVAILABLE); + if (mGroup.removeClient(deviceAddress)) { + if (DBG) Slog.d(TAG, "Removed client " + deviceAddress); if (mGroup.isClientListEmpty()) { Slog.d(TAG, "Client list empty, killing p2p connection"); sendMessage(WifiP2pManager.REMOVE_GROUP); @@ -682,7 +685,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { sendP2pPeersChangedBroadcast(); } } else { - if (DBG) Slog.d(TAG, "Failed to remove client " + address); + if (DBG) Slog.d(TAG, "Failed to remove client " + deviceAddress); for (WifiP2pDevice c : mGroup.getClientList()) { if (DBG) Slog.d(TAG,"client " + c.deviceAddress); } @@ -1005,12 +1008,20 @@ public class WifiP2pService extends IWifiP2pManager.Stub { private void updateDeviceStatus(String deviceAddress, Status status) { for (WifiP2pDevice d : mPeers.getDeviceList()) { - // TODO: fix later - // if (d.deviceAddress.equals(deviceAddress)) { - if (d.deviceAddress.startsWith(deviceAddress.substring(0, 8))) { + if (d.deviceAddress.equals(deviceAddress)) { d.status = status; } } } + + private String getDeviceAddress(String interfaceAddress) { + for (WifiP2pDevice d : mPeers.getDeviceList()) { + if (interfaceAddress.equals(WifiNative.p2pGetInterfaceAddress(d.deviceAddress))) { + return d.deviceAddress; + } + } + return null; + } + } } |