Skip to content

Commit d4a149d

Browse files
isheriffAndroid (Google) Code Review
authored andcommitted
Merge "Frequency conflict handling" into jb-mr1-dev
2 parents fc2652e + 9f452d0 commit d4a149d

File tree

3 files changed

+194
-31
lines changed

3 files changed

+194
-31
lines changed

wifi/java/android/net/wifi/WifiMonitor.java

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ public class WifiMonitor {
178178

179179
private static final String P2P_GO_NEG_SUCCESS_STR = "P2P-GO-NEG-SUCCESS";
180180

181+
/* P2P-GO-NEG-FAILURE status=x */
181182
private static final String P2P_GO_NEG_FAILURE_STR = "P2P-GO-NEG-FAILURE";
182183

183184
private static final String P2P_GROUP_FORMATION_SUCCESS_STR =
@@ -566,6 +567,26 @@ private void handleWpsFailEvent(String dataString) {
566567
WifiManager.ERROR, 0));
567568
}
568569

570+
/* <event> status=<err> and the special case of <event> reason=FREQ_CONFLICT */
571+
private P2pStatus p2pError(String dataString) {
572+
P2pStatus err = P2pStatus.UNKNOWN;
573+
String[] tokens = dataString.split(" ");
574+
if (tokens.length < 2) return err;
575+
String[] nameValue = tokens[1].split("=");
576+
if (nameValue.length != 2) return err;
577+
578+
/* Handle the special case of reason=FREQ+CONFLICT */
579+
if (nameValue[1].equals("FREQ_CONFLICT")) {
580+
return P2pStatus.NO_COMMON_CHANNEL;
581+
}
582+
try {
583+
err = P2pStatus.valueOf(Integer.parseInt(nameValue[1]));
584+
} catch (NumberFormatException e) {
585+
e.printStackTrace();
586+
}
587+
return err;
588+
}
589+
569590
/**
570591
* Handle p2p events
571592
*/
@@ -582,11 +603,11 @@ private void handleP2pEvents(String dataString) {
582603
} else if (dataString.startsWith(P2P_GO_NEG_SUCCESS_STR)) {
583604
mStateMachine.sendMessage(P2P_GO_NEGOTIATION_SUCCESS_EVENT);
584605
} else if (dataString.startsWith(P2P_GO_NEG_FAILURE_STR)) {
585-
mStateMachine.sendMessage(P2P_GO_NEGOTIATION_FAILURE_EVENT);
606+
mStateMachine.sendMessage(P2P_GO_NEGOTIATION_FAILURE_EVENT, p2pError(dataString));
586607
} else if (dataString.startsWith(P2P_GROUP_FORMATION_SUCCESS_STR)) {
587608
mStateMachine.sendMessage(P2P_GROUP_FORMATION_SUCCESS_EVENT);
588609
} else if (dataString.startsWith(P2P_GROUP_FORMATION_FAILURE_STR)) {
589-
mStateMachine.sendMessage(P2P_GROUP_FORMATION_FAILURE_EVENT);
610+
mStateMachine.sendMessage(P2P_GROUP_FORMATION_FAILURE_EVENT, p2pError(dataString));
590611
} else if (dataString.startsWith(P2P_GROUP_STARTED_STR)) {
591612
mStateMachine.sendMessage(P2P_GROUP_STARTED_EVENT, new WifiP2pGroup(dataString));
592613
} else if (dataString.startsWith(P2P_GROUP_REMOVED_STR)) {
@@ -595,17 +616,7 @@ private void handleP2pEvents(String dataString) {
595616
mStateMachine.sendMessage(P2P_INVITATION_RECEIVED_EVENT,
596617
new WifiP2pGroup(dataString));
597618
} else if (dataString.startsWith(P2P_INVITATION_RESULT_STR)) {
598-
String[] tokens = dataString.split(" ");
599-
if (tokens.length != 2) return;
600-
String[] nameValue = tokens[1].split("=");
601-
if (nameValue.length != 2) return;
602-
P2pStatus err = P2pStatus.UNKNOWN;
603-
try {
604-
err = P2pStatus.valueOf(Integer.parseInt(nameValue[1]));
605-
} catch (NumberFormatException e) {
606-
e.printStackTrace();
607-
}
608-
mStateMachine.sendMessage(P2P_INVITATION_RESULT_EVENT, err);
619+
mStateMachine.sendMessage(P2P_INVITATION_RESULT_EVENT, p2pError(dataString));
609620
} else if (dataString.startsWith(P2P_PROV_DISC_PBC_REQ_STR)) {
610621
mStateMachine.sendMessage(P2P_PROV_DISC_PBC_REQ_EVENT,
611622
new WifiP2pProvDiscEvent(dataString));

wifi/java/android/net/wifi/WifiStateMachine.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ public class WifiStateMachine extends StateMachine {
114114

115115
private final boolean mP2pSupported;
116116
private final AtomicBoolean mP2pConnected = new AtomicBoolean(false);
117+
private boolean mTemporarilyDisconnectWifi = false;
117118
private final String mPrimaryDeviceType;
118119

119120
/* Scan results handling */
@@ -2017,6 +2018,10 @@ public boolean processMessage(Message message) {
20172018
NetworkInfo info = (NetworkInfo) message.obj;
20182019
mP2pConnected.set(info.isConnected());
20192020
break;
2021+
case WifiP2pService.DISCONNECT_WIFI_REQUEST:
2022+
mTemporarilyDisconnectWifi = (message.arg1 == 1);
2023+
replyToMessage(message, WifiP2pService.DISCONNECT_WIFI_RESPONSE);
2024+
break;
20202025
default:
20212026
loge("Error! unhandled message" + message);
20222027
break;
@@ -3030,6 +3035,15 @@ public boolean processMessage(Message message) {
30303035
transitionTo(mDisconnectedState);
30313036
}
30323037
break;
3038+
case WifiP2pService.DISCONNECT_WIFI_REQUEST:
3039+
if (message.arg1 == 1) {
3040+
mWifiNative.disconnect();
3041+
mTemporarilyDisconnectWifi = true;
3042+
} else {
3043+
mWifiNative.reconnect();
3044+
mTemporarilyDisconnectWifi = false;
3045+
}
3046+
break;
30333047
/* Do a redundant disconnect without transition */
30343048
case CMD_DISCONNECT:
30353049
mWifiNative.disconnect();
@@ -3159,6 +3173,13 @@ public boolean processMessage(Message message) {
31593173
mWifiNative.disconnect();
31603174
transitionTo(mDisconnectingState);
31613175
break;
3176+
case WifiP2pService.DISCONNECT_WIFI_REQUEST:
3177+
if (message.arg1 == 1) {
3178+
mWifiNative.disconnect();
3179+
mTemporarilyDisconnectWifi = true;
3180+
transitionTo(mDisconnectingState);
3181+
}
3182+
break;
31623183
case CMD_SET_SCAN_MODE:
31633184
if (message.arg1 == SCAN_ONLY_MODE) {
31643185
sendMessage(CMD_DISCONNECT);
@@ -3465,6 +3486,13 @@ public void enter() {
34653486
if (DBG) log(getName() + "\n");
34663487
EventLog.writeEvent(EVENTLOG_WIFI_STATE_CHANGED, getName());
34673488

3489+
// We dont scan frequently if this is a temporary disconnect
3490+
// due to p2p
3491+
if (mTemporarilyDisconnectWifi) {
3492+
mWifiP2pChannel.sendMessage(WifiP2pService.DISCONNECT_WIFI_RESPONSE);
3493+
return;
3494+
}
3495+
34683496
mFrameworkScanIntervalMs = Settings.Global.getLong(mContext.getContentResolver(),
34693497
Settings.Global.WIFI_FRAMEWORK_SCAN_INTERVAL_MS,
34703498
mDefaultFrameworkScanIntervalMs);
@@ -3579,6 +3607,12 @@ public boolean processMessage(Message message) {
35793607
sendMessageDelayed(obtainMessage(CMD_NO_NETWORKS_PERIODIC_SCAN,
35803608
++mPeriodicScanToken, 0), mSupplicantScanIntervalMs);
35813609
}
3610+
case CMD_RECONNECT:
3611+
case CMD_REASSOCIATE:
3612+
// Drop a third party reconnect/reassociate if we are
3613+
// tempoarily disconnected for p2p
3614+
if (mTemporarilyDisconnectWifi) ret = NOT_HANDLED;
3615+
break;
35823616
default:
35833617
ret = NOT_HANDLED;
35843618
}

0 commit comments

Comments
 (0)