提交 f8e4b412 编写于 作者: A Alwin Beukers 提交者: John W. Linville

brcm80211: moved function brcmu_parse_tlvs

Moved the brcmu_parse_tlvs function and brcmu_tlv structure into
the only file using them. Names were adjusted accordingly.
Reported-by: NJohannes Berg <johannes@sipsolutions.net>
Reviewed-by: NRoland Vossen <rvossen@broadcom.com>
Reviewed-by: NArend van Spriel <arend@broadcom.com>
Signed-off-by: NArend van Spriel <arend@broadcom.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 b0551fb7
...@@ -247,6 +247,13 @@ static const u32 __wl_cipher_suites[] = { ...@@ -247,6 +247,13 @@ static const u32 __wl_cipher_suites[] = {
WLAN_CIPHER_SUITE_AES_CMAC, WLAN_CIPHER_SUITE_AES_CMAC,
}; };
/* tag_ID/length/value_buffer tuple */
struct brcmf_tlv {
u8 id;
u8 len;
u8 data[1];
};
/* Quarter dBm units to mW /* Quarter dBm units to mW
* Table starts at QDBM_OFFSET, so the first entry is mW for qdBm=153 * Table starts at QDBM_OFFSET, so the first entry is mW for qdBm=153
* Table is offset so the last entry is largest mW value that fits in * Table is offset so the last entry is largest mW value that fits in
...@@ -2151,11 +2158,39 @@ static bool brcmf_is_ibssmode(struct brcmf_cfg80211_priv *cfg_priv) ...@@ -2151,11 +2158,39 @@ static bool brcmf_is_ibssmode(struct brcmf_cfg80211_priv *cfg_priv)
return cfg_priv->conf->mode == WL_MODE_IBSS; return cfg_priv->conf->mode == WL_MODE_IBSS;
} }
/*
* Traverse a string of 1-byte tag/1-byte length/variable-length value
* triples, returning a pointer to the substring whose first element
* matches tag
*/
static struct brcmf_tlv *brcmf_parse_tlvs(void *buf, int buflen, uint key)
{
struct brcmf_tlv *elt;
int totlen;
elt = (struct brcmf_tlv *) buf;
totlen = buflen;
/* find tagged parameter */
while (totlen >= 2) {
int len = elt->len;
/* validate remaining totlen */
if ((elt->id == key) && (totlen >= (len + 2)))
return elt;
elt = (struct brcmf_tlv *) ((u8 *) elt + (len + 2));
totlen -= (len + 2);
}
return NULL;
}
static s32 brcmf_update_bss_info(struct brcmf_cfg80211_priv *cfg_priv) static s32 brcmf_update_bss_info(struct brcmf_cfg80211_priv *cfg_priv)
{ {
struct brcmf_bss_info *bi; struct brcmf_bss_info *bi;
struct brcmf_ssid *ssid; struct brcmf_ssid *ssid;
struct brcmu_tlv *tim; struct brcmf_tlv *tim;
u16 beacon_interval; u16 beacon_interval;
u8 dtim_period; u8 dtim_period;
size_t ie_len; size_t ie_len;
...@@ -2185,7 +2220,7 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_priv *cfg_priv) ...@@ -2185,7 +2220,7 @@ static s32 brcmf_update_bss_info(struct brcmf_cfg80211_priv *cfg_priv)
ie_len = le32_to_cpu(bi->ie_length); ie_len = le32_to_cpu(bi->ie_length);
beacon_interval = le16_to_cpu(bi->beacon_period); beacon_interval = le16_to_cpu(bi->beacon_period);
tim = brcmu_parse_tlvs(ie, ie_len, WLAN_EID_TIM); tim = brcmf_parse_tlvs(ie, ie_len, WLAN_EID_TIM);
if (tim) if (tim)
dtim_period = tim->data[1]; dtim_period = tim->data[1];
else { else {
......
...@@ -364,36 +364,6 @@ void brcmu_prpkt(const char *msg, struct sk_buff *p0) ...@@ -364,36 +364,6 @@ void brcmu_prpkt(const char *msg, struct sk_buff *p0)
EXPORT_SYMBOL(brcmu_prpkt); EXPORT_SYMBOL(brcmu_prpkt);
#endif /* defined(BCMDBG) */ #endif /* defined(BCMDBG) */
/*
* Traverse a string of 1-byte tag/1-byte length/variable-length value
* triples, returning a pointer to the substring whose first element
* matches tag
*/
struct brcmu_tlv *brcmu_parse_tlvs(void *buf, int buflen, uint key)
{
struct brcmu_tlv *elt;
int totlen;
elt = (struct brcmu_tlv *) buf;
totlen = buflen;
/* find tagged parameter */
while (totlen >= 2) {
int len = elt->len;
/* validate remaining totlen */
if ((elt->id == key) && (totlen >= (len + 2)))
return elt;
elt = (struct brcmu_tlv *) ((u8 *) elt + (len + 2));
totlen -= (len + 2);
}
return NULL;
}
EXPORT_SYMBOL(brcmu_parse_tlvs);
#if defined(BCMDBG) #if defined(BCMDBG)
int int
brcmu_format_flags(const struct brcmu_bit_desc *bd, u32 flags, char *buf, brcmu_format_flags(const struct brcmu_bit_desc *bd, u32 flags, char *buf,
......
...@@ -192,13 +192,6 @@ struct brcmu_bit_desc { ...@@ -192,13 +192,6 @@ struct brcmu_bit_desc {
const char *name; const char *name;
}; };
/* tag_ID/length/value_buffer tuple */
struct brcmu_tlv {
u8 id;
u8 len;
u8 data[1];
};
/* externs */ /* externs */
/* format/print */ /* format/print */
#if defined(BCMDBG) #if defined(BCMDBG)
...@@ -207,9 +200,6 @@ extern int brcmu_format_flags(const struct brcmu_bit_desc *bd, u32 flags, ...@@ -207,9 +200,6 @@ extern int brcmu_format_flags(const struct brcmu_bit_desc *bd, u32 flags,
extern int brcmu_format_hex(char *str, const void *bytes, int len); extern int brcmu_format_hex(char *str, const void *bytes, int len);
#endif #endif
extern struct brcmu_tlv *brcmu_parse_tlvs(void *buf, int buflen,
uint key);
extern uint brcmu_mkiovar(char *name, char *data, uint datalen, extern uint brcmu_mkiovar(char *name, char *data, uint datalen,
char *buf, uint len); char *buf, uint len);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册