fix: support newer kernel cfg80211 APIs

This commit is contained in:
Shen Mintao
2026-06-25 19:26:34 +08:00
parent a5db07c4d4
commit 8bf93919e7
4 changed files with 154 additions and 17 deletions
+13 -1
View File
@@ -60,9 +60,21 @@ endif
MAKEFLAGS +=-j$(shell nproc)
KERNEL_AUTOCONF := $(KDIR)/include/config/auto.conf
KERNEL_CONFIG := $(KDIR)/.config
KERNEL_CC_IS_CLANG := $(shell if [ -r "$(KERNEL_AUTOCONF)" ] && grep -q '^CONFIG_CC_IS_CLANG=y' "$(KERNEL_AUTOCONF)"; then echo y; elif [ -r "$(KERNEL_CONFIG)" ] && grep -q '^CONFIG_CC_IS_CLANG=y' "$(KERNEL_CONFIG)"; then echo y; fi)
ifeq ($(KERNEL_CC_IS_CLANG),y)
LLVM ?= 1
endif
ifneq ($(LLVM),)
KBUILD_EXTRA_ARGS += LLVM=$(LLVM)
endif
all: modules
modules:
make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) modules
make -C $(KDIR) M=$(PWD) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) $(KBUILD_EXTRA_ARGS) modules
install:
mkdir -p $(MODDESTDIR)
+129 -13
View File
@@ -2941,7 +2941,12 @@ bool key_flag = false;
* @add_key: add a key with the given parameters. @mac_addr will be %NULL
* when adding a group key.
*/
static int rwnx_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
static int rwnx_cfg80211_add_key(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct wireless_dev *wdev,
#else
struct net_device *netdev,
#endif
#if (LINUX_VERSION_CODE >= HIGH_KERNEL_VERSION2)
int link_id,
#endif
@@ -2949,7 +2954,11 @@ static int rwnx_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
struct key_params *params)
{
struct rwnx_hw *rwnx_hw = wiphy_priv(wiphy);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct rwnx_vif *vif = netdev_priv(wdev->netdev);
#else
struct rwnx_vif *vif = netdev_priv(netdev);
#endif
int i, error = 0;
struct mm_key_add_cfm key_add_cfm;
u8_l cipher = 0;
@@ -3056,7 +3065,12 @@ static int rwnx_cfg80211_add_key(struct wiphy *wiphy, struct net_device *netdev,
* not possible to retrieve the key, -ENOENT if it doesn't exist.
*
*/
static int rwnx_cfg80211_get_key(struct wiphy *wiphy, struct net_device *netdev,
static int rwnx_cfg80211_get_key(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct wireless_dev *wdev,
#else
struct net_device *netdev,
#endif
#if (LINUX_VERSION_CODE >= HIGH_KERNEL_VERSION2)
int link_id,
#endif
@@ -3075,7 +3089,12 @@ static int rwnx_cfg80211_get_key(struct wiphy *wiphy, struct net_device *netdev,
* @del_key: remove a key given the @mac_addr (%NULL for a group key)
* and @key_index, return -ENOENT if the key doesn't exist.
*/
static int rwnx_cfg80211_del_key(struct wiphy *wiphy, struct net_device *netdev,
static int rwnx_cfg80211_del_key(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct wireless_dev *wdev,
#else
struct net_device *netdev,
#endif
#if (LINUX_VERSION_CODE >= HIGH_KERNEL_VERSION2)
int link_id,
#endif
@@ -3083,7 +3102,11 @@ static int rwnx_cfg80211_del_key(struct wiphy *wiphy, struct net_device *netdev,
u8 key_index, bool pairwise, const u8 *mac_addr)
{
struct rwnx_hw *rwnx_hw = wiphy_priv(wiphy);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct rwnx_vif *vif = netdev_priv(wdev->netdev);
#else
struct rwnx_vif *vif = netdev_priv(netdev);
#endif
int error;
struct rwnx_sta *sta = NULL;
struct rwnx_key *rwnx_key;
@@ -3131,7 +3154,11 @@ static int rwnx_cfg80211_set_default_key(struct wiphy *wiphy,
* @set_default_mgmt_key: set the default management frame key on an interface
*/
static int rwnx_cfg80211_set_default_mgmt_key(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct wireless_dev *wdev,
#else
struct net_device *netdev,
#endif
#if (LINUX_VERSION_CODE >= HIGH_KERNEL_VERSION2)
int link_id,
#endif
@@ -3221,7 +3248,12 @@ static int rwnx_cfg80211_connect(struct wiphy *wiphy, struct net_device *dev,
key_params.key_len = sme->key_len;
key_params.seq_len = 0;
key_params.cipher = sme->crypto.cipher_group;
rwnx_cfg80211_add_key(wiphy, dev,
rwnx_cfg80211_add_key(wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
&rwnx_vif->wdev,
#else
dev,
#endif
#if (LINUX_VERSION_CODE >= HIGH_KERNEL_VERSION2)
0,
#endif
@@ -3448,7 +3480,11 @@ static int rwnx_cfg80211_external_auth(struct wiphy *wiphy, struct net_device *d
* @add_station: Add a new station.
*/
static int rwnx_cfg80211_add_station(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct wireless_dev *wdev,
#else
struct net_device *dev,
#endif
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0))
u8 *mac,
#else
@@ -3457,7 +3493,11 @@ static int rwnx_cfg80211_add_station(struct wiphy *wiphy,
struct station_parameters *params)
{
struct rwnx_hw *rwnx_hw = wiphy_priv(wiphy);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct rwnx_vif *rwnx_vif = netdev_priv(wdev->netdev);
#else
struct rwnx_vif *rwnx_vif = netdev_priv(dev);
#endif
struct me_sta_add_cfm me_sta_add_cfm;
int error = 0;
@@ -3548,7 +3588,13 @@ static int rwnx_cfg80211_add_station(struct wiphy *wiphy,
#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 0, 0)
sinfo.filled |= STATION_INFO_ASSOC_REQ_IES;
#endif
cfg80211_new_sta(rwnx_vif->ndev, sta->mac_addr, &sinfo, GFP_KERNEL);
cfg80211_new_sta(
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
&rwnx_vif->wdev,
#else
rwnx_vif->ndev,
#endif
sta->mac_addr, &sinfo, GFP_KERNEL);
}
#ifdef CONFIG_BAND_STEERING
@@ -3573,7 +3619,13 @@ static int rwnx_cfg80211_add_station(struct wiphy *wiphy,
#define PRINT_STA_FLAG(f) \
(params->sta_flags_set & BIT(NL80211_STA_FLAG_##f) ? "["#f"]" : "")
netdev_info(dev, "Add sta %d (%pM) flags=%s%s%s%s%s%s%s",
netdev_info(
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
wdev->netdev,
#else
dev,
#endif
"Add sta %d (%pM) flags=%s%s%s%s%s%s%s",
sta->sta_idx, mac,
PRINT_STA_FLAG(AUTHORIZED),
PRINT_STA_FLAG(SHORT_PREAMBLE),
@@ -3599,7 +3651,11 @@ static int rwnx_cfg80211_add_station(struct wiphy *wiphy,
* @del_station: Remove a station
*/
static int rwnx_cfg80211_del_station_compat(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct wireless_dev *wdev,
#else
struct net_device *dev,
#endif
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0))
u8 *mac
#elif (LINUX_VERSION_CODE < KERNEL_VERSION(3, 19, 0))
@@ -3610,7 +3666,11 @@ static int rwnx_cfg80211_del_station_compat(struct wiphy *wiphy,
)
{
struct rwnx_hw *rwnx_hw = wiphy_priv(wiphy);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct rwnx_vif *rwnx_vif = netdev_priv(wdev->netdev);
#else
struct rwnx_vif *rwnx_vif = netdev_priv(dev);
#endif
struct rwnx_sta *cur, *tmp;
int error = 0, found = 0;
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 19, 0)
@@ -3650,7 +3710,13 @@ static int rwnx_cfg80211_del_station_compat(struct wiphy *wiphy,
spin_unlock_bh(&rwnx_hw->cb_lock);
if(found) {
netdev_info(dev, "Del sta %d (%pM)", cur->sta_idx, cur->mac_addr);
netdev_info(
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
wdev->netdev,
#else
dev,
#endif
"Del sta %d (%pM)", cur->sta_idx, cur->mac_addr);
if (cur->vif_idx != cur->vlan_idx) {
struct rwnx_vif *vlan_vif;
vlan_vif = rwnx_hw->vif_table[cur->vlan_idx];
@@ -3664,7 +3730,13 @@ static int rwnx_cfg80211_del_station_compat(struct wiphy *wiphy,
}
}
if (rwnx_vif->wdev.iftype == NL80211_IFTYPE_AP || rwnx_vif->wdev.iftype == NL80211_IFTYPE_P2P_GO) {
cfg80211_del_sta(rwnx_vif->ndev, cur->mac_addr, GFP_KERNEL);
cfg80211_del_sta(
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
&rwnx_vif->wdev,
#else
rwnx_vif->ndev,
#endif
cur->mac_addr, GFP_KERNEL);
}
#ifdef AICWF_RX_REORDER
@@ -3889,7 +3961,12 @@ void apm_probe_sta_work_process(struct work_struct *work)
* them, also against the existing state! Drivers must call
* cfg80211_check_station_change() to validate the information.
*/
static int rwnx_cfg80211_change_station(struct wiphy *wiphy, struct net_device *dev,
static int rwnx_cfg80211_change_station(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct wireless_dev *wdev,
#else
struct net_device *dev,
#endif
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0))
u8 *mac,
#else
@@ -3898,7 +3975,11 @@ static int rwnx_cfg80211_change_station(struct wiphy *wiphy, struct net_device *
struct station_parameters *params)
{
struct rwnx_hw *rwnx_hw = wiphy_priv(wiphy);
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct rwnx_vif *vif = netdev_priv(wdev->netdev);
#else
struct rwnx_vif *vif = netdev_priv(dev);
#endif
struct rwnx_sta *sta;
sta = rwnx_get_sta(rwnx_hw, mac);
@@ -3907,7 +3988,11 @@ static int rwnx_cfg80211_change_station(struct wiphy *wiphy, struct net_device *
/* Add the TDLS station */
if (params->sta_flags_set & BIT(NL80211_STA_FLAG_TDLS_PEER))
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct rwnx_vif *rwnx_vif = netdev_priv(wdev->netdev);
#else
struct rwnx_vif *rwnx_vif = netdev_priv(dev);
#endif
struct me_sta_add_cfm me_sta_add_cfm;
int error = 0;
@@ -3978,7 +4063,13 @@ static int rwnx_cfg80211_change_station(struct wiphy *wiphy, struct net_device *
#define PRINT_STA_FLAG(f) \
(params->sta_flags_set & BIT(NL80211_STA_FLAG_##f) ? "["#f"]" : "")
netdev_info(dev, "Add %s TDLS sta %d (%pM) flags=%s%s%s%s%s%s%s",
netdev_info(
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
wdev->netdev,
#else
dev,
#endif
"Add %s TDLS sta %d (%pM) flags=%s%s%s%s%s%s%s",
sta->tdls.initiator ? "initiator" : "responder",
sta->sta_idx, mac,
PRINT_STA_FLAG(AUTHORIZED),
@@ -4261,7 +4352,13 @@ static int rwnx_cfg80211_stop_ap(struct wiphy *wiphy, struct net_device *dev)
/* delete any remaining STA*/
while (!list_empty(&rwnx_vif->ap.sta_list)) {
rwnx_cfg80211_del_station_compat(wiphy, dev, NULL);
rwnx_cfg80211_del_station_compat(wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
&rwnx_vif->wdev,
#else
dev,
#endif
NULL);
}
#ifdef CONFIG_BAND_STEERING
@@ -4516,7 +4613,9 @@ static int rwnx_cfg80211_get_tx_power(struct wiphy *wiphy,
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 17, 0)
int radio_idx,
unsigned int changed,
#endif
#if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 14, 0)
unsigned int link_id,
#endif
int *mbm)
{
@@ -5882,7 +5981,11 @@ int rwnx_fill_station_info(struct rwnx_sta *sta, struct rwnx_vif *vif,
* @get_station: get station information for the station identified by @mac
*/
static int rwnx_cfg80211_get_station(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct wireless_dev *wdev,
#else
struct net_device *dev,
#endif
#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 16, 0))
u8 *mac,
#else
@@ -5890,7 +5993,11 @@ static int rwnx_cfg80211_get_station(struct wiphy *wiphy,
#endif
struct station_info *sinfo)
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct rwnx_vif *vif = netdev_priv(wdev->netdev);
#else
struct rwnx_vif *vif = netdev_priv(dev);
#endif
struct rwnx_sta *sta = NULL;
if (RWNX_VIF_TYPE(vif) == NL80211_IFTYPE_MONITOR)
@@ -5923,10 +6030,19 @@ static int rwnx_cfg80211_get_station(struct wiphy *wiphy,
/**
* @dump_station: dump station callback -- resume dump at index @idx
*/
static int rwnx_cfg80211_dump_station(struct wiphy *wiphy, struct net_device *dev,
static int rwnx_cfg80211_dump_station(struct wiphy *wiphy,
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct wireless_dev *wdev,
#else
struct net_device *dev,
#endif
int idx, u8 *mac, struct station_info *sinfo)
{
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
struct rwnx_vif *rwnx_vif = netdev_priv(wdev->netdev);
#else
struct rwnx_vif *rwnx_vif = netdev_priv(dev);
#endif
//struct rwnx_hw *rwnx_hw = wiphy_priv(wiphy);
struct rwnx_sta *sta_iter, *sta = NULL;
//struct mesh_peer_info_cfm peer_info_cfm;
+9
View File
@@ -115,12 +115,21 @@ rwnx_prep_tdls_direct(struct rwnx_hw *rwnx_hw, struct rwnx_vif *rwnx_vif,
switch (action_code) {
case WLAN_PUB_ACTION_TDLS_DISCOVER_RES:
#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 1, 0)
skb_put(skb, 1 + sizeof(mgmt->u.action.tdls_discover_resp));
mgmt->u.action.category = WLAN_CATEGORY_PUBLIC;
mgmt->u.action.action_code = WLAN_PUB_ACTION_TDLS_DISCOVER_RES;
mgmt->u.action.tdls_discover_resp.dialog_token = dialog_token;
mgmt->u.action.tdls_discover_resp.capability =
cpu_to_le16(rwnx_get_tdls_sta_capab(rwnx_vif, status_code));
#else
skb_put(skb, 1 + sizeof(mgmt->u.action.u.tdls_discover_resp));
mgmt->u.action.category = WLAN_CATEGORY_PUBLIC;
mgmt->u.action.u.tdls_discover_resp.action_code = WLAN_PUB_ACTION_TDLS_DISCOVER_RES;
mgmt->u.action.u.tdls_discover_resp.dialog_token = dialog_token;
mgmt->u.action.u.tdls_discover_resp.capability =
cpu_to_le16(rwnx_get_tdls_sta_capab(rwnx_vif, status_code));
#endif
break;
default:
return -EINVAL;