wpa_supplicant配置文件中的 ctrl_interface的理解

1)下面我们看wpa_supplicant的启动:
wpa_supplicant -Dwext -iwlan0 -c/data/misc/wifi/wpa_supplicant.conf
wpa_supplicant.conf配置文件中:
ctrl_interface =/data/system/wpa_supplicant


2)在最终处理配置文件的函数是:
int wpa_supplicant_reload_configuration(struct wpa_supplicant *wpa_s)


3)最终调用配置文件中的ctrl_interface是:
struct ctrl_iface_priv *wpa_supplicant_ctrl_iface_init(struct wpa_supplicant *wpa_s)
{
。。。。。。。。。。。。。
if (wpa_s->conf->ctrl_interface == NULL)
//注意wpa_s->conf->ctrl_interface就是配置文件中的ctrl_interface,如果没有就不会创建socket
return priv;
if (wpas_ctrl_iface_open_sock(wpa_s, priv) < 0) {
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
}
4)分析wpas_ctrl_iface_open_sock()
static int wpas_ctrl_iface_open_sock(struct wpa_supplicant *wpa_s, struct ctrl_iface_priv *priv)
{
。。。。。。。。。
buf = os_strdup(wpa_s->conf->ctrl_interface);
。。。。。。。。。
if (os_strncmp(buf, "DIR=", 4) == 0) {
dir = buf + 4;
gid_str = os_strstr(dir, " GROUP=");
if (gid_str) {
*gid_str = '\0';
gid_str += 7;
}
} else {
dir = buf;
gid_str = wpa_s->conf->ctrl_interface_group;
}
if (mkdir(dir, S_IRWXU | S_IRWXG) < 0) {//会根据配置文件的ctrl_interface路径,创建目录
。。。。。。。。。。
if (chmod(dir, S_IRWXU | S_IRWXG) < 0) {
。。。。。。。。。。。。。。
fname = wpa_supplicant_ctrl_iface_path(wpa_s);
os_strlcpy(addr.sun_path, fname, sizeof(addr.sun_path));
if (connect(priv->sock, (struct sockaddr *) &addr,
。。。。。。。。。。。。。。。。
--------------------------------------------------------------------------------------



5)分析wpa_supplicant_ctrl_iface_path()此函数生成socket的sun_path,即网络控制节点名字
static char * wpa_supplicant_ctrl_iface_path(struct wpa_supplicant *wpa_s)
{
。。。。。。
res = os_snprintf(buf, len, "%s/%s", dir, wpa_s->ifname);
//注意wpa_s->ifname是我们启动wap_supplicant的参数-iwlan0,dir是配置文件中的ctrl_interface,所以socket的sun_path就是配置文件中的ctrl_interface +参数指定的-iwlan0
。。。。
}


至此,我们可以得出结论,
1)如果使用配置文件配置ctrl_interface
wap_supplicant的socket通信(wap_supplicant与wap_cli之间通信)的sun_path等于ctrl_interface +参数指定的-iwlan0
2)配置文件中也可以不指定ctrl_interface,但是wap_supplicant运行的参数中加上-C/data/system/wpa_supplicant

二、如果我们调用命令wpa_cli


wpa_cli -p/data/system/wpa_supplicant -iwlan0

1)-p/data/system/wpa_supplicant
就是wpa_supplicant.conf指定的ctrl_interface,或者参数-C/data/system/wpa_supplicant
2)-iwlan0 就是wpa_supplicant运行时指定的接口

三、另外还有一种方式直接指定wap_supplicant的socket通信(wap_supplicant与wap_cli之间通信)的sun_path。

wap_supplicant运行时候 加上-g参数,可以直接指定sun_path。


代码分析
struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
-------wpa_supplicant_global_ctrl_iface_init
{……..
if (global->params.ctrl_interface == NULL)
//params.ctrl_interface就是-g参数指定的内容
if (wpas_global_ctrl_iface_open_sock(global, priv) < 0) {
}

你可能感兴趣的:(c)