qcacmn: Add support for initiate pasn auth vendor command
Add support for initiate pasn authentication using the vendor command: QCA_NL80211_VENDOR_SUBCMD_PASN Fill the below required attributes to initiate PASN: QCA_WLAN_VENDOR_ATTR_PASN_ACTION QCA_WLAN_VENDOR_ATTR_PASN_PEERS QCA_WLAN_VENDOR_ATTR_PASN_PEER_MAC_ADDR QCA_WLAN_VENDOR_ATTR_PASN_PEER_SRC_ADDR Change-Id: If33f54eafe5986b4571cc21a80fb0b61578db116 CRs-Fixed: 3232261
This commit is contained in:

zatwierdzone przez
Madan Koyyalamudi

rodzic
93bf7e1fb1
commit
38b8236ddc
@@ -28,6 +28,7 @@
|
||||
#include "qdf_status.h"
|
||||
#include <wlan_objmgr_cmn.h>
|
||||
#include "wifi_pos_public_struct.h"
|
||||
#include "wlan_cfg80211.h"
|
||||
|
||||
/* forward declaration */
|
||||
struct wifi_pos_ch_info;
|
||||
@@ -35,6 +36,12 @@ struct wlan_objmgr_psoc;
|
||||
struct wifi_pos_driver_caps;
|
||||
|
||||
#ifdef WIFI_POS_CONVERGED
|
||||
#define FEATURE_WIFI_POS_11AZ_AUTH_EVENTS \
|
||||
[QCA_NL80211_VENDOR_SUBCMD_PASN_AUTH_STATUS_INDEX] = { \
|
||||
.vendor_id = QCA_NL80211_VENDOR_ID, \
|
||||
.subcmd = QCA_NL80211_VENDOR_SUBCMD_PASN, \
|
||||
},
|
||||
|
||||
/**
|
||||
* os_if_wifi_pos_register_nl() - abstration API to register callback with GENL
|
||||
* socket.
|
||||
@@ -80,6 +87,8 @@ void os_if_wifi_pos_send_peer_status(struct qdf_mac_addr *peer_mac,
|
||||
int os_if_wifi_pos_populate_caps(struct wlan_objmgr_psoc *psoc,
|
||||
struct wifi_pos_driver_caps *caps);
|
||||
#else
|
||||
#define FEATURE_WIFI_POS_11AZ_AUTH_EVENTS
|
||||
|
||||
static inline int os_if_wifi_pos_register_nl(void)
|
||||
{
|
||||
return 0;
|
||||
|
@@ -37,9 +37,7 @@ struct wifi_pos_osif_ops {
|
||||
uint8_t num_pasn_peers,
|
||||
bool is_initiate_pasn);
|
||||
};
|
||||
#endif
|
||||
|
||||
#if defined(WIFI_POS_CONVERGED) && defined(WLAN_FEATURE_RTT_11AZ_SUPPORT)
|
||||
/**
|
||||
* osif_wifi_pos_register_ops() - Register Wifi-Pos module OS_IF callbacks
|
||||
* @psoc: Pointer to PSOC obj
|
||||
|
@@ -1093,9 +1093,14 @@ os_if_wifi_pos_initiate_pasn_auth(struct wlan_objmgr_vdev *vdev,
|
||||
bool is_initiate_pasn)
|
||||
{
|
||||
struct net_device *netdev;
|
||||
struct cfg80211_pasn_params *pasn_params;
|
||||
struct vdev_osif_priv *osif_priv;
|
||||
int i, ret;
|
||||
struct sk_buff *skb;
|
||||
struct nlattr *attr, *nest_attr;
|
||||
enum qca_wlan_vendor_pasn_action action;
|
||||
int i;
|
||||
int index = QCA_NL80211_VENDOR_SUBCMD_PASN_AUTH_STATUS_INDEX;
|
||||
uint16_t record_size;
|
||||
uint32_t len;
|
||||
QDF_STATUS status = QDF_STATUS_SUCCESS;
|
||||
|
||||
osif_priv = wlan_vdev_get_ospriv(vdev);
|
||||
@@ -1106,43 +1111,79 @@ os_if_wifi_pos_initiate_pasn_auth(struct wlan_objmgr_vdev *vdev,
|
||||
|
||||
netdev = osif_priv->wdev->netdev;
|
||||
|
||||
pasn_params = qdf_mem_malloc(sizeof(*pasn_params) +
|
||||
(num_pasn_peers *
|
||||
sizeof(struct pasn_peer)));
|
||||
if (!pasn_params)
|
||||
len = NLMSG_HDRLEN;
|
||||
/* QCA_WLAN_VENDOR_ATTR_PASN_ACTION */
|
||||
len += nla_total_size(sizeof(u32));
|
||||
|
||||
/*
|
||||
* size of nest containing
|
||||
* QCA_WLAN_VENDOR_ATTR_PASN_PEER_MAC_ADDR
|
||||
* QCA_WLAN_VENDOR_ATTR_PASN_PEER_SRC_ADDR
|
||||
*/
|
||||
record_size = nla_total_size(2 * nla_total_size(ETH_ALEN));
|
||||
|
||||
/* QCA_WLAN_VENDOR_ATTR_PASN_PEERS nest */
|
||||
len += nla_total_size(num_pasn_peers * record_size);
|
||||
|
||||
skb = wlan_cfg80211_vendor_event_alloc(osif_priv->wdev->wiphy,
|
||||
osif_priv->wdev, len,
|
||||
index, GFP_ATOMIC);
|
||||
if (!skb)
|
||||
return QDF_STATUS_E_NOMEM;
|
||||
|
||||
pasn_params->action = (is_initiate_pasn ?
|
||||
NL80211_PASN_ACTION_AUTH : NL80211_PASN_ACTION_DEAUTH);
|
||||
action = is_initiate_pasn ?
|
||||
QCA_WLAN_VENDOR_PASN_ACTION_AUTH :
|
||||
QCA_WLAN_VENDOR_PASN_ACTION_DELETE_SECURE_RANGING_CONTEXT;
|
||||
if (nla_put_u32(skb, QCA_WLAN_VENDOR_ATTR_PASN_ACTION, action)) {
|
||||
osif_err("NLA put failed");
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
attr = nla_nest_start(skb, QCA_WLAN_VENDOR_ATTR_PASN_PEERS);
|
||||
if (!attr) {
|
||||
osif_err("NLA nest failed");
|
||||
status = QDF_STATUS_E_FAILURE;
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
pasn_params->num_pasn_peers = num_pasn_peers;
|
||||
for (i = 0; i < num_pasn_peers; i++) {
|
||||
qdf_mem_copy(pasn_params->peer[i].peer_addr,
|
||||
pasn_peer[i].peer_mac.bytes,
|
||||
QDF_MAC_ADDR_SIZE);
|
||||
qdf_mem_copy(pasn_params->peer[i].src_addr,
|
||||
pasn_peer[i].self_mac.bytes,
|
||||
QDF_MAC_ADDR_SIZE);
|
||||
if (pasn_peer[i].force_self_mac_usage)
|
||||
pasn_params->peer[i].flags = PASN_PEER_USE_SRC_MAC;
|
||||
osif_debug("PASN peer_mac[%d]:" QDF_MAC_ADDR_FMT "src_mac:" QDF_MAC_ADDR_FMT, i,
|
||||
QDF_MAC_ADDR_REF(pasn_peer[i].peer_mac.bytes),
|
||||
QDF_MAC_ADDR_REF(pasn_peer[i].self_mac.bytes));
|
||||
nest_attr = nla_nest_start(skb, i);
|
||||
if (!nest_attr) {
|
||||
osif_err("NLA nest failed for iter:%d", i);
|
||||
status = QDF_STATUS_E_FAILURE;
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
osif_debug("PASN peer_mac[%d]:" QDF_MAC_ADDR_FMT " src_mac:" QDF_MAC_ADDR_FMT,
|
||||
i,
|
||||
QDF_MAC_ADDR_REF(pasn_params->peer[i].peer_addr),
|
||||
QDF_MAC_ADDR_REF(pasn_params->peer[i].src_addr));
|
||||
if (nla_put(skb, QCA_WLAN_VENDOR_ATTR_PASN_PEER_MAC_ADDR,
|
||||
ETH_ALEN, pasn_peer[i].peer_mac.bytes)) {
|
||||
osif_err("NLA put failed");
|
||||
status = QDF_STATUS_E_FAILURE;
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
if (pasn_peer[i].force_self_mac_usage &&
|
||||
nla_put(skb, QCA_WLAN_VENDOR_ATTR_PASN_PEER_SRC_ADDR,
|
||||
ETH_ALEN, pasn_peer[i].self_mac.bytes)) {
|
||||
osif_err("NLA put failed");
|
||||
status = QDF_STATUS_E_FAILURE;
|
||||
goto nla_put_failure;
|
||||
}
|
||||
|
||||
nla_nest_end(skb, nest_attr);
|
||||
}
|
||||
nla_nest_end(skb, attr);
|
||||
|
||||
osif_debug("action:%d num_pasn_peers:%d", pasn_params->action,
|
||||
pasn_params->num_pasn_peers);
|
||||
osif_debug("action:%d num_pasn_peers:%d", action, num_pasn_peers);
|
||||
|
||||
ret = cfg80211_pasn_auth_request(netdev, pasn_params,
|
||||
qdf_mem_malloc_flags());
|
||||
if (ret) {
|
||||
status = qdf_status_from_os_return(ret);
|
||||
osif_err("PASN Auth request failed");
|
||||
}
|
||||
wlan_cfg80211_vendor_event(skb, GFP_ATOMIC);
|
||||
|
||||
qdf_mem_free(pasn_params);
|
||||
return status;
|
||||
|
||||
nla_put_failure:
|
||||
wlan_cfg80211_vendor_free_skb(skb);
|
||||
|
||||
return status;
|
||||
}
|
||||
|
@@ -255,6 +255,7 @@ enum qca_nl80211_vendor_subcmds_index {
|
||||
QCA_NL80211_VENDOR_SUBCMD_MCC_QUOTA_INDEX,
|
||||
QCA_NL80211_VENDOR_SUBCMD_PEER_FLUSH_PENDING_INDEX,
|
||||
QCA_NL80211_VENDOR_SUBCMD_DRIVER_READY_INDEX,
|
||||
QCA_NL80211_VENDOR_SUBCMD_PASN_AUTH_STATUS_INDEX,
|
||||
#ifdef WLAN_SUPPORT_SCS
|
||||
QCA_NL80211_VENDOR_SUBCMD_SCS_RULE_CONFIG_INDEX,
|
||||
#endif
|
||||
|
Reference in New Issue
Block a user