qcacld-3.0: changes to support spectral genl

HDD changes to support general netlink sockets for
spectral scan feature.

Change-Id: Ie8f262ef77b42c69ac5e25e9a2d0cc099b66b1dd
CRs-Fixed: 2183863
This commit is contained in:
Sandeep Puligilla 2018-02-04 22:57:44 -08:00 committed by snandini
parent d884eec60b
commit 019a1bd120
6 changed files with 171 additions and 4 deletions

5
Kbuild
View File

@ -872,13 +872,16 @@ UMAC_SPECTRAL_CORE_DIR := $(WLAN_COMMON_ROOT)/$(UMAC_SPECTRAL_DIR)/core
UMAC_SPECTRAL_DISP_DIR := $(WLAN_COMMON_ROOT)/$(UMAC_SPECTRAL_DIR)/dispatcher/src
UMAC_TARGET_SPECTRAL_INC := -I$(WLAN_COMMON_INC)/target_if/spectral
UMAC_SPECTRAL_INC := -I$(WLAN_COMMON_INC)/$(UMAC_SPECTRAL_DISP_INC_DIR)
UMAC_SPECTRAL_INC := -I$(WLAN_COMMON_INC)/$(UMAC_SPECTRAL_DISP_INC_DIR) \
-I$(WLAN_COMMON_INC)/$(UMAC_SPECTRAL_CORE_INC_DIR) \
-I$(WLAN_COMMON_INC)/target_if/direct_buf_rx/inc
UMAC_SPECTRAL_OBJS := $(UMAC_SPECTRAL_CORE_DIR)/spectral_offload.o \
$(UMAC_SPECTRAL_CORE_DIR)/spectral_common.o \
$(UMAC_SPECTRAL_DISP_DIR)/wlan_spectral_ucfg_api.o \
$(UMAC_SPECTRAL_DISP_DIR)/wlan_spectral_utils_api.o \
$(UMAC_SPECTRAL_DISP_DIR)/wlan_spectral_tgt_api.o \
$(WLAN_COMMON_ROOT)/os_if/linux/spectral/src/wlan_cfg80211_spectral.o \
$(WLAN_COMMON_ROOT)/os_if/linux/spectral/src/os_if_spectral_netlink.o \
$(WLAN_COMMON_ROOT)/target_if/spectral/target_if_spectral_netlink.o \
$(WLAN_COMMON_ROOT)/target_if/spectral/target_if_spectral_phyerr.o \
$(WLAN_COMMON_ROOT)/target_if/spectral/target_if_spectral.o \

View File

@ -1710,6 +1710,7 @@ struct hdd_context {
bool force_rsne_override;
qdf_wake_lock_t monitor_mode_wakelock;
bool lte_coex_ant_share;
int sscan_pid;
};
/**

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017 The Linux Foundation. All rights reserved.
* Copyright (c) 2017-2018 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -26,6 +26,26 @@
#if !defined(WLAN_HDD_SPECTRALSCAN_H)
#define WLAN_HDD_SPECTRALSCAN_H
/*
* enum spectral_scan_msg_type - spectral scan registration
* @SPECTRAL_SCAN_REGISTER_REQ: spectral scan app register request
* @SPECTRAL_SCAN_REGISTER_RSP: spectral scan app register response
*/
enum spectral_scan_msg_type {
SPECTRAL_SCAN_REGISTER_REQ,
SPECTRAL_SCAN_REGISTER_RSP,
};
/*
* struct spectral_scan_msg - spectral scan request message
* @msg_type: message type
* @pid: process id
*/
struct spectral_scan_msg {
uint32_t msg_type;
uint32_t pid;
};
#define FEATURE_SPECTRAL_SCAN_VENDOR_COMMANDS \
{ \
.info.vendor_id = QCA_NL80211_VENDOR_ID, \
@ -166,5 +186,14 @@ int wlan_hdd_cfg80211_spectral_scan_get_status(struct wiphy *wiphy,
const void *data,
int data_len);
/**
* spectral_scan_activate_service() - Activate spectral scan message handler
*
* This function registers a handler to receive netlink message from
* the spectral scan application process.
*
* Return - 0 for success, non zero for failure
*/
int spectral_scan_activate_service(void);
#endif

View File

@ -139,7 +139,7 @@
#include "wlan_ocb_ucfg_api.h"
#include <wlan_green_ap_ucfg_api.h>
#include <wlan_hdd_spectralscan.h>
#ifdef MODULE
#define WLAN_MODULE_NAME module_name(THIS_MODULE)
#else
@ -6215,6 +6215,12 @@ static int hdd_init_netlink_services(struct hdd_context *hdd_ctx)
goto err_close_cesium;
}
ret = spectral_scan_activate_service();
if (ret) {
hdd_alert("spectral_scan_activate_service failed: %d", ret);
goto err_close_cesium;
}
return 0;
err_close_cesium:

View File

