nl80211: Add signal strength and bandwith to nl80211station info
This patch adds signal strength and transmission bitrate to the station_info of nl80211. Signed-off-by: Henning Rogge <rogge@fgan.de> Acked-by: Johannes Berg <johannes@sipsolutions.net> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
221b3d60cb
commit
420e7fabd9
@ -1091,12 +1091,46 @@ static int parse_station_flags(struct nlattr *nla, u32 *staflags)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u16 nl80211_calculate_bitrate(struct rate_info *rate)
|
||||
{
|
||||
int modulation, streams, bitrate;
|
||||
|
||||
if (!(rate->flags & RATE_INFO_FLAGS_MCS))
|
||||
return rate->legacy;
|
||||
|
||||
/* the formula below does only work for MCS values smaller than 32 */
|
||||
if (rate->mcs >= 32)
|
||||
return 0;
|
||||
|
||||
modulation = rate->mcs & 7;
|
||||
streams = (rate->mcs >> 3) + 1;
|
||||
|
||||
bitrate = (rate->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH) ?
|
||||
13500000 : 6500000;
|
||||
|
||||
if (modulation < 4)
|
||||
bitrate *= (modulation + 1);
|
||||
else if (modulation == 4)
|
||||
bitrate *= (modulation + 2);
|
||||
else
|
||||
bitrate *= (modulation + 3);
|
||||
|
||||
bitrate *= streams;
|
||||
|
||||
if (rate->flags & RATE_INFO_FLAGS_SHORT_GI)
|
||||
bitrate = (bitrate / 9) * 10;
|
||||
|
||||
/* do NOT round down here */
|
||||
return (bitrate + 50000) / 100000;
|
||||
}
|
||||
|
||||
static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
|
||||
int flags, struct net_device *dev,
|
||||
u8 *mac_addr, struct station_info *sinfo)
|
||||
{
|
||||
void *hdr;
|
||||
struct nlattr *sinfoattr;
|
||||
struct nlattr *sinfoattr, *txrate;
|
||||
u16 bitrate;
|
||||
|
||||
hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_STATION);
|
||||
if (!hdr)
|
||||
@ -1126,7 +1160,29 @@ static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
|
||||
if (sinfo->filled & STATION_INFO_PLINK_STATE)
|
||||
NLA_PUT_U8(msg, NL80211_STA_INFO_PLINK_STATE,
|
||||
sinfo->plink_state);
|
||||
if (sinfo->filled & STATION_INFO_SIGNAL)
|
||||
NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL,
|
||||
sinfo->signal);
|
||||
if (sinfo->filled & STATION_INFO_TX_BITRATE) {
|
||||
txrate = nla_nest_start(msg, NL80211_STA_INFO_TX_BITRATE);
|
||||
if (!txrate)
|
||||
goto nla_put_failure;
|
||||
|
||||
/* nl80211_calculate_bitrate will return 0 for mcs >= 32 */
|
||||
bitrate = nl80211_calculate_bitrate(&sinfo->txrate);
|
||||
if (bitrate > 0)
|
||||
NLA_PUT_U16(msg, NL80211_RATE_INFO_BITRATE, bitrate);
|
||||
|
||||
if (sinfo->txrate.flags & RATE_INFO_FLAGS_MCS)
|
||||
NLA_PUT_U8(msg, NL80211_RATE_INFO_MCS,
|
||||
sinfo->txrate.mcs);
|
||||
if (sinfo->txrate.flags & RATE_INFO_FLAGS_40_MHZ_WIDTH)
|
||||
NLA_PUT_FLAG(msg, NL80211_RATE_INFO_40_MHZ_WIDTH);
|
||||
if (sinfo->txrate.flags & RATE_INFO_FLAGS_SHORT_GI)
|
||||
NLA_PUT_FLAG(msg, NL80211_RATE_INFO_SHORT_GI);
|
||||
|
||||
nla_nest_end(msg, txrate);
|
||||
}
|
||||
nla_nest_end(msg, sinfoattr);
|
||||
|
||||
return genlmsg_end(msg, hdr);
|
||||
|
Reference in New Issue
Block a user