--- zzzz-none-000/linux-4.19.183/net/wireless/nl80211.c 2021-03-24 10:07:39.000000000 +0000 +++ bcm63-7530ax-756/linux-4.19.183/net/wireless/nl80211.c 2023-06-28 08:54:21.000000000 +0000 @@ -859,6 +859,9 @@ int idx; int type; bool def, defmgmt; +#ifdef CONFIG_BCM_KF_MISC_BACKPORTS + bool defbeacon; +#endif /* CONFIG_BCM_KF_MISC_BACKPORTS */ bool def_uni, def_multi; }; @@ -873,13 +876,21 @@ k->def = !!tb[NL80211_KEY_DEFAULT]; k->defmgmt = !!tb[NL80211_KEY_DEFAULT_MGMT]; +#ifdef CONFIG_BCM_KF_MISC_BACKPORTS + k->defbeacon = !!tb[NL80211_KEY_DEFAULT_BEACON]; +#endif /* CONFIG_BCM_KF_MISC_BACKPORTS */ if (k->def) { k->def_uni = true; k->def_multi = true; } +#ifndef CONFIG_BCM_KF_MISC_BACKPORTS if (k->defmgmt) k->def_multi = true; +#else + if (k->defmgmt || k->defbeacon) + k->def_multi = true; +#endif /* CONFIG_BCM_KF_MISC_BACKPORTS */ if (tb[NL80211_KEY_IDX]) k->idx = nla_get_u8(tb[NL80211_KEY_IDX]); @@ -990,6 +1001,7 @@ if (err) return err; +#ifndef CONFIG_BCM_KF_MISC_BACKPORTS if (k->def && k->defmgmt) { GENL_SET_ERR_MSG(info, "key with def && defmgmt is invalid"); return -EINVAL; @@ -1001,6 +1013,21 @@ return -EINVAL; } } +#else + if ((k->def ? 1 : 0) + (k->defmgmt ? 1 : 0) + + (k->defbeacon ? 1 : 0) > 1) { + GENL_SET_ERR_MSG(info, + "key with multiple default flags is invalid"); + return -EINVAL; + } + + if (k->defmgmt || k->defbeacon) { + if (k->def_uni || !k->def_multi) { + GENL_SET_ERR_MSG(info, "defmgmt key must be mcast"); + return -EINVAL; + } + } +#endif /* CONFIG_BCM_KF_MISC_BACKPORTS */ if (k->idx != -1) { if (k->defmgmt) { @@ -1009,14 +1036,27 @@ "defmgmt key idx not 4 or 5"); return -EINVAL; } +#ifdef CONFIG_BCM_KF_MISC_BACKPORTS + } else if (k->defbeacon) { + if (k->idx < 6 || k->idx > 7) { + GENL_SET_ERR_MSG(info, + "defmgmt key idx not 6 or 7"); + return -EINVAL; + } +#endif /* CONFIG_BCM_KF_MISC_BACKPORTS */ } else if (k->def) { if (k->idx < 0 || k->idx > 3) { GENL_SET_ERR_MSG(info, "def key idx not 0-3"); return -EINVAL; } } else { +#ifndef CONFIG_BCM_KF_MISC_BACKPORTS if (k->idx < 0 || k->idx > 5) { GENL_SET_ERR_MSG(info, "key idx not 0-5"); +#else + if (k->idx < 0 || k->idx > 7) { + GENL_SET_ERR_MSG(info, "key idx not 0-7"); +#endif /* CONFIG_BCM_KF_MISC_BACKPORTS */ return -EINVAL; } } @@ -3509,7 +3549,11 @@ return -EINVAL; /* only support setting default key */ +#ifndef CONFIG_BCM_KF_MISC_BACKPORTS if (!key.def && !key.defmgmt) +#else + if (!key.def && !key.defmgmt && !key.defbeacon) +#endif /* CONFIG_BCM_KF_MISC_BACKPORTS */ return -EINVAL; wdev_lock(dev->ieee80211_ptr);