diff options
author | Irfan Sheriff <isheriff@google.com> | 2012-09-23 15:27:50 -0700 |
---|---|---|
committer | Irfan Sheriff <isheriff@google.com> | 2012-09-23 15:27:50 -0700 |
commit | d36adc31ce0335635b536174299e15b9f099c9ad (patch) | |
tree | 0a550371d4f397a1d807ccab374c172576bbfca3 /wifi | |
parent | 2250550187ed7a2bd98d5f861151b49db5635f6e (diff) | |
download | frameworks_base-d36adc31ce0335635b536174299e15b9f099c9ad.zip frameworks_base-d36adc31ce0335635b536174299e15b9f099c9ad.tar.gz frameworks_base-d36adc31ce0335635b536174299e15b9f099c9ad.tar.bz2 |
P2p fixes
- NPE fixes
- Remove group on CTRL-EVENT-DISCONNECTED since the supplicant sometimes misses
the group removed event
- Fix the pattern match since we sometimes end up creating group without passphrase
Bug: 7119140
Bug: 7210558
Change-Id: I2cf0be073aaaaa9b931ea9a79b0bf4bd6a2b32ff
Diffstat (limited to 'wifi')
-rw-r--r-- | wifi/java/android/net/wifi/p2p/WifiP2pGroup.java | 2 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/p2p/WifiP2pService.java | 64 |
2 files changed, 43 insertions, 23 deletions
diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java b/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java index bc492b3..cf7604d 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pGroup.java @@ -68,7 +68,7 @@ public class WifiP2pGroup implements Parcelable { "ssid=\"(.+)\" " + "freq=(\\d+) " + "(?:psk=)?([0-9a-fA-F]{64})?" + - "(?:passphrase=)?(?:\"(.{8,63})\")? " + + "(?:passphrase=)?(?:\"(.{0,63})\")? " + "go_dev_addr=((?:[0-9a-f]{2}:){5}[0-9a-f]{2})" + " ?(\\[PERSISTENT\\])?" ); diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java index 13abb79..b317f3f 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java @@ -527,6 +527,11 @@ public class WifiP2pService extends IWifiP2pManager.Stub { case WifiMonitor.NETWORK_CONNECTION_EVENT: case WifiMonitor.NETWORK_DISCONNECTION_EVENT: case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: + case WifiMonitor.AUTHENTICATION_FAILURE_EVENT: + case WifiMonitor.WPS_SUCCESS_EVENT: + case WifiMonitor.WPS_FAIL_EVENT: + case WifiMonitor.WPS_OVERLAP_EVENT: + case WifiMonitor.WPS_TIMEOUT_EVENT: case WifiMonitor.P2P_GROUP_REMOVED_EVENT: case WifiMonitor.P2P_DEVICE_FOUND_EVENT: case WifiMonitor.P2P_DEVICE_LOST_EVENT: @@ -537,6 +542,9 @@ public class WifiP2pService extends IWifiP2pManager.Stub { case PEER_CONNECTION_USER_ACCEPT: case PEER_CONNECTION_USER_REJECT: case GROUP_CREATING_TIMED_OUT: + case DhcpStateMachine.CMD_PRE_DHCP_ACTION: + case DhcpStateMachine.CMD_POST_DHCP_ACTION: + case DhcpStateMachine.CMD_ON_QUIT: break; /* unexpected group created, remove */ case WifiMonitor.P2P_GROUP_STARTED_EVENT: @@ -1351,34 +1359,18 @@ public class WifiP2pService extends IWifiP2pManager.Stub { if (mWifiNative.p2pGroupRemove(mGroup.getInterface())) { replyToMessage(message, WifiP2pManager.REMOVE_GROUP_SUCCEEDED); } else { + handleGroupRemoved(); + transitionTo(mInactiveState); replyToMessage(message, WifiP2pManager.REMOVE_GROUP_FAILED, WifiP2pManager.ERROR); } break; + /* The supplicant misses the group removed event at times and just + * sends a network disconnect event */ + case WifiMonitor.NETWORK_DISCONNECTION_EVENT: case WifiMonitor.P2P_GROUP_REMOVED_EVENT: if (DBG) logd(getName() + " group removed"); - Collection <WifiP2pDevice> devices = mGroup.getClientList(); - boolean changed = false; - for (WifiP2pDevice d : mPeers.getDeviceList()) { - if (devices.contains(d) || mGroup.getOwner().equals(d)) { - d.status = WifiP2pDevice.AVAILABLE; - changed = true; - } - } - - if (mGroup.isGroupOwner()) { - stopDhcpServer(mGroup.getInterface()); - } else { - if (DBG) logd("stop DHCP client"); - mDhcpStateMachine.sendMessage(DhcpStateMachine.CMD_STOP_DHCP); - mDhcpStateMachine.doQuit(); - mDhcpStateMachine = null; - } - - mGroup = null; - mWifiNative.p2pFlush(); - mServiceDiscReqId = null; - if (changed) sendP2pPeersChangedBroadcast(); + handleGroupRemoved(); transitionTo(mInactiveState); break; case WifiMonitor.P2P_DEVICE_LOST_EVENT: @@ -1734,9 +1726,12 @@ public class WifiP2pService extends IWifiP2pManager.Stub { */ private void updatePersistentNetworks() { String listStr = mWifiNative.listNetworks(); + if (listStr == null) return; boolean isSaveRequired = false; String[] lines = listStr.split("\n"); + if (lines == null) return; + // Skip the first line, which is a header for (int i = 1; i < lines.length; i++) { String[] result = lines[i].split("\t"); @@ -2101,6 +2096,31 @@ public class WifiP2pService extends IWifiP2pManager.Stub { sendMessage(WifiP2pManager.DISCOVER_PEERS); } + private void handleGroupRemoved() { + Collection <WifiP2pDevice> devices = mGroup.getClientList(); + boolean changed = false; + for (WifiP2pDevice d : mPeers.getDeviceList()) { + if (devices.contains(d) || mGroup.getOwner().equals(d)) { + d.status = WifiP2pDevice.AVAILABLE; + changed = true; + } + } + + if (mGroup.isGroupOwner()) { + stopDhcpServer(mGroup.getInterface()); + } else { + if (DBG) logd("stop DHCP client"); + mDhcpStateMachine.sendMessage(DhcpStateMachine.CMD_STOP_DHCP); + mDhcpStateMachine.doQuit(); + mDhcpStateMachine = null; + } + + mGroup = null; + mWifiNative.p2pFlush(); + mServiceDiscReqId = null; + if (changed) sendP2pPeersChangedBroadcast(); + } + //State machine initiated requests can have replyTo set to null indicating //there are no recipients, we ignore those reply actions private void replyToMessage(Message msg, int what) { |