cfg80211: move enum reg_set_by to nl80211.h
Luis R. Rodriguez [Tue, 10 Mar 2009 02:07:41 +0000 (22:07 -0400)]
We do this so we can later inform userspace who set the
regulatory domain and provide details of the request.

Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>

drivers/net/wireless/ath9k/main.c
drivers/net/wireless/ath9k/regd.c
drivers/net/wireless/ath9k/regd.h
include/linux/nl80211.h
include/net/cfg80211.h
net/wireless/core.c
net/wireless/core.h
net/wireless/reg.c

index 1d6b05c..e9b3f36 100644 (file)
@@ -1670,7 +1670,7 @@ int ath_attach(u16 devid, struct ath_softc *sc)
        }
        wiphy_apply_custom_regulatory(hw->wiphy, regd);
        ath9k_reg_apply_radar_flags(hw->wiphy);
-       ath9k_reg_apply_world_flags(hw->wiphy, REGDOM_SET_BY_DRIVER);
+       ath9k_reg_apply_world_flags(hw->wiphy, NL80211_REGDOM_SET_BY_DRIVER);
 
        INIT_WORK(&sc->chan_work, ath9k_wiphy_chan_work);
        INIT_DELAYED_WORK(&sc->wiphy_work, ath9k_wiphy_work);
index ff0afc0..b8f9b6d 100644 (file)
@@ -168,8 +168,9 @@ static bool ath9k_is_radar_freq(u16 center_freq)
  *   received a beacon on a channel we can enable active scan and
  *   adhoc (or beaconing).
  */
