Loading wifi/java/android/net/wifi/WifiNative.java +42 −0 Original line number Diff line number Diff line Loading @@ -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"); Loading @@ -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; Loading Loading @@ -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"); } Loading wifi/java/android/net/wifi/p2p/WifiP2pService.java +44 −12 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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; Loading Loading @@ -476,6 +490,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { if (DBG) logd(getName()); sendP2pStateChangedBroadcast(true); mNetworkInfo.setIsAvailable(true); sendP2pConnectionChangedBroadcast(); initializeP2pSettings(); } Loading Loading @@ -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); } } Loading Loading @@ -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; Loading @@ -663,12 +678,15 @@ public class WifiP2pService extends IWifiP2pManager.Stub { WifiP2pManager.BUSY); break; case WifiP2pManager.CANCEL_CONNECT: if (mWifiNative.p2pCancelConnect()) { //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); } else { replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_FAILED, WifiP2pManager.ERROR); } break; default: return NOT_HANDLED; Loading Loading @@ -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: Loading @@ -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 Loading Loading @@ -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()); Loading Loading @@ -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); Loading @@ -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) { Loading Loading
wifi/java/android/net/wifi/WifiNative.java +42 −0 Original line number Diff line number Diff line Loading @@ -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"); Loading @@ -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; Loading Loading @@ -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"); } Loading
wifi/java/android/net/wifi/p2p/WifiP2pService.java +44 −12 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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; Loading Loading @@ -476,6 +490,7 @@ public class WifiP2pService extends IWifiP2pManager.Stub { if (DBG) logd(getName()); sendP2pStateChangedBroadcast(true); mNetworkInfo.setIsAvailable(true); sendP2pConnectionChangedBroadcast(); initializeP2pSettings(); } Loading Loading @@ -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); } } Loading Loading @@ -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; Loading @@ -663,12 +678,15 @@ public class WifiP2pService extends IWifiP2pManager.Stub { WifiP2pManager.BUSY); break; case WifiP2pManager.CANCEL_CONNECT: if (mWifiNative.p2pCancelConnect()) { //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); } else { replyToMessage(message, WifiP2pManager.CANCEL_CONNECT_FAILED, WifiP2pManager.ERROR); } break; default: return NOT_HANDLED; Loading Loading @@ -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: Loading @@ -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 Loading Loading @@ -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()); Loading Loading @@ -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); Loading @@ -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) { Loading