@ -34,6 +34,7 @@
#include <wlan_osif_priv.h>
#include <wlan_reg_ucfg_api.h>
#include <target_if.h>
#include <os_if_spectral_netlink.h>
#define LOW_2GHZ_FREQ 2312
#define HIGH_2GHZ_FREQ 2732
@ -47,6 +48,7 @@ static void hdd_init_pdev_os_priv(struct hdd_context *hdd_ctx,
os_priv->wiphy = hdd_ctx->wiphy;
os_priv->legacy_osif_priv = hdd_ctx;
wlan_cfg80211_scan_priv_init(hdd_ctx->hdd_pdev);
os_if_spectral_netlink_init(hdd_ctx->hdd_pdev);
}
static void hdd_deinit_pdev_os_priv(struct wlan_objmgr_pdev *pdev)

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2017 The Linux Foundation. All rights reserved.
* Copyright (c) 2017, 2018 The Linux Foundation. All rights reserved.
*
* Permission to use, copy, modify, and/or distribute this software for
* any purpose with or without fee is hereby granted, provided that the
@ -31,6 +31,10 @@
#include "ani_global.h"
#include "wlan_cfg80211_spectral.h"
#include "wlan_hdd_spectralscan.h"
#include <wlan_spectral_ucfg_api.h>
#ifdef CNSS_GENL
#include <net/cnss_nl.h>
#endif
/**
* __wlan_hdd_cfg80211_spectral_scan_start() - start spectral scan
@ -354,3 +358,125 @@ int wlan_hdd_cfg80211_spectral_scan_get_status(struct wiphy *wiphy,
return ret;
}
#ifdef CNSS_GENL
static void send_spectral_scan_reg_rsp_msg(struct hdd_context *hdd_ctx)
{
struct sk_buff *skb;
struct nlmsghdr *nlh;
struct spectral_scan_msg *rsp_msg;
int err;
skb = alloc_skb(NLMSG_SPACE(sizeof(struct spectral_scan_msg)),
GFP_KERNEL);
if (skb == NULL) {
hdd_err("Skb allocation failed");
return;
}
nlh = (struct nlmsghdr *)skb->data;
nlh->nlmsg_pid = 0;
nlh->nlmsg_flags = 0;
nlh->nlmsg_seq = 0;
nlh->nlmsg_type = WLAN_NL_MSG_SPECTRAL_SCAN;
rsp_msg = NLMSG_DATA(nlh);
rsp_msg->msg_type = SPECTRAL_SCAN_REGISTER_RSP;
rsp_msg->pid = hdd_ctx->sscan_pid;
nlh->nlmsg_len = NLMSG_LENGTH(sizeof(struct spectral_scan_msg));
skb_put(skb, NLMSG_SPACE(sizeof(struct spectral_scan_msg)));
hdd_info("sending App Reg Response to process pid %d",
hdd_ctx->sscan_pid);
err = nl_srv_ucast(skb, hdd_ctx->sscan_pid, MSG_DONTWAIT,
WLAN_NL_MSG_SPECTRAL_SCAN, CLD80211_MCGRP_OEM_MSGS);
if (err < 0)
hdd_err("SPECTRAL: failed to send to spectral scan reg"
" response");
}
/**
* __spectral_scan_msg_handler() - API to handle spectral scan
* command
* @data: Data received
* @data_len: length of the data received
* @ctx: Pointer to stored context
* @pid: Process ID
*
* API to handle spectral scan commands from user space
*
* Return: None
*/
static void __spectral_scan_msg_handler(const void *data, int data_len,
void *ctx, int pid)
{
struct spectral_scan_msg *ss_msg = NULL;
struct nlattr *tb[QCA_WLAN_VENDOR_ATTR_MAX + 1];
struct hdd_context *hdd_ctx;
int ret;
hdd_ctx = (struct hdd_context *)cds_get_context(QDF_MODULE_ID_HDD);
ret = wlan_hdd_validate_context(hdd_ctx);
if (0 != ret)
return;
if (wlan_cfg80211_nla_parse(tb, CLD80211_ATTR_MAX, data,
data_len, NULL)) {
hdd_err("nla parse fails");
return;
}
if (!tb[CLD80211_ATTR_DATA]) {
hdd_err("attr VENDOR_DATA fails");
return;
}
ss_msg = (struct spectral_scan_msg *)nla_data(tb[CLD80211_ATTR_DATA]);
if (!ss_msg) {
hdd_err("data NULL");
return;
}
switch (ss_msg->msg_type) {
case SPECTRAL_SCAN_REGISTER_REQ:
hdd_ctx->sscan_pid = ss_msg->pid;
hdd_debug("spectral scan application registered, pid=%d",
hdd_ctx->sscan_pid);
send_spectral_scan_reg_rsp_msg(hdd_ctx);
ucfg_spectral_scan_set_ppid(hdd_ctx->hdd_pdev,
hdd_ctx->sscan_pid);
break;
default:
hdd_warn("invalid message type %d", ss_msg->msg_type);
break;
}
}
static void spectral_scan_msg_handler(const void *data, int data_len,
void *ctx, int pid)
{
cds_ssr_protect(__func__);
__spectral_scan_msg_handler(data, data_len, ctx, pid);
cds_ssr_unprotect(__func__);
}
/**
* spectral_scan_activate_service() - API to register spectral
* scan cmd handler
*
* API to register the spectral scan command handler using new
* genl infra. Return type is zero to match with legacy
* prototype
*
* Return: 0
*/
int spectral_scan_activate_service(void)
{
register_cld_cmd_cb(WLAN_NL_MSG_SPECTRAL_SCAN,
spectral_scan_msg_handler, NULL);
return 0;
}
#endif