zoukankan      html  css  js  c++  java
  • wpa_supplicant上行接口浅析

    摘自http://blog.csdn.net/fxfzz/article/details/6176414

    wpa_supplicant提供的接口

    从通信层次上划分,

    上行接口:wpa_supplicant提供向上的控制接口 control interface,用于与其他模块(如UI)进行通信,其他模块可以通过control interface 来获取信息或下发命令。

    下行接口:wpa_supplicant通过socket通信机制实现下行接口,与内核进行通信,获取信息或下发命令。

    本篇博文主要分析wpa_supplicant的上行接口。

    一共有两种方式:一种基于传统dbus机制实现与其他进程间的IPC通信;另一种通过Unix domain socket机制实现进程间的IPC通信。

    Dbus接口

    该接口主要在文件“ctrl_iface_dbus.h”,“ctrl_iface_dbus.c”,“ctrl_iface_dbus_handler.h”和“ctrl_iface_dbus_handler.c”中实现,提供一些基本的控制方法。

    DBusMessage * wpas_dbus_new_invalid_iface_error(DBusMessage *message);
     
    DBusMessage * wpas_dbus_global_add_interface(DBusMessage *message,
                                            struct wpa_global *global);
     
    DBusMessage * wpas_dbus_global_remove_interface(DBusMessage *message,
                                              struct wpa_global *global);
     
    DBusMessage * wpas_dbus_global_get_interface(DBusMessage *message,
                                            struct wpa_global *global);
     
    DBusMessage * wpas_dbus_global_set_debugparams(DBusMessage *message,
                                              struct wpa_global *global);
     
    DBusMessage * wpas_dbus_iface_scan(DBusMessage *message,
                                   struct wpa_supplicant *wpa_s);
     
    DBusMessage * wpas_dbus_iface_scan_results(DBusMessage *message,
                                          struct wpa_supplicant *wpa_s);
     
    DBusMessage * wpas_dbus_bssid_properties(DBusMessage *message,
                                        struct wpa_supplicant *wpa_s,
                                        struct wpa_scan_res *res);
     
    DBusMessage * wpas_dbus_iface_capabilities(DBusMessage *message,
                                          struct wpa_supplicant *wpa_s);
     
    DBusMessage * wpas_dbus_iface_add_network(DBusMessage *message,
                                         struct wpa_supplicant *wpa_s);
     
    DBusMessage * wpas_dbus_iface_remove_network(DBusMessage *message,
                                            struct wpa_supplicant *wpa_s);
     
    DBusMessage * wpas_dbus_iface_set_network(DBusMessage *message,
                                         struct wpa_supplicant *wpa_s,
                                         struct wpa_ssid *ssid);
     
    DBusMessage * wpas_dbus_iface_enable_network(DBusMessage *message,
                                            struct wpa_supplicant *wpa_s,
                                            struct wpa_ssid *ssid);
     
    DBusMessage * wpas_dbus_iface_disable_network(DBusMessage *message,
                                             struct wpa_supplicant *wpa_s,
                                             struct wpa_ssid *ssid);
     
    DBusMessage * wpas_dbus_iface_select_network(DBusMessage *message,
                                                 struct wpa_supplicant *wpa_s);
     
    DBusMessage * wpas_dbus_iface_disconnect(DBusMessage *message,
                                        struct wpa_supplicant *wpa_s);
     
    DBusMessage * wpas_dbus_iface_set_ap_scan(DBusMessage *message,
                                              struct wpa_supplicant *wpa_s);
     
    DBusMessage * wpas_dbus_iface_set_smartcard_modules(
           DBusMessage *message, struct wpa_supplicant *wpa_s);
     
    DBusMessage * wpas_dbus_iface_get_state(DBusMessage *message,
                                       struct wpa_supplicant *wpa_s);
     
    DBusMessage * wpas_dbus_iface_get_scanning(DBusMessage *message,
                                          struct wpa_supplicant *wpa_s);
     
    DBusMessage * wpas_dbus_iface_set_blobs(DBusMessage *message,
                                        struct wpa_supplicant *wpa_s);
     
    DBusMessage * wpas_dbus_iface_remove_blobs(DBusMessage *message,
                                          struct wpa_supplicant *wpa_s);
    Dbus接口方法

    Unix domain socket 接口

    该接口主要在文件“wpa_ctrl.h”,“wpa_ctrl.c”,“ctrl_iface_unix.c”,“ctrl_iface.h”和“ctrl_iface.c”实现。

    (1“wpa_ctrl.h”,“wpa_ctrl.c”完成对control interface的封装,对外提供统一的接口。其主要的工作是通过Unix domain socket建立一个control interface 的client结点,与作为server的wpa_supplicant结点通信。

    主要功能函数:

    struct wpa_ctrl * wpa_ctrl_open(const char *ctrl_path);
    /* 建立并初始化一个Unix domain socket的client结点,并与作为server的wpa_supplicant结点绑定 */
    
    void wpa_ctrl_close(struct wpa_ctrl *ctrl);
    /* 撤销并销毁已建立的Unix domain socket的client结点 */
     
    int wpa_ctrl_request(struct wpa_ctrl *ctrl, const char *cmd, size_t cmd_len,
                       char *reply, size_t *reply_len,
                       void (*msg_cb)(char *msg, size_t len));
     
    /* 用户模块直接调用该函数对wpa_supplicant发送命令并获取所需信息 */
    
     
    int wpa_ctrl_attach(struct wpa_ctrl *ctrl);
    /* 注册 某个 control interface 作为 monitor interface */
     
    int wpa_ctrl_detach(struct wpa_ctrl *ctrl);
    /* 撤销某个 monitor interface 为 普通的 control interface  */
     
    int wpa_ctrl_pending(struct wpa_ctrl *ctrl);
    /* 判断是否有挂起的event 事件 */
     
    int wpa_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len);
    /* 获取挂起的event 事件 */
    Unix domain socket

    Note:
    Wpa_supplicant 提供两种由外部模块获取信息的方式:一种是外部模块通过发送request 命令然后获取response的问答模式;另一种是wpa_supplicant主动向外部发送event事件,由外部模块监听接收。

    一般的常用做法是外部模块通过调用wpa_ctrl_open()两次,建立两个control interface接口,一个为ctrl interface,用于发送命令,获取信息,另一个为monitor interface,用于监听接收来自于wpa_supplicant的event时间。此举可以降低通信的耦合性,避免response和event的相互干扰。

    (2)“ctrl_iface_unix.c”实现wpa_supplicant的Unix domain socket通信机制中server结点,完成对client结点的响应。

    其中最主要的两个函数为:

    static void wpa_supplicant_ctrl_iface_receive(int sock, void *eloop_ctx,
                                             void *sock_ctx)
    /* 接收并解析client发送request命令,然后根据不同的命令调用底层不同的处理函数;
     * 然后将获得response结果回馈到 client 结点。
     */
     
    static void wpa_supplicant_ctrl_iface_send(struct ctrl_iface_priv *priv,
                                          int level, const char *buf,
                                          size_t len)
    /* 向注册的monitor interfaces 主动发送event事件 */

    wpa_supplicant_ctrl_iface_receive方法主要用在wpa_supplicant监听client发送过来的命令。

    原理:eloop_run方法一直在监听socket的变化,一旦发现client的socket有变化,就会调用与该socket绑定的handler方法处理,在这里,该handler方法即为wpa_supplicant_ctrl_iface_receive方法。

    3)“ctrl_iface.h”和“ctrl_iface.c”主要实现了各种request命令的底层处理函数。

  • 相关阅读:
    C++实现二叉树的相应操作
    C++对文件的操作
    C++与C的区别二
    C++多线程编程二
    C++多线程编程一
    C语言多线程编程二
    C语言多线程编程一
    HTML练习(三)
    磁盘/内存模式查询数据
    RestTemplate使用不当引发的问题分析
  • 原文地址:https://www.cnblogs.com/chenbin7/p/3266164.html
Copyright © 2011-2022 走看看