You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless-next-2.6 into for-davem
Conflicts: net/bluetooth/l2cap_core.c
This commit is contained in:
@@ -56,6 +56,7 @@
|
||||
#define BT_SECURITY 4
|
||||
struct bt_security {
|
||||
__u8 level;
|
||||
__u8 key_size;
|
||||
};
|
||||
#define BT_SECURITY_SDP 0
|
||||
#define BT_SECURITY_LOW 1
|
||||
@@ -76,9 +77,12 @@ struct bt_power {
|
||||
#define BT_POWER_FORCE_ACTIVE_OFF 0
|
||||
#define BT_POWER_FORCE_ACTIVE_ON 1
|
||||
|
||||
#define BT_INFO(fmt, arg...) printk(KERN_INFO "Bluetooth: " fmt "\n" , ## arg)
|
||||
#define BT_ERR(fmt, arg...) printk(KERN_ERR "%s: " fmt "\n" , __func__ , ## arg)
|
||||
#define BT_DBG(fmt, arg...) pr_debug("%s: " fmt "\n" , __func__ , ## arg)
|
||||
__attribute__((format (printf, 2, 3)))
|
||||
int bt_printk(const char *level, const char *fmt, ...);
|
||||
|
||||
#define BT_INFO(fmt, arg...) bt_printk(KERN_INFO, pr_fmt(fmt), ##arg)
|
||||
#define BT_ERR(fmt, arg...) bt_printk(KERN_ERR, pr_fmt(fmt), ##arg)
|
||||
#define BT_DBG(fmt, arg...) pr_debug(fmt "\n", ##arg)
|
||||
|
||||
/* Connection and socket states */
|
||||
enum {
|
||||
@@ -204,7 +208,7 @@ out:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int bt_err(__u16 code);
|
||||
int bt_to_errno(__u16 code);
|
||||
|
||||
extern int hci_sock_init(void);
|
||||
extern void hci_sock_cleanup(void);
|
||||
|
||||
@@ -211,11 +211,16 @@ enum {
|
||||
#define LMP_EDR_3S_ESCO 0x80
|
||||
|
||||
#define LMP_EXT_INQ 0x01
|
||||
#define LMP_SIMUL_LE_BR 0x02
|
||||
#define LMP_SIMPLE_PAIR 0x08
|
||||
#define LMP_NO_FLUSH 0x40
|
||||
|
||||
#define LMP_LSTO 0x01
|
||||
#define LMP_INQ_TX_PWR 0x02
|
||||
#define LMP_EXTFEATURES 0x80
|
||||
|
||||
/* Extended LMP features */
|
||||
#define LMP_HOST_LE 0x02
|
||||
|
||||
/* Connection modes */
|
||||
#define HCI_CM_ACTIVE 0x0000
|
||||
@@ -254,6 +259,10 @@ enum {
|
||||
#define HCI_LK_UNAUTH_COMBINATION 0x04
|
||||
#define HCI_LK_AUTH_COMBINATION 0x05
|
||||
#define HCI_LK_CHANGED_COMBINATION 0x06
|
||||
/* The spec doesn't define types for SMP keys */
|
||||
#define HCI_LK_SMP_LTK 0x81
|
||||
#define HCI_LK_SMP_IRK 0x82
|
||||
#define HCI_LK_SMP_CSRK 0x83
|
||||
|
||||
/* ----- HCI Commands ---- */
|
||||
#define HCI_OP_NOP 0x0000
|
||||
@@ -653,6 +662,12 @@ struct hci_rp_read_local_oob_data {
|
||||
|
||||
#define HCI_OP_READ_INQ_RSP_TX_POWER 0x0c58
|
||||
|
||||
#define HCI_OP_WRITE_LE_HOST_SUPPORTED 0x0c6d
|
||||
struct hci_cp_write_le_host_supported {
|
||||
__u8 le;
|
||||
__u8 simul;
|
||||
} __packed;
|
||||
|
||||
#define HCI_OP_READ_LOCAL_VERSION 0x1001
|
||||
struct hci_rp_read_local_version {
|
||||
__u8 status;
|
||||
@@ -676,6 +691,9 @@ struct hci_rp_read_local_features {
|
||||
} __packed;
|
||||
|
||||
#define HCI_OP_READ_LOCAL_EXT_FEATURES 0x1004
|
||||
struct hci_cp_read_local_ext_features {
|
||||
__u8 page;
|
||||
} __packed;
|
||||
struct hci_rp_read_local_ext_features {
|
||||
__u8 status;
|
||||
__u8 page;
|
||||
|
||||
@@ -75,12 +75,28 @@ struct bt_uuid {
|
||||
u8 svc_hint;
|
||||
};
|
||||
|
||||
struct key_master_id {
|
||||
__le16 ediv;
|
||||
u8 rand[8];
|
||||
} __packed;
|
||||
|
||||
struct link_key_data {
|
||||
bdaddr_t bdaddr;
|
||||
u8 type;
|
||||
u8 val[16];
|
||||
u8 pin_len;
|
||||
u8 dlen;
|
||||
u8 data[0];
|
||||
} __packed;
|
||||
|
||||
struct link_key {
|
||||
struct list_head list;
|
||||
bdaddr_t bdaddr;
|
||||
u8 type;
|
||||
u8 val[16];
|
||||
u8 pin_len;
|
||||
u8 dlen;
|
||||
u8 data[0];
|
||||
};
|
||||
|
||||
struct oob_data {
|
||||
@@ -114,6 +130,7 @@ struct hci_dev {
|
||||
__u8 major_class;
|
||||
__u8 minor_class;
|
||||
__u8 features[8];
|
||||
__u8 extfeatures[8];
|
||||
__u8 commands[64];
|
||||
__u8 ssp_mode;
|
||||
__u8 hci_ver;
|
||||
@@ -224,7 +241,6 @@ struct hci_conn {
|
||||
struct list_head list;
|
||||
|
||||
atomic_t refcnt;
|
||||
spinlock_t lock;
|
||||
|
||||
bdaddr_t dst;
|
||||
__u8 dst_type;
|
||||
@@ -246,11 +262,11 @@ struct hci_conn {
|
||||
__u8 sec_level;
|
||||
__u8 pending_sec_level;
|
||||
__u8 pin_length;
|
||||
__u8 enc_key_size;
|
||||
__u8 io_capability;
|
||||
__u8 power_save;
|
||||
__u16 disc_timeout;
|
||||
unsigned long pend;
|
||||
__u8 ltk[16];
|
||||
|
||||
__u8 remote_cap;
|
||||
__u8 remote_oob;
|
||||
@@ -273,7 +289,6 @@ struct hci_conn {
|
||||
struct hci_dev *hdev;
|
||||
void *l2cap_data;
|
||||
void *sco_data;
|
||||
void *priv;
|
||||
|
||||
struct hci_conn *link;
|
||||
|
||||
@@ -539,6 +554,11 @@ int hci_link_keys_clear(struct hci_dev *hdev);
|
||||
struct link_key *hci_find_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
|
||||
int hci_add_link_key(struct hci_dev *hdev, struct hci_conn *conn, int new_key,
|
||||
bdaddr_t *bdaddr, u8 *val, u8 type, u8 pin_len);
|
||||
struct link_key *hci_find_ltk(struct hci_dev *hdev, __le16 ediv, u8 rand[8]);
|
||||
struct link_key *hci_find_link_key_type(struct hci_dev *hdev,
|
||||
bdaddr_t *bdaddr, u8 type);
|
||||
int hci_add_ltk(struct hci_dev *hdev, int new_key, bdaddr_t *bdaddr,
|
||||
u8 key_size, __le16 ediv, u8 rand[8], u8 ltk[16]);
|
||||
int hci_remove_link_key(struct hci_dev *hdev, bdaddr_t *bdaddr);
|
||||
|
||||
int hci_remote_oob_data_clear(struct hci_dev *hdev);
|
||||
@@ -580,6 +600,9 @@ void hci_conn_del_sysfs(struct hci_conn *conn);
|
||||
#define lmp_no_flush_capable(dev) ((dev)->features[6] & LMP_NO_FLUSH)
|
||||
#define lmp_le_capable(dev) ((dev)->features[4] & LMP_LE)
|
||||
|
||||
/* ----- Extended LMP capabilities ----- */
|
||||
#define lmp_host_le_capable(dev) ((dev)->extfeatures[0] & LMP_HOST_LE)
|
||||
|
||||
/* ----- HCI protocols ----- */
|
||||
struct hci_proto {
|
||||
char *name;
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
#define L2CAP_DEFAULT_MONITOR_TO 12000 /* 12 seconds */
|
||||
#define L2CAP_DEFAULT_MAX_PDU_SIZE 1009 /* Sized for 3-DH5 packet */
|
||||
#define L2CAP_DEFAULT_ACK_TO 200
|
||||
#define L2CAP_LOCAL_BUSY_TRIES 12
|
||||
#define L2CAP_LE_DEFAULT_MTU 23
|
||||
|
||||
#define L2CAP_CONN_TIMEOUT (40000) /* 40 seconds */
|
||||
@@ -130,6 +129,12 @@ struct l2cap_conninfo {
|
||||
#define L2CAP_SDU_END 0x8000
|
||||
#define L2CAP_SDU_CONTINUE 0xC000
|
||||
|
||||
/* L2CAP Command rej. reasons */
|
||||
#define L2CAP_REJ_NOT_UNDERSTOOD 0x0000
|
||||
#define L2CAP_REJ_MTU_EXCEEDED 0x0001
|
||||
#define L2CAP_REJ_INVALID_CID 0x0002
|
||||
|
||||
|
||||
/* L2CAP structures */
|
||||
struct l2cap_hdr {
|
||||
__le16 len;
|
||||
@@ -144,10 +149,21 @@ struct l2cap_cmd_hdr {
|
||||
} __packed;
|
||||
#define L2CAP_CMD_HDR_SIZE 4
|
||||
|
||||
struct l2cap_cmd_rej {
|
||||
struct l2cap_cmd_rej_unk {
|
||||
__le16 reason;
|
||||
} __packed;
|
||||
|
||||
struct l2cap_cmd_rej_mtu {
|
||||
__le16 reason;
|
||||
__le16 max_mtu;
|
||||
} __packed;
|
||||
|
||||
struct l2cap_cmd_rej_cid {
|
||||
__le16 reason;
|
||||
__le16 scid;
|
||||
__le16 dcid;
|
||||
} __packed;
|
||||
|
||||
struct l2cap_conn_req {
|
||||
__le16 psm;
|
||||
__le16 scid;
|
||||
@@ -352,8 +368,6 @@ struct l2cap_chan {
|
||||
struct sk_buff *tx_send_head;
|
||||
struct sk_buff_head tx_q;
|
||||
struct sk_buff_head srej_q;
|
||||
struct sk_buff_head busy_q;
|
||||
struct work_struct busy_work;
|
||||
struct list_head srej_l;
|
||||
|
||||
struct list_head list;
|
||||
@@ -422,6 +436,7 @@ struct l2cap_conn {
|
||||
struct l2cap_pinfo {
|
||||
struct bt_sock bt;
|
||||
struct l2cap_chan *chan;
|
||||
struct sk_buff *rx_busy_skb;
|
||||
};
|
||||
|
||||
enum {
|
||||
@@ -449,7 +464,6 @@ enum {
|
||||
CONN_REJ_ACT,
|
||||
CONN_SEND_FBIT,
|
||||
CONN_RNR_SENT,
|
||||
CONN_SAR_RETRY,
|
||||
};
|
||||
|
||||
#define __set_chan_timer(c, t) l2cap_set_timer(c, &c->chan_timer, (t))
|
||||
@@ -498,5 +512,6 @@ void l2cap_chan_close(struct l2cap_chan *chan, int reason);
|
||||
void l2cap_chan_destroy(struct l2cap_chan *chan);
|
||||
int l2cap_chan_connect(struct l2cap_chan *chan);
|
||||
int l2cap_chan_send(struct l2cap_chan *chan, struct msghdr *msg, size_t len);
|
||||
void l2cap_chan_busy(struct l2cap_chan *chan, int busy);
|
||||
|
||||
#endif /* __L2CAP_H */
|
||||
|
||||
@@ -101,6 +101,8 @@ struct mgmt_key_info {
|
||||
u8 type;
|
||||
u8 val[16];
|
||||
u8 pin_len;
|
||||
u8 dlen;
|
||||
u8 data[0];
|
||||
} __packed;
|
||||
|
||||
#define MGMT_OP_LOAD_KEYS 0x000D
|
||||
|
||||
@@ -118,5 +118,6 @@ struct smp_cmd_security_req {
|
||||
/* SMP Commands */
|
||||
int smp_conn_security(struct l2cap_conn *conn, __u8 sec_level);
|
||||
int smp_sig_channel(struct l2cap_conn *conn, struct sk_buff *skb);
|
||||
int smp_distribute_keys(struct l2cap_conn *conn, __u8 force);
|
||||
|
||||
#endif /* __SMP_H */
|
||||
|
||||
@@ -3055,6 +3055,7 @@ void cfg80211_cqm_pktloss_notify(struct net_device *dev,
|
||||
* @dev: network device
|
||||
* @bssid: BSSID of AP (to avoid races)
|
||||
* @replay_ctr: new replay counter
|
||||
* @gfp: allocation flags
|
||||
*/
|
||||
void cfg80211_gtk_rekey_notify(struct net_device *dev, const u8 *bssid,
|
||||
const u8 *replay_ctr, gfp_t gfp);
|
||||
|
||||
+145
-26
@@ -20,6 +20,7 @@
|
||||
#include <linux/device.h>
|
||||
#include <linux/ieee80211.h>
|
||||
#include <net/cfg80211.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
/**
|
||||
* DOC: Introduction
|
||||
@@ -192,6 +193,17 @@ enum ieee80211_bss_change {
|
||||
*/
|
||||
#define IEEE80211_BSS_ARP_ADDR_LIST_LEN 4
|
||||
|
||||
/**
|
||||
* enum ieee80211_rssi_event - RSSI threshold event
|
||||
* An indicator for when RSSI goes below/above a certain threshold.
|
||||
* @RSSI_EVENT_HIGH: AP's rssi crossed the high threshold set by the driver.
|
||||
* @RSSI_EVENT_LOW: AP's rssi crossed the low threshold set by the driver.
|
||||
*/
|
||||
enum ieee80211_rssi_event {
|
||||
RSSI_EVENT_HIGH,
|
||||
RSSI_EVENT_LOW,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct ieee80211_bss_conf - holds the BSS's changing parameters
|
||||
*
|
||||
@@ -961,21 +973,6 @@ enum sta_notify_cmd {
|
||||
STA_NOTIFY_SLEEP, STA_NOTIFY_AWAKE,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ieee80211_tkip_key_type - get tkip key
|
||||
*
|
||||
* Used by drivers which need to get a tkip key for skb. Some drivers need a
|
||||
* phase 1 key, others need a phase 2 key. A single function allows the driver
|
||||
* to get the key, this enum indicates what type of key is required.
|
||||
*
|
||||
* @IEEE80211_TKIP_P1_KEY: the driver needs a phase 1 key
|
||||
* @IEEE80211_TKIP_P2_KEY: the driver needs a phase 2 key
|
||||
*/
|
||||
enum ieee80211_tkip_key_type {
|
||||
IEEE80211_TKIP_P1_KEY,
|
||||
IEEE80211_TKIP_P2_KEY,
|
||||
};
|
||||
|
||||
/**
|
||||
* enum ieee80211_hw_flags - hardware flags
|
||||
*
|
||||
@@ -1881,6 +1878,8 @@ enum ieee80211_ampdu_mlme_action {
|
||||
* @set_bitrate_mask: Set a mask of rates to be used for rate control selection
|
||||
* when transmitting a frame. Currently only legacy rates are handled.
|
||||
* The callback can sleep.
|
||||
* @rssi_callback: Notify driver when the average RSSI goes above/below
|
||||
* thresholds that were registered previously. The callback can sleep.
|
||||
*/
|
||||
struct ieee80211_ops {
|
||||
void (*tx)(struct ieee80211_hw *hw, struct sk_buff *skb);
|
||||
@@ -1989,6 +1988,8 @@ struct ieee80211_ops {
|
||||
bool (*tx_frames_pending)(struct ieee80211_hw *hw);
|
||||
int (*set_bitrate_mask)(struct ieee80211_hw *hw, struct ieee80211_vif *vif,
|
||||
const struct cfg80211_bitrate_mask *mask);
|
||||
void (*rssi_callback)(struct ieee80211_hw *hw,
|
||||
enum ieee80211_rssi_event rssi_event);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -2579,21 +2580,111 @@ struct sk_buff *
|
||||
ieee80211_get_buffered_bc(struct ieee80211_hw *hw, struct ieee80211_vif *vif);
|
||||
|
||||
/**
|
||||
* ieee80211_get_tkip_key - get a TKIP rc4 for skb
|
||||
* ieee80211_get_tkip_p1k_iv - get a TKIP phase 1 key for IV32
|
||||
*
|
||||
* This function computes a TKIP rc4 key for an skb. It computes
|
||||
* a phase 1 key if needed (iv16 wraps around). This function is to
|
||||
* be used by drivers which can do HW encryption but need to compute
|
||||
* to phase 1/2 key in SW.
|
||||
* This function returns the TKIP phase 1 key for the given IV32.
|
||||
*
|
||||
* @keyconf: the parameter passed with the set key
|
||||
* @skb: the skb for which the key is needed
|
||||
* @type: TBD
|
||||
* @key: a buffer to which the key will be written
|
||||
* @iv32: IV32 to get the P1K for
|
||||
* @p1k: a buffer to which the key will be written, as 5 u16 values
|
||||
*/
|
||||
void ieee80211_get_tkip_key(struct ieee80211_key_conf *keyconf,
|
||||
struct sk_buff *skb,
|
||||
enum ieee80211_tkip_key_type type, u8 *key);
|
||||
void ieee80211_get_tkip_p1k_iv(struct ieee80211_key_conf *keyconf,
|
||||
u32 iv32, u16 *p1k);
|
||||
|
||||
/**
|
||||
* ieee80211_get_tkip_p1k - get a TKIP phase 1 key
|
||||
*
|
||||
* This function returns the TKIP phase 1 key for the IV32 taken
|
||||
* from the given packet.
|
||||
*
|
||||
* @keyconf: the parameter passed with the set key
|
||||
* @skb: the packet to take the IV32 value from that will be encrypted
|
||||
* with this P1K
|
||||
* @p1k: a buffer to which the key will be written, as 5 u16 values
|
||||
*/
|
||||
static inline void ieee80211_get_tkip_p1k(struct ieee80211_key_conf *keyconf,
|
||||
struct sk_buff *skb, u16 *p1k)
|
||||
{
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
const u8 *data = (u8 *)hdr + ieee80211_hdrlen(hdr->frame_control);
|
||||
u32 iv32 = get_unaligned_le32(&data[4]);
|
||||
|
||||
ieee80211_get_tkip_p1k_iv(keyconf, iv32, p1k);
|
||||
}
|
||||
|
||||
/**
|
||||
* ieee80211_get_tkip_p2k - get a TKIP phase 2 key
|
||||
*
|
||||
* This function computes the TKIP RC4 key for the IV values
|
||||
* in the packet.
|
||||
*
|
||||
* @keyconf: the parameter passed with the set key
|
||||
* @skb: the packet to take the IV32/IV16 values from that will be
|
||||
* encrypted with this key
|
||||
* @p2k: a buffer to which the key will be written, 16 bytes
|
||||
*/
|
||||
void ieee80211_get_tkip_p2k(struct ieee80211_key_conf *keyconf,
|
||||
struct sk_buff *skb, u8 *p2k);
|
||||
|
||||
/**
|
||||
* struct ieee80211_key_seq - key sequence counter
|
||||
*
|
||||
* @tkip: TKIP data, containing IV32 and IV16 in host byte order
|
||||
* @ccmp: PN data, most significant byte first (big endian,
|
||||
* reverse order than in packet)
|
||||
* @aes_cmac: PN data, most significant byte first (big endian,
|
||||
* reverse order than in packet)
|
||||
*/
|
||||
struct ieee80211_key_seq {
|
||||
union {
|
||||
struct {
|
||||
u32 iv32;
|
||||
u16 iv16;
|
||||
} tkip;
|
||||
struct {
|
||||
u8 pn[6];
|
||||
} ccmp;
|
||||
struct {
|
||||
u8 pn[6];
|
||||
} aes_cmac;
|
||||
};
|
||||
};
|
||||
|
||||
/**
|
||||
* ieee80211_get_key_tx_seq - get key TX sequence counter
|
||||
*
|
||||
* @keyconf: the parameter passed with the set key
|
||||
* @seq: buffer to receive the sequence data
|
||||
*
|
||||
* This function allows a driver to retrieve the current TX IV/PN
|
||||
* for the given key. It must not be called if IV generation is
|
||||
* offloaded to the device.
|
||||
*
|
||||
* Note that this function may only be called when no TX processing
|
||||
* can be done concurrently, for example when queues are stopped
|
||||
* and the stop has been synchronized.
|
||||
*/
|
||||
void ieee80211_get_key_tx_seq(struct ieee80211_key_conf *keyconf,
|
||||
struct ieee80211_key_seq *seq);
|
||||
|
||||
/**
|
||||
* ieee80211_get_key_rx_seq - get key RX sequence counter
|
||||
*
|
||||
* @keyconf: the parameter passed with the set key
|
||||
* @tid: The TID, or -1 for the management frame value (CCMP only);
|
||||
* the value on TID 0 is also used for non-QoS frames. For
|
||||
* CMAC, only TID 0 is valid.
|
||||
* @seq: buffer to receive the sequence data
|
||||
*
|
||||
* This function allows a driver to retrieve the current RX IV/PNs
|
||||
* for the given key. It must not be called if IV checking is done
|
||||
* by the device and not by mac80211.
|
||||
*
|
||||
* Note that this function may only be called when no RX processing
|
||||
* can be done concurrently.
|
||||
*/
|
||||
void ieee80211_get_key_rx_seq(struct ieee80211_key_conf *keyconf,
|
||||
int tid, struct ieee80211_key_seq *seq);
|
||||
|
||||
/**
|
||||
* ieee80211_gtk_rekey_notify - notify userspace supplicant of rekeying
|
||||
@@ -2932,6 +3023,29 @@ void ieee80211_beacon_loss(struct ieee80211_vif *vif);
|
||||
*/
|
||||
void ieee80211_connection_loss(struct ieee80211_vif *vif);
|
||||
|
||||
/**
|
||||
* ieee80211_resume_disconnect - disconnect from AP after resume
|
||||
*
|
||||
* @vif: &struct ieee80211_vif pointer from the add_interface callback.
|
||||
*
|
||||
* Instructs mac80211 to disconnect from the AP after resume.
|
||||
* Drivers can use this after WoWLAN if they know that the
|
||||
* connection cannot be kept up, for example because keys were
|
||||
* used while the device was asleep but the replay counters or
|
||||
* similar cannot be retrieved from the device during resume.
|
||||
*
|
||||
* Note that due to implementation issues, if the driver uses
|
||||
* the reconfiguration functionality during resume the interface
|
||||
* will still be added as associated first during resume and then
|
||||
* disconnect normally later.
|
||||
*
|
||||
* This function can only be called from the resume callback and
|
||||
* the driver must not be holding any of its own locks while it
|
||||
* calls this function, or at least not any locks it needs in the
|
||||
* key configuration paths (if it supports HW crypto).
|
||||
*/
|
||||
void ieee80211_resume_disconnect(struct ieee80211_vif *vif);
|
||||
|
||||
/**
|
||||
* ieee80211_disable_dyn_ps - force mac80211 to temporarily disable dynamic psm
|
||||
*
|
||||
@@ -3240,4 +3354,9 @@ ieee80211_vif_type_p2p(struct ieee80211_vif *vif)
|
||||
return ieee80211_iftype_p2p(vif->type, vif->p2p);
|
||||
}
|
||||
|
||||
void ieee80211_enable_rssi_reports(struct ieee80211_vif *vif,
|
||||
int rssi_min_thold,
|
||||
int rssi_max_thold);
|
||||
|
||||
void ieee80211_disable_rssi_reports(struct ieee80211_vif *vif);
|
||||
#endif /* MAC80211_H */
|
||||
|
||||
Reference in New Issue
Block a user