|
@@ -838,6 +838,29 @@ static int ieee80211_ioctl_giwscan(struct net_device *dev,
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
+static int ieee80211_ioctl_giwrate(struct net_device *dev,
|
|
|
|
+ struct iw_request_info *info,
|
|
|
|
+ struct iw_param *rate, char *extra)
|
|
|
|
+{
|
|
|
|
+ struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr);
|
|
|
|
+ struct sta_info *sta;
|
|
|
|
+ struct ieee80211_sub_if_data *sdata;
|
|
|
|
+
|
|
|
|
+ sdata = IEEE80211_DEV_TO_SUB_IF(dev);
|
|
|
|
+ if (sdata->type == IEEE80211_IF_TYPE_STA)
|
|
|
|
+ sta = sta_info_get(local, sdata->u.sta.bssid);
|
|
|
|
+ else
|
|
|
|
+ return -EOPNOTSUPP;
|
|
|
|
+ if (!sta)
|
|
|
|
+ return -ENODEV;
|
|
|
|
+ if (sta->txrate < local->oper_hw_mode->num_rates)
|
|
|
|
+ rate->value = local->oper_hw_mode->rates[sta->txrate].rate * 100000;
|
|
|
|
+ else
|
|
|
|
+ rate->value = 0;
|
|
|
|
+ sta_info_put(sta);
|
|
|
|
+ return 0;
|
|
|
|
+}
|
|
|
|
+
|
|
static int ieee80211_ioctl_siwrts(struct net_device *dev,
|
|
static int ieee80211_ioctl_siwrts(struct net_device *dev,
|
|
struct iw_request_info *info,
|
|
struct iw_request_info *info,
|
|
struct iw_param *rts, char *extra)
|
|
struct iw_param *rts, char *extra)
|
|
@@ -1779,7 +1802,7 @@ static const iw_handler ieee80211_handler[] =
|
|
(iw_handler) NULL, /* -- hole -- */
|
|
(iw_handler) NULL, /* -- hole -- */
|
|
(iw_handler) NULL, /* -- hole -- */
|
|
(iw_handler) NULL, /* -- hole -- */
|
|
(iw_handler) NULL, /* SIOCSIWRATE */
|
|
(iw_handler) NULL, /* SIOCSIWRATE */
|
|
- (iw_handler) NULL, /* SIOCGIWRATE */
|
|
|
|
|
|
+ (iw_handler) ieee80211_ioctl_giwrate, /* SIOCGIWRATE */
|
|
(iw_handler) ieee80211_ioctl_siwrts, /* SIOCSIWRTS */
|
|
(iw_handler) ieee80211_ioctl_siwrts, /* SIOCSIWRTS */
|
|
(iw_handler) ieee80211_ioctl_giwrts, /* SIOCGIWRTS */
|
|
(iw_handler) ieee80211_ioctl_giwrts, /* SIOCGIWRTS */
|
|
(iw_handler) ieee80211_ioctl_siwfrag, /* SIOCSIWFRAG */
|
|
(iw_handler) ieee80211_ioctl_siwfrag, /* SIOCSIWFRAG */
|