* @NL80211_STA_INFO_LLID: the station's mesh LLID
  * @NL80211_STA_INFO_PLID: the station's mesh PLID
  * @NL80211_STA_INFO_PLINK_STATE: peer link state for the station
+ * @NL80211_STA_INFO_RX_BITRATE: last unicast data frame rx rate, nested
+ *     attribute, like NL80211_STA_INFO_TX_BITRATE.
  * @__NL80211_STA_INFO_AFTER_LAST: internal
  * @NL80211_STA_INFO_MAX: highest possible station info attribute
  */
        NL80211_STA_INFO_TX_RETRIES,
        NL80211_STA_INFO_TX_FAILED,
        NL80211_STA_INFO_SIGNAL_AVG,
+       NL80211_STA_INFO_RX_BITRATE,
 
        /* keep last */
        __NL80211_STA_INFO_AFTER_LAST,
 
  * @STATION_INFO_PLID: @plid filled
  * @STATION_INFO_PLINK_STATE: @plink_state filled
  * @STATION_INFO_SIGNAL: @signal filled
- * @STATION_INFO_TX_BITRATE: @tx_bitrate fields are filled
+ * @STATION_INFO_TX_BITRATE: @txrate fields are filled
  *  (tx_bitrate, tx_bitrate_flags and tx_bitrate_mcs)
  * @STATION_INFO_RX_PACKETS: @rx_packets filled
  * @STATION_INFO_TX_PACKETS: @tx_packets filled
  * @STATION_INFO_TX_FAILED: @tx_failed filled
  * @STATION_INFO_RX_DROP_MISC: @rx_dropped_misc filled
  * @STATION_INFO_SIGNAL_AVG: @signal_avg filled
+ * @STATION_INFO_RX_BITRATE: @rxrate fields are filled
  */
 enum station_info_flags {
        STATION_INFO_INACTIVE_TIME      = 1<<0,
        STATION_INFO_TX_FAILED          = 1<<11,
        STATION_INFO_RX_DROP_MISC       = 1<<12,
        STATION_INFO_SIGNAL_AVG         = 1<<13,
+       STATION_INFO_RX_BITRATE         = 1<<14,
 };
 
 /**
        s8 signal;
        s8 signal_avg;
        struct rate_info txrate;
+       struct rate_info rxrate;
        u32 rx_packets;
        u32 tx_packets;
        u32 tx_retries;
 
        return 0;
 }
 
+static bool nl80211_put_sta_rate(struct sk_buff *msg, struct rate_info *info,
+                                int attr)
+{
+       struct nlattr *rate;
+       u16 bitrate;
+
+       rate = nla_nest_start(msg, attr);
+       if (!rate)
+               goto nla_put_failure;
+
+       /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */
+       bitrate = cfg80211_calculate_bitrate(info);
+       if (bitrate > 0)
+               NLA_PUT_U16(msg, NL80211_RATE_INFO_BITRATE, bitrate);
+
+       if (info->flags & RATE_INFO_FLAGS_MCS)
+               NLA_PUT_U8(msg, NL80211_RATE_INFO_MCS, info->mcs);
+       if (info->flags & RATE_INFO_FLAGS_40_MHZ_WIDTH)
+               NLA_PUT_FLAG(msg, NL80211_RATE_INFO_40_MHZ_WIDTH);
+       if (info->flags & RATE_INFO_FLAGS_SHORT_GI)
+               NLA_PUT_FLAG(msg, NL80211_RATE_INFO_SHORT_GI);
+
+       nla_nest_end(msg, rate);
+       return true;
+
+nla_put_failure:
+       return false;
+}
+
 static int nl80211_send_station(struct sk_buff *msg, u32 pid, u32 seq,
                                int flags, struct net_device *dev,
                                const u8 *mac_addr, struct station_info *sinfo)
 {
        void *hdr;
-       struct nlattr *sinfoattr, *txrate;
-       u16 bitrate;
+       struct nlattr *sinfoattr;
 
        hdr = nl80211hdr_put(msg, pid, seq, flags, NL80211_CMD_NEW_STATION);
        if (!hdr)
                NLA_PUT_U8(msg, NL80211_STA_INFO_SIGNAL_AVG,
                           sinfo->signal_avg);
        if (sinfo->filled & STATION_INFO_TX_BITRATE) {
-               txrate = nla_nest_start(msg, NL80211_STA_INFO_TX_BITRATE);
-               if (!txrate)
+               if (!nl80211_put_sta_rate(msg, &sinfo->txrate,
+                                         NL80211_STA_INFO_TX_BITRATE))
+                       goto nla_put_failure;
+       }
+       if (sinfo->filled & STATION_INFO_RX_BITRATE) {
+               if (!nl80211_put_sta_rate(msg, &sinfo->rxrate,
+                                         NL80211_STA_INFO_RX_BITRATE))
                        goto nla_put_failure;
-
-               /* cfg80211_calculate_bitrate will return 0 for mcs >= 32 */
-               bitrate = cfg80211_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);
        }
        if (sinfo->filled & STATION_INFO_RX_PACKETS)
                NLA_PUT_U32(msg, NL80211_STA_INFO_RX_PACKETS,