blob: dbfba561051d0b7fa53334d4e702b9f5da30c29b [file] [log] [blame]
/*
* Copyright (c) 2019 The Linux Foundation. All rights reserved.
*
* wpa_supplicant/hostapd control interface library
* Copyright (c) 2004-2006, Jouni Malinen <j@w1.fi>
*
* This software may be distributed under the terms of the BSD license.
* redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* 3. Neither the name(s) of the above-listed copyright holder(s) nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef WIFIHAL_CTRL_H
#define WIFIHAL_CTRL_H
#include <sys/un.h>
#include <unistd.h>
#include <fcntl.h>
#include "stdlib.h"
#ifdef ANDROID
#include <dirent.h>
#include <grp.h>
#include <pwd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <cutils/sockets.h>
#endif /* ANDROID */
#ifdef __cplusplus
extern "C" {
#endif
/**
* struct wifihal_ctrl - Internal structure for control interface library
*
* This structure is used by the clients to interface with WiFi Hal
* library to store internal data. Programs using the library should not touch
* this data directly. They can only use the pointer to the data structure as
* an identifier for the control interface connection and use this as one of
* the arguments for most of the control interface library functions.
*/
struct wifihal_ctrl {
int s;
struct sockaddr_un local;
struct sockaddr_un dest;
};
#ifndef CONFIG_CTRL_IFACE_CLIENT_DIR
#define CONFIG_CTRL_IFACE_CLIENT_DIR "/dev/socket/wifihal"
#endif /* CONFIG_CTRL_IFACE_CLIENT_DIR */
#ifndef CONFIG_CTRL_IFACE_CLIENT_PREFIX
#define CONFIG_CTRL_IFACE_CLIENT_PREFIX "wifihal_ctrl_cli_"
#endif /* CONFIG_CTRL_IFACE_CLIENT_PREFIX */
#define DEFAULT_PAGE_SIZE 4096
enum nl_family_type
{
//! gen netlink family
GENERIC_NL_FAMILY = 1,
//! Cld80211 family
CLD80211_FAMILY
};
enum wifihal_ctrl_cmd
{
/** attach monitor sock */
WIFIHAL_CTRL_MONITOR_ATTACH,
/** dettach monitor sock */
WIFIHAL_CTRL_MONITOR_DETTACH,
/** Send data over Netlink Sock */
WIFIHAL_CTRL_SEND_NL_DATA,
};
//! WIFIHAL Control Request
typedef struct wifihal_ctrl_req_s {
//! ctrl command
uint32_t ctrl_cmd;
//! Family name
uint32_t family_name;
//! command ID
uint32_t cmd_id;
//! monitor sock len
uint32_t monsock_len;
//! monitor sock
struct sockaddr_un monsock;
//! data buff length
uint32_t data_len;
//! reserved
uint32_t reserved[4];
//! data
char data[0];
}wifihal_ctrl_req_t;
//! WIFIHAL Sync Response
typedef struct wifihal_ctrl_sync_rsp_s {
//! ctrl command
uint32_t ctrl_cmd;
//! Family name
uint32_t family_name;
//! command ID
uint32_t cmd_id;
//! status for the request
int status;
//! reserved
uint32_t reserved[4];
}wifihal_ctrl_sync_rsp_t;
//! WIFIHAL Async Response
typedef struct wifihal_ctrl_event_s {
//! Family name
uint32_t family_name;
//! command ID
uint32_t cmd_id;
//! data buff length
uint32_t data_len;
//! reserved
uint32_t reserved;
//! data
char data[0];
}wifihal_ctrl_event_t;
/* WiFi Hal control interface access */
/**
* wifihal_ctrl_open - Open a control interface to WiFi-Hal
* @ctrl_path: Path for UNIX domain sockets; ignored if UDP sockets are used.
* Returns: Pointer to abstract control interface data or %NULL on failure
*
* This function is used to open a control interface to WiFi-Hal.
* ctrl_path is usually /var/run/wifihal. This path
* is configured in WiFi-Hal and other programs using the control
* interface need to use matching path configuration.
*/
struct wifihal_ctrl * wifihal_ctrl_open(const char *ctrl_path);
/**
* wifihal_ctrl_open2 - Open a control interface to wifihal
* @ctrl_path: Path for UNIX domain sockets; ignored if UDP sockets are used.
* @cli_path: Path for client UNIX domain sockets; ignored if UDP socket
* is used.
* Returns: Pointer to abstract control interface data or %NULL on failure
*
* This function is used to open a control interface to wifihal
* when the socket path for client need to be specified explicitly. Default
* ctrl_path is usually /var/run/wifihal and client
* socket path is /tmp.
*/
struct wifihal_ctrl * wifihal_ctrl_open2(const char *ctrl_path, const char *cli_path);
/**
* wifihal_ctrl_close - Close a control interface to wifihal
* @ctrl: Control interface data from wifihal_ctrl_open()
*
* This function is used to close a control interface.
*/
void wifihal_ctrl_close(struct wifihal_ctrl *ctrl);
/**
* wifihal_ctrl_request - Send a command to wifihal
* @ctrl: Control interface data from wifihal_ctrl_open()
* @cmd: Command; usually, ASCII text, e.g., "PING"
* @cmd_len: Length of the cmd in bytes
* @reply: Buffer for the response
* @reply_len: Reply buffer length
* @msg_cb: Callback function for unsolicited messages or %NULL if not used
* Returns: 0 on success, -1 on error (send or receive failed), -2 on timeout
*
* This function is used to send commands to wifihal. Received
* response will be written to reply and reply_len is set to the actual length
* of the reply. This function will block for up to two seconds while waiting
* for the reply. If unsolicited messages are received, the blocking time may
* be longer.
*
* msg_cb can be used to register a callback function that will be called for
* unsolicited messages received while waiting for the command response. These
* messages may be received if wifihal_ctrl_request() is called at the same time as
* wifihal is sending such a message.
* FIXME : Change the comment below.
* This can happen only if
* the program has used wpa_ctrl_attach() to register itself as a monitor for
* event messages. Alternatively to msg_cb, programs can register two control
* interface connections and use one of them for commands and the other one for
* receiving event messages, in other words, call wpa_ctrl_attach() only for
* the control interface connection that will be used for event messages.
*/
int wifihal_ctrl_request(struct wifihal_ctrl *ctrl, const char *cmd, size_t cmd_len,
char *reply, size_t *reply_len);
#ifdef __cplusplus
}
#endif
#endif