diff options
author | Irfan Sheriff <isheriff@google.com> | 2012-04-06 15:25:41 -0700 |
---|---|---|
committer | Irfan Sheriff <isheriff@google.com> | 2012-04-06 15:40:17 -0700 |
commit | 55bfa42b05868a62ea66d291dcc51f0150fadcc2 (patch) | |
tree | df3b05c827642fb40efd19896bc1a655b2b9869f /wifi | |
parent | 6756f74d81808ef9fc0cdab3c8848723122587c1 (diff) | |
download | frameworks_base-55bfa42b05868a62ea66d291dcc51f0150fadcc2.zip frameworks_base-55bfa42b05868a62ea66d291dcc51f0150fadcc2.tar.gz frameworks_base-55bfa42b05868a62ea66d291dcc51f0150fadcc2.tar.bz2 |
P2p fixes
Add powersave on client after connect
Set concurrency priority to STA
Fix connection cancellation
Change-Id: I76fd9d1085c611a8c4068047b64289ef539ab389
Diffstat (limited to 'wifi')
-rw-r--r-- | wifi/java/android/net/wifi/WifiNative.java | 42 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/p2p/WifiP2pService.java | 56 |
2 files changed, 86 insertions, 12 deletions
diff --git a/wifi/java/android/net/wifi/WifiNative.java b/wifi/java/android/net/wifi/WifiNative.java index c11d082..db73ea8 100644 --- a/wifi/java/android/net/wifi/WifiNative.java +++ b/wifi/java/android/net/wifi/WifiNative.java @@ -396,11 +396,25 @@ public class WifiNative { } } + public boolean startWpsPbc(String iface, String bssid) { + if (TextUtils.isEmpty(bssid)) { + return doBooleanCommand("WPS_PBC interface=" + iface); + } else { + return doBooleanCommand("WPS_PBC interface=" + iface + " " + bssid); + } + } + public boolean startWpsPinKeypad(String pin) { if (TextUtils.isEmpty(pin)) return false; return doBooleanCommand("WPS_PIN any " + pin); } + public boolean startWpsPinKeypad(String iface, String pin) { + if (TextUtils.isEmpty(pin)) return false; + return doBooleanCommand("WPS_PIN interface=" + iface + " any " + pin); + } + + public String startWpsPinDisplay(String bssid) { if (TextUtils.isEmpty(bssid)) { return doStringCommand("WPS_PIN any"); @@ -409,6 +423,14 @@ public class WifiNative { } } + public String startWpsPinDisplay(String iface, String bssid) { + if (TextUtils.isEmpty(bssid)) { + return doStringCommand("WPS_PIN interface=" + iface + " any"); + } else { + return doStringCommand("WPS_PIN interface=" + iface + " " + bssid); + } + } + /* Configures an access point connection */ public boolean startWpsRegistrar(String bssid, String pin) { if (TextUtils.isEmpty(bssid) || TextUtils.isEmpty(pin)) return false; @@ -440,6 +462,26 @@ public class WifiNative { return doBooleanCommand("SET p2p_ssid_postfix " + postfix); } + public boolean setP2pGroupIdle(String iface, int time) { + return doBooleanCommand("SET interface=" + iface + " p2p_group_idle " + time); + } + + public boolean setP2pPowerSave(String iface, boolean enabled) { + if (enabled) { + return doBooleanCommand("P2P_SET interface=" + iface + " ps 1"); + } else { + return doBooleanCommand("P2P_SET interface=" + iface + " ps 0"); + } + } + + /** + * "sta" prioritizes STA connection over P2P and "p2p" prioritizes + * P2P connection over STA + */ + public boolean setConcurrencyPriority(String s) { + return doBooleanCommand("P2P_SET conc_priority " + s); + } + public boolean p2pFind() { return doBooleanCommand("P2P_FIND"); } diff --git a/wifi/java/android/net/wifi/p2p/WifiP2pService.java b/wifi/java/android/net/wifi/p2p/WifiP2pService.java index 3d3a746..32e1053 100644 --- a/wifi/java/android/net/wifi/p2p/WifiP2pService.java +++ b/wifi/java/android/net/wifi/p2p/WifiP2pService.java @@ -109,6 +109,9 @@ public class WifiP2pService extends IWifiP2pManager.Stub { /* Set a two minute discover timeout to avoid STA scans from being blocked */ private static final int DISCOVER_TIMEOUT_S = 120; + /* Idle time after a peer is gone when the group is torn down */ + private static final int GROUP_IDLE_TIME_S = 2; + /** * Delay between restarts upon failure to setup connection with supplicant */ @@ -343,10 +346,21 @@ public class WifiP2pService extends IWifiP2pManager.Stub { case WifiMonitor.NETWORK_CONNECTION_EVENT: case WifiMonitor.NETWORK_DISCONNECTION_EVENT: case WifiMonitor.SUPPLICANT_STATE_CHANGE_EVENT: + case WifiMonitor.P2P_GROUP_REMOVED_EVENT: case PEER_CONNECTION_USER_ACCEPT: case PEER_CONNECTION_USER_REJECT: case GROUP_CREATING_TIMED_OUT: break; + /* unexpected group created, remove */ + case WifiMonitor.P2P_GROUP_STARTED_EVENT: + mGroup = (WifiP2pGroup) message.obj; + loge("Unexpected group creation, remove " + mGroup); + mWifiNative.p2pGroupRemove(mGroup.getInterface()); + break; + case WifiMonitor.P2P_GROUP_FORMATION_FAILURE_EVENT: + loge("Unexpected group failure, flush peers"); + mWifiNative.p2pFlush(); + break; default: loge("Unhandled message " + message); return NOT_HANDLED; @@ -476,6 +490,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { if (DBG) logd(getName()); sendP2pStateChangedBroadcast(true); mNetworkInfo.setIsAvailable(true); + sendP2pConnectionChangedBroadcast(); initializeP2pSettings(); } @@ -561,9 +576,11 @@ public class WifiP2pService extends IWifiP2pManager.Stub { //If peer is a GO, we do not need to send provisional discovery, //the supplicant takes care of it. if (mWifiNative.isGroupOwner(mSavedPeerConfig.deviceAddress)) { + if (DBG) logd("Sending join to GO"); p2pConnectWithPinDisplay(mSavedPeerConfig, JOIN_GROUP); transitionTo(mGroupNegotiationState); } else { + if (DBG) logd("Sending prov disc"); transitionTo(mProvisionDiscoveryState); } } @@ -651,9 +668,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { case GROUP_CREATING_TIMED_OUT: if (mGroupCreatingTimeoutIndex == message.arg1) { if (DBG) logd("Group negotiation timed out"); - updateDeviceStatus(mSavedPeerConfig.deviceAddress, WifiP2pDevice.FAILED); - mSavedPeerConfig = null; - sendP2pPeersChangedBroadcast(); + handleGroupCreationFailure(); transitionTo(mInactiveState); } break; @@ -663,12 +678,15 @@ public class WifiP2pService extends IWifiP2pManager.Stub { WifiP2pManager.BUSY); break; case WifiP2pManager.CANCEL_CONNECT: - if (mWifiNative.p2pCancelConnect()) { - replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_SUCCEEDED); - } else { - replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_FAILED, - WifiP2pManager.ERROR); - } + //Do a supplicant p2p_cancel which only cancels an ongoing + //group negotiation. This will fail for a pending provision + //discovery or for a pending user action, but at the framework + //level, we always treat cancel as succeded and enter + //an inactive state + mWifiNative.p2pCancelConnect(); + handleGroupCreationFailure(); + transitionTo(mInactiveState); + replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_SUCCEEDED); break; default: return NOT_HANDLED; @@ -811,9 +829,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { case WifiMonitor.P2P_GO_NEGOTIATION_FAILURE_EVENT: case WifiMonitor.P2P_GROUP_FORMATION_FAILURE_EVENT: if (DBG) logd(getName() + " go failure"); - updateDeviceStatus(mSavedPeerConfig.deviceAddress, WifiP2pDevice.FAILED); - mSavedPeerConfig = null; - sendP2pPeersChangedBroadcast(); + handleGroupCreationFailure(); transitionTo(mInactiveState); break; default: @@ -838,6 +854,10 @@ public class WifiP2pService extends IWifiP2pManager.Stub { setWifiP2pInfoOnGroupFormation(SERVER_ADDRESS); sendP2pConnectionChangedBroadcast(); } + + if (!mPersistGroup) { + mWifiNative.setP2pGroupIdle(mGroup.getInterface(), GROUP_IDLE_TIME_S); + } } @Override @@ -886,6 +906,8 @@ public class WifiP2pService extends IWifiP2pManager.Stub { if (DBG) logd("DhcpInfo: " + dhcpInfo); setWifiP2pInfoOnGroupFormation(dhcpInfo.serverAddress); sendP2pConnectionChangedBroadcast(); + //Turn on power save on client + mWifiNative.setP2pPowerSave(mGroup.getInterface(), true); } else { loge("DHCP failed"); mWifiNative.p2pGroupRemove(mGroup.getInterface()); @@ -1258,6 +1280,8 @@ public class WifiP2pService extends IWifiP2pManager.Stub { //The supplicant default is to support everything, but a bug necessitates //the framework to specify this explicitly mWifiNative.setConfigMethods("keypad display push_button"); + //STA has higher priority over P2P + mWifiNative.setConcurrencyPriority("sta"); mThisDevice.deviceAddress = mWifiNative.p2pGetDeviceAddress(); updateThisDevice(WifiP2pDevice.AVAILABLE); @@ -1269,6 +1293,14 @@ public class WifiP2pService extends IWifiP2pManager.Stub { sendThisDeviceChangedBroadcast(); } + private void handleGroupCreationFailure() { + mSavedPeerConfig = null; + /* After cancelling group formation, new connections on existing peers can fail + * at supplicant. Flush and restart discovery */ + mWifiNative.p2pFlush(); + sendMessage(WifiP2pManager.DISCOVER_PEERS); + } + //State machine initiated requests can have replyTo set to null indicating //there are no recepients, we ignore those reply actions private void replyToMessage(Message msg, int what) { |