cfg80211: move IE split utilities here from mac80211
As the next patch will require the IE splitting utility functions in cfg80211, move them there from mac80211. Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
ba8c3d6f16
commit
29464ccc78
@ -5000,6 +5000,64 @@ int cfg80211_get_p2p_attr(const u8 *ies, unsigned int len,
|
|||||||
enum ieee80211_p2p_attr_id attr,
|
enum ieee80211_p2p_attr_id attr,
|
||||||
u8 *buf, unsigned int bufsize);
|
u8 *buf, unsigned int bufsize);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ieee80211_ie_split_ric - split an IE buffer according to ordering (with RIC)
|
||||||
|
* @ies: the IE buffer
|
||||||
|
* @ielen: the length of the IE buffer
|
||||||
|
* @ids: an array with element IDs that are allowed before
|
||||||
|
* the split
|
||||||
|
* @n_ids: the size of the element ID array
|
||||||
|
* @after_ric: array IE types that come after the RIC element
|
||||||
|
* @n_after_ric: size of the @after_ric array
|
||||||
|
* @offset: offset where to start splitting in the buffer
|
||||||
|
*
|
||||||
|
* This function splits an IE buffer by updating the @offset
|
||||||
|
* variable to point to the location where the buffer should be
|
||||||
|
* split.
|
||||||
|
*
|
||||||
|
* It assumes that the given IE buffer is well-formed, this
|
||||||
|
* has to be guaranteed by the caller!
|
||||||
|
*
|
||||||
|
* It also assumes that the IEs in the buffer are ordered
|
||||||
|
* correctly, if not the result of using this function will not
|
||||||
|
* be ordered correctly either, i.e. it does no reordering.
|
||||||
|
*
|
||||||
|
* The function returns the offset where the next part of the
|
||||||
|
* buffer starts, which may be @ielen if the entire (remainder)
|
||||||
|
* of the buffer should be used.
|
||||||
|
*/
|
||||||
|
size_t ieee80211_ie_split_ric(const u8 *ies, size_t ielen,
|
||||||
|
const u8 *ids, int n_ids,
|
||||||
|
const u8 *after_ric, int n_after_ric,
|
||||||
|
size_t offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ieee80211_ie_split - split an IE buffer according to ordering
|
||||||
|
* @ies: the IE buffer
|
||||||
|
* @ielen: the length of the IE buffer
|
||||||
|
* @ids: an array with element IDs that are allowed before
|
||||||
|
* the split
|
||||||
|
* @n_ids: the size of the element ID array
|
||||||
|
* @offset: offset where to start splitting in the buffer
|
||||||
|
*
|
||||||
|
* This function splits an IE buffer by updating the @offset
|
||||||
|
* variable to point to the location where the buffer should be
|
||||||
|
* split.
|
||||||
|
*
|
||||||
|
* It assumes that the given IE buffer is well-formed, this
|
||||||
|
* has to be guaranteed by the caller!
|
||||||
|
*
|
||||||
|
* It also assumes that the IEs in the buffer are ordered
|
||||||
|
* correctly, if not the result of using this function will not
|
||||||
|
* be ordered correctly either, i.e. it does no reordering.
|
||||||
|
*
|
||||||
|
* The function returns the offset where the next part of the
|
||||||
|
* buffer starts, which may be @ielen if the entire (remainder)
|
||||||
|
* of the buffer should be used.
|
||||||
|
*/
|
||||||
|
size_t ieee80211_ie_split(const u8 *ies, size_t ielen,
|
||||||
|
const u8 *ids, int n_ids, size_t offset);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
|
@ -5379,34 +5379,6 @@ int ieee80211_reserve_tid(struct ieee80211_sta *sta, u8 tid);
|
|||||||
*/
|
*/
|
||||||
void ieee80211_unreserve_tid(struct ieee80211_sta *sta, u8 tid);
|
void ieee80211_unreserve_tid(struct ieee80211_sta *sta, u8 tid);
|
||||||
|
|
||||||
/**
|
|
||||||
* ieee80211_ie_split - split an IE buffer according to ordering
|
|
||||||
*
|
|
||||||
* @ies: the IE buffer
|
|
||||||
* @ielen: the length of the IE buffer
|
|
||||||
* @ids: an array with element IDs that are allowed before
|
|
||||||
* the split
|
|
||||||
* @n_ids: the size of the element ID array
|
|
||||||
* @offset: offset where to start splitting in the buffer
|
|
||||||
*
|
|
||||||
* This function splits an IE buffer by updating the @offset
|
|
||||||
* variable to point to the location where the buffer should be
|
|
||||||
* split.
|
|
||||||
*
|
|
||||||
* It assumes that the given IE buffer is well-formed, this
|
|
||||||
* has to be guaranteed by the caller!
|
|
||||||
*
|
|
||||||
* It also assumes that the IEs in the buffer are ordered
|
|
||||||
* correctly, if not the result of using this function will not
|
|
||||||
* be ordered correctly either, i.e. it does no reordering.
|
|
||||||
*
|
|
||||||
* The function returns the offset where the next part of the
|
|
||||||
* buffer starts, which may be @ielen if the entire (remainder)
|
|
||||||
* of the buffer should be used.
|
|
||||||
*/
|
|
||||||
size_t ieee80211_ie_split(const u8 *ies, size_t ielen,
|
|
||||||
const u8 *ids, int n_ids, size_t offset);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ieee80211_tx_dequeue - dequeue a packet from a software tx queue
|
* ieee80211_tx_dequeue - dequeue a packet from a software tx queue
|
||||||
*
|
*
|
||||||
|
@ -1965,10 +1965,6 @@ int __ieee80211_request_smps_ap(struct ieee80211_sub_if_data *sdata,
|
|||||||
void ieee80211_recalc_smps(struct ieee80211_sub_if_data *sdata);
|
void ieee80211_recalc_smps(struct ieee80211_sub_if_data *sdata);
|
||||||
void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata);
|
void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata);
|
||||||
|
|
||||||
size_t ieee80211_ie_split_ric(const u8 *ies, size_t ielen,
|
|
||||||
const u8 *ids, int n_ids,
|
|
||||||
const u8 *after_ric, int n_after_ric,
|
|
||||||
size_t offset);
|
|
||||||
size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset);
|
size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset);
|
||||||
u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
|
u8 *ieee80211_ie_build_ht_cap(u8 *pos, struct ieee80211_sta_ht_cap *ht_cap,
|
||||||
u16 cap);
|
u16 cap);
|
||||||
|
@ -2194,46 +2194,6 @@ void ieee80211_recalc_min_chandef(struct ieee80211_sub_if_data *sdata)
|
|||||||
mutex_unlock(&local->chanctx_mtx);
|
mutex_unlock(&local->chanctx_mtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool ieee80211_id_in_list(const u8 *ids, int n_ids, u8 id)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < n_ids; i++)
|
|
||||||
if (ids[i] == id)
|
|
||||||
return true;
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t ieee80211_ie_split_ric(const u8 *ies, size_t ielen,
|
|
||||||
const u8 *ids, int n_ids,
|
|
||||||
const u8 *after_ric, int n_after_ric,
|
|
||||||
size_t offset)
|
|
||||||
{
|
|
||||||
size_t pos = offset;
|
|
||||||
|
|
||||||
while (pos < ielen && ieee80211_id_in_list(ids, n_ids, ies[pos])) {
|
|
||||||
if (ies[pos] == WLAN_EID_RIC_DATA && n_after_ric) {
|
|
||||||
pos += 2 + ies[pos + 1];
|
|
||||||
|
|
||||||
while (pos < ielen &&
|
|
||||||
!ieee80211_id_in_list(after_ric, n_after_ric,
|
|
||||||
ies[pos]))
|
|
||||||
pos += 2 + ies[pos + 1];
|
|
||||||
} else {
|
|
||||||
pos += 2 + ies[pos + 1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t ieee80211_ie_split(const u8 *ies, size_t ielen,
|
|
||||||
const u8 *ids, int n_ids, size_t offset)
|
|
||||||
{
|
|
||||||
return ieee80211_ie_split_ric(ies, ielen, ids, n_ids, NULL, 0, offset);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL(ieee80211_ie_split);
|
|
||||||
|
|
||||||
size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset)
|
size_t ieee80211_ie_split_vendor(const u8 *ies, size_t ielen, size_t offset)
|
||||||
{
|
{
|
||||||
size_t pos = offset;
|
size_t pos = offset;
|
||||||
|
@ -1290,6 +1290,47 @@ int cfg80211_get_p2p_attr(const u8 *ies, unsigned int len,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cfg80211_get_p2p_attr);
|
EXPORT_SYMBOL(cfg80211_get_p2p_attr);
|
||||||
|
|
||||||
|
static bool ieee80211_id_in_list(const u8 *ids, int n_ids, u8 id)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < n_ids; i++)
|
||||||
|
if (ids[i] == id)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t ieee80211_ie_split_ric(const u8 *ies, size_t ielen,
|
||||||
|
const u8 *ids, int n_ids,
|
||||||
|
const u8 *after_ric, int n_after_ric,
|
||||||
|
size_t offset)
|
||||||
|
{
|
||||||
|
size_t pos = offset;
|
||||||
|
|
||||||
|
while (pos < ielen && ieee80211_id_in_list(ids, n_ids, ies[pos])) {
|
||||||
|
if (ies[pos] == WLAN_EID_RIC_DATA && n_after_ric) {
|
||||||
|
pos += 2 + ies[pos + 1];
|
||||||
|
|
||||||
|
while (pos < ielen &&
|
||||||
|
!ieee80211_id_in_list(after_ric, n_after_ric,
|
||||||
|
ies[pos]))
|
||||||
|
pos += 2 + ies[pos + 1];
|
||||||
|
} else {
|
||||||
|
pos += 2 + ies[pos + 1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(ieee80211_ie_split_ric);
|
||||||
|
|
||||||
|
size_t ieee80211_ie_split(const u8 *ies, size_t ielen,
|
||||||
|
const u8 *ids, int n_ids, size_t offset)
|
||||||
|
{
|
||||||
|
return ieee80211_ie_split_ric(ies, ielen, ids, n_ids, NULL, 0, offset);
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(ieee80211_ie_split);
|
||||||
|
|
||||||
bool ieee80211_operating_class_to_band(u8 operating_class,
|
bool ieee80211_operating_class_to_band(u8 operating_class,
|
||||||
enum ieee80211_band *band)
|
enum ieee80211_band *band)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user