|
@@ -311,24 +311,25 @@ static int ignore_request(struct wiphy *wiphy, enum reg_set_by set_by,
|
|
case REGDOM_SET_BY_INIT:
|
|
case REGDOM_SET_BY_INIT:
|
|
return -EINVAL;
|
|
return -EINVAL;
|
|
case REGDOM_SET_BY_CORE:
|
|
case REGDOM_SET_BY_CORE:
|
|
- /* Always respect new wireless core hints, should only
|
|
|
|
- * come in for updating the world regulatory domain at init
|
|
|
|
- * anyway */
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Always respect new wireless core hints, should only happen
|
|
|
|
+ * when updating the world regulatory domain at init.
|
|
|
|
+ */
|
|
return 0;
|
|
return 0;
|
|
case REGDOM_SET_BY_COUNTRY_IE:
|
|
case REGDOM_SET_BY_COUNTRY_IE:
|
|
|
|
+ if (unlikely(!is_an_alpha2(alpha2)))
|
|
|
|
+ return -EINVAL;
|
|
if (last_request->initiator == REGDOM_SET_BY_COUNTRY_IE) {
|
|
if (last_request->initiator == REGDOM_SET_BY_COUNTRY_IE) {
|
|
if (last_request->wiphy != wiphy) {
|
|
if (last_request->wiphy != wiphy) {
|
|
- /* Two cards with two APs claiming different
|
|
|
|
- * different Country IE alpha2s!
|
|
|
|
- * You're special!! */
|
|
|
|
- if (!alpha2_equal(last_request->alpha2,
|
|
|
|
- cfg80211_regdomain->alpha2)) {
|
|
|
|
- /* XXX: Deal with conflict, consider
|
|
|
|
- * building a new one out of the
|
|
|
|
- * intersection */
|
|
|
|
- WARN_ON(1);
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Two cards with two APs claiming different
|
|
|
|
+ * different Country IE alpha2s. We could
|
|
|
|
+ * intersect them, but that seems unlikely
|
|
|
|
+ * to be correct. Reject second one for now.
|
|
|
|
+ */
|
|
|
|
+ if (!alpha2_equal(alpha2,
|
|
|
|
+ cfg80211_regdomain->alpha2))
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
- }
|
|
|
|
return -EALREADY;
|
|
return -EALREADY;
|
|
}
|
|
}
|
|
/* Two consecutive Country IE hints on the same wiphy */
|
|
/* Two consecutive Country IE hints on the same wiphy */
|
|
@@ -336,42 +337,28 @@ static int ignore_request(struct wiphy *wiphy, enum reg_set_by set_by,
|
|
return 0;
|
|
return 0;
|
|
return -EALREADY;
|
|
return -EALREADY;
|
|
}
|
|
}
|
|
- if (WARN_ON(!is_alpha2_set(alpha2) || !is_an_alpha2(alpha2)),
|
|
|
|
- "Invalid Country IE regulatory hint passed "
|
|
|
|
- "to the wireless core\n")
|
|
|
|
- return -EINVAL;
|
|
|
|
- /* We ignore Country IE hints for now, as we haven't yet
|
|
|
|
- * added the dot11MultiDomainCapabilityEnabled flag
|
|
|
|
- * for wiphys */
|
|
|
|
- return 1;
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Ignore Country IE hints for now, need to think about
|
|
|
|
+ * what we need to do to support multi-domain operation.
|
|
|
|
+ */
|
|
|
|
+ return -EOPNOTSUPP;
|
|
case REGDOM_SET_BY_DRIVER:
|
|
case REGDOM_SET_BY_DRIVER:
|
|
- BUG_ON(!wiphy);
|
|
|
|
if (last_request->initiator == REGDOM_SET_BY_DRIVER)
|
|
if (last_request->initiator == REGDOM_SET_BY_DRIVER)
|
|
return -EALREADY;
|
|
return -EALREADY;
|
|
- if (last_request->initiator == REGDOM_SET_BY_CORE)
|
|
|
|
- return 0;
|
|
|
|
- /* XXX: Handle intersection, and add the
|
|
|
|
- * dot11MultiDomainCapabilityEnabled flag to wiphy. For now
|
|
|
|
- * we assume the driver has this set to false, following the
|
|
|
|
- * 802.11d dot11MultiDomainCapabilityEnabled documentation */
|
|
|
|
- if (last_request->initiator == REGDOM_SET_BY_COUNTRY_IE)
|
|
|
|
- return 0;
|
|
|
|
return 0;
|
|
return 0;
|
|
case REGDOM_SET_BY_USER:
|
|
case REGDOM_SET_BY_USER:
|
|
- if (last_request->initiator == REGDOM_SET_BY_USER ||
|
|
|
|
- last_request->initiator == REGDOM_SET_BY_CORE)
|
|
|
|
- return 0;
|
|
|
|
- /* Drivers can use their wiphy's reg_notifier()
|
|
|
|
- * to override any information */
|
|
|
|
- if (last_request->initiator == REGDOM_SET_BY_DRIVER)
|
|
|
|
- return 0;
|
|
|
|
- /* XXX: Handle intersection */
|
|
|
|
|
|
+ /*
|
|
|
|
+ * If the user wants to override the AP's hint, we may
|
|
|
|
+ * need to follow both and use the intersection. For now,
|
|
|
|
+ * reject any such attempt (but we don't support country
|
|
|
|
+ * IEs right now anyway.)
|
|
|
|
+ */
|
|
if (last_request->initiator == REGDOM_SET_BY_COUNTRY_IE)
|
|
if (last_request->initiator == REGDOM_SET_BY_COUNTRY_IE)
|
|
return -EOPNOTSUPP;
|
|
return -EOPNOTSUPP;
|
|
return 0;
|
|
return 0;
|
|
- default:
|
|
|
|
- return -EINVAL;
|
|
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ return -EINVAL;
|
|
}
|
|
}
|
|
|
|
|
|
/* Used by nl80211 before kmalloc'ing our regulatory domain */
|
|
/* Used by nl80211 before kmalloc'ing our regulatory domain */
|