mirror of
https://github.com/torvalds/linux.git
synced 2024-12-20 18:11:47 +00:00
7882513bac
This patch adds to mac80211_hwsim the capability to send traffic via userspace. Frame exchange between kernel and user spaces is done through generic netlink communication protocol. A new generic netlink family MAC80211_HWSIM is proposed, this family contains three basic commands HWSIM_CMD_REGISTER, which is the command used to register a new traffic listener, HWSIM_CMD_FRAME, to exchange the frames from kernel to user and vice-versa, and HWSIM_CMD_TX_INFO_FRAME which returns from user all the information about retransmissions, rates, rx signal, and so on. How it works: Once the driver is loaded the MAC80211_HWSIM family will be registered. In the absence of userspace daemon, the driver itselfs implements a perfect wireless medium as it did in the past. When a daemon sends a HWSIM_CMD_REGISTER command, the module stores the application PID, and from this moment all frames will be sent to the registered daemon. The user space application will be in charge of process/forward all frames broadcast by any mac80211_hwsim radio. If the user application is stopped, the kernel module will detect the release of the socket and it will switch back to in-kernel perfect channel simulation. The userspace daemon must be waiting for incoming HWSIM_CMD_FRAME commands sent from kernel, for each HWSIM_CMD_FRAME command the application will try to broadcast this frame to all mac80211_hwsim radios, however the application may decide to forward/drop this frame. In the case of forwarding the frame, a new HWSIM_CMD_FRAME command will be created, all necessary attributes will be populated and the frame will be sent back to the kernel. Also after the frame broadcast phase, a HWSIM_CMD_TX_INFO_FRAME command will be sent from userspace to kernel, this command contains all the information regarding the transmission, such as number of tries, rates, ack signal, etc. You can find the actual implementation of wireless mediumd daemon (wmediumd) at: * Last version tarball: https://github.com/jlopex/cozybit/tarball/master * Or visiting my github tree: https://github.com/jlopex/cozybit/tree Signed-off-by: Javier Lopez <jlopex@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
134 lines
4.1 KiB
C
134 lines
4.1 KiB
C
/*
|
|
* mac80211_hwsim - software simulator of 802.11 radio(s) for mac80211
|
|
* Copyright (c) 2008, Jouni Malinen <j@w1.fi>
|
|
* Copyright (c) 2011, Javier Lopez <jlopex@gmail.com>
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#ifndef __MAC80211_HWSIM_H
|
|
#define __MAC80211_HWSIM_H
|
|
|
|
/**
|
|
* enum hwsim_tx_control_flags - flags to describe transmission info/status
|
|
*
|
|
* These flags are used to give the wmediumd extra information in order to
|
|
* modify its behavior for each frame
|
|
*
|
|
* @HWSIM_TX_CTL_REQ_TX_STATUS: require TX status callback for this frame.
|
|
* @HWSIM_TX_CTL_NO_ACK: tell the wmediumd not to wait for an ack
|
|
* @HWSIM_TX_STAT_ACK: Frame was acknowledged
|
|
*
|
|
*/
|
|
enum hwsim_tx_control_flags {
|
|
HWSIM_TX_CTL_REQ_TX_STATUS = BIT(0),
|
|
HWSIM_TX_CTL_NO_ACK = BIT(1),
|
|
HWSIM_TX_STAT_ACK = BIT(2),
|
|
};
|
|
|
|
/**
|
|
* DOC: Frame transmission/registration support
|
|
*
|
|
* Frame transmission and registration support exists to allow userspace
|
|
* entities such as wmediumd to receive and process all broadcasted
|
|
* frames from a mac80211_hwsim radio device.
|
|
*
|
|
* This allow user space applications to decide if the frame should be
|
|
* dropped or not and implement a wireless medium simulator at user space.
|
|
*
|
|
* Registration is done by sending a register message to the driver and
|
|
* will be automatically unregistered if the user application doesn't
|
|
* responds to sent frames.
|
|
* Once registered the user application has to take responsibility of
|
|
* broadcasting the frames to all listening mac80211_hwsim radio
|
|
* interfaces.
|
|
*
|
|
* For more technical details, see the corresponding command descriptions
|
|
* below.
|
|
*/
|
|
|
|
/**
|
|
* enum hwsim_commands - supported hwsim commands
|
|
*
|
|
* @HWSIM_CMD_UNSPEC: unspecified command to catch errors
|
|
*
|
|
* @HWSIM_CMD_REGISTER: request to register and received all broadcasted
|
|
* frames by any mac80211_hwsim radio device.
|
|
* @HWSIM_CMD_FRAME: send/receive a broadcasted frame from/to kernel/user
|
|
* space, uses:
|
|
* %HWSIM_ATTR_ADDR_TRANSMITTER, %HWSIM_ATTR_ADDR_RECEIVER,
|
|
* %HWSIM_ATTR_FRAME, %HWSIM_ATTR_FLAGS, %HWSIM_ATTR_RX_RATE,
|
|
* %HWSIM_ATTR_SIGNAL, %HWSIM_ATTR_COOKIE
|
|
* @HWSIM_CMD_TX_INFO_FRAME: Transmission info report from user space to
|
|
* kernel, uses:
|
|
* %HWSIM_ATTR_ADDR_TRANSMITTER, %HWSIM_ATTR_FLAGS,
|
|
* %HWSIM_ATTR_TX_INFO, %HWSIM_ATTR_SIGNAL, %HWSIM_ATTR_COOKIE
|
|
* @__HWSIM_CMD_MAX: enum limit
|
|
*/
|
|
enum {
|
|
HWSIM_CMD_UNSPEC,
|
|
HWSIM_CMD_REGISTER,
|
|
HWSIM_CMD_FRAME,
|
|
HWSIM_CMD_TX_INFO_FRAME,
|
|
__HWSIM_CMD_MAX,
|
|
};
|
|
#define HWSIM_CMD_MAX (_HWSIM_CMD_MAX - 1)
|
|
|
|
/**
|
|
* enum hwsim_attrs - hwsim netlink attributes
|
|
*
|
|
* @HWSIM_ATTR_UNSPEC: unspecified attribute to catch errors
|
|
*
|
|
* @HWSIM_ATTR_ADDR_RECEIVER: MAC address of the radio device that
|
|
* the frame is broadcasted to
|
|
* @HWSIM_ATTR_ADDR_TRANSMITTER: MAC address of the radio device that
|
|
* the frame was broadcasted from
|
|
* @HWSIM_ATTR_FRAME: Data array
|
|
* @HWSIM_ATTR_FLAGS: mac80211 transmission flags, used to process
|
|
properly the frame at user space
|
|
* @HWSIM_ATTR_RX_RATE: estimated rx rate index for this frame at user
|
|
space
|
|
* @HWSIM_ATTR_SIGNAL: estimated RX signal for this frame at user
|
|
space
|
|
* @HWSIM_ATTR_TX_INFO: ieee80211_tx_rate array
|
|
* @HWSIM_ATTR_COOKIE: sk_buff cookie to identify the frame
|
|
* @__HWSIM_ATTR_MAX: enum limit
|
|
*/
|
|
|
|
|
|
enum {
|
|
HWSIM_ATTR_UNSPEC,
|
|
HWSIM_ATTR_ADDR_RECEIVER,
|
|
HWSIM_ATTR_ADDR_TRANSMITTER,
|
|
HWSIM_ATTR_FRAME,
|
|
HWSIM_ATTR_FLAGS,
|
|
HWSIM_ATTR_RX_RATE,
|
|
HWSIM_ATTR_SIGNAL,
|
|
HWSIM_ATTR_TX_INFO,
|
|
HWSIM_ATTR_COOKIE,
|
|
__HWSIM_ATTR_MAX,
|
|
};
|
|
#define HWSIM_ATTR_MAX (__HWSIM_ATTR_MAX - 1)
|
|
|
|
/**
|
|
* struct hwsim_tx_rate - rate selection/status
|
|
*
|
|
* @idx: rate index to attempt to send with
|
|
* @count: number of tries in this rate before going to the next rate
|
|
*
|
|
* A value of -1 for @idx indicates an invalid rate and, if used
|
|
* in an array of retry rates, that no more rates should be tried.
|
|
*
|
|
* When used for transmit status reporting, the driver should
|
|
* always report the rate and number of retries used.
|
|
*
|
|
*/
|
|
struct hwsim_tx_rate {
|
|
s8 idx;
|
|
u8 count;
|
|
} __packed;
|
|
|
|
#endif /* __MAC80211_HWSIM_H */
|