|
@@ -417,6 +417,7 @@ static const struct nla_policy nl80211_policy[NUM_NL80211_ATTR] = {
|
|
|
[NL80211_ATTR_FILS_KEK] = { .type = NLA_BINARY,
|
|
|
.len = FILS_MAX_KEK_LEN },
|
|
|
[NL80211_ATTR_FILS_NONCES] = { .len = 2 * FILS_NONCE_LEN },
|
|
|
+ [NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED] = { .type = NLA_FLAG, },
|
|
|
};
|
|
|
|
|
|
/* policy for the key attributes */
|
|
@@ -1659,6 +1660,7 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,
|
|
|
if (rdev->wiphy.features &
|
|
|
NL80211_FEATURE_SUPPORTS_WMM_ADMISSION)
|
|
|
CMD(add_tx_ts, ADD_TX_TS);
|
|
|
+ CMD(set_multicast_to_unicast, SET_MULTICAST_TO_UNICAST);
|
|
|
}
|
|
|
#undef CMD
|
|
|
|
|
@@ -11766,6 +11768,31 @@ static int nl80211_tdls_cancel_channel_switch(struct sk_buff *skb,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static int nl80211_set_multicast_to_unicast(struct sk_buff *skb,
|
|
|
+ struct genl_info *info)
|
|
|
+{
|
|
|
+ struct cfg80211_registered_device *rdev = info->user_ptr[0];
|
|
|
+ struct net_device *dev = info->user_ptr[1];
|
|
|
+ struct wireless_dev *wdev = dev->ieee80211_ptr;
|
|
|
+ const struct nlattr *nla;
|
|
|
+ bool enabled;
|
|
|
+
|
|
|
+ if (netif_running(dev))
|
|
|
+ return -EBUSY;
|
|
|
+
|
|
|
+ if (!rdev->ops->set_multicast_to_unicast)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
+ if (wdev->iftype != NL80211_IFTYPE_AP &&
|
|
|
+ wdev->iftype != NL80211_IFTYPE_P2P_GO)
|
|
|
+ return -EOPNOTSUPP;
|
|
|
+
|
|
|
+ nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED];
|
|
|
+ enabled = nla_get_flag(nla);
|
|
|
+
|
|
|
+ return rdev_set_multicast_to_unicast(rdev, dev, enabled);
|
|
|
+}
|
|
|
+
|
|
|
#define NL80211_FLAG_NEED_WIPHY 0x01
|
|
|
#define NL80211_FLAG_NEED_NETDEV 0x02
|
|
|
#define NL80211_FLAG_NEED_RTNL 0x04
|
|
@@ -12625,6 +12652,14 @@ static const struct genl_ops nl80211_ops[] = {
|
|
|
.internal_flags = NL80211_FLAG_NEED_NETDEV_UP |
|
|
|
NL80211_FLAG_NEED_RTNL,
|
|
|
},
|
|
|
+ {
|
|
|
+ .cmd = NL80211_CMD_SET_MULTICAST_TO_UNICAST,
|
|
|
+ .doit = nl80211_set_multicast_to_unicast,
|
|
|
+ .policy = nl80211_policy,
|
|
|
+ .flags = GENL_UNS_ADMIN_PERM,
|
|
|
+ .internal_flags = NL80211_FLAG_NEED_NETDEV |
|
|
|
+ NL80211_FLAG_NEED_RTNL,
|
|
|
+ },
|
|
|
};
|
|
|
|
|
|
/* notification functions */
|