Skip to content

Commit

Permalink
wireless: make regdom passing semantics simpler
Browse files Browse the repository at this point in the history
The regdom struct is given to the core, so it might as well
free it in error conditions.

Signed-off-by: Johannes Berg <johannes@sipsolutions.net>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
Johannes Berg authored and John W. Linville committed Oct 31, 2008
1 parent 7dddaf1 commit d2372b3
Show file tree
Hide file tree
Showing 4 changed files with 10 additions and 20 deletions.
13 changes: 3 additions & 10 deletions Documentation/networking/regulatory.txt
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,6 @@ struct ieee80211_regdomain mydriver_jp_regdom = {

Then in some part of your code after your wiphy has been registered:

int r;
struct ieee80211_regdomain *rd;
int size_of_regd;
int num_rules = mydriver_jp_regdom.n_reg_rules;
Expand All @@ -178,17 +177,11 @@ Then in some part of your code after your wiphy has been registered:

rd = kzalloc(size_of_regd, GFP_KERNEL);
if (!rd)
return -ENOMEM;
return -ENOMEM;

memcpy(rd, &mydriver_jp_regdom, sizeof(struct ieee80211_regdomain));

for (i=0; i < num_rules; i++) {
for (i=0; i < num_rules; i++)
memcpy(&rd->reg_rules[i], &mydriver_jp_regdom.reg_rules[i],
sizeof(struct ieee80211_reg_rule));
}
r = regulatory_hint(hw->wiphy, NULL, rd);
if (r) {
kfree(rd);
return r;
}

return regulatory_hint(hw->wiphy, NULL, rd);
3 changes: 1 addition & 2 deletions include/net/wireless.h
Original file line number Diff line number Diff line change
Expand Up @@ -358,8 +358,7 @@ ieee80211_get_channel(struct wiphy *wiphy, int freq)
* for a regulatory domain structure for the respective country. If
* a regulatory domain is build and passed you should set the alpha2
* if possible, otherwise set it to the special value of "99" which tells
* the wireless core it is unknown. If you pass a built regulatory domain
* and we return non zero you are in charge of kfree()'ing the structure.
* the wireless core it is unknown.
*
* Returns -EALREADY if *a regulatory domain* has already been set. Note that
* this could be by another driver. It is safe for drivers to continue if
Expand Down
5 changes: 1 addition & 4 deletions net/wireless/nl80211.c
Original file line number Diff line number Diff line change
Expand Up @@ -1935,12 +1935,9 @@ static int nl80211_set_reg(struct sk_buff *skb, struct genl_info *info)
mutex_lock(&cfg80211_drv_mutex);
r = set_regdom(rd);
mutex_unlock(&cfg80211_drv_mutex);
if (r)
goto bad_reg;

return r;

bad_reg:
bad_reg:
kfree(rd);
return -EINVAL;
}
Expand Down
9 changes: 5 additions & 4 deletions net/wireless/reg.c
Original file line number Diff line number Diff line change
Expand Up @@ -605,7 +605,6 @@ int __regulatory_hint(struct wiphy *wiphy, enum reg_set_by set_by,
return r;
}

/* If rd is not NULL and if this call fails the caller must free it */
int regulatory_hint(struct wiphy *wiphy, const char *alpha2,
struct ieee80211_regdomain *rd)
{
Expand Down Expand Up @@ -690,6 +689,7 @@ void print_regdomain_info(const struct ieee80211_regdomain *rd)
print_rd_rules(rd);
}

/* Takes ownership of rd only if it doesn't fail */
static int __set_regdom(const struct ieee80211_regdomain *rd)
{
/* Some basic sanity checks first */
Expand Down Expand Up @@ -750,16 +750,17 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)

/* Use this call to set the current regulatory domain. Conflicts with
* multiple drivers can be ironed out later. Caller must've already
* kmalloc'd the rd structure. If this calls fails you should kfree()
* the passed rd. Caller must hold cfg80211_drv_mutex */
* kmalloc'd the rd structure. Caller must hold cfg80211_drv_mutex */
int set_regdom(const struct ieee80211_regdomain *rd)
{
int r;

/* Note that this doesn't update the wiphys, this is done below */
r = __set_regdom(rd);
if (r)
if (r) {
kfree(rd);
return r;
}

/* This would make this whole thing pointless */
BUG_ON(rd != cfg80211_regdomain);
Expand Down

0 comments on commit d2372b3

Please sign in to comment.