-static void ath9k_reg_apply_beaconing_flags(struct wiphy *wiphy,
-                                            enum reg_set_by setby)
+static void ath9k_reg_apply_beaconing_flags(
+       struct wiphy *wiphy,
+       enum nl80211_reg_initiator initiator)
 {
        enum ieee80211_band band;
        struct ieee80211_supported_band *sband;
@@ -194,7 +195,7 @@ static void ath9k_reg_apply_beaconing_flags(struct wiphy *wiphy,
                            (ch->flags & IEEE80211_CHAN_RADAR))
                                continue;
 
-                       if (setby == REGDOM_SET_BY_COUNTRY_IE) {
+                       if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE) {
                                r = freq_reg_info(wiphy, ch->center_freq,
                                        &bandwidth, &reg_rule);
                                if (r)
@@ -226,8 +227,9 @@ static void ath9k_reg_apply_beaconing_flags(struct wiphy *wiphy,
 }
 
 /* Allows active scan scan on Ch 12 and 13 */
-static void ath9k_reg_apply_active_scan_flags(struct wiphy *wiphy,
-                                             enum reg_set_by setby)
+static void ath9k_reg_apply_active_scan_flags(
+       struct wiphy *wiphy,
+       enum nl80211_reg_initiator initiator)
 {
        struct ieee80211_supported_band *sband;
        struct ieee80211_channel *ch;
@@ -241,7 +243,7 @@ static void ath9k_reg_apply_active_scan_flags(struct wiphy *wiphy,
         * If no country IE has been received always enable active scan
         * on these channels. This is only done for specific regulatory SKUs
         */
-       if (setby != REGDOM_SET_BY_COUNTRY_IE) {
+       if (initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE) {
                ch = &sband->channels[11]; /* CH 12 */
                if (ch->flags & IEEE80211_CHAN_PASSIVE_SCAN)
                        ch->flags &= ~IEEE80211_CHAN_PASSIVE_SCAN;
@@ -308,7 +310,8 @@ void ath9k_reg_apply_radar_flags(struct wiphy *wiphy)
        }
 }
 
-void ath9k_reg_apply_world_flags(struct wiphy *wiphy, enum reg_set_by setby)
+void ath9k_reg_apply_world_flags(struct wiphy *wiphy,
+                                enum nl80211_reg_initiator initiator)
 {
        struct ieee80211_hw *hw = wiphy_to_ieee80211_hw(wiphy);
        struct ath_wiphy *aphy = hw->priv;
@@ -320,11 +323,11 @@ void ath9k_reg_apply_world_flags(struct wiphy *wiphy, enum reg_set_by setby)
        case 0x63:
        case 0x66:
        case 0x67:
-               ath9k_reg_apply_beaconing_flags(wiphy, setby);
+               ath9k_reg_apply_beaconing_flags(wiphy, initiator);
                break;
        case 0x68:
-               ath9k_reg_apply_beaconing_flags(wiphy, setby);
-               ath9k_reg_apply_active_scan_flags(wiphy, setby);
+               ath9k_reg_apply_beaconing_flags(wiphy, initiator);
+               ath9k_reg_apply_active_scan_flags(wiphy, initiator);
                break;
        }
        return;
@@ -340,11 +343,11 @@ int ath9k_reg_notifier(struct wiphy *wiphy, struct regulatory_request *request)
        ath9k_reg_apply_radar_flags(wiphy);
 
        switch (request->initiator) {
-       case REGDOM_SET_BY_DRIVER:
-       case REGDOM_SET_BY_CORE:
-       case REGDOM_SET_BY_USER:
+       case NL80211_REGDOM_SET_BY_DRIVER:
+       case NL80211_REGDOM_SET_BY_CORE:
+       case NL80211_REGDOM_SET_BY_USER:
                break;
-       case REGDOM_SET_BY_COUNTRY_IE:
+       case NL80211_REGDOM_SET_BY_COUNTRY_IE:
                if (ath9k_is_world_regd(sc->sc_ah))
                        ath9k_reg_apply_world_flags(wiphy, request->initiator);
                break;
index d48160d..8f885f3 100644 (file)
@@ -236,7 +236,8 @@ enum CountryCode {
 bool ath9k_is_world_regd(struct ath_hw *ah);
 const struct ieee80211_regdomain *ath9k_world_regdomain(struct ath_hw *ah);
 const struct ieee80211_regdomain *ath9k_default_world_regdomain(void);
-void ath9k_reg_apply_world_flags(struct wiphy *wiphy, enum reg_set_by setby);
+void ath9k_reg_apply_world_flags(struct wiphy *wiphy,
+                                enum nl80211_reg_initiator initiator);
 void ath9k_reg_apply_radar_flags(struct wiphy *wiphy);
 int ath9k_regd_init(struct ath_hw *ah);
 bool ath9k_regd_is_eeprom_valid(struct ath_hw *ah);
index f6e5637..c0fd432 100644 (file)
@@ -673,6 +673,25 @@ enum nl80211_bitrate_attr {
 };
 
 /**
+ * enum nl80211_initiator - Indicates the initiator of a reg domain request
+ * @NL80211_REGDOM_SET_BY_CORE: Core queried CRDA for a dynamic world
+ *     regulatory domain.
+ * @NL80211_REGDOM_SET_BY_USER: User asked the wireless core to set the
+ *     regulatory domain.
+ * @NL80211_REGDOM_SET_BY_DRIVER: a wireless drivers has hinted to the
+ *     wireless core it thinks its knows the regulatory domain we should be in.
+ * @NL80211_REGDOM_SET_BY_COUNTRY_IE: the wireless core has received an
+ *     802.11 country information element with regulatory information it
+ *     thinks we should consider.
+ */
+enum nl80211_reg_initiator {
+       NL80211_REGDOM_SET_BY_CORE,
+       NL80211_REGDOM_SET_BY_USER,
+       NL80211_REGDOM_SET_BY_DRIVER,
+       NL80211_REGDOM_SET_BY_COUNTRY_IE,
+};
+
+/**
  * enum nl80211_reg_rule_attr - regulatory rule attributes
  * @NL80211_ATTR_REG_RULE_FLAGS: a set of flags which specify additional
  *     considerations for a given frequency range. These are the
index f195ea4..50f3fd9 100644 (file)
@@ -349,27 +349,9 @@ struct bss_parameters {
 };
 
 /**
- * enum reg_set_by - Indicates who is trying to set the regulatory domain
- * @REGDOM_SET_BY_CORE: Core queried CRDA for a dynamic world regulatory domain.
- * @REGDOM_SET_BY_USER: User asked the wireless core to set the
- *     regulatory domain.
- * @REGDOM_SET_BY_DRIVER: a wireless drivers has hinted to the wireless core
- *     it thinks its knows the regulatory domain we should be in.
- * @REGDOM_SET_BY_COUNTRY_IE: the wireless core has received an 802.11 country
- *     information element with regulatory information it thinks we
- *     should consider.
- */
-enum reg_set_by {
-       REGDOM_SET_BY_CORE,
-       REGDOM_SET_BY_USER,
-       REGDOM_SET_BY_DRIVER,
-       REGDOM_SET_BY_COUNTRY_IE,
-};
-
-/**
  * enum environment_cap - Environment parsed from country IE
  * @ENVIRON_ANY: indicates country IE applies to both indoor and
- *     outdoor operation.
+ *     outdoor operation.
  * @ENVIRON_INDOOR: indicates country IE applies only to indoor operation
  * @ENVIRON_OUTDOOR: indicates country IE applies only to outdoor operation
  */
@@ -388,7 +370,7 @@ enum environment_cap {
  *     and potentially inform users of which devices specifically
  *     cased the conflicts.
  * @initiator: indicates who sent this request, could be any of
- *     of those set in reg_set_by, %REGDOM_SET_BY_*
+ *     of those set in nl80211_reg_initiator (%NL80211_REGDOM_SET_BY_*)
  * @alpha2: the ISO / IEC 3166 alpha2 country code of the requested
  *     regulatory domain. We have a few special codes:
  *     00 - World regulatory domain
@@ -405,7 +387,7 @@ enum environment_cap {
  */
 struct regulatory_request {
        int wiphy_idx;
-       enum reg_set_by initiator;
+       enum nl80211_reg_initiator initiator;
        char alpha2[2];
        bool intersect;
        u32 country_ie_checksum;
index dd7f222..c939f5e 100644 (file)
@@ -350,7 +350,7 @@ int wiphy_register(struct wiphy *wiphy)
        mutex_lock(&cfg80211_mutex);
 
        /* set up regulatory info */
-       wiphy_update_regulatory(wiphy, REGDOM_SET_BY_CORE);
+       wiphy_update_regulatory(wiphy, NL80211_REGDOM_SET_BY_CORE);
 
        res = device_add(&drv->wiphy.dev);
        if (res)
index f6c53f5..6acd483 100644 (file)
@@ -136,7 +136,8 @@ extern int cfg80211_dev_rename(struct cfg80211_registered_device *drv,
                               char *newname);
 
 void ieee80211_set_bitrate_flags(struct wiphy *wiphy);
-void wiphy_update_regulatory(struct wiphy *wiphy, enum reg_set_by setby);
+void wiphy_update_regulatory(struct wiphy *wiphy,
+                            enum nl80211_reg_initiator setby);
 
 void cfg80211_bss_expire(struct cfg80211_registered_device *dev);
 void cfg80211_bss_age(struct cfg80211_registered_device *dev,
index 47ff447..68fde6d 100644 (file)
@@ -857,8 +857,8 @@ static int freq_reg_info_regd(struct wiphy *wiphy,
         * Follow the driver's regulatory domain, if present, unless a country
         * IE has been processed or a user wants to help complaince further
         */
-       if (last_request->initiator != REGDOM_SET_BY_COUNTRY_IE &&
-           last_request->initiator != REGDOM_SET_BY_USER &&
+       if (last_request->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
+           last_request->initiator != NL80211_REGDOM_SET_BY_USER &&
            wiphy->regd)
                regd = wiphy->regd;
 
@@ -943,7 +943,8 @@ static void handle_channel(struct wiphy *wiphy, enum ieee80211_band band,
                 * http://tinyurl.com/11d-clarification
                 */
                if (r == -ERANGE &&
-                   last_request->initiator == REGDOM_SET_BY_COUNTRY_IE) {
+                   last_request->initiator ==
+                   NL80211_REGDOM_SET_BY_COUNTRY_IE) {
 #ifdef CONFIG_CFG80211_REG_DEBUG
                        printk(KERN_DEBUG "cfg80211: Leaving channel %d MHz "
                                "intact on %s - no rule found in band on "
@@ -956,7 +957,8 @@ static void handle_channel(struct wiphy *wiphy, enum ieee80211_band band,
                 * for the band so we respect its band definitions
                 */
 #ifdef CONFIG_CFG80211_REG_DEBUG
-                       if (last_request->initiator == REGDOM_SET_BY_COUNTRY_IE)
+                       if (last_request->initiator ==
+                           NL80211_REGDOM_SET_BY_COUNTRY_IE)
                                printk(KERN_DEBUG "cfg80211: Disabling "
                                        "channel %d MHz on %s due to "
                                        "Country IE\n",
@@ -970,7 +972,7 @@ static void handle_channel(struct wiphy *wiphy, enum ieee80211_band band,
 
        power_rule = &reg_rule->power_rule;
 
-       if (last_request->initiator == REGDOM_SET_BY_DRIVER &&
+       if (last_request->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
            request_wiphy && request_wiphy == wiphy &&
            request_wiphy->strict_regulatory) {
                /*
@@ -1011,11 +1013,12 @@ static void handle_band(struct wiphy *wiphy, enum ieee80211_band band)
                handle_channel(wiphy, band, i);
 }
 
-static bool ignore_reg_update(struct wiphy *wiphy, enum reg_set_by setby)
+static bool ignore_reg_update(struct wiphy *wiphy,
+                             enum nl80211_reg_initiator initiator)
 {
        if (!last_request)
                return true;
-       if (setby == REGDOM_SET_BY_CORE &&
+       if (initiator == NL80211_REGDOM_SET_BY_CORE &&
                  wiphy->custom_regulatory)
                return true;
        /*
@@ -1028,12 +1031,12 @@ static bool ignore_reg_update(struct wiphy *wiphy, enum reg_set_by setby)
        return false;
 }
 
-static void update_all_wiphy_regulatory(enum reg_set_by setby)
+static void update_all_wiphy_regulatory(enum nl80211_reg_initiator initiator)
 {
        struct cfg80211_registered_device *drv;
 
        list_for_each_entry(drv, &cfg80211_drv_list, list)
-               wiphy_update_regulatory(&drv->wiphy, setby);
+               wiphy_update_regulatory(&drv->wiphy, initiator);
 }
 
 static void handle_reg_beacon(struct wiphy *wiphy,
@@ -1124,7 +1127,7 @@ static bool reg_is_world_roaming(struct wiphy *wiphy)
        if (is_world_regdom(cfg80211_regdomain->alpha2) ||
            (wiphy->regd && is_world_regdom(wiphy->regd->alpha2)))
                return true;
-       if (last_request->initiator != REGDOM_SET_BY_COUNTRY_IE &&
+       if (last_request->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE &&
            wiphy->custom_regulatory)
                return true;
        return false;
@@ -1138,11 +1141,12 @@ static void reg_process_beacons(struct wiphy *wiphy)
        wiphy_update_beacon_reg(wiphy);
 }
 
-void wiphy_update_regulatory(struct wiphy *wiphy, enum reg_set_by setby)
+void wiphy_update_regulatory(struct wiphy *wiphy,
+                            enum nl80211_reg_initiator initiator)
 {
        enum ieee80211_band band;
 
-       if (ignore_reg_update(wiphy, setby))
+       if (ignore_reg_update(wiphy, initiator))
                goto out;
        for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
                if (wiphy->bands[band])
@@ -1255,15 +1259,16 @@ static int ignore_request(struct wiphy *wiphy,
                return 0;
 
        switch (pending_request->initiator) {
-       case REGDOM_SET_BY_CORE:
+       case NL80211_REGDOM_SET_BY_CORE:
                return -EINVAL;
-       case REGDOM_SET_BY_COUNTRY_IE:
+       case NL80211_REGDOM_SET_BY_COUNTRY_IE:
 
                last_wiphy = wiphy_idx_to_wiphy(last_request->wiphy_idx);
 
                if (unlikely(!is_an_alpha2(pending_request->alpha2)))
                        return -EINVAL;
-               if (last_request->initiator == REGDOM_SET_BY_COUNTRY_IE) {
+               if (last_request->initiator ==
+                   NL80211_REGDOM_SET_BY_COUNTRY_IE) {
                        if (last_wiphy != wiphy) {
                                /*
                                 * Two cards with two APs claiming different
@@ -1284,8 +1289,8 @@ static int ignore_request(struct wiphy *wiphy,
                        return -EALREADY;
                }
                return REG_INTERSECT;
-       case REGDOM_SET_BY_DRIVER:
-               if (last_request->initiator == REGDOM_SET_BY_CORE) {
+       case NL80211_REGDOM_SET_BY_DRIVER:
+               if (last_request->initiator == NL80211_REGDOM_SET_BY_CORE) {
                        if (is_old_static_regdom(cfg80211_regdomain))
                                return 0;
                        if (regdom_changes(pending_request->alpha2))
@@ -1298,28 +1303,28 @@ static int ignore_request(struct wiphy *wiphy,
                 * back in or if you add a new device for which the previously
                 * loaded card also agrees on the regulatory domain.
                 */
-               if (last_request->initiator == REGDOM_SET_BY_DRIVER &&
+               if (last_request->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
                    !regdom_changes(pending_request->alpha2))
                        return -EALREADY;
 
                return REG_INTERSECT;
-       case REGDOM_SET_BY_USER:
-               if (last_request->initiator == REGDOM_SET_BY_COUNTRY_IE)
+       case NL80211_REGDOM_SET_BY_USER:
+               if (last_request->initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE)
                        return REG_INTERSECT;
                /*
                 * If the user knows better the user should set the regdom
                 * to their country before the IE is picked up
                 */
-               if (last_request->initiator == REGDOM_SET_BY_USER &&
+               if (last_request->initiator == NL80211_REGDOM_SET_BY_USER &&
                          last_request->intersect)
                        return -EOPNOTSUPP;
                /*
                 * Process user requests only after previous user/driver/core
                 * requests have been processed
                 */
-               if (last_request->initiator == REGDOM_SET_BY_CORE ||
-                   last_request->initiator == REGDOM_SET_BY_DRIVER ||
-                   last_request->initiator == REGDOM_SET_BY_USER) {
+               if (last_request->initiator == NL80211_REGDOM_SET_BY_CORE ||
+                   last_request->initiator == NL80211_REGDOM_SET_BY_DRIVER ||
+                   last_request->initiator == NL80211_REGDOM_SET_BY_USER) {
                        if (regdom_changes(last_request->alpha2))
                                return -EAGAIN;
                }
@@ -1359,7 +1364,8 @@ static int __regulatory_hint(struct wiphy *wiphy,
        r = ignore_request(wiphy, pending_request);
 
        if (r == REG_INTERSECT) {
-               if (pending_request->initiator == REGDOM_SET_BY_DRIVER) {
+               if (pending_request->initiator ==
+                   NL80211_REGDOM_SET_BY_DRIVER) {
                        r = reg_copy_regd(&wiphy->regd, cfg80211_regdomain);
                        if (r) {
                                kfree(pending_request);
@@ -1374,7 +1380,8 @@ static int __regulatory_hint(struct wiphy *wiphy,
                 * wiphy
                 */
                if (r == -EALREADY &&
-                   pending_request->initiator == REGDOM_SET_BY_DRIVER) {
+                   pending_request->initiator ==
+                   NL80211_REGDOM_SET_BY_DRIVER) {
                        r = reg_copy_regd(&wiphy->regd, cfg80211_regdomain);
                        if (r) {
                                kfree(pending_request);
@@ -1425,7 +1432,7 @@ static void reg_process_hint(struct regulatory_request *reg_request)
        if (wiphy_idx_valid(reg_request->wiphy_idx))
                wiphy = wiphy_idx_to_wiphy(reg_request->wiphy_idx);
 
-       if (reg_request->initiator == REGDOM_SET_BY_DRIVER &&
+       if (reg_request->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
            !wiphy) {
                kfree(reg_request);
                goto out;
@@ -1439,7 +1446,7 @@ out:
        mutex_unlock(&cfg80211_mutex);
 }
 
-/* Processes regulatory hints, this is all the REGDOM_SET_BY_* */
+/* Processes regulatory hints, this is all the NL80211_REGDOM_SET_BY_* */
 static void reg_process_pending_hints(void)
        {
        struct regulatory_request *reg_request;
@@ -1523,7 +1530,7 @@ static int regulatory_hint_core(const char *alpha2)
 
        request->alpha2[0] = alpha2[0];
        request->alpha2[1] = alpha2[1];
-       request->initiator = REGDOM_SET_BY_CORE;
+       request->initiator = NL80211_REGDOM_SET_BY_CORE;
 
        queue_regulatory_request(request);
 
@@ -1544,7 +1551,7 @@ int regulatory_hint_user(const char *alpha2)
        request->wiphy_idx = WIPHY_IDX_STALE;
        request->alpha2[0] = alpha2[0];
        request->alpha2[1] = alpha2[1];
-       request->initiator = REGDOM_SET_BY_USER,
+       request->initiator = NL80211_REGDOM_SET_BY_USER,
 
        queue_regulatory_request(request);
 
@@ -1570,7 +1577,7 @@ int regulatory_hint(struct wiphy *wiphy, const char *alpha2)
 
        request->alpha2[0] = alpha2[0];
        request->alpha2[1] = alpha2[1];
-       request->initiator = REGDOM_SET_BY_DRIVER;
+       request->initiator = NL80211_REGDOM_SET_BY_DRIVER;
 
        queue_regulatory_request(request);
 
@@ -1719,7 +1726,7 @@ void regulatory_hint_11d(struct wiphy *wiphy,
        request->wiphy_idx = get_wiphy_idx(wiphy);
        request->alpha2[0] = rd->alpha2[0];
        request->alpha2[1] = rd->alpha2[1];
-       request->initiator = REGDOM_SET_BY_COUNTRY_IE;
+       request->initiator = NL80211_REGDOM_SET_BY_COUNTRY_IE;
        request->country_ie_checksum = checksum;
        request->country_ie_env = env;
 
@@ -1827,7 +1834,8 @@ static void print_regdomain(const struct ieee80211_regdomain *rd)
 
        if (is_intersected_alpha2(rd->alpha2)) {
 
-               if (last_request->initiator == REGDOM_SET_BY_COUNTRY_IE) {
+               if (last_request->initiator ==
+                   NL80211_REGDOM_SET_BY_COUNTRY_IE) {
                        struct cfg80211_registered_device *drv;
                        drv = cfg80211_drv_by_wiphy_idx(
                                last_request->wiphy_idx);
@@ -1919,7 +1927,7 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
         * rd is non static (it means CRDA was present and was used last)
         * and the pending request came in from a country IE
         */
-       if (last_request->initiator != REGDOM_SET_BY_COUNTRY_IE) {
+       if (last_request->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE) {
                /*
                 * If someone else asked us to change the rd lets only bother
                 * checking if the alpha2 changes if CRDA was already called
@@ -1951,7 +1959,7 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
        if (!last_request->intersect) {
                int r;
 
-               if (last_request->initiator != REGDOM_SET_BY_DRIVER) {
+               if (last_request->initiator != NL80211_REGDOM_SET_BY_DRIVER) {
                        reset_regdomains();
                        cfg80211_regdomain = rd;
                        return 0;
@@ -1975,7 +1983,7 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
 
        /* Intersection requires a bit more work */
 
-       if (last_request->initiator != REGDOM_SET_BY_COUNTRY_IE) {
+       if (last_request->initiator != NL80211_REGDOM_SET_BY_COUNTRY_IE) {
 
                intersected_rd = regdom_intersect(rd, cfg80211_regdomain);
                if (!intersected_rd)
@@ -1986,7 +1994,7 @@ static int __set_regdom(const struct ieee80211_regdomain *rd)
                 * However if a driver requested this specific regulatory
                 * domain we keep it for its private use
                 */
-               if (last_request->initiator == REGDOM_SET_BY_DRIVER)
+               if (last_request->initiator == NL80211_REGDOM_SET_BY_DRIVER)
                        request_wiphy->regd = rd;
                else
                        kfree(rd);