wifi学习记录

/external/wpa_supplicant_8/wpa_supplicant/ctrl_iface.c

该类是底层用于对接上层com.android.server.wifi.WifiNative类

WifiNative 通过链接库文件libwifi-service.so

/* Native functions are defined in libwifi-service.so */
        System.loadLibrary("wifi-service");

通过doBooleanCommandNative方法,向ctrl_iface传入操作命令字符串,从而起到方法调用的动能。

举例要添加一个wifi network,则需要上层WifiNative点用ctrl_iface的wpa_supplicant_ctrl_iface_process并传入ADD_NETWORK命令字符串以及相关的参数(网络编号)

else if (os_strcmp(buf, "ADD_NETWORK") == 0) {
reply_len = wpa_supplicant_ctrl_iface_add_network(
wpa_s, reply, reply_size);
}

这中间还经由ctrl_iface_unix.c文件的wpa_supplicant_ctrl_iface_receive方法


我wifi完成添加网络的调用步骤:

WifiNative

ctrl_iface_unix : wpa_supplicant_ctrl_iface_receive

ctrl_iface : wpa_supplicant_ctrl_iface_process

ctrl_iface : wpa_supplicant_ctrl_iface_add_network

这里面实际上真正的添加网络操作在wpa_supplicant_ctrl_iface_add_network里

wpa_supplicant_ctrl_iface_add_network

首先ssid = wpa_config_add_network(wpa_s->conf);添加网络,并返回一个ssid,ssid代表了该网络的身份标识。

然后通过wpa_config_set_network_defaults初始化wifi网络信息.。(config.c::wpa_config_set_network_defaults)

/**
 * wpa_config_set_network_defaults - Set network default values
 * @ssid: Pointer to network configuration data
 */
void wpa_config_set_network_defaults(struct wpa_ssid *ssid)


然后SET_NETWORK流程查看:

} else if (os_strncmp(buf, "SET_NETWORK ", 12) == 0) {
if (wpa_supplicant_ctrl_iface_set_network(wpa_s, buf + 12))

最终调用:wpa_supplicant_ctrl_iface_update_network

ret = wpa_config_set(ssid, name, value, 0); 设置值。

根据name判断是否是‘psk’和'priority',做相应的处理

if ((os_strcmp(name, "psk") == 0 &&
    value[0] == '"' && ssid->ssid_len) ||
   (os_strcmp(name, "ssid") == 0 && ssid->passphrase))
wpa_config_update_psk(ssid);
else if (os_strcmp(name, "priority") == 0)
wpa_config_update_prio_list(wpa_s->conf);

其中wpa_config_update_prio_list具体实现如下:

int wpa_config_update_prio_list(struct wpa_config *config)    (config.c::wpa_config_set_network_defaults)
{
struct wpa_ssid *ssid;
int ret = 0;


os_free(config->pssid);
config->pssid = NULL;
config->num_prio = 0;


ssid = config->ssid;
while (ssid) {
ssid->pnext = NULL;
if (wpa_config_add_prio_network(config, ssid) < 0)
ret = -1;
ssid = ssid->next;
}


return ret;
}

enable wifi network

将会调用到wpa_supplicant.c文件,wpa_supplicant_enable_network,wpa_supplicant_enable_one_network, 然后会启动scan,

wpa_supplicant_req_scan(wpa_s, 0, 0);


你可能感兴趣的:(Android)