Platform: Rockchip
OS: Android 6.0
Kernel: 3.10.92
前面了解了Framework和WPAS的socket交互,这里再看看WPAS和kernel的socket交互。
入口:
select_driver -> wpa_drivers[i]->global_init -> nl80211_global_init
static void * nl80211_global_init(void)
{
//两个回调函数,收到内核事件会调用
cfg->newlink_cb = wpa_driver_nl80211_event_rtm_newlink;
cfg->dellink_cb = wpa_driver_nl80211_event_rtm_dellink;
//初始化netlink socket,用来接收网卡的状态变化事件,创建或删除网络接口
global->netlink = netlink_init(cfg);
//netlink和driver交互初始化,这里创建的是generic netlink的socket,
if (wpa_driver_nl80211_init_nl_global(global) < 0)
//控制网口up/down,获取hwaddr的socket
global->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0);
}
rtnetlinks socket:
struct netlink_data * netlink_init(struct netlink_config *cfg)
{
//创建netlink类型socket,这种类型用于和kernel通信
netlink->sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
//注册收取内核事件回调函数,它会调用上面的newlink_cb函数
eloop_register_read_sock(netlink->sock, netlink_receive, netlink,
NULL);