Lines Matching refs:info

35 				   struct genl_info *info,
220 cfg80211_get_dev_from_info(struct net *netns, struct genl_info *info)
222 return __cfg80211_rdev_from_attrs(netns, info->attrs);
1293 static int nl80211_parse_key_new(struct genl_info *info, struct nlattr *key,
1299 info->extack);
1340 info->extack);
1354 static int nl80211_parse_key_old(struct genl_info *info, struct key_parse *k)
1356 if (info->attrs[NL80211_ATTR_KEY_DATA]) {
1357 k->p.key = nla_data(info->attrs[NL80211_ATTR_KEY_DATA]);
1358 k->p.key_len = nla_len(info->attrs[NL80211_ATTR_KEY_DATA]);
1361 if (info->attrs[NL80211_ATTR_KEY_SEQ]) {
1362 k->p.seq = nla_data(info->attrs[NL80211_ATTR_KEY_SEQ]);
1363 k->p.seq_len = nla_len(info->attrs[NL80211_ATTR_KEY_SEQ]);
1366 if (info->attrs[NL80211_ATTR_KEY_IDX])
1367 k->idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
1369 if (info->attrs[NL80211_ATTR_KEY_CIPHER])
1370 k->p.cipher = nla_get_u32(info->attrs[NL80211_ATTR_KEY_CIPHER]);
1372 k->def = !!info->attrs[NL80211_ATTR_KEY_DEFAULT];
1373 k->defmgmt = !!info->attrs[NL80211_ATTR_KEY_DEFAULT_MGMT];
1382 if (info->attrs[NL80211_ATTR_KEY_TYPE])
1383 k->type = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
1385 if (info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES]) {
1389 info->attrs[NL80211_ATTR_KEY_DEFAULT_TYPES],
1391 info->extack);
1402 static int nl80211_parse_key(struct genl_info *info, struct key_parse *k)
1410 if (info->attrs[NL80211_ATTR_KEY])
1411 err = nl80211_parse_key_new(info, info->attrs[NL80211_ATTR_KEY], k);
1413 err = nl80211_parse_key_old(info, k);
1420 GENL_SET_ERR_MSG(info,
1427 GENL_SET_ERR_MSG(info,
1436 GENL_SET_ERR_MSG(info,
1442 GENL_SET_ERR_MSG(info,
1448 GENL_SET_ERR_MSG(info, "def key idx not 0-3");
1453 GENL_SET_ERR_MSG(info, "key idx not 0-7");
1464 struct genl_info *info, bool *no_ht)
1466 struct nlattr *keys = info->attrs[NL80211_ATTR_KEYS];
1491 err = nl80211_parse_key_new(info, key, &parse);
1498 GENL_SET_ERR_MSG(info, "key index out of range [0-3]");
1503 GENL_SET_ERR_MSG(info,
1519 GENL_SET_ERR_MSG(info, "connect key must be WEP");
1535 GENL_SET_ERR_MSG(info, "need a default/TX key");
1890 /* add HT info */
1903 /* add VHT info */
1939 /* add EDMG info */
2802 const struct nl80211_vendor_cmd_info *info;
2811 info = &rdev->wiphy.vendor_commands[i].info;
2812 if (nla_put(msg, i + 1, sizeof(*info), info))
2819 const struct nl80211_vendor_cmd_info *info;
2828 info = &rdev->wiphy.vendor_events[i];
2829 if (nla_put(msg, i + 1, sizeof(*info), info))
3137 static int nl80211_get_wiphy(struct sk_buff *skb, struct genl_info *info)
3140 struct cfg80211_registered_device *rdev = info->user_ptr[0];
3148 info->snd_portid, info->snd_seq, 0,
3154 return genlmsg_reply(msg, info);
3212 struct genl_info *info,
3219 *punct_bitmap = nla_get_u32(info->attrs[NL80211_ATTR_PUNCT_BITMAP]);
3227 struct genl_info *info,
3230 struct netlink_ext_ack *extack = info->extack;
3231 struct nlattr **attrs = info->attrs;
3241 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
3242 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
3244 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
3321 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) {
3323 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]);
3325 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG])
3327 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]);
3356 struct genl_info *info,
3378 result = nl80211_parse_chandef(rdev, info, &chandef);
3421 static int nl80211_set_channel(struct sk_buff *skb, struct genl_info *info)
3423 struct cfg80211_registered_device *rdev = info->user_ptr[0];
3424 int link_id = nl80211_link_id_or_invalid(info->attrs);
3425 struct net_device *netdev = info->user_ptr[1];
3429 ret = __nl80211_set_channel(rdev, netdev, info, link_id);
3435 static int nl80211_set_wiphy(struct sk_buff *skb, struct genl_info *info)
3459 if (info->attrs[NL80211_ATTR_IFINDEX]) {
3460 int ifindex = nla_get_u32(info->attrs[NL80211_ATTR_IFINDEX]);
3462 netdev = __dev_get_by_index(genl_info_net(info), ifindex);
3470 rdev = __cfg80211_rdev_from_attrs(genl_info_net(info),
3471 info->attrs);
3489 if (info->attrs[NL80211_ATTR_WIPHY_NAME])
3491 rdev, nla_data(info->attrs[NL80211_ATTR_WIPHY_NAME]));
3497 if (info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS]) {
3523 info->attrs[NL80211_ATTR_WIPHY_TXQ_PARAMS],
3529 info->extack);
3537 nl80211_link_id_or_invalid(info->attrs);
3556 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
3557 int link_id = nl80211_link_id_or_invalid(info->attrs);
3564 info, link_id);
3567 result = __nl80211_set_channel(rdev, netdev, info, link_id);
3574 if (info->attrs[NL80211_ATTR_WIPHY_TX_POWER_SETTING]) {
3588 type = nla_get_u32(info->attrs[idx]);
3590 if (!info->attrs[NL80211_ATTR_WIPHY_TX_POWER_LEVEL] &&
3598 mbm = nla_get_u32(info->attrs[idx]);
3606 if (info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX] &&
3607 info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]) {
3617 tx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_TX]);
3618 rx_ant = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_ANTENNA_RX]);
3638 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]) {
3640 info->attrs[NL80211_ATTR_WIPHY_RETRY_SHORT]);
3645 if (info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]) {
3647 info->attrs[NL80211_ATTR_WIPHY_RETRY_LONG]);
3652 if (info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]) {
3654 info->attrs[NL80211_ATTR_WIPHY_FRAG_THRESHOLD]);
3672 if (info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]) {
3674 info->attrs[NL80211_ATTR_WIPHY_RTS_THRESHOLD]);
3678 if (info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]) {
3679 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) {
3685 info->attrs[NL80211_ATTR_WIPHY_COVERAGE_CLASS]);
3689 if (info->attrs[NL80211_ATTR_WIPHY_DYN_ACK]) {
3698 if (info->attrs[NL80211_ATTR_TXQ_LIMIT]) {
3705 info->attrs[NL80211_ATTR_TXQ_LIMIT]);
3709 if (info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]) {
3716 info->attrs[NL80211_ATTR_TXQ_MEMORY_LIMIT]);
3720 if (info->attrs[NL80211_ATTR_TXQ_QUANTUM]) {
3727 info->attrs[NL80211_ATTR_TXQ_QUANTUM]);
4029 static int nl80211_get_interface(struct sk_buff *skb, struct genl_info *info)
4032 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4033 struct wireless_dev *wdev = info->user_ptr[1];
4039 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
4045 return genlmsg_reply(msg, info);
4081 struct genl_info *info,
4087 if (info->attrs[NL80211_ATTR_MNTR_FLAGS]) {
4091 err = parse_monitor_flags(info->attrs[NL80211_ATTR_MNTR_FLAGS],
4103 if (info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]) {
4114 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_GROUP_DATA]);
4125 if (info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]) {
4135 nla_data(info->attrs[NL80211_ATTR_MU_MIMO_FOLLOW_MAC_ADDR]);
4168 static int nl80211_set_interface(struct sk_buff *skb, struct genl_info *info)
4170 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4174 struct net_device *dev = info->user_ptr[1];
4181 if (info->attrs[NL80211_ATTR_IFTYPE]) {
4182 ntype = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
4187 if (info->attrs[NL80211_ATTR_MESH_ID]) {
4201 nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
4203 nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
4208 if (info->attrs[NL80211_ATTR_4ADDR]) {
4209 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
4218 err = nl80211_parse_mon_options(rdev, ntype, info, &params);
4241 static int _nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
4243 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4252 if (!info->attrs[NL80211_ATTR_IFNAME])
4255 if (info->attrs[NL80211_ATTR_IFTYPE])
4256 type = nla_get_u32(info->attrs[NL80211_ATTR_IFTYPE]);
4263 info->attrs[NL80211_ATTR_MAC]) {
4264 nla_memcpy(params.macaddr, info->attrs[NL80211_ATTR_MAC],
4270 if (info->attrs[NL80211_ATTR_4ADDR]) {
4271 params.use_4addr = !!nla_get_u8(info->attrs[NL80211_ATTR_4ADDR]);
4280 err = nl80211_parse_mon_options(rdev, type, info, &params);
4289 nla_data(info->attrs[NL80211_ATTR_IFNAME]),
4299 if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
4300 wdev->owner_nlportid = info->snd_portid;
4304 if (!info->attrs[NL80211_ATTR_MESH_ID])
4310 nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
4312 nla_data(info->attrs[NL80211_ATTR_MESH_ID]),
4329 if (nl80211_send_iface(msg, info->snd_portid, info->snd_seq, 0,
4335 return genlmsg_reply(msg, info);
4338 static int nl80211_new_interface(struct sk_buff *skb, struct genl_info *info)
4340 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4347 ret = _nl80211_new_interface(skb, info);
4353 static int nl80211_del_interface(struct sk_buff *skb, struct genl_info *info)
4355 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4356 struct wireless_dev *wdev = info->user_ptr[1];
4380 info->user_ptr[1] = NULL;
4389 static int nl80211_set_noack_map(struct sk_buff *skb, struct genl_info *info)
4391 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4392 struct net_device *dev = info->user_ptr[1];
4395 if (!info->attrs[NL80211_ATTR_NOACK_MAP])
4401 noack_map = nla_get_u16(info->attrs[NL80211_ATTR_NOACK_MAP]);
4406 static int nl80211_validate_key_link_id(struct genl_info *info,
4412 GENL_SET_ERR_MSG(info,
4422 GENL_SET_ERR_MSG(info,
4427 GENL_SET_ERR_MSG(info, "invalid link ID for MLO group key");
4431 GENL_SET_ERR_MSG(info, "link ID not allowed for non-MLO group key");
4485 static int nl80211_get_key(struct sk_buff *skb, struct genl_info *info)
4487 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4489 struct net_device *dev = info->user_ptr[1];
4499 int link_id = nl80211_link_id_or_invalid(info->attrs);
4512 if (info->attrs[NL80211_ATTR_KEY_IDX]) {
4513 key_idx = nla_get_u8(info->attrs[NL80211_ATTR_KEY_IDX]);
4516 GENL_SET_ERR_MSG(info, "BIGTK not supported");
4521 if (info->attrs[NL80211_ATTR_MAC])
4522 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4525 if (info->attrs[NL80211_ATTR_KEY_TYPE]) {
4526 u32 kt = nla_get_u32(info->attrs[NL80211_ATTR_KEY_TYPE]);
4544 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
4559 err = nl80211_validate_key_link_id(info, wdev, link_id, pairwise);
4573 return genlmsg_reply(msg, info);
4582 static int nl80211_set_key(struct sk_buff *skb, struct genl_info *info)
4584 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4587 struct net_device *dev = info->user_ptr[1];
4588 int link_id = nl80211_link_id_or_invalid(info->attrs);
4591 err = nl80211_parse_key(info, &key);
4617 err = nl80211_validate_key_link_id(info, wdev, link_id, false);
4645 err = nl80211_validate_key_link_id(info, wdev, link_id, false);
4671 err = nl80211_validate_key_link_id(info, wdev, link_id, false);
4683 if (info->attrs[NL80211_ATTR_MAC])
4684 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4691 err = nl80211_validate_key_link_id(info, wdev, link_id, true);
4707 static int nl80211_new_key(struct sk_buff *skb, struct genl_info *info)
4709 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4711 struct net_device *dev = info->user_ptr[1];
4714 int link_id = nl80211_link_id_or_invalid(info->attrs);
4717 err = nl80211_parse_key(info, &key);
4722 GENL_SET_ERR_MSG(info, "no key");
4726 if (info->attrs[NL80211_ATTR_MAC])
4727 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4739 GENL_SET_ERR_MSG(info, "key type not pairwise or group");
4744 info->attrs[NL80211_ATTR_VLAN_ID])
4745 key.p.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
4753 GENL_SET_ERR_MSG(info, "key setting validation failed");
4760 GENL_SET_ERR_MSG(info, "key not allowed");
4763 err = nl80211_validate_key_link_id(info, wdev, link_id,
4771 GENL_SET_ERR_MSG(info, "key addition failed");
4778 static int nl80211_del_key(struct sk_buff *skb, struct genl_info *info)
4780 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4782 struct net_device *dev = info->user_ptr[1];
4785 int link_id = nl80211_link_id_or_invalid(info->attrs);
4788 err = nl80211_parse_key(info, &key);
4792 if (info->attrs[NL80211_ATTR_MAC])
4793 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
4822 err = nl80211_validate_key_link_id(info, wdev, link_id,
4865 struct genl_info *info)
4875 if (!info->attrs[NL80211_ATTR_ACL_POLICY])
4878 acl_policy = nla_get_u32(info->attrs[NL80211_ATTR_ACL_POLICY]);
4883 if (!info->attrs[NL80211_ATTR_MAC_ADDRS])
4886 n_entries = validate_acl_mac_addrs(info->attrs[NL80211_ATTR_MAC_ADDRS]);
4898 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_MAC_ADDRS], tmp) {
4907 static int nl80211_set_mac_acl(struct sk_buff *skb, struct genl_info *info)
4909 struct cfg80211_registered_device *rdev = info->user_ptr[0];
4910 struct net_device *dev = info->user_ptr[1];
4921 acl = parse_acl_data(&rdev->wiphy, info);
5074 static u16 he_get_txmcsmap(struct genl_info *info, unsigned int link_id,
5077 struct net_device *dev = info->user_ptr[1];
5106 static bool he_set_mcs_mask(struct genl_info *info,
5124 tx_mcs_map = he_get_txmcsmap(info, link_id, he_cap);
5139 static int nl80211_parse_tx_bitrate_mask(struct genl_info *info,
5148 struct cfg80211_registered_device *rdev = info->user_ptr[0];
5182 he_tx_mcs_map = he_get_txmcsmap(info, link_id, he_cap);
5209 info->extack);
5245 !he_set_mcs_mask(info, wdev, sband,
5930 static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info)
5932 struct cfg80211_registered_device *rdev = info->user_ptr[0];
5933 unsigned int link_id = nl80211_link_id(info->attrs);
5934 struct net_device *dev = info->user_ptr[1];
5950 if (!info->attrs[NL80211_ATTR_BEACON_INTERVAL] ||
5951 !info->attrs[NL80211_ATTR_DTIM_PERIOD] ||
5952 !info->attrs[NL80211_ATTR_BEACON_HEAD])
5959 err = nl80211_parse_beacon(rdev, info->attrs, &params->beacon,
5960 info->extack);
5965 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
5967 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
5981 if (info->attrs[NL80211_ATTR_SSID]) {
5982 params->ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
5984 nla_len(info->attrs[NL80211_ATTR_SSID]);
6003 if (info->attrs[NL80211_ATTR_HIDDEN_SSID])
6005 info->attrs[NL80211_ATTR_HIDDEN_SSID]);
6007 params->privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
6009 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
6011 info->attrs[NL80211_ATTR_AUTH_TYPE]);
6020 err = nl80211_crypto_settings(rdev, info, &params->crypto,
6025 if (info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]) {
6031 info->attrs[NL80211_ATTR_INACTIVITY_TIMEOUT]);
6034 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
6040 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
6048 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
6055 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
6064 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
6065 err = nl80211_parse_chandef(rdev, info, &params->chandef);
6079 if (info->attrs[NL80211_ATTR_PUNCT_BITMAP]) {
6080 err = nl80211_parse_punct_bitmap(rdev, info,
6095 if (info->attrs[NL80211_ATTR_TX_RATES]) {
6096 err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
6109 if (info->attrs[NL80211_ATTR_SMPS_MODE]) {
6111 nla_get_u8(info->attrs[NL80211_ATTR_SMPS_MODE]);
6137 params->pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
6143 if (info->attrs[NL80211_ATTR_ACL_POLICY]) {
6144 params->acl = parse_acl_data(&rdev->wiphy, info);
6153 nla_get_flag(info->attrs[NL80211_ATTR_TWT_RESPONDER]);
6155 if (info->attrs[NL80211_ATTR_HE_OBSS_PD]) {
6157 info->attrs[NL80211_ATTR_HE_OBSS_PD],
6163 if (info->attrs[NL80211_ATTR_FILS_DISCOVERY]) {
6165 info->attrs[NL80211_ATTR_FILS_DISCOVERY],
6171 if (info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP]) {
6173 rdev, info->attrs[NL80211_ATTR_UNSOL_BCAST_PROBE_RESP],
6179 if (info->attrs[NL80211_ATTR_MBSSID_CONFIG]) {
6181 info->attrs[NL80211_ATTR_MBSSID_CONFIG],
6203 if (info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS])
6205 info->attrs[NL80211_ATTR_AP_SETTINGS_FLAGS]);
6206 else if (info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])
6210 info->attrs[NL80211_ATTR_SOCKET_OWNER] &&
6211 wdev->conn_owner_nlportid != info->snd_portid) {
6226 if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
6227 wdev->conn_owner_nlportid = info->snd_portid;
6246 static int nl80211_set_beacon(struct sk_buff *skb, struct genl_info *info)
6248 struct cfg80211_registered_device *rdev = info->user_ptr[0];
6249 unsigned int link_id = nl80211_link_id(info->attrs);
6250 struct net_device *dev = info->user_ptr[1];
6265 err = nl80211_parse_beacon(rdev, info->attrs, &params, info->extack);
6279 static int nl80211_stop_ap(struct sk_buff *skb, struct genl_info *info)
6281 struct cfg80211_registered_device *rdev = info->user_ptr[0];
6282 unsigned int link_id = nl80211_link_id(info->attrs);
6283 struct net_device *dev = info->user_ptr[1];
6297 static int parse_station_flags(struct genl_info *info,
6309 nla = info->attrs[NL80211_ATTR_STA_FLAGS2];
6325 nla = info->attrs[NL80211_ATTR_STA_FLAGS];
6329 if (nla_parse_nested_deprecated(flags, NL80211_STA_FLAG_MAX, nla, sta_flags_policy, info->extack))
6374 bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info, int attr)
6386 bitrate = cfg80211_calculate_bitrate(info);
6396 switch (info->bw) {
6435 WARN_ON(!(info->flags & RATE_INFO_FLAGS_HE_MCS));
6442 WARN_ON(!(info->flags & RATE_INFO_FLAGS_EHT_MCS));
6449 if (info->flags & RATE_INFO_FLAGS_MCS) {
6450 if (nla_put_u8(msg, NL80211_RATE_INFO_MCS, info->mcs))
6452 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
6455 } else if (info->flags & RATE_INFO_FLAGS_VHT_MCS) {
6456 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_MCS, info->mcs))
6458 if (nla_put_u8(msg, NL80211_RATE_INFO_VHT_NSS, info->nss))
6460 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
6463 } else if (info->flags & RATE_INFO_FLAGS_HE_MCS) {
6464 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_MCS, info->mcs))
6466 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_NSS, info->nss))
6468 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_GI, info->he_gi))
6470 if (nla_put_u8(msg, NL80211_RATE_INFO_HE_DCM, info->he_dcm))
6472 if (info->bw == RATE_INFO_BW_HE_RU &&
6474 info->he_ru_alloc))
6476 } else if (info->flags & RATE_INFO_FLAGS_S1G_MCS) {
6477 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_MCS, info->mcs))
6479 if (nla_put_u8(msg, NL80211_RATE_INFO_S1G_NSS, info->nss))
6481 if (info->flags & RATE_INFO_FLAGS_SHORT_GI &&
6484 } else if (info->flags & RATE_INFO_FLAGS_EHT_MCS) {
6485 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_MCS, info->mcs))
6487 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_NSS, info->nss))
6489 if (nla_put_u8(msg, NL80211_RATE_INFO_EHT_GI, info->eht_gi))
6491 if (info->bw == RATE_INFO_BW_EHT_RU &&
6493 info->eht_ru_alloc))
6812 static int nl80211_get_station(struct sk_buff *skb, struct genl_info *info)
6814 struct cfg80211_registered_device *rdev = info->user_ptr[0];
6815 struct net_device *dev = info->user_ptr[1];
6823 if (!info->attrs[NL80211_ATTR_MAC])
6826 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
6842 info->snd_portid, info->snd_seq, 0,
6848 return genlmsg_reply(msg, info);
7008 static struct net_device *get_vlan(struct genl_info *info,
7011 struct nlattr *vlanattr = info->attrs[NL80211_ATTR_STA_VLAN];
7018 v = dev_get_by_index(genl_info_net(info), nla_get_u32(vlanattr));
7045 static int nl80211_parse_sta_wme(struct genl_info *info,
7053 if (!info->attrs[NL80211_ATTR_STA_WME])
7056 nla = info->attrs[NL80211_ATTR_STA_WME];
7059 info->extack);
7080 static int nl80211_parse_sta_channel_info(struct genl_info *info,
7083 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]) {
7085 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
7087 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_CHANNELS]);
7097 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]) {
7099 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
7101 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_OPER_CLASSES]);
7106 static int nl80211_set_station_tdls(struct genl_info *info,
7111 if (info->attrs[NL80211_ATTR_PEER_AID])
7112 params->aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
7113 if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
7115 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
7116 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
7118 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
7119 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) {
7121 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
7123 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
7125 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) {
7127 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
7129 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
7139 err = nl80211_parse_sta_channel_info(info, params);
7143 return nl80211_parse_sta_wme(info, params);
7146 static int nl80211_parse_sta_txpower_setting(struct genl_info *info,
7150 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7153 if (info->attrs[NL80211_ATTR_STA_TX_POWER_SETTING]) {
7160 txpwr->type = nla_get_u8(info->attrs[idx]);
7165 if (info->attrs[idx])
7166 txpwr->power = nla_get_s16(info->attrs[idx]);
7179 static int nl80211_set_station(struct sk_buff *skb, struct genl_info *info)
7181 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7182 struct net_device *dev = info->user_ptr[1];
7197 if (info->attrs[NL80211_ATTR_STA_AID])
7198 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
7200 if (info->attrs[NL80211_ATTR_VLAN_ID])
7201 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
7203 if (info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
7205 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
7209 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS])
7211 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
7215 if (!info->attrs[NL80211_ATTR_MAC])
7219 nl80211_link_id_or_invalid(info->attrs);
7221 if (info->attrs[NL80211_ATTR_MLD_ADDR]) {
7230 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]);
7233 nla_data(info->attrs[NL80211_ATTR_MAC]);
7237 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
7241 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
7243 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
7245 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
7248 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
7250 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
7254 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
7256 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
7258 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
7261 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
7264 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
7266 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
7268 if (info->attrs[NL80211_ATTR_STA_PLINK_STATE]) {
7270 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_STATE]);
7271 if (info->attrs[NL80211_ATTR_MESH_PEER_AID])
7273 info->attrs[NL80211_ATTR_MESH_PEER_AID]);
7277 if (info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE])
7279 info->attrs[NL80211_ATTR_LOCAL_MESH_POWER_MODE]);
7281 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
7284 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
7287 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY])
7289 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]);
7291 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT])
7293 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]);
7300 err = nl80211_parse_sta_txpower_setting(info,
7307 err = nl80211_set_station_tdls(info, &params);
7311 params.vlan = get_vlan(info, rdev);
7340 static int nl80211_new_station(struct sk_buff *skb, struct genl_info *info)
7342 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7344 struct net_device *dev = info->user_ptr[1];
7356 if (!info->attrs[NL80211_ATTR_MAC])
7359 if (!info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL])
7362 if (!info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
7365 if (!info->attrs[NL80211_ATTR_STA_AID] &&
7366 !info->attrs[NL80211_ATTR_PEER_AID])
7370 nl80211_link_id_or_invalid(info->attrs);
7372 if (info->attrs[NL80211_ATTR_MLD_ADDR]) {
7373 mac_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]);
7376 nla_data(info->attrs[NL80211_ATTR_MAC]);
7380 mac_addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
7384 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
7386 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
7388 nla_get_u16(info->attrs[NL80211_ATTR_STA_LISTEN_INTERVAL]);
7390 if (info->attrs[NL80211_ATTR_VLAN_ID])
7391 params.vlan_id = nla_get_u16(info->attrs[NL80211_ATTR_VLAN_ID]);
7393 if (info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]) {
7395 nla_get_u8(info->attrs[NL80211_ATTR_STA_SUPPORT_P2P_PS]);
7405 if (info->attrs[NL80211_ATTR_PEER_AID])
7406 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_PEER_AID]);
7408 params.aid = nla_get_u16(info->attrs[NL80211_ATTR_STA_AID]);
7410 if (info->attrs[NL80211_ATTR_STA_CAPABILITY]) {
7412 nla_get_u16(info->attrs[NL80211_ATTR_STA_CAPABILITY]);
7416 if (info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]) {
7418 nla_data(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
7420 nla_len(info->attrs[NL80211_ATTR_STA_EXT_CAPABILITY]);
7423 if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
7425 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
7427 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
7429 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
7431 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) {
7433 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
7435 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
7437 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) {
7439 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
7441 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
7451 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY])
7453 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]);
7455 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
7458 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
7461 if (info->attrs[NL80211_ATTR_STA_PLINK_ACTION])
7463 nla_get_u8(info->attrs[NL80211_ATTR_STA_PLINK_ACTION]);
7465 if (info->attrs[NL80211_ATTR_AIRTIME_WEIGHT])
7467 nla_get_u16(info->attrs[NL80211_ATTR_AIRTIME_WEIGHT]);
7474 err = nl80211_parse_sta_txpower_setting(info,
7480 err = nl80211_parse_sta_channel_info(info, &params);
7484 err = nl80211_parse_sta_wme(info, &params);
7488 if (parse_station_flags(info, dev->ieee80211_ptr->iftype, &params))
7526 info->attrs[NL80211_ATTR_PEER_AID])
7553 params.vlan = get_vlan(info, rdev);
7566 info->attrs[NL80211_ATTR_PEER_AID])
7623 static int nl80211_del_station(struct sk_buff *skb, struct genl_info *info)
7625 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7626 struct net_device *dev = info->user_ptr[1];
7632 if (info->attrs[NL80211_ATTR_MAC])
7633 params.mac = nla_data(info->attrs[NL80211_ATTR_MAC]);
7655 if (info->attrs[NL80211_ATTR_MGMT_SUBTYPE]) {
7657 nla_get_u8(info->attrs[NL80211_ATTR_MGMT_SUBTYPE]);
7666 if (info->attrs[NL80211_ATTR_REASON_CODE]) {
7668 nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
7795 static int nl80211_get_mpath(struct sk_buff *skb, struct genl_info *info)
7797 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7799 struct net_device *dev = info->user_ptr[1];
7807 if (!info->attrs[NL80211_ATTR_MAC])
7810 dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
7826 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
7832 return genlmsg_reply(msg, info);
7835 static int nl80211_set_mpath(struct sk_buff *skb, struct genl_info *info)
7837 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7838 struct net_device *dev = info->user_ptr[1];
7842 if (!info->attrs[NL80211_ATTR_MAC])
7845 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
7848 dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
7849 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
7860 static int nl80211_new_mpath(struct sk_buff *skb, struct genl_info *info)
7862 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7863 struct net_device *dev = info->user_ptr[1];
7867 if (!info->attrs[NL80211_ATTR_MAC])
7870 if (!info->attrs[NL80211_ATTR_MPATH_NEXT_HOP])
7873 dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
7874 next_hop = nla_data(info->attrs[NL80211_ATTR_MPATH_NEXT_HOP]);
7885 static int nl80211_del_mpath(struct sk_buff *skb, struct genl_info *info)
7887 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7888 struct net_device *dev = info->user_ptr[1];
7891 if (info->attrs[NL80211_ATTR_MAC])
7892 dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
7903 static int nl80211_get_mpp(struct sk_buff *skb, struct genl_info *info)
7905 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7907 struct net_device *dev = info->user_ptr[1];
7915 if (!info->attrs[NL80211_ATTR_MAC])
7918 dst = nla_data(info->attrs[NL80211_ATTR_MAC]);
7934 if (nl80211_send_mpath(msg, info->snd_portid, info->snd_seq, 0,
7940 return genlmsg_reply(msg, info);
7995 static int nl80211_set_bss(struct sk_buff *skb, struct genl_info *info)
7997 struct cfg80211_registered_device *rdev = info->user_ptr[0];
7998 struct net_device *dev = info->user_ptr[1];
8004 params.link_id = nl80211_link_id_or_invalid(info->attrs);
8014 if (info->attrs[NL80211_ATTR_BSS_CTS_PROT])
8016 nla_get_u8(info->attrs[NL80211_ATTR_BSS_CTS_PROT]);
8017 if (info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE])
8019 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_PREAMBLE]);
8020 if (info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME])
8022 nla_get_u8(info->attrs[NL80211_ATTR_BSS_SHORT_SLOT_TIME]);
8023 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
8025 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
8027 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
8029 if (info->attrs[NL80211_ATTR_AP_ISOLATE])
8030 params.ap_isolate = !!nla_get_u8(info->attrs[NL80211_ATTR_AP_ISOLATE]);
8031 if (info->attrs[NL80211_ATTR_BSS_HT_OPMODE])
8033 nla_get_u16(info->attrs[NL80211_ATTR_BSS_HT_OPMODE]);
8035 if (info->attrs[NL80211_ATTR_P2P_CTWINDOW]) {
8039 nla_get_u8(info->attrs[NL80211_ATTR_P2P_CTWINDOW]);
8045 if (info->attrs[NL80211_ATTR_P2P_OPPPS]) {
8050 tmp = nla_get_u8(info->attrs[NL80211_ATTR_P2P_OPPPS]);
8071 static int nl80211_req_set_reg(struct sk_buff *skb, struct genl_info *info)
8087 if (info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE])
8089 nla_get_u32(info->attrs[NL80211_ATTR_USER_REG_HINT_TYPE]);
8096 if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
8099 data = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
8102 if (info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
8103 owner_nlportid = info->snd_portid;
8104 is_indoor = !!info->attrs[NL80211_ATTR_REG_INDOOR];
8116 static int nl80211_reload_regdb(struct sk_buff *skb, struct genl_info *info)
8122 struct genl_info *info)
8124 struct cfg80211_registered_device *rdev = info->user_ptr[0];
8125 struct net_device *dev = info->user_ptr[1];
8154 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8227 return genlmsg_reply(msg, info);
8299 static int nl80211_parse_mesh_config(struct genl_info *info,
8315 if (!info->attrs[NL80211_ATTR_MESH_CONFIG])
8317 if (nla_parse_nested_deprecated(tb, NL80211_MESHCONF_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_CONFIG], nl80211_meshconf_params_policy, info->extack))
8447 static int nl80211_parse_mesh_setup(struct genl_info *info,
8450 struct cfg80211_registered_device *rdev = info->user_ptr[0];
8453 if (!info->attrs[NL80211_ATTR_MESH_SETUP])
8455 if (nla_parse_nested_deprecated(tb, NL80211_MESH_SETUP_ATTR_MAX, info->attrs[NL80211_ATTR_MESH_SETUP], nl80211_mesh_setup_params_policy, info->extack))
8502 struct genl_info *info)
8504 struct cfg80211_registered_device *rdev = info->user_ptr[0];
8505 struct net_device *dev = info->user_ptr[1];
8517 err = nl80211_parse_mesh_config(info, &cfg, &mask);
8594 static int nl80211_get_reg_do(struct sk_buff *skb, struct genl_info *info)
8607 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
8614 if (info->attrs[NL80211_ATTR_WIPHY]) {
8617 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
8659 return genlmsg_reply(msg, info);
8799 static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
8809 if (!info->attrs[NL80211_ATTR_REG_ALPHA2])
8812 if (!info->attrs[NL80211_ATTR_REG_RULES])
8815 alpha2 = nla_data(info->attrs[NL80211_ATTR_REG_ALPHA2]);
8817 if (info->attrs[NL80211_ATTR_DFS_REGION])
8818 dfs_region = nla_get_u8(info->attrs[NL80211_ATTR_DFS_REGION]);
8820 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
8850 nla_for_each_nested(nl_reg_rule, info->attrs[NL80211_ATTR_REG_RULES],
8854 info->extack);
9145 static int nl80211_trigger_scan(struct sk_buff *skb, struct genl_info *info)
9147 struct cfg80211_registered_device *rdev = info->user_ptr[0];
9148 struct wireless_dev *wdev = info->user_ptr[1];
9168 if (info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ]) {
9172 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQ_KHZ];
9174 } else if (info->attrs[NL80211_ATTR_SCAN_FREQUENCIES])
9175 scan_freqs = info->attrs[NL80211_ATTR_SCAN_FREQUENCIES];
9185 if (info->attrs[NL80211_ATTR_SCAN_SSIDS])
9186 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp)
9192 if (info->attrs[NL80211_ATTR_IE])
9193 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
9288 nla_for_each_nested(attr, info->attrs[NL80211_ATTR_SCAN_SSIDS], tmp) {
9299 if (info->attrs[NL80211_ATTR_IE]) {
9300 request->ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
9302 nla_data(info->attrs[NL80211_ATTR_IE]),
9311 if (info->attrs[NL80211_ATTR_SCAN_SUPP_RATES]) {
9313 info->attrs[NL80211_ATTR_SCAN_SUPP_RATES],
9334 if (info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]) {
9336 nla_get_u16(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION]);
9338 nla_get_flag(info->attrs[NL80211_ATTR_MEASUREMENT_DURATION_MANDATORY]);
9341 err = nl80211_check_scan_flags(wiphy, wdev, request, info->attrs,
9347 nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
9358 if (info->attrs[NL80211_ATTR_BSSID])
9360 nla_data(info->attrs[NL80211_ATTR_BSSID]), ETH_ALEN);
9362 info->attrs[NL80211_ATTR_MAC])
9363 memcpy(request->bssid, nla_data(info->attrs[NL80211_ATTR_MAC]),
9390 static int nl80211_abort_scan(struct sk_buff *skb, struct genl_info *info)
9392 struct cfg80211_registered_device *rdev = info->user_ptr[0];
9393 struct wireless_dev *wdev = info->user_ptr[1];
9876 struct genl_info *info)
9878 struct cfg80211_registered_device *rdev = info->user_ptr[0];
9879 struct net_device *dev = info->user_ptr[1];
9888 want_multi = info->attrs[NL80211_ATTR_SCHED_SCAN_MULTI];
9894 info->attrs,
9914 if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
9915 sched_scan_req->owner_nlportid = info->snd_portid;
9929 struct genl_info *info)
9932 struct cfg80211_registered_device *rdev = info->user_ptr[0];
9938 if (info->attrs[NL80211_ATTR_COOKIE]) {
9939 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
9948 req->owner_nlportid != info->snd_portid))
9955 struct genl_info *info)
9957 struct cfg80211_registered_device *rdev = info->user_ptr[0];
9958 struct net_device *dev = info->user_ptr[1];
9974 err = nl80211_parse_chandef(rdev, info, &chandef);
9992 if (nla_get_flag(info->attrs[NL80211_ATTR_RADAR_BACKGROUND])) {
10037 struct genl_info *info)
10039 struct cfg80211_registered_device *rdev = info->user_ptr[0];
10040 struct net_device *dev = info->user_ptr[1];
10049 GENL_SET_ERR_MSG(info,
10054 err = nl80211_parse_chandef(rdev, info, &chandef);
10056 GENL_SET_ERR_MSG(info, "Unable to extract chandef info");
10062 GENL_SET_ERR_MSG(info, "chandef is invalid");
10067 GENL_SET_ERR_MSG(info,
10090 static int nl80211_channel_switch(struct sk_buff *skb, struct genl_info *info)
10092 struct cfg80211_registered_device *rdev = info->user_ptr[0];
10093 unsigned int link_id = nl80211_link_id(info->attrs);
10094 struct net_device *dev = info->user_ptr[1];
10138 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
10139 !info->attrs[NL80211_ATTR_CH_SWITCH_COUNT])
10143 if (need_new_beacon && !info->attrs[NL80211_ATTR_CSA_IES])
10149 cs_count = nla_get_u32(info->attrs[NL80211_ATTR_CH_SWITCH_COUNT]);
10158 err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon_after,
10159 info->extack);
10171 info->attrs[NL80211_ATTR_CSA_IES],
10172 nl80211_policy, info->extack);
10177 info->extack);
10254 err = nl80211_parse_chandef(rdev, info, &params.chandef);
10273 !nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS])) {
10279 if (info->attrs[NL80211_ATTR_CH_SWITCH_BLOCK_TX])
10282 if (info->attrs[NL80211_ATTR_PUNCT_BITMAP]) {
10283 err = nl80211_parse_punct_bitmap(rdev, info,
10652 static int nl80211_authenticate(struct sk_buff *skb, struct genl_info *info)
10654 struct cfg80211_registered_device *rdev = info->user_ptr[0];
10655 struct net_device *dev = info->user_ptr[1];
10665 if (!info->attrs[NL80211_ATTR_MAC])
10668 if (!info->attrs[NL80211_ATTR_AUTH_TYPE])
10671 if (!info->attrs[NL80211_ATTR_SSID])
10674 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
10677 err = nl80211_parse_key(info, &key);
10719 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
10720 freq = MHZ_TO_KHZ(nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ]));
10721 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
10723 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
10729 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
10730 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
10732 if (info->attrs[NL80211_ATTR_IE]) {
10733 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
10734 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
10737 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
10745 !info->attrs[NL80211_ATTR_AUTH_DATA])
10748 if (info->attrs[NL80211_ATTR_AUTH_DATA]) {
10754 req.auth_data = nla_data(info->attrs[NL80211_ATTR_AUTH_DATA]);
10755 req.auth_data_len = nla_len(info->attrs[NL80211_ATTR_AUTH_DATA]);
10758 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
10771 req.link_id = nl80211_link_id_or_invalid(info->attrs);
10775 if (!info->attrs[NL80211_ATTR_MLD_ADDR])
10777 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]);
10798 struct genl_info *info)
10800 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
10801 GENL_SET_ERR_MSG(info, "SOCKET_OWNER not set");
10814 struct genl_info *info,
10820 settings->control_port = info->attrs[NL80211_ATTR_CONTROL_PORT];
10822 if (info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
10826 info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
10831 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT])
10836 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
10837 int r = validate_pae_over_nl80211(rdev, info);
10844 if (info->attrs[NL80211_ATTR_CONTROL_PORT_NO_PREAUTH])
10848 if (info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]) {
10852 data = nla_data(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
10853 len = nla_len(info->attrs[NL80211_ATTR_CIPHER_SUITES_PAIRWISE]);
10871 if (info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]) {
10873 nla_get_u32(info->attrs[NL80211_ATTR_CIPHER_SUITE_GROUP]);
10879 if (info->attrs[NL80211_ATTR_WPA_VERSIONS]) {
10881 nla_get_u32(info->attrs[NL80211_ATTR_WPA_VERSIONS]);
10886 if (info->attrs[NL80211_ATTR_AKM_SUITES]) {
10890 data = nla_data(info->attrs[NL80211_ATTR_AKM_SUITES]);
10891 len = nla_len(info->attrs[NL80211_ATTR_AKM_SUITES]);
10903 if (info->attrs[NL80211_ATTR_PMK]) {
10904 if (nla_len(info->attrs[NL80211_ATTR_PMK]) != WLAN_PMK_LEN)
10911 settings->psk = nla_data(info->attrs[NL80211_ATTR_PMK]);
10914 if (info->attrs[NL80211_ATTR_SAE_PASSWORD]) {
10921 nla_data(info->attrs[NL80211_ATTR_SAE_PASSWORD]);
10923 nla_len(info->attrs[NL80211_ATTR_SAE_PASSWORD]);
10926 if (info->attrs[NL80211_ATTR_SAE_PWE])
10928 nla_get_u8(info->attrs[NL80211_ATTR_SAE_PWE]);
10967 static int nl80211_associate(struct sk_buff *skb, struct genl_info *info)
10969 struct cfg80211_registered_device *rdev = info->user_ptr[0];
10970 struct net_device *dev = info->user_ptr[1];
10978 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
10981 if (!info->attrs[NL80211_ATTR_SSID])
10991 ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
10992 ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
10994 if (info->attrs[NL80211_ATTR_IE]) {
10995 req.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
10996 req.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
11000 GENL_SET_ERR_MSG(info,
11006 if (info->attrs[NL80211_ATTR_USE_MFP]) {
11008 nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
11015 if (info->attrs[NL80211_ATTR_PREV_BSSID])
11016 req.prev_bssid = nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
11018 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
11021 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
11023 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
11026 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
11027 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
11030 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
11034 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
11037 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE]))
11040 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT]))
11043 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
11045 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
11048 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
11049 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
11052 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
11056 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
11066 if (info->attrs[NL80211_ATTR_FILS_KEK]) {
11067 req.fils_kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]);
11068 req.fils_kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]);
11069 if (!info->attrs[NL80211_ATTR_FILS_NONCES])
11072 nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]);
11075 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]) {
11076 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY])
11079 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK]),
11083 if (info->attrs[NL80211_ATTR_S1G_CAPABILITY]) {
11084 if (!info->attrs[NL80211_ATTR_S1G_CAPABILITY_MASK])
11087 nla_data(info->attrs[NL80211_ATTR_S1G_CAPABILITY]),
11091 req.link_id = nl80211_link_id_or_invalid(info->attrs);
11093 if (info->attrs[NL80211_ATTR_MLO_LINKS]) {
11104 if (info->attrs[NL80211_ATTR_MAC] ||
11105 info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
11106 !info->attrs[NL80211_ATTR_MLD_ADDR])
11109 req.ap_mld_addr = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]);
11117 info->attrs[NL80211_ATTR_MLO_LINKS],
11152 GENL_SET_ERR_MSG(info,
11161 GENL_SET_ERR_MSG(info,
11178 GENL_SET_ERR_MSG(info,
11185 GENL_SET_ERR_MSG(info,
11197 req.bss = nl80211_assoc_bss(rdev, ssid, ssid_len, info->attrs);
11203 err = nl80211_crypto_settings(rdev, info, &req.crypto, 1);
11209 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
11211 info->snd_portid;
11228 static int nl80211_deauthenticate(struct sk_buff *skb, struct genl_info *info)
11230 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11231 struct net_device *dev = info->user_ptr[1];
11238 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
11241 if (!info->attrs[NL80211_ATTR_MAC])
11244 if (!info->attrs[NL80211_ATTR_REASON_CODE])
11254 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
11256 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
11262 if (info->attrs[NL80211_ATTR_IE]) {
11263 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
11264 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
11267 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
11276 static int nl80211_disassociate(struct sk_buff *skb, struct genl_info *info)
11278 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11279 struct net_device *dev = info->user_ptr[1];
11286 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
11289 if (!info->attrs[NL80211_ATTR_MAC])
11292 if (!info->attrs[NL80211_ATTR_REASON_CODE])
11302 bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
11304 reason_code = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
11310 if (info->attrs[NL80211_ATTR_IE]) {
11311 ie = nla_data(info->attrs[NL80211_ATTR_IE]);
11312 ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
11315 local_state_change = !!info->attrs[NL80211_ATTR_LOCAL_STATE_CHANGE];
11352 static int nl80211_join_ibss(struct sk_buff *skb, struct genl_info *info)
11354 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11355 struct net_device *dev = info->user_ptr[1];
11363 if (!info->attrs[NL80211_ATTR_SSID] ||
11364 !nla_len(info->attrs[NL80211_ATTR_SSID]))
11369 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL])
11371 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
11386 if (info->attrs[NL80211_ATTR_MAC]) {
11387 ibss.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
11392 ibss.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
11393 ibss.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
11395 if (info->attrs[NL80211_ATTR_IE]) {
11396 ibss.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
11397 ibss.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
11400 err = nl80211_parse_chandef(rdev, info, &ibss.chandef);
11433 ibss.channel_fixed = !!info->attrs[NL80211_ATTR_FREQ_FIXED];
11434 ibss.privacy = !!info->attrs[NL80211_ATTR_PRIVACY];
11436 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
11438 nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
11440 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
11450 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
11452 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
11455 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
11456 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
11459 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
11463 if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
11465 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
11468 if (ibss.privacy && info->attrs[NL80211_ATTR_KEYS]) {
11471 connkeys = nl80211_parse_connkeys(rdev, info, &no_ht);
11483 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT]);
11485 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
11486 int r = validate_pae_over_nl80211(rdev, info);
11497 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
11503 else if (info->attrs[NL80211_ATTR_SOCKET_OWNER])
11504 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
11510 static int nl80211_leave_ibss(struct sk_buff *skb, struct genl_info *info)
11512 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11513 struct net_device *dev = info->user_ptr[1];
11524 static int nl80211_set_mcast_rate(struct sk_buff *skb, struct genl_info *info)
11526 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11527 struct net_device *dev = info->user_ptr[1];
11541 if (!info->attrs[NL80211_ATTR_MCAST_RATE])
11544 nla_rate = nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE]);
11556 const struct nl80211_vendor_cmd_info *info,
11576 if (info) {
11578 info->vendor_id))
11581 info->subcmd))
11619 const struct nl80211_vendor_cmd_info *info;
11625 info = NULL;
11631 info = &wiphy->vendor_events[vendor_event_idx];
11639 cmd, attr, info, gfp);
11671 static int nl80211_testmode_do(struct sk_buff *skb, struct genl_info *info)
11673 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11679 wdev = __cfg80211_wdev_from_attrs(rdev, genl_info_net(info),
11680 info->attrs);
11694 if (!info->attrs[NL80211_ATTR_TESTDATA])
11697 rdev->cur_cmd_info = info;
11699 nla_data(info->attrs[NL80211_ATTR_TESTDATA]),
11700 nla_len(info->attrs[NL80211_ATTR_TESTDATA]));
11809 static int nl80211_connect(struct sk_buff *skb, struct genl_info *info)
11811 struct cfg80211_registered_device *rdev = info->user_ptr[0];
11812 struct net_device *dev = info->user_ptr[1];
11821 if (!info->attrs[NL80211_ATTR_SSID] ||
11822 !nla_len(info->attrs[NL80211_ATTR_SSID]))
11825 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
11827 nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
11834 connect.privacy = info->attrs[NL80211_ATTR_PRIVACY];
11836 if (info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS] &&
11840 connect.want_1x = info->attrs[NL80211_ATTR_WANT_1X_4WAY_HS];
11842 err = nl80211_crypto_settings(rdev, info, &connect.crypto,
11854 if (info->attrs[NL80211_ATTR_BG_SCAN_PERIOD] &&
11857 nla_get_u16(info->attrs[NL80211_ATTR_BG_SCAN_PERIOD]);
11860 if (info->attrs[NL80211_ATTR_MAC])
11861 connect.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
11862 else if (info->attrs[NL80211_ATTR_MAC_HINT])
11864 nla_data(info->attrs[NL80211_ATTR_MAC_HINT]);
11865 connect.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
11866 connect.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
11868 if (info->attrs[NL80211_ATTR_IE]) {
11869 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
11870 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
11873 if (info->attrs[NL80211_ATTR_USE_MFP]) {
11874 connect.mfp = nla_get_u32(info->attrs[NL80211_ATTR_USE_MFP]);
11883 if (info->attrs[NL80211_ATTR_PREV_BSSID])
11885 nla_data(info->attrs[NL80211_ATTR_PREV_BSSID]);
11887 if (info->attrs[NL80211_ATTR_WIPHY_FREQ])
11889 info->attrs[NL80211_ATTR_WIPHY_FREQ]));
11890 if (info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET])
11892 nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_OFFSET]);
11898 } else if (info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]) {
11899 freq = nla_get_u32(info->attrs[NL80211_ATTR_WIPHY_FREQ_HINT]);
11906 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]) {
11908 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_CHANNELS]);
11910 if (info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG])
11912 nla_get_u8(info->attrs[NL80211_ATTR_WIPHY_EDMG_BW_CONFIG]);
11915 if (connect.privacy && info->attrs[NL80211_ATTR_KEYS]) {
11916 connkeys = nl80211_parse_connkeys(rdev, info, NULL);
11921 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HT]))
11924 if (info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK])
11926 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]),
11929 if (info->attrs[NL80211_ATTR_HT_CAPABILITY]) {
11930 if (!info->attrs[NL80211_ATTR_HT_CAPABILITY_MASK]) {
11935 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]),
11939 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_VHT]))
11942 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_HE]))
11945 if (nla_get_flag(info->attrs[NL80211_ATTR_DISABLE_EHT]))
11948 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK])
11950 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]),
11953 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY]) {
11954 if (!info->attrs[NL80211_ATTR_VHT_CAPABILITY_MASK]) {
11959 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]),
11963 if (nla_get_flag(info->attrs[NL80211_ATTR_USE_RRM])) {
11975 connect.pbss = nla_get_flag(info->attrs[NL80211_ATTR_PBSS]);
11981 if (info->attrs[NL80211_ATTR_BSS_SELECT]) {
11988 err = parse_bss_select(info->attrs[NL80211_ATTR_BSS_SELECT],
11998 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] &&
11999 info->attrs[NL80211_ATTR_FILS_ERP_REALM] &&
12000 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] &&
12001 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
12003 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
12005 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
12007 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
12009 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
12012 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]);
12014 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
12016 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
12017 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] ||
12018 info->attrs[NL80211_ATTR_FILS_ERP_REALM] ||
12019 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] ||
12020 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
12025 if (nla_get_flag(info->attrs[NL80211_ATTR_EXTERNAL_AUTH_SUPPORT])) {
12026 if (!info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
12028 GENL_SET_ERR_MSG(info,
12035 if (nla_get_flag(info->attrs[NL80211_ATTR_MLO_SUPPORT]))
12045 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER]) {
12046 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
12060 struct genl_info *info)
12063 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12064 struct net_device *dev = info->user_ptr[1];
12074 if (info->attrs[NL80211_ATTR_IE]) {
12075 connect.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
12076 connect.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
12089 info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] &&
12090 info->attrs[NL80211_ATTR_FILS_ERP_REALM] &&
12091 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] &&
12092 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
12094 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
12096 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_USERNAME]);
12098 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
12100 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_REALM]);
12103 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM]);
12105 nla_data(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
12107 nla_len(info->attrs[NL80211_ATTR_FILS_ERP_RRK]);
12109 } else if (info->attrs[NL80211_ATTR_FILS_ERP_USERNAME] ||
12110 info->attrs[NL80211_ATTR_FILS_ERP_REALM] ||
12111 info->attrs[NL80211_ATTR_FILS_ERP_NEXT_SEQ_NUM] ||
12112 info->attrs[NL80211_ATTR_FILS_ERP_RRK]) {
12116 if (info->attrs[NL80211_ATTR_AUTH_TYPE]) {
12117 auth_type = nla_get_u32(info->attrs[NL80211_ATTR_AUTH_TYPE]);
12140 static int nl80211_disconnect(struct sk_buff *skb, struct genl_info *info)
12142 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12143 struct net_device *dev = info->user_ptr[1];
12148 dev->ieee80211_ptr->conn_owner_nlportid != info->snd_portid)
12151 if (!info->attrs[NL80211_ATTR_REASON_CODE])
12154 reason = nla_get_u16(info->attrs[NL80211_ATTR_REASON_CODE]);
12169 static int nl80211_wiphy_netns(struct sk_buff *skb, struct genl_info *info)
12171 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12175 if (info->attrs[NL80211_ATTR_PID]) {
12176 u32 pid = nla_get_u32(info->attrs[NL80211_ATTR_PID]);
12179 } else if (info->attrs[NL80211_ATTR_NETNS_FD]) {
12180 u32 fd = nla_get_u32(info->attrs[NL80211_ATTR_NETNS_FD]);
12200 static int nl80211_setdel_pmksa(struct sk_buff *skb, struct genl_info *info)
12202 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12205 struct net_device *dev = info->user_ptr[1];
12210 if (!info->attrs[NL80211_ATTR_PMKID])
12213 pmksa.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
12215 if (info->attrs[NL80211_ATTR_MAC]) {
12216 pmksa.bssid = nla_data(info->attrs[NL80211_ATTR_MAC]);
12217 } else if (info->attrs[NL80211_ATTR_SSID] &&
12218 info->attrs[NL80211_ATTR_FILS_CACHE_ID] &&
12219 (info->genlhdr->cmd == NL80211_CMD_DEL_PMKSA ||
12220 info->attrs[NL80211_ATTR_PMK])) {
12221 pmksa.ssid = nla_data(info->attrs[NL80211_ATTR_SSID]);
12222 pmksa.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
12224 nla_data(info->attrs[NL80211_ATTR_FILS_CACHE_ID]);
12228 if (info->attrs[NL80211_ATTR_PMK]) {
12229 pmksa.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
12230 pmksa.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
12233 if (info->attrs[NL80211_ATTR_PMK_LIFETIME])
12235 nla_get_u32(info->attrs[NL80211_ATTR_PMK_LIFETIME]);
12237 if (info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD])
12240 info->attrs[NL80211_ATTR_PMK_REAUTH_THRESHOLD]);
12249 switch (info->genlhdr->cmd) {
12267 static int nl80211_flush_pmksa(struct sk_buff *skb, struct genl_info *info)
12269 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12270 struct net_device *dev = info->user_ptr[1];
12282 static int nl80211_tdls_mgmt(struct sk_buff *skb, struct genl_info *info)
12284 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12285 struct net_device *dev = info->user_ptr[1];
12297 if (!info->attrs[NL80211_ATTR_TDLS_ACTION] ||
12298 !info->attrs[NL80211_ATTR_STATUS_CODE] ||
12299 !info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN] ||
12300 !info->attrs[NL80211_ATTR_IE] ||
12301 !info->attrs[NL80211_ATTR_MAC])
12304 peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
12305 action_code = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_ACTION]);
12306 status_code = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
12307 dialog_token = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_DIALOG_TOKEN]);
12308 initiator = nla_get_flag(info->attrs[NL80211_ATTR_TDLS_INITIATOR]);
12309 if (info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY])
12311 nla_get_u32(info->attrs[NL80211_ATTR_TDLS_PEER_CAPABILITY]);
12312 link_id = nl80211_link_id_or_invalid(info->attrs);
12317 nla_data(info->attrs[NL80211_ATTR_IE]),
12318 nla_len(info->attrs[NL80211_ATTR_IE]));
12321 static int nl80211_tdls_oper(struct sk_buff *skb, struct genl_info *info)
12323 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12324 struct net_device *dev = info->user_ptr[1];
12332 if (!info->attrs[NL80211_ATTR_TDLS_OPERATION] ||
12333 !info->attrs[NL80211_ATTR_MAC])
12336 operation = nla_get_u8(info->attrs[NL80211_ATTR_TDLS_OPERATION]);
12337 peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
12343 struct genl_info *info)
12345 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12346 unsigned int link_id = nl80211_link_id(info->attrs);
12347 struct wireless_dev *wdev = info->user_ptr[1];
12355 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ] ||
12356 !info->attrs[NL80211_ATTR_DURATION])
12359 duration = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
12373 err = nl80211_parse_chandef(rdev, info, &chandef);
12405 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
12424 return genlmsg_reply(msg, info);
12434 struct genl_info *info)
12436 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12437 struct wireless_dev *wdev = info->user_ptr[1];
12440 if (!info->attrs[NL80211_ATTR_COOKIE])
12446 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
12452 struct genl_info *info)
12455 unsigned int link_id = nl80211_link_id(info->attrs);
12456 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12457 struct net_device *dev = info->user_ptr[1];
12465 err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
12477 static int nl80211_register_mgmt(struct sk_buff *skb, struct genl_info *info)
12479 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12480 struct wireless_dev *wdev = info->user_ptr[1];
12483 if (!info->attrs[NL80211_ATTR_FRAME_MATCH])
12486 if (info->attrs[NL80211_ATTR_FRAME_TYPE])
12487 frame_type = nla_get_u16(info->attrs[NL80211_ATTR_FRAME_TYPE]);
12512 if (info->attrs[NL80211_ATTR_RECEIVE_MULTICAST] &&
12515 GENL_SET_ERR_MSG(info,
12520 return cfg80211_mlme_register_mgmt(wdev, info->snd_portid, frame_type,
12521 nla_data(info->attrs[NL80211_ATTR_FRAME_MATCH]),
12522 nla_len(info->attrs[NL80211_ATTR_FRAME_MATCH]),
12523 info->attrs[NL80211_ATTR_RECEIVE_MULTICAST],
12524 info->extack);
12527 static int nl80211_tx_mgmt(struct sk_buff *skb, struct genl_info *info)
12529 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12530 struct wireless_dev *wdev = info->user_ptr[1];
12538 info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK],
12541 if (!info->attrs[NL80211_ATTR_FRAME])
12549 if (!info->attrs[NL80211_ATTR_WIPHY_FREQ])
12569 if (info->attrs[NL80211_ATTR_DURATION]) {
12572 params.wait = nla_get_u32(info->attrs[NL80211_ATTR_DURATION]);
12583 params.offchan = info->attrs[NL80211_ATTR_OFFCHANNEL_TX_OK];
12588 params.no_cck = nla_get_flag(info->attrs[NL80211_ATTR_TX_NO_CCK_RATE]);
12594 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
12595 err = nl80211_parse_chandef(rdev, info, &chandef);
12610 params.link_id = nl80211_link_id_or_invalid(info->attrs);
12623 params.buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
12624 params.len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
12626 if (info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]) {
12627 int len = nla_len(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
12635 nla_data(info->attrs[NL80211_ATTR_CSA_C_OFFSETS_TX]);
12649 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
12668 return genlmsg_reply(msg, info);
12680 static int nl80211_tx_mgmt_cancel_wait(struct sk_buff *skb, struct genl_info *info)
12682 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12683 struct wireless_dev *wdev = info->user_ptr[1];
12686 if (!info->attrs[NL80211_ATTR_COOKIE])
12710 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
12715 static int nl80211_set_power_save(struct sk_buff *skb, struct genl_info *info)
12717 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12719 struct net_device *dev = info->user_ptr[1];
12724 if (!info->attrs[NL80211_ATTR_PS_STATE])
12727 ps_state = nla_get_u32(info->attrs[NL80211_ATTR_PS_STATE]);
12745 static int nl80211_get_power_save(struct sk_buff *skb, struct genl_info *info)
12747 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12750 struct net_device *dev = info->user_ptr[1];
12764 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
12780 return genlmsg_reply(msg, info);
12800 static int nl80211_set_cqm_txe(struct genl_info *info,
12803 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12804 struct net_device *dev = info->user_ptr[1];
12881 static int nl80211_set_cqm_rssi(struct genl_info *info,
12885 struct cfg80211_registered_device *rdev = info->user_ptr[0];
12887 struct net_device *dev = info->user_ptr[1];
12977 static int nl80211_set_cqm(struct sk_buff *skb, struct genl_info *info)
12983 cqm = info->attrs[NL80211_ATTR_CQM];
12989 info->extack);
13003 return nl80211_set_cqm_rssi(info, thresholds, len / 4,
13014 return nl80211_set_cqm_txe(info, rate, pkts, intvl);
13020 static int nl80211_join_ocb(struct sk_buff *skb, struct genl_info *info)
13022 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13023 struct net_device *dev = info->user_ptr[1];
13027 err = nl80211_parse_chandef(rdev, info, &setup.chandef);
13034 static int nl80211_leave_ocb(struct sk_buff *skb, struct genl_info *info)
13036 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13037 struct net_device *dev = info->user_ptr[1];
13042 static int nl80211_join_mesh(struct sk_buff *skb, struct genl_info *info)
13044 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13045 struct net_device *dev = info->user_ptr[1];
13054 if (info->attrs[NL80211_ATTR_MESH_CONFIG]) {
13056 err = nl80211_parse_mesh_config(info, &cfg, NULL);
13061 if (!info->attrs[NL80211_ATTR_MESH_ID] ||
13062 !nla_len(info->attrs[NL80211_ATTR_MESH_ID]))
13065 setup.mesh_id = nla_data(info->attrs[NL80211_ATTR_MESH_ID]);
13066 setup.mesh_id_len = nla_len(info->attrs[NL80211_ATTR_MESH_ID]);
13068 if (info->attrs[NL80211_ATTR_MCAST_RATE] &&
13070 nla_get_u32(info->attrs[NL80211_ATTR_MCAST_RATE])))
13073 if (info->attrs[NL80211_ATTR_BEACON_INTERVAL]) {
13075 nla_get_u32(info->attrs[NL80211_ATTR_BEACON_INTERVAL]);
13084 if (info->attrs[NL80211_ATTR_DTIM_PERIOD]) {
13086 nla_get_u32(info->attrs[NL80211_ATTR_DTIM_PERIOD]);
13091 if (info->attrs[NL80211_ATTR_MESH_SETUP]) {
13093 err = nl80211_parse_mesh_setup(info, &setup);
13101 if (info->attrs[NL80211_ATTR_WIPHY_FREQ]) {
13102 err = nl80211_parse_chandef(rdev, info, &setup.chandef);
13110 if (info->attrs[NL80211_ATTR_BSS_BASIC_RATES]) {
13111 u8 *rates = nla_data(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
13113 nla_len(info->attrs[NL80211_ATTR_BSS_BASIC_RATES]);
13127 if (info->attrs[NL80211_ATTR_TX_RATES]) {
13128 err = nl80211_parse_tx_bitrate_mask(info, info->attrs,
13145 nla_get_flag(info->attrs[NL80211_ATTR_HANDLE_DFS]);
13147 if (info->attrs[NL80211_ATTR_CONTROL_PORT_OVER_NL80211]) {
13148 int r = validate_pae_over_nl80211(rdev, info);
13158 if (!err && info->attrs[NL80211_ATTR_SOCKET_OWNER])
13159 dev->ieee80211_ptr->conn_owner_nlportid = info->snd_portid;
13165 static int nl80211_leave_mesh(struct sk_buff *skb, struct genl_info *info)
13167 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13168 struct net_device *dev = info->user_ptr[1];
13341 static int nl80211_get_wowlan(struct sk_buff *skb, struct genl_info *info)
13343 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13363 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
13408 return genlmsg_reply(msg, info);
13594 static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
13596 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13608 if (!info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS]) {
13615 info->attrs[NL80211_ATTR_WOWLAN_TRIGGERS],
13616 nl80211_wowlan_policy, info->extack);
13702 info->extack);
13856 static int nl80211_get_coalesce(struct sk_buff *skb, struct genl_info *info)
13858 struct cfg80211_registered_device *rdev = info->user_ptr[0];
13869 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
13878 return genlmsg_reply(msg, info);
13996 static int nl80211_set_coalesce(struct sk_buff *skb, struct genl_info *info)
13998 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14009 if (!info->attrs[NL80211_ATTR_COALESCE_RULE]) {
14015 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
14029 nla_for_each_nested(rule, info->attrs[NL80211_ATTR_COALESCE_RULE],
14064 static int nl80211_set_rekey_data(struct sk_buff *skb, struct genl_info *info)
14066 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14067 struct net_device *dev = info->user_ptr[1];
14073 if (!info->attrs[NL80211_ATTR_REKEY_DATA])
14077 info->attrs[NL80211_ATTR_REKEY_DATA],
14078 nl80211_rekey_policy, info->extack);
14122 struct genl_info *info)
14124 struct net_device *dev = info->user_ptr[1];
14134 wdev->ap_unexpected_nlportid = info->snd_portid;
14139 struct genl_info *info)
14141 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14142 struct net_device *dev = info->user_ptr[1];
14154 if (!info->attrs[NL80211_ATTR_MAC])
14164 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
14171 addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
14183 return genlmsg_reply(msg, info);
14192 static int nl80211_register_beacons(struct sk_buff *skb, struct genl_info *info)
14194 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14208 if (reg->nlportid == info->snd_portid) {
14214 nreg->nlportid = info->snd_portid;
14226 static int nl80211_start_p2p_device(struct sk_buff *skb, struct genl_info *info)
14228 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14229 struct wireless_dev *wdev = info->user_ptr[1];
14254 static int nl80211_stop_p2p_device(struct sk_buff *skb, struct genl_info *info)
14256 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14257 struct wireless_dev *wdev = info->user_ptr[1];
14270 static int nl80211_start_nan(struct sk_buff *skb, struct genl_info *info)
14272 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14273 struct wireless_dev *wdev = info->user_ptr[1];
14286 if (!info->attrs[NL80211_ATTR_NAN_MASTER_PREF])
14290 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
14292 if (info->attrs[NL80211_ATTR_BANDS]) {
14293 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
14314 static int nl80211_stop_nan(struct sk_buff *skb, struct genl_info *info)
14316 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14317 struct wireless_dev *wdev = info->user_ptr[1];
14391 struct genl_info *info)
14393 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14394 struct wireless_dev *wdev = info->user_ptr[1];
14407 if (!info->attrs[NL80211_ATTR_NAN_FUNC])
14411 info->attrs[NL80211_ATTR_NAN_FUNC],
14413 info->extack);
14512 info->extack);
14589 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
14621 return genlmsg_reply(msg, info);
14629 struct genl_info *info)
14631 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14632 struct wireless_dev *wdev = info->user_ptr[1];
14641 if (!info->attrs[NL80211_ATTR_COOKIE])
14644 cookie = nla_get_u64(info->attrs[NL80211_ATTR_COOKIE]);
14652 struct genl_info *info)
14654 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14655 struct wireless_dev *wdev = info->user_ptr[1];
14665 if (info->attrs[NL80211_ATTR_NAN_MASTER_PREF]) {
14667 nla_get_u8(info->attrs[NL80211_ATTR_NAN_MASTER_PREF]);
14674 if (info->attrs[NL80211_ATTR_BANDS]) {
14675 u32 bands = nla_get_u32(info->attrs[NL80211_ATTR_BANDS]);
14750 if (match->info && match->info_len &&
14752 match->info))
14834 struct genl_info *info)
14843 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
14853 return genlmsg_reply(msg, info);
14860 static int nl80211_update_ft_ies(struct sk_buff *skb, struct genl_info *info)
14862 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14864 struct net_device *dev = info->user_ptr[1];
14869 if (!info->attrs[NL80211_ATTR_MDID] ||
14870 !info->attrs[NL80211_ATTR_IE])
14874 ft_params.md = nla_get_u16(info->attrs[NL80211_ATTR_MDID]);
14875 ft_params.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
14876 ft_params.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
14882 struct genl_info *info)
14884 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14885 struct wireless_dev *wdev = info->user_ptr[1];
14900 if (info->attrs[NL80211_ATTR_CRIT_PROT_ID])
14901 proto = nla_get_u16(info->attrs[NL80211_ATTR_CRIT_PROT_ID]);
14907 if (!info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION])
14911 nla_get_u16(info->attrs[NL80211_ATTR_MAX_CRIT_PROT_DURATION]);
14915 rdev->crit_proto_nlportid = info->snd_portid;
14921 struct genl_info *info)
14923 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14924 struct wireless_dev *wdev = info->user_ptr[1];
14958 static int nl80211_vendor_cmd(struct sk_buff *skb, struct genl_info *info)
14960 struct cfg80211_registered_device *rdev = info->user_ptr[0];
14962 __cfg80211_wdev_from_attrs(rdev, genl_info_net(info),
14963 info->attrs);
14979 if (!info->attrs[NL80211_ATTR_VENDOR_ID] ||
14980 !info->attrs[NL80211_ATTR_VENDOR_SUBCMD])
14983 vid = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_ID]);
14984 subcmd = nla_get_u32(info->attrs[NL80211_ATTR_VENDOR_SUBCMD]);
14992 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
15014 if (info->attrs[NL80211_ATTR_VENDOR_DATA]) {
15015 data = nla_data(info->attrs[NL80211_ATTR_VENDOR_DATA]);
15016 len = nla_len(info->attrs[NL80211_ATTR_VENDOR_DATA]);
15019 info->attrs[NL80211_ATTR_VENDOR_DATA],
15020 info->extack);
15025 rdev->cur_cmd_info = info;
15105 if (vcmd->info.vendor_id != vid || vcmd->info.subcmd != subcmd)
15283 struct genl_info *info)
15285 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15287 struct net_device *dev = info->user_ptr[1];
15294 if (info->attrs[NL80211_ATTR_QOS_MAP]) {
15295 pos = nla_data(info->attrs[NL80211_ATTR_QOS_MAP]);
15296 len = nla_len(info->attrs[NL80211_ATTR_QOS_MAP]);
15332 static int nl80211_add_tx_ts(struct sk_buff *skb, struct genl_info *info)
15334 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15335 struct net_device *dev = info->user_ptr[1];
15345 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC] ||
15346 !info->attrs[NL80211_ATTR_USER_PRIO])
15349 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
15350 up = nla_get_u8(info->attrs[NL80211_ATTR_USER_PRIO]);
15361 peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
15363 if (info->attrs[NL80211_ATTR_ADMITTED_TIME]) {
15365 nla_get_u16(info->attrs[NL80211_ATTR_ADMITTED_TIME]);
15390 static int nl80211_del_tx_ts(struct sk_buff *skb, struct genl_info *info)
15392 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15393 struct net_device *dev = info->user_ptr[1];
15399 if (!info->attrs[NL80211_ATTR_TSID] || !info->attrs[NL80211_ATTR_MAC])
15402 tsid = nla_get_u8(info->attrs[NL80211_ATTR_TSID]);
15403 peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
15413 struct genl_info *info)
15415 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15416 struct net_device *dev = info->user_ptr[1];
15435 if (!info->attrs[NL80211_ATTR_MAC] ||
15436 !info->attrs[NL80211_ATTR_OPER_CLASS])
15439 err = nl80211_parse_chandef(rdev, info, &chandef);
15462 addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
15463 oper_class = nla_get_u8(info->attrs[NL80211_ATTR_OPER_CLASS]);
15473 struct genl_info *info)
15475 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15476 struct net_device *dev = info->user_ptr[1];
15493 if (!info->attrs[NL80211_ATTR_MAC])
15496 addr = nla_data(info->attrs[NL80211_ATTR_MAC]);
15506 struct genl_info *info)
15508 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15509 struct net_device *dev = info->user_ptr[1];
15521 nla = info->attrs[NL80211_ATTR_MULTICAST_TO_UNICAST_ENABLED];
15527 static int nl80211_set_pmk(struct sk_buff *skb, struct genl_info *info)
15529 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15530 struct net_device *dev = info->user_ptr[1];
15543 if (!info->attrs[NL80211_ATTR_MAC] || !info->attrs[NL80211_ATTR_PMK])
15552 pmk_conf.aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
15558 pmk_conf.pmk = nla_data(info->attrs[NL80211_ATTR_PMK]);
15559 pmk_conf.pmk_len = nla_len(info->attrs[NL80211_ATTR_PMK]);
15566 if (info->attrs[NL80211_ATTR_PMKR0_NAME])
15568 nla_data(info->attrs[NL80211_ATTR_PMKR0_NAME]);
15576 static int nl80211_del_pmk(struct sk_buff *skb, struct genl_info *info)
15578 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15579 struct net_device *dev = info->user_ptr[1];
15592 if (!info->attrs[NL80211_ATTR_MAC])
15596 aa = nla_data(info->attrs[NL80211_ATTR_MAC]);
15603 static int nl80211_external_auth(struct sk_buff *skb, struct genl_info *info)
15605 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15606 struct net_device *dev = info->user_ptr[1];
15612 if (!info->attrs[NL80211_ATTR_SSID] &&
15617 if (!info->attrs[NL80211_ATTR_BSSID])
15620 if (!info->attrs[NL80211_ATTR_STATUS_CODE])
15625 if (info->attrs[NL80211_ATTR_SSID]) {
15626 params.ssid.ssid_len = nla_len(info->attrs[NL80211_ATTR_SSID]);
15630 nla_data(info->attrs[NL80211_ATTR_SSID]),
15634 memcpy(params.bssid, nla_data(info->attrs[NL80211_ATTR_BSSID]),
15637 params.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
15639 if (info->attrs[NL80211_ATTR_PMKID])
15640 params.pmkid = nla_data(info->attrs[NL80211_ATTR_PMKID]);
15645 static int nl80211_tx_control_port(struct sk_buff *skb, struct genl_info *info)
15647 bool dont_wait_for_ack = info->attrs[NL80211_ATTR_DONT_WAIT_FOR_ACK];
15648 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15649 struct net_device *dev = info->user_ptr[1];
15667 if (!info->attrs[NL80211_ATTR_FRAME] ||
15668 !info->attrs[NL80211_ATTR_MAC] ||
15669 !info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]) {
15670 GENL_SET_ERR_MSG(info, "Frame, MAC or ethertype missing");
15699 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
15700 len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
15701 dest = nla_data(info->attrs[NL80211_ATTR_MAC]);
15702 proto = nla_get_u16(info->attrs[NL80211_ATTR_CONTROL_PORT_ETHERTYPE]);
15704 nla_get_flag(info->attrs[NL80211_ATTR_CONTROL_PORT_NO_ENCRYPT]);
15706 link_id = nl80211_link_id_or_invalid(info->attrs);
15712 nl_set_extack_cookie_u64(info->extack, cookie);
15720 struct genl_info *info)
15722 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15723 struct net_device *dev = info->user_ptr[1];
15726 unsigned int link_id = nl80211_link_id(info->attrs);
15747 hdr = nl80211hdr_put(msg, info->snd_portid, info->snd_seq, 0,
15785 return genlmsg_reply(msg, info);
15792 static int nl80211_update_owe_info(struct sk_buff *skb, struct genl_info *info)
15794 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15796 struct net_device *dev = info->user_ptr[1];
15801 if (!info->attrs[NL80211_ATTR_STATUS_CODE] ||
15802 !info->attrs[NL80211_ATTR_MAC])
15806 owe_info.status = nla_get_u16(info->attrs[NL80211_ATTR_STATUS_CODE]);
15807 nla_memcpy(owe_info.peer, info->attrs[NL80211_ATTR_MAC], ETH_ALEN);
15809 if (info->attrs[NL80211_ATTR_IE]) {
15810 owe_info.ie = nla_data(info->attrs[NL80211_ATTR_IE]);
15811 owe_info.ie_len = nla_len(info->attrs[NL80211_ATTR_IE]);
15817 static int nl80211_probe_mesh_link(struct sk_buff *skb, struct genl_info *info)
15819 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15820 struct net_device *dev = info->user_ptr[1];
15831 if (!info->attrs[NL80211_ATTR_MAC] ||
15832 !info->attrs[NL80211_ATTR_FRAME]) {
15833 GENL_SET_ERR_MSG(info, "Frame or MAC missing");
15840 dest = nla_data(info->attrs[NL80211_ATTR_MAC]);
15841 buf = nla_data(info->attrs[NL80211_ATTR_FRAME]);
15842 len = nla_len(info->attrs[NL80211_ATTR_FRAME]);
15863 struct genl_info *info, const u8 *peer,
15866 struct netlink_ext_ack *extack = info->extack;
15937 err = nl80211_parse_tx_bitrate_mask(info, attrs, attr,
15962 struct genl_info *info)
15964 struct cfg80211_registered_device *rdev = info->user_ptr[0];
15966 unsigned int link_id = nl80211_link_id(info->attrs);
15967 struct net_device *dev = info->user_ptr[1];
15974 if (!info->attrs[NL80211_ATTR_TID_CONFIG])
15980 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG],
15991 if (info->attrs[NL80211_ATTR_MAC])
15992 tid_config->peer = nla_data(info->attrs[NL80211_ATTR_MAC]);
15996 nla_for_each_nested(tid, info->attrs[NL80211_ATTR_TID_CONFIG],
16006 info, tid_config->peer, link_id);
16021 static int nl80211_color_change(struct sk_buff *skb, struct genl_info *info)
16023 struct cfg80211_registered_device *rdev = info->user_ptr[0];
16025 struct net_device *dev = info->user_ptr[1];
16041 if (!info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT] ||
16042 !info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR] ||
16043 !info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS])
16046 params.count = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COUNT]);
16047 params.color = nla_get_u8(info->attrs[NL80211_ATTR_COLOR_CHANGE_COLOR]);
16049 err = nl80211_parse_beacon(rdev, info->attrs, &params.beacon_next,
16050 info->extack);
16059 info->attrs[NL80211_ATTR_COLOR_CHANGE_ELEMS],
16060 nl80211_policy, info->extack);
16065 info->extack);
16128 struct genl_info *info)
16130 struct cfg80211_registered_device *rdev = info->user_ptr[0];
16131 struct net_device *dev = info->user_ptr[1];
16135 if (!info->attrs[NL80211_ATTR_MAC] ||
16136 !info->attrs[NL80211_ATTR_FILS_KEK] ||
16137 !info->attrs[NL80211_ATTR_FILS_NONCES])
16140 fils_aad.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]);
16141 fils_aad.kek_len = nla_len(info->attrs[NL80211_ATTR_FILS_KEK]);
16142 fils_aad.kek = nla_data(info->attrs[NL80211_ATTR_FILS_KEK]);
16143 nonces = nla_data(info->attrs[NL80211_ATTR_FILS_NONCES]);
16150 static int nl80211_add_link(struct sk_buff *skb, struct genl_info *info)
16152 struct cfg80211_registered_device *rdev = info->user_ptr[0];
16153 unsigned int link_id = nl80211_link_id(info->attrs);
16154 struct net_device *dev = info->user_ptr[1];
16168 if (!info->attrs[NL80211_ATTR_MAC] ||
16169 !is_valid_ether_addr(nla_data(info->attrs[NL80211_ATTR_MAC])))
16175 nla_data(info->attrs[NL80211_ATTR_MAC]));
16187 static int nl80211_remove_link(struct sk_buff *skb, struct genl_info *info)
16189 unsigned int link_id = nl80211_link_id(info->attrs);
16190 struct net_device *dev = info->user_ptr[1];
16194 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID])
16212 nl80211_add_mod_link_station(struct sk_buff *skb, struct genl_info *info,
16216 struct cfg80211_registered_device *rdev = info->user_ptr[0];
16217 struct net_device *dev = info->user_ptr[1];
16224 if (add && !info->attrs[NL80211_ATTR_MAC])
16227 if (!info->attrs[NL80211_ATTR_MLD_ADDR])
16230 if (add && !info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES])
16233 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]);
16235 if (info->attrs[NL80211_ATTR_MAC]) {
16236 params.link_mac = nla_data(info->attrs[NL80211_ATTR_MAC]);
16241 if (!info->attrs[NL80211_ATTR_MLO_LINK_ID])
16244 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]);
16246 if (info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]) {
16248 nla_data(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
16250 nla_len(info->attrs[NL80211_ATTR_STA_SUPPORTED_RATES]);
16253 if (info->attrs[NL80211_ATTR_HT_CAPABILITY])
16255 nla_data(info->attrs[NL80211_ATTR_HT_CAPABILITY]);
16257 if (info->attrs[NL80211_ATTR_VHT_CAPABILITY])
16259 nla_data(info->attrs[NL80211_ATTR_VHT_CAPABILITY]);
16261 if (info->attrs[NL80211_ATTR_HE_CAPABILITY]) {
16263 nla_data(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
16265 nla_len(info->attrs[NL80211_ATTR_HE_CAPABILITY]);
16267 if (info->attrs[NL80211_ATTR_EHT_CAPABILITY]) {
16269 nla_data(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
16271 nla_len(info->attrs[NL80211_ATTR_EHT_CAPABILITY]);
16281 if (info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY])
16283 nla_data(info->attrs[NL80211_ATTR_HE_6GHZ_CAPABILITY]);
16285 if (info->attrs[NL80211_ATTR_OPMODE_NOTIF]) {
16288 nla_get_u8(info->attrs[NL80211_ATTR_OPMODE_NOTIF]);
16291 err = nl80211_parse_sta_txpower_setting(info, &params.txpwr,
16307 nl80211_add_link_station(struct sk_buff *skb, struct genl_info *info)
16309 return nl80211_add_mod_link_station(skb, info, true);
16313 nl80211_modify_link_station(struct sk_buff *skb, struct genl_info *info)
16315 return nl80211_add_mod_link_station(skb, info, false);
16319 nl80211_remove_link_station(struct sk_buff *skb, struct genl_info *info)
16322 struct cfg80211_registered_device *rdev = info->user_ptr[0];
16323 struct net_device *dev = info->user_ptr[1];
16329 if (!info->attrs[NL80211_ATTR_MLD_ADDR] ||
16330 !info->attrs[NL80211_ATTR_MLO_LINK_ID])
16333 params.mld_mac = nla_data(info->attrs[NL80211_ATTR_MLD_ADDR]);
16334 params.link_id = nla_get_u8(info->attrs[NL80211_ATTR_MLO_LINK_ID]);
16344 struct genl_info *info)
16346 struct cfg80211_registered_device *rdev = info->user_ptr[0];
16347 struct net_device *dev = info->user_ptr[1];
16353 if (!info->attrs[NL80211_ATTR_MAC] &&
16357 if (info->attrs[NL80211_ATTR_MAC])
16358 hwts.macaddr = nla_data(info->attrs[NL80211_ATTR_MAC]);
16361 nla_get_flag(info->attrs[NL80211_ATTR_HW_TIMESTAMP_ENABLED]);
16456 struct genl_info *info)
16471 rdev = cfg80211_get_dev_from_info(genl_info_net(info), info);
16476 info->user_ptr[0] = rdev;
16479 wdev = __cfg80211_wdev_from_attrs(NULL, genl_info_net(info),
16480 info->attrs);
16496 info->user_ptr[1] = dev;
16498 info->user_ptr[1] = wdev;
16507 info->user_ptr[0] = rdev;
16511 struct nlattr *link_id = info->attrs[NL80211_ATTR_MLO_LINK_ID];
16534 if (info->attrs[NL80211_ATTR_MLO_LINK_ID] ||
16558 struct genl_info *info)
16562 if (info->user_ptr[1]) {
16564 struct wireless_dev *wdev = info->user_ptr[1];
16568 dev_put(info->user_ptr[1]);
16572 if (info->user_ptr[0] &&
16574 struct cfg80211_registered_device *rdev = info->user_ptr[0];
16629 static int nl80211_set_sar_specs(struct sk_buff *skb, struct genl_info *info)
16631 struct cfg80211_registered_device *rdev = info->user_ptr[0];
16643 if (!info->attrs[NL80211_ATTR_SAR_SPEC])
16647 info->attrs[NL80211_ATTR_SAR_SPEC],
16691 rdev->cur_cmd_info = info;
17618 struct cfg80211_scan_info *info;
17662 info = rdev->int_scan_req ? &rdev->int_scan_req->info :
17663 &rdev->scan_req->info;
17664 if (info->scan_start_tsf &&
17666 info->scan_start_tsf, NL80211_BSS_PAD) ||
17668 info->tsf_bssid)))
18164 struct cfg80211_roam_info *info, gfp_t gfp)
18170 const u8 *connected_addr = info->ap_mld_addr ?
18171 info->ap_mld_addr :
18172 (info->links[0].bss ?
18173 info->links[0].bss->bssid :
18174 info->links[0].bssid);
18176 if (info->valid_links) {
18177 for_each_valid_link(info, link) {
18182 link_info_size += info->links[link].addr ?
18184 link_info_size += (info->links[link].bssid ||
18185 info->links[link].bss) ?
18190 msg = nlmsg_new(100 + info->req_ie_len + info->resp_ie_len +
18191 info->fils.kek_len + info->fils.pmk_len +
18192 (info->fils.pmkid ? WLAN_PMKID_LEN : 0) +
18206 (info->req_ie &&
18207 nla_put(msg, NL80211_ATTR_REQ_IE, info->req_ie_len,
18208 info->req_ie)) ||
18209 (info->resp_ie &&
18210 nla_put(msg, NL80211_ATTR_RESP_IE, info->resp_ie_len,
18211 info->resp_ie)) ||
18212 (info->fils.update_erp_next_seq_num &&
18214 info->fils.erp_next_seq_num)) ||
18215 (info->fils.kek &&
18216 nla_put(msg, NL80211_ATTR_FILS_KEK, info->fils.kek_len,
18217 info->fils.kek)) ||
18218 (info->fils.pmk &&
18219 nla_put(msg, NL80211_ATTR_PMK, info->fils.pmk_len, info->fils.pmk)) ||
18220 (info->fils.pmkid &&
18221 nla_put(msg, NL80211_ATTR_PMKID, WLAN_PMKID_LEN, info->fils.pmkid)))
18224 if (info->valid_links) {
18232 for_each_valid_link(info, link) {
18234 const u8 *bssid = info->links[link].bss ?
18235 info->links[link].bss->bssid :
18236 info->links[link].bssid;
18245 (info->links[link].addr &&
18247 info->links[link].addr)))
18870 struct cfg80211_rx_info *info, gfp_t gfp)
18876 msg = nlmsg_new(100 + info->len, gfp);
18891 (info->have_link_id &&
18892 nla_put_u8(msg, NL80211_ATTR_MLO_LINK_ID, info->link_id)) ||
18893 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ, KHZ_TO_MHZ(info->freq)) ||
18894 nla_put_u32(msg, NL80211_ATTR_WIPHY_FREQ_OFFSET, info->freq % 1000) ||
18895 (info->sig_dbm &&
18896 nla_put_u32(msg, NL80211_ATTR_RX_SIGNAL_DBM, info->sig_dbm)) ||
18897 nla_put(msg, NL80211_ATTR_FRAME, info->len, info->buf) ||
18898 (info->flags &&
18899 nla_put_u32(msg, NL80211_ATTR_RXMGMT_FLAGS, info->flags)) ||
18900 (info->rx_tstamp && nla_put_u64_64bit(msg,
18902 info->rx_tstamp,
18904 (info->ack_tstamp && nla_put_u64_64bit(msg,
18906 info->ack_tstamp,