mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-09-22 04:31:58 +08:00
wifi: cfg80211: add ieee80211_fragment_element to public API
This function will be used by the kunit tests within cfg80211. As it is generally useful, move it from mac80211 to cfg80211. Signed-off-by: Benjamin Berg <benjamin.berg@intel.com> Signed-off-by: Gregory Greenman <gregory.greenman@intel.com> Link: https://lore.kernel.org/r/20230827135854.5af9391659f5.Ie534ed6591ba02be8572d4d7242394f29e3af04b@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
ffbd0c8c1e
commit
5806ef25bc
@ -8873,6 +8873,18 @@ static inline size_t ieee80211_ie_split(const u8 *ies, size_t ielen,
|
|||||||
return ieee80211_ie_split_ric(ies, ielen, ids, n_ids, NULL, 0, offset);
|
return ieee80211_ie_split_ric(ies, ielen, ids, n_ids, NULL, 0, offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ieee80211_fragment_element - fragment the last element in skb
|
||||||
|
* @skb: The skbuf that the element was added to
|
||||||
|
* @len_pos: Pointer to length of the element to fragment
|
||||||
|
* @frag_id: The element ID to use for fragments
|
||||||
|
*
|
||||||
|
* This function fragments all data after @len_pos, adding fragmentation
|
||||||
|
* elements with the given ID as appropriate. The SKB will grow in size
|
||||||
|
* accordingly.
|
||||||
|
*/
|
||||||
|
void ieee80211_fragment_element(struct sk_buff *skb, u8 *len_pos, u8 frag_id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cfg80211_report_wowlan_wakeup - report wakeup from WoWLAN
|
* cfg80211_report_wowlan_wakeup - report wakeup from WoWLAN
|
||||||
* @wdev: the wireless device reporting the wakeup
|
* @wdev: the wireless device reporting the wakeup
|
||||||
|
@ -2308,8 +2308,6 @@ ieee802_11_parse_elems(const u8 *start, size_t len, bool action,
|
|||||||
return ieee802_11_parse_elems_crc(start, len, action, 0, 0, bss);
|
return ieee802_11_parse_elems_crc(start, len, action, 0, 0, bss);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ieee80211_fragment_element(struct sk_buff *skb, u8 *len_pos, u8 frag_id);
|
|
||||||
|
|
||||||
extern const int ieee802_1d_to_ac[8];
|
extern const int ieee802_1d_to_ac[8];
|
||||||
|
|
||||||
static inline int ieee80211_ac_from_tid(int tid)
|
static inline int ieee80211_ac_from_tid(int tid)
|
||||||
|
@ -5101,32 +5101,3 @@ u8 *ieee80211_ie_build_eht_cap(u8 *pos,
|
|||||||
|
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ieee80211_fragment_element(struct sk_buff *skb, u8 *len_pos, u8 frag_id)
|
|
||||||
{
|
|
||||||
unsigned int elem_len;
|
|
||||||
|
|
||||||
if (!len_pos)
|
|
||||||
return;
|
|
||||||
|
|
||||||
elem_len = skb->data + skb->len - len_pos - 1;
|
|
||||||
|
|
||||||
while (elem_len > 255) {
|
|
||||||
/* this one is 255 */
|
|
||||||
*len_pos = 255;
|
|
||||||
/* remaining data gets smaller */
|
|
||||||
elem_len -= 255;
|
|
||||||
/* make space for the fragment ID/len in SKB */
|
|
||||||
skb_put(skb, 2);
|
|
||||||
/* shift back the remaining data to place fragment ID/len */
|
|
||||||
memmove(len_pos + 255 + 3, len_pos + 255 + 1, elem_len);
|
|
||||||
/* place the fragment ID */
|
|
||||||
len_pos += 255 + 1;
|
|
||||||
*len_pos = frag_id;
|
|
||||||
/* and point to fragment length to update later */
|
|
||||||
len_pos++;
|
|
||||||
}
|
|
||||||
|
|
||||||
*len_pos = elem_len;
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_IF_KUNIT(ieee80211_fragment_element);
|
|
||||||
|
@ -1966,6 +1966,35 @@ size_t ieee80211_ie_split_ric(const u8 *ies, size_t ielen,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(ieee80211_ie_split_ric);
|
EXPORT_SYMBOL(ieee80211_ie_split_ric);
|
||||||
|
|
||||||
|
void ieee80211_fragment_element(struct sk_buff *skb, u8 *len_pos, u8 frag_id)
|
||||||
|
{
|
||||||
|
unsigned int elem_len;
|
||||||
|
|
||||||
|
if (!len_pos)
|
||||||
|
return;
|
||||||
|
|
||||||
|
elem_len = skb->data + skb->len - len_pos - 1;
|
||||||
|
|
||||||
|
while (elem_len > 255) {
|
||||||
|
/* this one is 255 */
|
||||||
|
*len_pos = 255;
|
||||||
|
/* remaining data gets smaller */
|
||||||
|
elem_len -= 255;
|
||||||
|
/* make space for the fragment ID/len in SKB */
|
||||||
|
skb_put(skb, 2);
|
||||||
|
/* shift back the remaining data to place fragment ID/len */
|
||||||
|
memmove(len_pos + 255 + 3, len_pos + 255 + 1, elem_len);
|
||||||
|
/* place the fragment ID */
|
||||||
|
len_pos += 255 + 1;
|
||||||
|
*len_pos = frag_id;
|
||||||
|
/* and point to fragment length to update later */
|
||||||
|
len_pos++;
|
||||||
|
}
|
||||||
|
|
||||||
|
*len_pos = elem_len;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(ieee80211_fragment_element);
|
||||||
|
|
||||||
bool ieee80211_operating_class_to_band(u8 operating_class,
|
bool ieee80211_operating_class_to_band(u8 operating_class,
|
||||||
enum nl80211_band *band)
|
enum nl80211_band *band)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user