Commit 922bd80f authored by Johannes Berg's avatar Johannes Berg

cfg80211: constify wowlan/coalesce mask/pattern pointers

This requires changing the nl80211 parsing code a bit to use
intermediate pointers for the allocation, but clarifies the
API towards the drivers.
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent c1e5f471
...@@ -1416,7 +1416,7 @@ void wl1271_rx_filter_free(struct wl12xx_rx_filter *filter) ...@@ -1416,7 +1416,7 @@ void wl1271_rx_filter_free(struct wl12xx_rx_filter *filter)
int wl1271_rx_filter_alloc_field(struct wl12xx_rx_filter *filter, int wl1271_rx_filter_alloc_field(struct wl12xx_rx_filter *filter,
u16 offset, u8 flags, u16 offset, u8 flags,
u8 *pattern, u8 len) const u8 *pattern, u8 len)
{ {
struct wl12xx_rx_filter_field *field; struct wl12xx_rx_filter_field *field;
......
...@@ -513,7 +513,7 @@ void wl12xx_queue_recovery_work(struct wl1271 *wl); ...@@ -513,7 +513,7 @@ void wl12xx_queue_recovery_work(struct wl1271 *wl);
size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen); size_t wl12xx_copy_fwlog(struct wl1271 *wl, u8 *memblock, size_t maxlen);
int wl1271_rx_filter_alloc_field(struct wl12xx_rx_filter *filter, int wl1271_rx_filter_alloc_field(struct wl12xx_rx_filter *filter,
u16 offset, u8 flags, u16 offset, u8 flags,
u8 *pattern, u8 len); const u8 *pattern, u8 len);
void wl1271_rx_filter_free(struct wl12xx_rx_filter *filter); void wl1271_rx_filter_free(struct wl12xx_rx_filter *filter);
struct wl12xx_rx_filter *wl1271_rx_filter_alloc(void); struct wl12xx_rx_filter *wl1271_rx_filter_alloc(void);
int wl1271_rx_filter_get_fields_size(struct wl12xx_rx_filter *filter); int wl1271_rx_filter_get_fields_size(struct wl12xx_rx_filter *filter);
......
...@@ -1827,7 +1827,7 @@ struct cfg80211_pmksa { ...@@ -1827,7 +1827,7 @@ struct cfg80211_pmksa {
* memory, free @mask only! * memory, free @mask only!
*/ */
struct cfg80211_pkt_pattern { struct cfg80211_pkt_pattern {
u8 *mask, *pattern; const u8 *mask, *pattern;
int pattern_len; int pattern_len;
int pkt_offset; int pkt_offset;
}; };
......
...@@ -8554,6 +8554,8 @@ static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info) ...@@ -8554,6 +8554,8 @@ static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN], nla_for_each_nested(pat, tb[NL80211_WOWLAN_TRIG_PKT_PATTERN],
rem) { rem) {
u8 *mask_pat;
nla_parse(pat_tb, MAX_NL80211_PKTPAT, nla_data(pat), nla_parse(pat_tb, MAX_NL80211_PKTPAT, nla_data(pat),
nla_len(pat), NULL); nla_len(pat), NULL);
err = -EINVAL; err = -EINVAL;
...@@ -8577,19 +8579,18 @@ static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info) ...@@ -8577,19 +8579,18 @@ static int nl80211_set_wowlan(struct sk_buff *skb, struct genl_info *info)
goto error; goto error;
new_triggers.patterns[i].pkt_offset = pkt_offset; new_triggers.patterns[i].pkt_offset = pkt_offset;
new_triggers.patterns[i].mask = mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
kmalloc(mask_len + pat_len, GFP_KERNEL); if (!mask_pat) {
if (!new_triggers.patterns[i].mask) {
err = -ENOMEM; err = -ENOMEM;
goto error; goto error;
} }
new_triggers.patterns[i].pattern = new_triggers.patterns[i].mask = mask_pat;
new_triggers.patterns[i].mask + mask_len; memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
memcpy(new_triggers.patterns[i].mask,
nla_data(pat_tb[NL80211_PKTPAT_MASK]),
mask_len); mask_len);
mask_pat += mask_len;
new_triggers.patterns[i].pattern = mask_pat;
new_triggers.patterns[i].pattern_len = pat_len; new_triggers.patterns[i].pattern_len = pat_len;
memcpy(new_triggers.patterns[i].pattern, memcpy(mask_pat,
nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
pat_len); pat_len);
i++; i++;
...@@ -8781,6 +8782,8 @@ static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev, ...@@ -8781,6 +8782,8 @@ static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev,
nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN], nla_for_each_nested(pat, tb[NL80211_ATTR_COALESCE_RULE_PKT_PATTERN],
rem) { rem) {
u8 *mask_pat;
nla_parse(pat_tb, MAX_NL80211_PKTPAT, nla_data(pat), nla_parse(pat_tb, MAX_NL80211_PKTPAT, nla_data(pat),
nla_len(pat), NULL); nla_len(pat), NULL);
if (!pat_tb[NL80211_PKTPAT_MASK] || if (!pat_tb[NL80211_PKTPAT_MASK] ||
...@@ -8802,17 +8805,19 @@ static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev, ...@@ -8802,17 +8805,19 @@ static int nl80211_parse_coalesce_rule(struct cfg80211_registered_device *rdev,
return -EINVAL; return -EINVAL;
new_rule->patterns[i].pkt_offset = pkt_offset; new_rule->patterns[i].pkt_offset = pkt_offset;
new_rule->patterns[i].mask = mask_pat = kmalloc(mask_len + pat_len, GFP_KERNEL);
kmalloc(mask_len + pat_len, GFP_KERNEL); if (!mask_pat)
if (!new_rule->patterns[i].mask)
return -ENOMEM; return -ENOMEM;
new_rule->patterns[i].pattern =
new_rule->patterns[i].mask + mask_len; new_rule->patterns[i].mask = mask_pat;
memcpy(new_rule->patterns[i].mask, memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_MASK]),
nla_data(pat_tb[NL80211_PKTPAT_MASK]), mask_len); mask_len);
mask_pat += mask_len;
new_rule->patterns[i].pattern = mask_pat;
new_rule->patterns[i].pattern_len = pat_len; new_rule->patterns[i].pattern_len = pat_len;
memcpy(new_rule->patterns[i].pattern, memcpy(mask_pat, nla_data(pat_tb[NL80211_PKTPAT_PATTERN]),
nla_data(pat_tb[NL80211_PKTPAT_PATTERN]), pat_len); pat_len);
i++; i++;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment