wifi: cfg80211: add ieee80211_fragment_element to public API
authorBenjamin Berg <benjamin.berg@intel.com>
Sun, 27 Aug 2023 11:05:22 +0000 (14:05 +0300)
committerJohannes Berg <johannes.berg@intel.com>
Mon, 11 Sep 2023 10:32:16 +0000 (12:32 +0200)
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>
include/net/cfg80211.h
net/mac80211/ieee80211_i.h
net/mac80211/util.c
net/wireless/util.c

index 922fd9e0d9b417ed2f7cce00cefb2063b7467e4a..f22b22d7d4e8231a8a3ebd6b12458ea9871ad777 100644 (file)
@@ -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);
 }
 
+/**
+ * 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
  * @wdev: the wireless device reporting the wakeup
index b8465d205076a1abc2123c4a54c8ee77cfb327b1..a6fd87f0c03532759a41fde91f6f18cfd8030d2c 100644 (file)
@@ -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);
 }
 
-void ieee80211_fragment_element(struct sk_buff *skb, u8 *len_pos, u8 frag_id);
-
 extern const int ieee802_1d_to_ac[8];
 
 static inline int ieee80211_ac_from_tid(int tid)
index b0232a2b963e948ab24e5836606faa9c8b065d9c..ed113028794a51b87f221908e41c10201d90dc95 100644 (file)
@@ -5101,32 +5101,3 @@ u8 *ieee80211_ie_build_eht_cap(u8 *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);
index fff99fe43fddbb1e84b76ad009e6f05afaa101a6..56cbd9979a3f65b7c19bc3f3dfca303c99f940fe 100644 (file)
@@ -1966,6 +1966,35 @@ size_t ieee80211_ie_split_ric(const u8 *ies, size_t ielen,
 }
 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,
                                       enum nl80211_band *band)
 {