Lines Matching +full:function +full:- +full:mask
1 // SPDX-License-Identifier: GPL-2.0-only
3 * NXP Wireless LAN device driver: management IE handling- setting and
6 * Copyright 2011-2020 NXP
11 /* This function checks if current IE index is used by any on other interface.
12 * Return: -1: yes, current IE index is used by someone else.
19 struct mwifiex_adapter *adapter = priv->adapter; in mwifiex_ie_index_used_by_other_intf()
22 for (i = 0; i < adapter->priv_num; i++) { in mwifiex_ie_index_used_by_other_intf()
23 if (adapter->priv[i] != priv) { in mwifiex_ie_index_used_by_other_intf()
24 ie = &adapter->priv[i]->mgmt_ie[idx]; in mwifiex_ie_index_used_by_other_intf()
25 if (ie->mgmt_subtype_mask && ie->ie_length) in mwifiex_ie_index_used_by_other_intf()
26 return -1; in mwifiex_ie_index_used_by_other_intf()
38 u16 mask, len, i; in mwifiex_ie_get_autoidx() local
40 for (i = 0; i < priv->adapter->max_mgmt_ie_index; i++) { in mwifiex_ie_get_autoidx()
41 mask = le16_to_cpu(priv->mgmt_ie[i].mgmt_subtype_mask); in mwifiex_ie_get_autoidx()
42 len = le16_to_cpu(ie->ie_length); in mwifiex_ie_get_autoidx()
44 if (mask == MWIFIEX_AUTO_IDX_MASK) in mwifiex_ie_get_autoidx()
47 if (mask == subtype_mask) { in mwifiex_ie_get_autoidx()
55 if (!priv->mgmt_ie[i].ie_length) { in mwifiex_ie_get_autoidx()
64 return -1; in mwifiex_ie_get_autoidx()
67 /* This function prepares IE data buffer for command to be sent to FW */
72 u16 travel_len, index, mask; in mwifiex_update_autoindex_ies() local
77 input_len = le16_to_cpu(ie_list->len); in mwifiex_update_autoindex_ies()
80 ie_list->len = 0; in mwifiex_update_autoindex_ies()
84 tlv_len = le16_to_cpu(ie->ie_length); in mwifiex_update_autoindex_ies()
88 return -1; in mwifiex_update_autoindex_ies()
89 index = le16_to_cpu(ie->ie_index); in mwifiex_update_autoindex_ies()
90 mask = le16_to_cpu(ie->mgmt_subtype_mask); in mwifiex_update_autoindex_ies()
94 if (mwifiex_ie_get_autoidx(priv, mask, ie, &index)) in mwifiex_update_autoindex_ies()
95 return -1; in mwifiex_update_autoindex_ies()
97 return -1; in mwifiex_update_autoindex_ies()
99 tmp = (u8 *)&priv->mgmt_ie[index].ie_buffer; in mwifiex_update_autoindex_ies()
100 memcpy(tmp, &ie->ie_buffer, le16_to_cpu(ie->ie_length)); in mwifiex_update_autoindex_ies()
101 priv->mgmt_ie[index].ie_length = ie->ie_length; in mwifiex_update_autoindex_ies()
102 priv->mgmt_ie[index].ie_index = cpu_to_le16(index); in mwifiex_update_autoindex_ies()
103 priv->mgmt_ie[index].mgmt_subtype_mask = in mwifiex_update_autoindex_ies()
104 cpu_to_le16(mask); in mwifiex_update_autoindex_ies()
106 ie->ie_index = cpu_to_le16(index); in mwifiex_update_autoindex_ies()
108 if (mask != MWIFIEX_DELETE_MASK) in mwifiex_update_autoindex_ies()
109 return -1; in mwifiex_update_autoindex_ies()
115 return -1; in mwifiex_update_autoindex_ies()
117 ie->ie_length = 0; in mwifiex_update_autoindex_ies()
118 memcpy(&priv->mgmt_ie[index], ie, in mwifiex_update_autoindex_ies()
122 le16_unaligned_add_cpu(&ie_list->len, in mwifiex_update_autoindex_ies()
124 priv->mgmt_ie[index].ie_length) + in mwifiex_update_autoindex_ies()
126 input_len -= tlv_len + MWIFIEX_IE_HDR_SIZE; in mwifiex_update_autoindex_ies()
139 * This function also updates allocated IE indices from driver.
154 return -ENOMEM; in mwifiex_update_uap_custom_ie()
156 ap_custom_ie->type = cpu_to_le16(TLV_TYPE_MGMT_IE); in mwifiex_update_uap_custom_ie()
157 pos = (u8 *)ap_custom_ie->ie_list; in mwifiex_update_uap_custom_ie()
160 len = sizeof(struct mwifiex_ie) - IEEE_MAX_IE_SIZE + in mwifiex_update_uap_custom_ie()
161 le16_to_cpu(beacon_ie->ie_length); in mwifiex_update_uap_custom_ie()
164 le16_unaligned_add_cpu(&ap_custom_ie->len, len); in mwifiex_update_uap_custom_ie()
167 len = sizeof(struct mwifiex_ie) - IEEE_MAX_IE_SIZE + in mwifiex_update_uap_custom_ie()
168 le16_to_cpu(pr_ie->ie_length); in mwifiex_update_uap_custom_ie()
171 le16_unaligned_add_cpu(&ap_custom_ie->len, len); in mwifiex_update_uap_custom_ie()
174 len = sizeof(struct mwifiex_ie) - IEEE_MAX_IE_SIZE + in mwifiex_update_uap_custom_ie()
175 le16_to_cpu(ar_ie->ie_length); in mwifiex_update_uap_custom_ie()
178 le16_unaligned_add_cpu(&ap_custom_ie->len, len); in mwifiex_update_uap_custom_ie()
183 pos = (u8 *)(&ap_custom_ie->ie_list[0].ie_index); in mwifiex_update_uap_custom_ie()
185 /* save beacon ie index after auto-indexing */ in mwifiex_update_uap_custom_ie()
186 *beacon_idx = le16_to_cpu(ap_custom_ie->ie_list[0].ie_index); in mwifiex_update_uap_custom_ie()
187 len = sizeof(*beacon_ie) - IEEE_MAX_IE_SIZE + in mwifiex_update_uap_custom_ie()
188 le16_to_cpu(beacon_ie->ie_length); in mwifiex_update_uap_custom_ie()
191 if (pr_ie && le16_to_cpu(pr_ie->ie_index) == MWIFIEX_AUTO_IDX_MASK) { in mwifiex_update_uap_custom_ie()
192 /* save probe resp ie index after auto-indexing */ in mwifiex_update_uap_custom_ie()
194 len = sizeof(*pr_ie) - IEEE_MAX_IE_SIZE + in mwifiex_update_uap_custom_ie()
195 le16_to_cpu(pr_ie->ie_length); in mwifiex_update_uap_custom_ie()
198 if (ar_ie && le16_to_cpu(ar_ie->ie_index) == MWIFIEX_AUTO_IDX_MASK) in mwifiex_update_uap_custom_ie()
199 /* save assoc resp ie index after auto-indexing */ in mwifiex_update_uap_custom_ie()
206 /* This function checks if the vendor specified IE is present in passed buffer
208 * Function takes pointer to struct mwifiex_ie pointer as argument.
214 struct mwifiex_ie **ie_ptr, u16 mask, in mwifiex_update_vs_ie() argument
227 return -ENOMEM; in mwifiex_update_vs_ie()
232 if (le16_to_cpu(ie->ie_length) + vs_ie->len + 2 > in mwifiex_update_vs_ie()
234 return -EINVAL; in mwifiex_update_vs_ie()
235 memcpy(ie->ie_buffer + le16_to_cpu(ie->ie_length), in mwifiex_update_vs_ie()
236 vs_ie, vs_ie->len + 2); in mwifiex_update_vs_ie()
237 le16_unaligned_add_cpu(&ie->ie_length, vs_ie->len + 2); in mwifiex_update_vs_ie()
238 ie->mgmt_subtype_mask = cpu_to_le16(mask); in mwifiex_update_vs_ie()
239 ie->ie_index = cpu_to_le16(MWIFIEX_AUTO_IDX_MASK); in mwifiex_update_vs_ie()
246 /* This function parses beacon IEs, probe response IEs, association response IEs
247 * from cfg80211_ap_settings->beacon and sets these IE to FW.
257 if (data->beacon_ies && data->beacon_ies_len) { in mwifiex_set_mgmt_beacon_data_ies()
258 mwifiex_update_vs_ie(data->beacon_ies, data->beacon_ies_len, in mwifiex_set_mgmt_beacon_data_ies()
262 mwifiex_update_vs_ie(data->beacon_ies, data->beacon_ies_len, in mwifiex_set_mgmt_beacon_data_ies()
267 if (data->proberesp_ies && data->proberesp_ies_len) { in mwifiex_set_mgmt_beacon_data_ies()
268 mwifiex_update_vs_ie(data->proberesp_ies, in mwifiex_set_mgmt_beacon_data_ies()
269 data->proberesp_ies_len, &pr_ie, in mwifiex_set_mgmt_beacon_data_ies()
272 mwifiex_update_vs_ie(data->proberesp_ies, in mwifiex_set_mgmt_beacon_data_ies()
273 data->proberesp_ies_len, &pr_ie, in mwifiex_set_mgmt_beacon_data_ies()
278 if (data->assocresp_ies && data->assocresp_ies_len) { in mwifiex_set_mgmt_beacon_data_ies()
279 mwifiex_update_vs_ie(data->assocresp_ies, in mwifiex_set_mgmt_beacon_data_ies()
280 data->assocresp_ies_len, &ar_ie, in mwifiex_set_mgmt_beacon_data_ies()
285 mwifiex_update_vs_ie(data->assocresp_ies, in mwifiex_set_mgmt_beacon_data_ies()
286 data->assocresp_ies_len, &ar_ie, in mwifiex_set_mgmt_beacon_data_ies()
300 priv->beacon_idx = beacon_idx; in mwifiex_set_mgmt_beacon_data_ies()
301 priv->proberesp_idx = pr_idx; in mwifiex_set_mgmt_beacon_data_ies()
302 priv->assocresp_idx = ar_idx; in mwifiex_set_mgmt_beacon_data_ies()
312 /* This function parses head and tail IEs, from cfg80211_beacon_data and sets
326 if (!info->tail || !info->tail_len) in mwifiex_uap_parse_tail_ies()
331 return -ENOMEM; in mwifiex_uap_parse_tail_ies()
333 left_len = info->tail_len; in mwifiex_uap_parse_tail_ies()
339 hdr = (void *)(info->tail + parsed_len); in mwifiex_uap_parse_tail_ies()
340 token_len = hdr->len + sizeof(struct ieee_types_header); in mwifiex_uap_parse_tail_ies()
342 err = -EINVAL; in mwifiex_uap_parse_tail_ies()
346 switch (hdr->element_id) { in mwifiex_uap_parse_tail_ies()
368 err = -EINVAL; in mwifiex_uap_parse_tail_ies()
371 memcpy(gen_ie->ie_buffer + ie_len, hdr, token_len); in mwifiex_uap_parse_tail_ies()
375 left_len -= token_len; in mwifiex_uap_parse_tail_ies()
384 info->tail, info->tail_len); in mwifiex_uap_parse_tail_ies()
386 token_len = vendorhdr->len + sizeof(struct ieee_types_header); in mwifiex_uap_parse_tail_ies()
388 err = -EINVAL; in mwifiex_uap_parse_tail_ies()
391 memcpy(gen_ie->ie_buffer + ie_len, vendorhdr, token_len); in mwifiex_uap_parse_tail_ies()
398 gen_ie->ie_index = cpu_to_le16(gen_idx); in mwifiex_uap_parse_tail_ies()
399 gen_ie->mgmt_subtype_mask = cpu_to_le16(MGMT_MASK_BEACON | in mwifiex_uap_parse_tail_ies()
402 gen_ie->ie_length = cpu_to_le16(ie_len); in mwifiex_uap_parse_tail_ies()
406 err = -EINVAL; in mwifiex_uap_parse_tail_ies()
410 priv->gen_idx = gen_idx; in mwifiex_uap_parse_tail_ies()
417 /* This function parses different IEs-head & tail IEs, beacon IEs,
419 * function and sets these IE to FW.
434 /* This function removes management IE set */
441 if (priv->gen_idx != MWIFIEX_AUTO_IDX_MASK) { in mwifiex_del_mgmt_ies()
444 return -ENOMEM; in mwifiex_del_mgmt_ies()
446 gen_ie->ie_index = cpu_to_le16(priv->gen_idx); in mwifiex_del_mgmt_ies()
447 gen_ie->mgmt_subtype_mask = cpu_to_le16(MWIFIEX_DELETE_MASK); in mwifiex_del_mgmt_ies()
448 gen_ie->ie_length = 0; in mwifiex_del_mgmt_ies()
449 if (mwifiex_update_uap_custom_ie(priv, gen_ie, &priv->gen_idx, in mwifiex_del_mgmt_ies()
450 NULL, &priv->proberesp_idx, in mwifiex_del_mgmt_ies()
451 NULL, &priv->assocresp_idx)) { in mwifiex_del_mgmt_ies()
452 ret = -1; in mwifiex_del_mgmt_ies()
456 priv->gen_idx = MWIFIEX_AUTO_IDX_MASK; in mwifiex_del_mgmt_ies()
459 if (priv->beacon_idx != MWIFIEX_AUTO_IDX_MASK) { in mwifiex_del_mgmt_ies()
462 ret = -ENOMEM; in mwifiex_del_mgmt_ies()
465 beacon_ie->ie_index = cpu_to_le16(priv->beacon_idx); in mwifiex_del_mgmt_ies()
466 beacon_ie->mgmt_subtype_mask = cpu_to_le16(MWIFIEX_DELETE_MASK); in mwifiex_del_mgmt_ies()
467 beacon_ie->ie_length = 0; in mwifiex_del_mgmt_ies()
469 if (priv->proberesp_idx != MWIFIEX_AUTO_IDX_MASK) { in mwifiex_del_mgmt_ies()
472 ret = -ENOMEM; in mwifiex_del_mgmt_ies()
475 pr_ie->ie_index = cpu_to_le16(priv->proberesp_idx); in mwifiex_del_mgmt_ies()
476 pr_ie->mgmt_subtype_mask = cpu_to_le16(MWIFIEX_DELETE_MASK); in mwifiex_del_mgmt_ies()
477 pr_ie->ie_length = 0; in mwifiex_del_mgmt_ies()
479 if (priv->assocresp_idx != MWIFIEX_AUTO_IDX_MASK) { in mwifiex_del_mgmt_ies()
482 ret = -ENOMEM; in mwifiex_del_mgmt_ies()
485 ar_ie->ie_index = cpu_to_le16(priv->assocresp_idx); in mwifiex_del_mgmt_ies()
486 ar_ie->mgmt_subtype_mask = cpu_to_le16(MWIFIEX_DELETE_MASK); in mwifiex_del_mgmt_ies()
487 ar_ie->ie_length = 0; in mwifiex_del_mgmt_ies()
492 beacon_ie, &priv->beacon_idx, in mwifiex_del_mgmt_ies()
493 pr_ie, &priv->proberesp_idx, in mwifiex_del_mgmt_ies()
494 ar_ie, &priv->assocresp_idx); in mwifiex_del_mgmt_ies()