您的位置:首页 > 移动开发 > Android开发

[RK3288][Android6.0] WiFi之wpa_supplicant的socket(服务端)

2017-06-29 15:01 399 查看
Platform: Rockchip

OS: Android 6.0

Kernel: 3.10.92

研究了Framework客户端如何打开连接上wpa_supplicant(WPAS)后,再来看看WPAS如何打开了与Framework通信的socket.

external/wpa_supplicant_8/wpa_supplicant/main.c

int main(int argc, char *argv[])
{
//'g'正是对应init.connectivity.rc参数中的-g@android:wpa_wlan0
//ctrl_interface的值就是“@android:wpa_wlan0了”
case 'g':
params.ctrl_interface = optarg;
//参数被传进去初始化
global = wpa_supplicant_init(¶ms);
}


wpa_supplicant.c

struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
{
//放到global中
if (params->ctrl_interface)
global->params.ctrl_interface =
os_strdup(params->ctrl_interface);
//继续传进去处理
global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
}


ctrl_iface_unix.c

wpa_supplicant_global_ctrl_iface_init(struct wpa_global *global)
{
if (wpas_global_ctrl_iface_open_sock(global, priv) < 0) {
os_free(priv);
return NULL;
}
//对应的发送给framework的回调函数
wpa_msg_register_cb(wpa_supplicant_ctrl_iface_msg_cb);
}


static int wpas_global_ctrl_iface_open_sock(struct wpa_global *global,
struct ctrl_iface_global_priv *priv)
{
if (os_strncmp(ctrl, "@android:", 9) == 0) {
//ctrl+9之后的值正是wpa_wlan0,和init.connectivity.rc中的socket name一致。
//获取服务端对应的socket,创建是在解析rc文件的时候已经完成了。
priv->sock = android_get_control_socket(ctrl + 9);
goto havesock;
}
//注册回调函数wpa_supplicant_global_ctrl_iface_receive(),如果client有发命令过来,此函数就会被调用。
eloop_register_read_sock(priv->sock,
wpa_supplicant_global_ctrl_iface_receive,
global, priv);
}


参考:

android使用socket使底层和framework通信

网络编程学习笔记一:Socket编程

Android get control socket

Android localsocket 的基础和使用实践: 01
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: