Android11 Wifi连接流程之IP地址分配

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

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
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值