-
-
Save dmpatel151282/8a22100a917938578ba36b51bf85d4b8 to your computer and use it in GitHub Desktop.
Open the following file from Android framework. | |
- /android/frameworks/base/services/java/com/android/server/ConnectivityService.java | |
- Add below code at appropriate place. | |
// the set of network types that can only be enabled by system/sig apps | |
List mProtectedNetworks; | |
+// Wifi/Eth coexist strategy V0.3 | |
+private NetworkInfo mSecondaryNetworkInfo = null; | |
+private int mActiveSecondaryNetwork = -1; | |
+// End | |
- Go to "handleDisconnect" function. Add below code at appropriate place. | |
int prevNetType = info.getType(); | |
+// Wifi/Eth coexist strategy V0.3 | |
+if (prevNetType == ConnectivityManager.TYPE_WIFI) { | |
+ log("Wifi Disconnected!"); | |
+ mSecondaryNetworkInfo = null; | |
+ mActiveSecondaryNetwork = -1; | |
+} | |
+// End | |
... | |
if (mActiveDefaultNetwork != -1) { | |
sendConnectedBroadcastDelayed(mNetTrackers[mActiveDefaultNetwork].getNetworkInfo(), | |
getConnectivityChangeDelay()); | |
} | |
+// Wifi/Eth coexist strategy V0.3 | |
+if (prevNetType == ConnectivityManager.TYPE_ETHERNET && mActiveSecondaryNetwork != -1) { | |
+ log("Ethernet disconnect, refresh netowrk info to wifi."); | |
+ handleConnect(mSecondaryNetworkInfo); | |
+ log("Add wlan0 default route info"); | |
+ LinkProperties wifiLp = mNetTrackers[mActiveDefaultNetwork].getLinkProperties(); | |
+ String ifname = wifiLp.getInterfaceName(); | |
+ for(RouteInfo r : wifiLp.getRoutes()) { | |
+ try { | |
+ if (r.isDefaultRoute()) { | |
+ log(ifname + "add default route: " + r); | |
+ mNetd.addRoute(ifname, r); | |
+ } | |
+ } catch (Exception e) { | |
+ // never crash - catch them all | |
+ if (DBG) loge("Exception trying to remove a route: " + e); | |
+ //return false; | |
+ } | |
+ } | |
+} | |
+// End | |
- Go to "handleConnectionFailure" function. Add below code at appropriate place. | |
mNetTrackers[info.getType()].setTeardownRequested(false); | |
+// Wifi/Eth coexist strategy V0.3 | |
+if (info.getType() == ConnectivityManager.TYPE_WIFI) { | |
+ log("Wifi Disconnected!"); | |
+ mSecondaryNetworkInfo = null; | |
+ mActiveSecondaryNetwork = -1; | |
+} | |
+// End | |
... | |
if (mActiveDefaultNetwork != -1) { | |
sendConnectedBroadcast(mNetTrackers[mActiveDefaultNetwork].getNetworkInfo()); | |
} | |
+// Wifi/Eth coexixt strategy V0.3 | |
+if (info.getType() == ConnectivityManager.TYPE_ETHERNET && mActiveSecondaryNetwork != -1) { | |
+ log("Ethernet disconnect, refresh netowrk info to wifi.[handleConnectionFailure]"); | |
+ handleConnect(mSecondaryNetworkInfo); | |
+ log("Add wlan0 default route info[handleConnectionFailure]"); | |
+ LinkProperties wifiLp = mNetTrackers[mActiveDefaultNetwork].getLinkProperties(); | |
+ String ifname = wifiLp.getInterfaceName(); | |
+ for(RouteInfo r : wifiLp.getRoutes()) { | |
+ try { | |
+ if (r.isDefaultRoute()) { | |
+ log(ifname + "add default route: " + r); | |
+ mNetd.addRoute(ifname, r); | |
+ } | |
+ } catch (Exception e) { | |
+ // never crash - catch them all | |
+ if (DBG) loge("Exception trying to remove a route: " + e); | |
+ //return false; | |
+ } | |
+ } | |
+} | |
+// End | |
- Go to "handleConnect" function. Add below code at appropriate place. | |
final int newNetType = info.getType(); | |
+// Wifi/Eth coexist strategy V0.3 | |
+log("Connected type: " + newNetType); | |
+log("Current preferred type: " + mNetworkPreference); | |
+// End | |
... | |
// if this is a default net and other default is running | |
// kill the one not preferred | |
if (mNetConfigs[newNetType].isDefault()) { | |
if (mActiveDefaultNetwork != -1 && mActiveDefaultNetwork != newNetType) { | |
if (isNewNetTypePreferredOverCurrentNetType(newNetType)) { | |
+// Wifi/Eth coexist strategy V0.3 | |
+if (newNetType == ConnectivityManager.TYPE_ETHERNET && | |
+ mActiveDefaultNetwork == ConnectivityManager.TYPE_WIFI) { | |
+ log("Wifi already connected, but Eth connected after. Eth&Wifi coexit"); | |
+ mSecondaryNetworkInfo = mNetTrackers[ConnectivityManager.TYPE_WIFI].getNetworkInfo();; | |
+ mActiveSecondaryNetwork = mActiveDefaultNetwork; | |
+ log("Delete wlan0 default route info"); | |
+ LinkProperties wifiLp = mNetTrackers[mActiveDefaultNetwork].getLinkProperties(); | |
+ String ifname = wifiLp.getInterfaceName(); | |
+ for(RouteInfo r : wifiLp.getRoutes()) { | |
+ try { | |
+ if (r.isDefaultRoute()) { | |
+ log(ifname + "remove default route: " + r); | |
+ mNetd.removeRoute(ifname, r); | |
+ } | |
+ } catch (Exception e) { | |
+ // never crash - catch them all | |
+ if (DBG) loge("Exception trying to remove a route: " + e); | |
+ //return false; | |
+ } | |
+ } | |
+} else { | |
+ // tear down the other | |
+ NetworkStateTracker otherNet = mNetTrackers[mActiveDefaultNetwork]; | |
+ if (DBG) { | |
+ log("Policy requires " + otherNet.getNetworkInfo().getTypeName() + | |
+ " teardown"); | |
+ } | |
+ if (!teardown(otherNet)) { | |
+ loge("Network declined teardown request"); | |
+ teardown(thisNet); | |
+ return; | |
+ } | |
+} | |
+// End | |
} else { | |
+// Wifi/Eth coexist strategy V0.3 | |
+if (newNetType == ConnectivityManager.TYPE_WIFI && | |
+ mActiveDefaultNetwork == ConnectivityManager.TYPE_ETHERNET) { | |
+ mSecondaryNetworkInfo = info; | |
+ mActiveSecondaryNetwork = newNetType; | |
+ log("Eth already connected, but wifi connected after. Eth&Wifi coexist."); | |
+ log("Eth default active \t Wifi seconday active"); | |
+ return; | |
+} else { | |
+ // don't accept this one | |
+ if (VDBG) { | |
+ log("Not broadcasting CONNECT_ACTION " + | |
+ "to torn down network " + info.getTypeName()); | |
+ } | |
+ teardown(thisNet); | |
+ return; | |
+} | |
+// End | |
} | |
} | |
synchronized (ConnectivityService.this) { | |
// have a new default network, release the transition wakelock in a second | |
// if it's held. The second pause is to allow apps to reconnect over the | |
// new network | |
if (mNetTransitionWakeLock.isHeld()) { | |
mHandler.sendMessageDelayed(mHandler.obtainMessage( | |
EVENT_CLEAR_NET_TRANSITION_WAKELOCK, | |
mNetTransitionWakeLockSerialNumber, 0), | |
1000); | |
} | |
} | |
mActiveDefaultNetwork = newNetType; | |
// this will cause us to come up initially as unconnected and switching | |
// to connected after our normal pause unless somebody reports us as reall | |
// disconnected | |
mDefaultInetConditionPublished = 0; | |
mDefaultConnectionSequence++; | |
mInetConditionChangeInFlight = false; | |
// Don't do this - if we never sign in stay, grey | |
//reportNetworkCondition(mActiveDefaultNetwork, 100); | |
} | |
- Go to "handleCaptivePortalTrackerCheck" function. Add below code at appropriate place. | |
if (DBG) log("Tear down low priority net " + info.getTypeName()); | |
+// Wifi/Eth coexist strategy V0.3 | |
+//teardown(thisNet); | |
+if (mActiveDefaultNetwork == ConnectivityManager.TYPE_ETHERNET) | |
+ mCaptivePortalTracker.detectCaptivePortal(new NetworkInfo(info)); | |
+// End | |
return; | |
Hello Dharmesh Patel, I am facing the same problem. I would like to have two connections, one wifi and one ethernet.
You had a great fix here. The problem is, that I have to use Android 9 and there were some changes in the code. Could you please help me to map your fix to Android 9 code?
Thanks for your awesome fix anyway :)
Best regards, Tobias.
Hello @tobias,
I will check for Android 9.0. I will update you in few days.
Hello Dharmesh Patel, I am facing the same problem. I would like to have two connections, one wifi and one ethernet.
You had a great fix here. The problem is, that I have to use Android 9 and there were some changes in the code. Could you please help me to map your fix to Android 9 code?
Thanks for your awesome fix anyway :)
Best regards, Tobias.Hello @tobias,
I will check for Android 9.0. I will update you in few days.
Hello @tovias,
Please refer below link and try it.
https://www.fatalerrors.org/a/android-8.1-and-android-5.1-are-connected-via-ethernet.html
Hello @dmpatel151282,
thanks for your fast reply. I will try solving the problem using the link you offered and give an update :)
Hello @dmpatel151282
I made the changes according to the guide, but it doesnt seem to fix my problem. The change of network score seems to work, because if I am connected to ethernet and turn on wifi, ethernet turns off and wifi gets connected. The problem is, that ethernet gets disconnected if I turn on wifi and only gets connected if I turn off wifi. So I am connected to ethernet, wifi off -> turn on wifi, disconnected from ethernet and connected to wifi -> turn wifi off, disconnected from wifi and connected to ethernet.
Thanks for your help
Best regards, Tobias
Hello @dmpatel151282
I made the changes according to the guide, but it doesnt seem to fix my problem. The change of network score seems to work, because if I am connected to ethernet and turn on wifi, ethernet turns off and wifi gets connected. The problem is, that ethernet gets disconnected if I turn on wifi and only gets connected if I turn off wifi. So I am connected to ethernet, wifi off -> turn on wifi, disconnected from ethernet and connected to wifi -> turn wifi off, disconnected from wifi and connected to ethernet.
Thanks for your help
Best regards, Tobias
Hello @TobianVorsmann
I have checked in Android Q based device and Ethernet and WiFi are running at same time.
I will look into it for changes in Android 9 and Android Q. Can you please check parallelly to get solution???
Hello @dmpatel151282
Thanks for your help. I am trying to find a solution parallelly for sure :)
Hello @TobianVorsmann
Have you got any solution of it???
If not then add below patch line in frameworks/base/services/core/java/com/android/server/ConnectivityService.java file.
+ final NetworkRequest mEthernetRequest = createDefaultInternetRequestForTransport(
+ NetworkCapabilities.TRANSPORT_ETHERNET,
+ NetworkRequest.Type.REQUEST);
+ NetworkRequestInfo ethernetNRI = new NetworkRequestInfo(null, mEthernetRequest, new Binder());
+ mNetworkRequests.put(mEthernetRequest, ethernetNRI);
+ mNetworkRequestInfoLogs.log("REGISTER " + ethernetNRI);
mDefaultMobileDataRequest = createDefaultInternetRequestForTransport(
| NetworkCapabilities.TRANSPORT_CELLULAR, NetworkRequest.Type.BACKGROUND_REQUEST);
I have tried in Android Q and it's working.
Hello Dharmesh Patel, I am facing the same problem. I would like to have two connections, one wifi and one ethernet.
You had a great fix here. The problem is, that I have to use Android 9 and there were some changes in the code. Could you please help me to map your fix to Android 9 code?
Thanks for your awesome fix anyway :)
Best regards, Tobias.