diff --git a/src/wiphy.c b/src/wiphy.c index 3beb351c..28d4b66e 100644 --- a/src/wiphy.c +++ b/src/wiphy.c @@ -2026,10 +2026,19 @@ static void wiphy_dump_after_regdom(struct wiphy *wiphy) } } -static void wiphy_update_reg_domain(struct wiphy *wiphy, bool global, +static bool wiphy_update_reg_domain(struct wiphy *wiphy, bool global, struct l_genl_msg *msg) { - char *out_country; + char out_country[2]; + char *orig; + + /* + * Write the new country code or XX if the reg domain is not a + * country domain. + */ + if (nl80211_parse_attrs(msg, NL80211_ATTR_REG_ALPHA2, out_country, + NL80211_ATTR_UNSPEC) < 0) + out_country[0] = out_country[1] = 'X'; if (global) /* @@ -2043,21 +2052,26 @@ static void wiphy_update_reg_domain(struct wiphy *wiphy, bool global, * wiphy created (that is not self-managed anyway) and we * haven't received any REG_CHANGE events yet. */ - out_country = regdom_country; + orig = regdom_country; + else - out_country = wiphy->regdom_country; + orig = wiphy->regdom_country; /* - * Write the new country code or XX if the reg domain is not a - * country domain. + * The kernel seems to send regdom updates even if the country didn't + * change. Skip these as there is no reason to re-dump. */ - if (nl80211_parse_attrs(msg, NL80211_ATTR_REG_ALPHA2, out_country, - NL80211_ATTR_UNSPEC) < 0) - out_country[0] = out_country[1] = 'X'; + if (orig[0] == out_country[0] && orig[1] == out_country[1]) + return false; l_debug("New reg domain country code for %s is %c%c", global ? "(global)" : wiphy->name, out_country[0], out_country[1]); + + orig[0] = out_country[0]; + orig[1] = out_country[1]; + + return true; } static void wiphy_get_reg_cb(struct l_genl_msg *msg, void *user_data) @@ -2305,7 +2319,8 @@ static void wiphy_reg_notify(struct l_genl_msg *msg, void *user_data) switch (cmd) { case NL80211_CMD_REG_CHANGE: - wiphy_update_reg_domain(NULL, true, msg); + if (!wiphy_update_reg_domain(NULL, true, msg)) + return; break; case NL80211_CMD_WIPHY_REG_CHANGE: if (nl80211_parse_attrs(msg, NL80211_ATTR_WIPHY, &wiphy_id, @@ -2316,7 +2331,9 @@ static void wiphy_reg_notify(struct l_genl_msg *msg, void *user_data) if (!wiphy) return; - wiphy_update_reg_domain(wiphy, false, msg); + if (!wiphy_update_reg_domain(wiphy, false, msg)) + return; + break; default: return;