Commit b6f35301 authored by Rajkumar Manoharan's avatar Rajkumar Manoharan Committed by John W. Linville

mac80211: Send nullfunc frames at lower rate during connection monitor

Recently mac80211 was changed to use nullfunc instead of probe
request for connection monitoring for tx ack status reporting
hardwares. Sometimes in congested network, STA got disconnected
quickly after the association. It was observered that the rate
control was not adopted to environment due to minimal transmission.

As the nullfunc are used for monitoring purpose, these frames should
not be sacrificed for rate control updation. So it is better to send
the monitoring null func frames at minimum rate that could help to
retain the connection.
Signed-off-by: default avatarRajkumar Manoharan <rmanohar@qca.qualcomm.com>
Signed-off-by: default avatarJohn W. Linville <linville@tuxdriver.com>
parent e209c5a7
...@@ -372,6 +372,9 @@ struct ieee80211_bss_conf { ...@@ -372,6 +372,9 @@ struct ieee80211_bss_conf {
* an SP that mac80211 transmits, it is already set; for driver frames * an SP that mac80211 transmits, it is already set; for driver frames
* the driver may set this flag. It is also used to do the same for * the driver may set this flag. It is also used to do the same for
* PS-Poll responses. * PS-Poll responses.
* @IEEE80211_TX_CTL_USE_MINRATE: This frame will be sent at lowest rate.
* This flag is used to send nullfunc frame at minimum rate when
* the nullfunc is used for connection monitoring purpose.
* *
* Note: If you have to add new flags to the enumeration, then don't * Note: If you have to add new flags to the enumeration, then don't
* forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary. * forget to update %IEEE80211_TX_TEMPORARY_FLAGS when necessary.
...@@ -404,6 +407,7 @@ enum mac80211_tx_control_flags { ...@@ -404,6 +407,7 @@ enum mac80211_tx_control_flags {
IEEE80211_TX_INTFL_TKIP_MIC_FAILURE = BIT(26), IEEE80211_TX_INTFL_TKIP_MIC_FAILURE = BIT(26),
IEEE80211_TX_CTL_NO_CCK_RATE = BIT(27), IEEE80211_TX_CTL_NO_CCK_RATE = BIT(27),
IEEE80211_TX_STATUS_EOSP = BIT(28), IEEE80211_TX_STATUS_EOSP = BIT(28),
IEEE80211_TX_CTL_USE_MINRATE = BIT(29),
}; };
#define IEEE80211_TX_CTL_STBC_SHIFT 23 #define IEEE80211_TX_CTL_STBC_SHIFT 23
......
...@@ -348,6 +348,7 @@ void ieee80211_send_nullfunc(struct ieee80211_local *local, ...@@ -348,6 +348,7 @@ void ieee80211_send_nullfunc(struct ieee80211_local *local,
{ {
struct sk_buff *skb; struct sk_buff *skb;
struct ieee80211_hdr_3addr *nullfunc; struct ieee80211_hdr_3addr *nullfunc;
struct ieee80211_if_managed *ifmgd = &sdata->u.mgd;
skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif); skb = ieee80211_nullfunc_get(&local->hw, &sdata->vif);
if (!skb) if (!skb)
...@@ -358,6 +359,10 @@ void ieee80211_send_nullfunc(struct ieee80211_local *local, ...@@ -358,6 +359,10 @@ void ieee80211_send_nullfunc(struct ieee80211_local *local,
nullfunc->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM); nullfunc->frame_control |= cpu_to_le16(IEEE80211_FCTL_PM);
IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT; IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_INTFL_DONT_ENCRYPT;
if (ifmgd->flags & (IEEE80211_STA_BEACON_POLL |
IEEE80211_STA_CONNECTION_POLL))
IEEE80211_SKB_CB(skb)->flags |= IEEE80211_TX_CTL_USE_MINRATE;
ieee80211_tx_skb(sdata, skb); ieee80211_tx_skb(sdata, skb);
} }
......
...@@ -199,7 +199,7 @@ static void rate_control_release(struct kref *kref) ...@@ -199,7 +199,7 @@ static void rate_control_release(struct kref *kref)
kfree(ctrl_ref); kfree(ctrl_ref);
} }
static bool rc_no_data_or_no_ack(struct ieee80211_tx_rate_control *txrc) static bool rc_no_data_or_no_ack_use_min(struct ieee80211_tx_rate_control *txrc)
{ {
struct sk_buff *skb = txrc->skb; struct sk_buff *skb = txrc->skb;
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data; struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
...@@ -208,7 +208,9 @@ static bool rc_no_data_or_no_ack(struct ieee80211_tx_rate_control *txrc) ...@@ -208,7 +208,9 @@ static bool rc_no_data_or_no_ack(struct ieee80211_tx_rate_control *txrc)
fc = hdr->frame_control; fc = hdr->frame_control;
return (info->flags & IEEE80211_TX_CTL_NO_ACK) || !ieee80211_is_data(fc); return (info->flags & (IEEE80211_TX_CTL_NO_ACK |
IEEE80211_TX_CTL_USE_MINRATE)) ||
!ieee80211_is_data(fc);
} }
static void rc_send_low_broadcast(s8 *idx, u32 basic_rates, static void rc_send_low_broadcast(s8 *idx, u32 basic_rates,
...@@ -262,7 +264,7 @@ bool rate_control_send_low(struct ieee80211_sta *sta, ...@@ -262,7 +264,7 @@ bool rate_control_send_low(struct ieee80211_sta *sta,
struct ieee80211_supported_band *sband = txrc->sband; struct ieee80211_supported_band *sband = txrc->sband;
int mcast_rate; int mcast_rate;
if (!sta || !priv_sta || rc_no_data_or_no_ack(txrc)) { if (!sta || !priv_sta || rc_no_data_or_no_ack_use_min(txrc)) {
if ((sband->band != IEEE80211_BAND_2GHZ) || if ((sband->band != IEEE80211_BAND_2GHZ) ||
!(info->flags & IEEE80211_TX_CTL_NO_CCK_RATE)) !(info->flags & IEEE80211_TX_CTL_NO_CCK_RATE))
info->control.rates[0].idx = info->control.rates[0].idx =
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment