在Android11 wifi连接流程中我们代码跟踪到了supplicant中开始associate,关联成功以后就是四次握手然后连接成功。连接成功以后还需要分配IP地址,才可以通信,这一节我们看一下IP地址的获取流程。
一、在ClientModeImpl中有一个函数startIpClient。这个函数会在俩个地方被调用,一个是连接的时候ConnectModeState,一个是连接成功以后进入ObtainingIpState。这俩个地方的区别就是isFilsConnection的不同,连接过程中isFilsConnection为true,把IPClinet先关掉。如果isFilsConnection为flase,则开始处理IP地址分配。
frameworks/opt/net/wifi/service/java/com/android/server/wifi/ClientModeImpl.java
这里我们先看是怎么进入ObtainingIpState的
SupplicantStaIfaceHal中注册了一个Supplicant的回调函数,当supplicant的状态发生改变时这里就会监听到,然后WifiMonitor就会发送statechange的广播。
private class SupplicantVendorStaIfaceHalCallback extends ISupplicantVendorStaIfaceCallback.Stub {
private String mIfaceName;
private SupplicantStaIfaceHalCallback mSupplicantStaIfacecallback;
SupplicantVendorStaIfaceHalCallback(@NonNull String ifaceName, SupplicantStaIfaceHalCallback callback) {
mIfaceName = ifaceName;
mSupplicantStaIfacecallback = callback;
}
@Override
public void onVendorStateChanged(int newState, byte[/* 6 */] bssid, int id,
ArrayList<Byte> ssid, boolean filsHlpSent) {
synchronized (mLock) {
logCallback("onVendorStateChanged");
SupplicantState newSupplicantState =
SupplicantStaIfaceCallbackImpl.supplicantHidlStateToFrameworkState(newState);
WifiSsid wifiSsid = // wifigbk++
WifiGbk.createWifiSsidFromByteArray(NativeUtil.byteArrayFromArrayList(ssid));
String bssidStr = NativeUtil.macAddressFromByteArray(bssid);
if (newSupplicantState == SupplicantState.COMPLETED) {
mWifiMonitor.broadcastNetworkConnectionEvent(
mIfaceName, getCurrentNetworkId(mIfaceName), filsHlpSent, bssidStr);
}
mWifiMonitor.broadcastSupplicantStateChangeEvent(
mIfaceName, getCurrentNetworkId(mIfaceName), wifiSsid, bssidStr, newSupplicantState);
}
}
frameworks/opt/net/wifi/service/java/com/android/server/wifi/WifiMonitor.java
public void broadcastNetworkConnectionEvent(String iface, int networkId, boolean filsHlpSent,
String bssid) {
sendMessage(iface, NETWORK_CONNECTION_EVENT, networkId, filsHlpSent ? 1 : 0, bssid);
}
此时wifi状态机还在ConnectModeState,对于NETWORK_CONNECTION_EVENT的处理结果就是跳转到ObtainingIpState
case WifiMonitor.NETWORK_CONNECTION_EVENT:
if (mVerboseLoggingEnabled) log("Network connection established");
mLastNetworkId = message.arg1;
mSentHLPs = message.arg2 == 1;
if (mSentHLPs) mWifiMetrics.incrementL2ConnectionThroughFilsAuthCount();
mWifiConfigManager.clearRecentFailureReason(mLastNetworkId);
mLastBssid = (String) message.obj;
reasonCode = message.arg2;
// TODO: This check should not be needed after ClientModeImpl refactor.
// Currently, the last connected network configuration is left in
// wpa_supplicant, this may result in wpa_supplicant initiating connection
// to it after a config store reload. Hence the old network Id lookups may not
// work, so disconnect the network and let network selector reselect a new
// network.
config = getCurrentWifiConfiguration();
if (config != null) {
if (mWifiConfigManager.saveAutoConnectedNewNetwork(config.networkId)) {
Log.i(TAG, "Successfully connected to new network " + config.getPrintableSsid());
mAutoConnectNewNetworkResultNotifier.onConnectionAttemptSuccess(config.SSID);
}
mWifiInfo.setBSSID(mLastBssid);
mWifiInfo.setNetworkId(mLastNetworkId);
mWifiInfo.setMacAddress

本文详细介绍了Android 11中WiFi连接成功后IP地址的获取流程,从ClientModeImpl的startIpClient函数开始,经过Supplicant状态监听,到ObtainingIpState状态启动IPClient,最终进入RunningState进行IPv4和IPv6的配置。过程中涉及到DHCPClient的交互,以及如何处理静态和动态IP的情况。
最低0.47元/天 解锁文章
1198





