1wpa_cli 与 wpa_supplicant 之间通信关键函数:
(1)wpa_cli发送命令到wpa_supplicant
static void wpa_request(struct wpa_ctrl *ctrl, int argc, char *argv[])
-1-> static const struct wpa_cli_cmd wpa_cli_commands[] = {{ "status", wpa_cli_cmd_status, NULL, cli_cmd_flag_none, ...} //支持的命令
-1-2-> 如 static int wpa_cli_cmd_add_network(struct wpa_ctrl *ctrl, int argc, char *argv[]) //以添加网络为例。
(2)wpa_supplicant接收wpa_cli发过来的命令:
ctrl_iface_unix.c 文件:
static void wpa_supplicant_ctrl_iface_receive(int sock, void *eloop_ctx,void *sock_ctx)
-1-> char * wpa_supplicant_ctrl_iface_process(struct wpa_supplicant *wpa_s,char *buf, size_t *resp_len)
(3)wpa_supplicant发送URC命令到wpa_cli
static void wpa_supplicant_ctrl_iface_msg_cb(void *ctx, int level,
enum wpa_msg_type type,
const char *txt, size_t len)
static void wpa_supplicant_ctrl_iface_send(struct wpa_supplicant *wpa_s,
const char *ifname, int sock,
struct dl_list *ctrl_dst,
int level, const char *buf,
size_t len,
struct ctrl_iface_priv *priv,
struct ctrl_iface_global_priv *gp) //遍历所有客户端。
2 wpa_supplicant与内核cfg80211通信。
(1)wpa_supplicant 发送netlink消息 到内核
//创建两个netlink套接字。一个用于发送命令;一个用于接收内核的组播事件。
static int wpa_driver_nl80211_init_nl_global(struct nl80211_global *global)
(2)wpa_supplicant接收内核cfg80211事件:
static void wpa_driver_nl80211_event_receive(int sock, void *eloop_ctx, void *handle)
int process_global_event(struct nl_msg *msg, void *arg)
int process_bss_event(struct nl_msg *msg, void *arg) //特定BSS事件
(3)wpa_supplicant发送netlink消息到内核cfg80211
//以发送NL80211_CMD_SET_KEY命令为例。
static int wpa_driver_nl80211_set_key(struct i802_bss *bss, struct wpa_driver_set_key_params *params)
//构造消息
static struct nl_msg * nl80211_ifindex_msg(struct wpa_driver_nl80211_data *drv, int ifindex, int flags, uint8_t cmd)
//发送消息并取得响应。
int send_and_recv_msgs(struct wpa_driver_nl80211_data *drv,
struct nl_msg *msg,
int (*valid_handler)(struct nl_msg *, void *),
void *valid_data,
int (*ack_handler_custom)(struct nl_msg *, void *),
void *ack_data);
3 cfg80211模块与HDD驱动通信
(1)HDD驱动初始化时注册cfg80211_ops到cfg80211模块。
cfg80211模块EXPORT_SYMBOL很多通用函数。通常HDD上报URC消息到cfg80211模块时调这些函数。
static struct cfg80211_ops wlan_hdd_cfg80211_ops = {
.add_virtual_intf = wlan_hdd_add_virtual_intf,..}
(2)cfg80211模块 发送消息到HDD驱动,调用cfg80211_ops函数。
如 wlan_hdd_cfg80211_start_ap
wlan_hdd_cfg80211_scan
wlan_hdd_cfg80211_connect
wlan_hdd_cfg80211_disconnect
(3)HDD上报 URC 消息到cfg80211模块
HDD可以调用,如注册wiphy_register
AP下有STA连接 cfg80211_new_sta
完整性检查失败报告:cfg80211_michael_mic_failure
4 内核网络设备模块与HDD驱动通信
(1)HDD驱动初始化时注册register_netdevice 网卡到内核网络设备模块。
static const struct net_device_ops wlan_drv_ops = {
.ndo_open = hdd_open,...}
当网络栈有数据传输时,调用net_device_ops里面函数ndo_start_xmit
(2)HDD接收数据
HDD驱动收到数据时,调用内核网络设备模块传递数据到网络栈。
netif_rx
netif_rx_ni
但由于RX阶段,主要在软中断上下文处理。
(3)HDD模块与内核网络设备模块 其他控制类操作。
$(kernel_root)/include/linux/netdevice.h函数是内核网络设备模块核心。
例如HDD调用了netif_tx_stop_all_queues