From 4a668d9d24f1c4b25c728ce11a402cf03650fddc Mon Sep 17 00:00:00 2001 From: Bapiraju Alla Date: Tue, 3 Mar 2020 12:25:39 +0530 Subject: [PATCH] qcacld-3.0: Add policy attribute to hdd_wiphy_vendor_commands According to new changes in kernel 5.4 version onwards, driver has to provide the policy for a NL command to ve verified against while registering wiphy to the kernel. To accommodate these changes, add policy for all the following vendor commands that are being registered in the driver QCA_NL80211_VENDOR_SUBCMD_GET_WAKE_REASON_STATS QCA_NL80211_VENDOR_SUBCMD_OCB_SET_CONFIG QCA_NL80211_VENDOR_SUBCMD_OCB_SET_UTC_TIME QCA_NL80211_VENDOR_SUBCMD_OCB_START_TIMING_ADVERT QCA_NL80211_VENDOR_SUBCMD_OCB_STOP_TIMING_ADVERT QCA_NL80211_VENDOR_SUBCMD_OCB_GET_TSF_TIMER QCA_NL80211_VENDOR_SUBCMD_DCC_GET_STATS QCA_NL80211_VENDOR_SUBCMD_DCC_CLEAR_STATS QCA_NL80211_VENDOR_SUBCMD_DCC_UPDATE_NDL QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES Change-Id: I1fa51d2fdf75a20098fe651769352d69d8fbd48c CRs-Fixed: 2633726 --- core/hdd/src/wlan_hdd_cfg80211.c | 79 +++------------------ core/hdd/src/wlan_hdd_ocb.c | 14 ++-- core/hdd/src/wlan_hdd_ocb.h | 113 ++++++++++++++++++++++++++++++- 3 files changed, 129 insertions(+), 77 deletions(-) diff --git a/core/hdd/src/wlan_hdd_cfg80211.c b/core/hdd/src/wlan_hdd_cfg80211.c index 4338b11f416f..b56b1477a221 100644 --- a/core/hdd/src/wlan_hdd_cfg80211.c +++ b/core/hdd/src/wlan_hdd_cfg80211.c @@ -10250,7 +10250,7 @@ static int wlan_hdd_cfg80211_set_probable_oper_channel(struct wiphy *wiphy, static const struct nla_policy -qca_wlan_vendor_attr_policy[QCA_WLAN_VENDOR_ATTR_MAX+1] = { +wlan_hdd_get_link_properties_policy[QCA_WLAN_VENDOR_ATTR_MAX + 1] = { [QCA_WLAN_VENDOR_ATTR_MAC_ADDR] = { .type = NLA_BINARY, .len = QDF_MAC_ADDR_SIZE }, }; @@ -10296,7 +10296,8 @@ static int __wlan_hdd_cfg80211_get_link_properties(struct wiphy *wiphy, return -EINVAL; if (wlan_cfg80211_nla_parse(tb, QCA_WLAN_VENDOR_ATTR_MAX, data, - data_len, qca_wlan_vendor_attr_policy)) { + data_len, + wlan_hdd_get_link_properties_policy)) { hdd_err("Invalid attribute"); return -EINVAL; } @@ -14643,78 +14644,17 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = { }, /* OCB commands */ - { - .info.vendor_id = QCA_NL80211_VENDOR_ID, - .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_OCB_SET_CONFIG, - .flags = WIPHY_VENDOR_CMD_NEED_WDEV | - WIPHY_VENDOR_CMD_NEED_NETDEV | - WIPHY_VENDOR_CMD_NEED_RUNNING, - .doit = wlan_hdd_cfg80211_ocb_set_config - }, - { - .info.vendor_id = QCA_NL80211_VENDOR_ID, - .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_OCB_SET_UTC_TIME, - .flags = WIPHY_VENDOR_CMD_NEED_WDEV | - WIPHY_VENDOR_CMD_NEED_NETDEV | - WIPHY_VENDOR_CMD_NEED_RUNNING, - .doit = wlan_hdd_cfg80211_ocb_set_utc_time - }, - { - .info.vendor_id = QCA_NL80211_VENDOR_ID, - .info.subcmd = - QCA_NL80211_VENDOR_SUBCMD_OCB_START_TIMING_ADVERT, - .flags = WIPHY_VENDOR_CMD_NEED_WDEV | - WIPHY_VENDOR_CMD_NEED_NETDEV | - WIPHY_VENDOR_CMD_NEED_RUNNING, - .doit = wlan_hdd_cfg80211_ocb_start_timing_advert - }, - { - .info.vendor_id = QCA_NL80211_VENDOR_ID, - .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_OCB_STOP_TIMING_ADVERT, - .flags = WIPHY_VENDOR_CMD_NEED_WDEV | - WIPHY_VENDOR_CMD_NEED_NETDEV | - WIPHY_VENDOR_CMD_NEED_RUNNING, - .doit = wlan_hdd_cfg80211_ocb_stop_timing_advert - }, - { - .info.vendor_id = QCA_NL80211_VENDOR_ID, - .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_OCB_GET_TSF_TIMER, - .flags = WIPHY_VENDOR_CMD_NEED_WDEV | - WIPHY_VENDOR_CMD_NEED_NETDEV | - WIPHY_VENDOR_CMD_NEED_RUNNING, - .doit = wlan_hdd_cfg80211_ocb_get_tsf_timer - }, - { - .info.vendor_id = QCA_NL80211_VENDOR_ID, - .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_DCC_GET_STATS, - .flags = WIPHY_VENDOR_CMD_NEED_WDEV | - WIPHY_VENDOR_CMD_NEED_NETDEV | - WIPHY_VENDOR_CMD_NEED_RUNNING, - .doit = wlan_hdd_cfg80211_dcc_get_stats - }, - { - .info.vendor_id = QCA_NL80211_VENDOR_ID, - .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_DCC_CLEAR_STATS, - .flags = WIPHY_VENDOR_CMD_NEED_WDEV | - WIPHY_VENDOR_CMD_NEED_NETDEV | - WIPHY_VENDOR_CMD_NEED_RUNNING, - .doit = wlan_hdd_cfg80211_dcc_clear_stats - }, - { - .info.vendor_id = QCA_NL80211_VENDOR_ID, - .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_DCC_UPDATE_NDL, - .flags = WIPHY_VENDOR_CMD_NEED_WDEV | - WIPHY_VENDOR_CMD_NEED_NETDEV | - WIPHY_VENDOR_CMD_NEED_RUNNING, - .doit = wlan_hdd_cfg80211_dcc_update_ndl - }, + FEATURE_OCB_VENDOR_COMMANDS + { .info.vendor_id = QCA_NL80211_VENDOR_ID, .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_LINK_PROPERTIES, .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV | WIPHY_VENDOR_CMD_NEED_RUNNING, - .doit = wlan_hdd_cfg80211_get_link_properties + .doit = wlan_hdd_cfg80211_get_link_properties, + vendor_command_policy(wlan_hdd_get_link_properties_policy, + QCA_WLAN_VENDOR_ATTR_MAX) }, FEATURE_OTA_TEST_VENDOR_COMMANDS @@ -14786,7 +14726,8 @@ const struct wiphy_vendor_command hdd_wiphy_vendor_commands[] = { .flags = WIPHY_VENDOR_CMD_NEED_WDEV | WIPHY_VENDOR_CMD_NEED_NETDEV | WIPHY_VENDOR_CMD_NEED_RUNNING, - .doit = wlan_hdd_cfg80211_get_wakelock_stats + .doit = wlan_hdd_cfg80211_get_wakelock_stats, + vendor_command_policy(VENDOR_CMD_RAW_DATA, 0) }, { .info.vendor_id = QCA_NL80211_VENDOR_ID, diff --git a/core/hdd/src/wlan_hdd_ocb.c b/core/hdd/src/wlan_hdd_ocb.c index 4302abb9fc96..545cc47a16c5 100644 --- a/core/hdd/src/wlan_hdd_ocb.c +++ b/core/hdd/src/wlan_hdd_ocb.c @@ -594,7 +594,7 @@ int iw_set_dot11p_channel_sched(struct net_device *dev, } #endif /* WLAN_WEXT_SUPPORT_ENABLE */ -static const struct nla_policy qca_wlan_vendor_ocb_set_config_policy[ +const struct nla_policy qca_wlan_vendor_ocb_set_config_policy[ QCA_WLAN_VENDOR_ATTR_OCB_SET_CONFIG_MAX + 1] = { [QCA_WLAN_VENDOR_ATTR_OCB_SET_CONFIG_CHANNEL_COUNT] = { .type = NLA_U32 @@ -619,7 +619,7 @@ static const struct nla_policy qca_wlan_vendor_ocb_set_config_policy[ }, }; -static const struct nla_policy qca_wlan_vendor_ocb_set_utc_time_policy[ +const struct nla_policy qca_wlan_vendor_ocb_set_utc_time_policy[ QCA_WLAN_VENDOR_ATTR_OCB_SET_UTC_TIME_MAX + 1] = { [QCA_WLAN_VENDOR_ATTR_OCB_SET_UTC_TIME_VALUE] = { .type = NLA_BINARY, .len = SIZE_UTC_TIME @@ -629,7 +629,7 @@ static const struct nla_policy qca_wlan_vendor_ocb_set_utc_time_policy[ }, }; -static const struct nla_policy qca_wlan_vendor_ocb_start_timing_advert_policy[ +const struct nla_policy qca_wlan_vendor_ocb_start_timing_advert_policy[ QCA_WLAN_VENDOR_ATTR_OCB_START_TIMING_ADVERT_MAX + 1] = { [QCA_WLAN_VENDOR_ATTR_OCB_START_TIMING_ADVERT_CHANNEL_FREQ] = { .type = NLA_U32 @@ -639,7 +639,7 @@ static const struct nla_policy qca_wlan_vendor_ocb_start_timing_advert_policy[ }, }; -static const struct nla_policy qca_wlan_vendor_ocb_stop_timing_advert_policy[ +const struct nla_policy qca_wlan_vendor_ocb_stop_timing_advert_policy[ QCA_WLAN_VENDOR_ATTR_OCB_STOP_TIMING_ADVERT_MAX + 1] = { [QCA_WLAN_VENDOR_ATTR_OCB_STOP_TIMING_ADVERT_CHANNEL_FREQ] = { .type = NLA_U32 @@ -655,7 +655,7 @@ static const struct nla_policy qca_wlan_vendor_ocb_get_tsf_timer_resp[] = { }, }; -static const struct nla_policy qca_wlan_vendor_dcc_get_stats[] = { +const struct nla_policy qca_wlan_vendor_dcc_get_stats[] = { [QCA_WLAN_VENDOR_ATTR_DCC_GET_STATS_CHANNEL_COUNT] = { .type = NLA_U32 }, @@ -673,13 +673,13 @@ static const struct nla_policy qca_wlan_vendor_dcc_get_stats_resp[] = { }, }; -static const struct nla_policy qca_wlan_vendor_dcc_clear_stats[] = { +const struct nla_policy qca_wlan_vendor_dcc_clear_stats[] = { [QCA_WLAN_VENDOR_ATTR_DCC_CLEAR_STATS_BITMAP] = { .type = NLA_U32 }, }; -static const struct nla_policy qca_wlan_vendor_dcc_update_ndl[ +const struct nla_policy qca_wlan_vendor_dcc_update_ndl[ QCA_WLAN_VENDOR_ATTR_DCC_UPDATE_NDL_MAX + 1] = { [QCA_WLAN_VENDOR_ATTR_DCC_UPDATE_NDL_CHANNEL_COUNT] = { .type = NLA_U32 diff --git a/core/hdd/src/wlan_hdd_ocb.h b/core/hdd/src/wlan_hdd_ocb.h index 1bd92c9bc098..d71ac85aea19 100644 --- a/core/hdd/src/wlan_hdd_ocb.h +++ b/core/hdd/src/wlan_hdd_ocb.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015-2019 The Linux Foundation. All rights reserved. + * Copyright (c) 2015-2020 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 @@ -238,7 +238,116 @@ struct hdd_context; int iw_set_dot11p_channel_sched(struct net_device *dev, struct iw_request_info *info, union iwreq_data *wrqu, char *extra); + +extern const struct nla_policy qca_wlan_vendor_ocb_set_config_policy[ + QCA_WLAN_VENDOR_ATTR_OCB_SET_CONFIG_MAX + 1]; +extern const struct nla_policy qca_wlan_vendor_ocb_set_utc_time_policy[ + QCA_WLAN_VENDOR_ATTR_OCB_SET_UTC_TIME_MAX + 1]; +extern const struct nla_policy qca_wlan_vendor_ocb_start_timing_advert_policy[ + QCA_WLAN_VENDOR_ATTR_OCB_START_TIMING_ADVERT_MAX + 1]; +extern const struct nla_policy qca_wlan_vendor_ocb_stop_timing_advert_policy[ + QCA_WLAN_VENDOR_ATTR_OCB_STOP_TIMING_ADVERT_MAX + 1]; +extern const struct nla_policy qca_wlan_vendor_dcc_get_stats[ + QCA_WLAN_VENDOR_ATTR_DCC_GET_STATS_MAX + 1]; +extern const struct nla_policy qca_wlan_vendor_dcc_clear_stats[ + QCA_WLAN_VENDOR_ATTR_DCC_CLEAR_STATS_MAX + 1]; +extern const struct nla_policy qca_wlan_vendor_dcc_update_ndl[ + QCA_WLAN_VENDOR_ATTR_DCC_UPDATE_NDL_MAX + 1]; + +#define FEATURE_OCB_VENDOR_COMMANDS \ +{ \ + .info.vendor_id = QCA_NL80211_VENDOR_ID, \ + .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_OCB_SET_CONFIG, \ + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \ + WIPHY_VENDOR_CMD_NEED_NETDEV | \ + WIPHY_VENDOR_CMD_NEED_RUNNING, \ + .doit = wlan_hdd_cfg80211_ocb_set_config, \ + vendor_command_policy(qca_wlan_vendor_ocb_set_config_policy, \ + QCA_WLAN_VENDOR_ATTR_OCB_SET_CONFIG_MAX) \ +}, \ + \ +{ \ + .info.vendor_id = QCA_NL80211_VENDOR_ID, \ + .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_OCB_SET_UTC_TIME, \ + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \ + WIPHY_VENDOR_CMD_NEED_NETDEV | \ + WIPHY_VENDOR_CMD_NEED_RUNNING, \ + .doit = wlan_hdd_cfg80211_ocb_set_utc_time, \ + vendor_command_policy(qca_wlan_vendor_ocb_set_utc_time_policy, \ + QCA_WLAN_VENDOR_ATTR_OCB_SET_UTC_TIME_MAX) \ +}, \ + \ +{ \ + .info.vendor_id = QCA_NL80211_VENDOR_ID, \ + .info.subcmd = \ + QCA_NL80211_VENDOR_SUBCMD_OCB_START_TIMING_ADVERT, \ + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \ + WIPHY_VENDOR_CMD_NEED_NETDEV | \ + WIPHY_VENDOR_CMD_NEED_RUNNING, \ + .doit = wlan_hdd_cfg80211_ocb_start_timing_advert, \ + vendor_command_policy( \ + qca_wlan_vendor_ocb_start_timing_advert_policy, \ + QCA_WLAN_VENDOR_ATTR_OCB_START_TIMING_ADVERT_MAX) \ +}, \ + \ +{ \ + .info.vendor_id = QCA_NL80211_VENDOR_ID, \ + .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_OCB_STOP_TIMING_ADVERT, \ + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \ + WIPHY_VENDOR_CMD_NEED_NETDEV | \ + WIPHY_VENDOR_CMD_NEED_RUNNING, \ + .doit = wlan_hdd_cfg80211_ocb_stop_timing_advert, \ + vendor_command_policy( \ + qca_wlan_vendor_ocb_stop_timing_advert_policy, \ + QCA_WLAN_VENDOR_ATTR_OCB_STOP_TIMING_ADVERT_MAX) \ +}, \ + \ +{ \ + .info.vendor_id = QCA_NL80211_VENDOR_ID, \ + .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_OCB_GET_TSF_TIMER, \ + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \ + WIPHY_VENDOR_CMD_NEED_NETDEV | \ + WIPHY_VENDOR_CMD_NEED_RUNNING, \ + .doit = wlan_hdd_cfg80211_ocb_get_tsf_timer, \ + vendor_command_policy(VENDOR_CMD_RAW_DATA, 0) \ +}, \ + \ +{ \ + .info.vendor_id = QCA_NL80211_VENDOR_ID, \ + .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_DCC_GET_STATS, \ + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \ + WIPHY_VENDOR_CMD_NEED_NETDEV | \ + WIPHY_VENDOR_CMD_NEED_RUNNING, \ + .doit = wlan_hdd_cfg80211_dcc_get_stats, \ + vendor_command_policy(qca_wlan_vendor_dcc_get_stats, \ + QCA_WLAN_VENDOR_ATTR_DCC_GET_STATS_MAX) \ +}, \ + \ +{ \ + .info.vendor_id = QCA_NL80211_VENDOR_ID, \ + .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_DCC_CLEAR_STATS, \ + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \ + WIPHY_VENDOR_CMD_NEED_NETDEV | \ + WIPHY_VENDOR_CMD_NEED_RUNNING, \ + .doit = wlan_hdd_cfg80211_dcc_clear_stats, \ + vendor_command_policy(qca_wlan_vendor_dcc_clear_stats, \ + QCA_WLAN_VENDOR_ATTR_DCC_CLEAR_STATS_MAX) \ +}, \ + \ +{ \ + .info.vendor_id = QCA_NL80211_VENDOR_ID, \ + .info.subcmd = QCA_NL80211_VENDOR_SUBCMD_DCC_UPDATE_NDL, \ + .flags = WIPHY_VENDOR_CMD_NEED_WDEV | \ + WIPHY_VENDOR_CMD_NEED_NETDEV | \ + WIPHY_VENDOR_CMD_NEED_RUNNING, \ + .doit = wlan_hdd_cfg80211_dcc_update_ndl, \ + vendor_command_policy(qca_wlan_vendor_dcc_update_ndl, \ + QCA_WLAN_VENDOR_ATTR_DCC_UPDATE_NDL_MAX) \ +}, + #else +#define FEATURE_OCB_VENDOR_COMMANDS + static inline int iw_set_dot11p_channel_sched(struct net_device *dev, struct iw_request_info *info, @@ -247,6 +356,8 @@ int iw_set_dot11p_channel_sched(struct net_device *dev, return 0; } #endif +#else +#define FEATURE_OCB_VENDOR_COMMANDS #endif #ifdef WLAN_FEATURE_DSRC