Skip to content

Commit

Permalink
mt76: mt7915: reject duplicated twt flows
Browse files Browse the repository at this point in the history
Reject twt flows with the same parameters to prevent some potential issues
causing by duplicated establishment.

Reviewed-by: Ryder Lee <ryder.lee@mediatek.com>
Reviewed-by: Shayne Chen <shayne.chen@mediatek.com>
Signed-off-by: Peter Chiu <chui-hao.chiu@mediatek.com>
Signed-off-by: Felix Fietkau <nbd@nbd.name>
  • Loading branch information
Peter Chiu authored and nbd168 committed May 5, 2022
1 parent b7104b4 commit d39368f
Showing 1 changed file with 31 additions and 0 deletions.
31 changes: 31 additions & 0 deletions mt7915/mac.c
Expand Up @@ -2690,6 +2690,34 @@ static int mt7915_mac_check_twt_req(struct ieee80211_twt_setup *twt)
return 0;
}

static bool
mt7915_mac_twt_param_equal(struct mt7915_sta *msta,
struct ieee80211_twt_params *twt_agrt)
{
u16 type = le16_to_cpu(twt_agrt->req_type);
u8 exp;
int i;

exp = FIELD_GET(IEEE80211_TWT_REQTYPE_WAKE_INT_EXP, type);
for (i = 0; i < MT7915_MAX_STA_TWT_AGRT; i++) {
struct mt7915_twt_flow *f;

if (!(msta->twt.flowid_mask & BIT(i)))
continue;

f = &msta->twt.flow[i];
if (f->duration == twt_agrt->min_twt_dur &&
f->mantissa == twt_agrt->mantissa &&
f->exp == exp &&
f->protection == !!(type & IEEE80211_TWT_REQTYPE_PROTECTION) &&
f->flowtype == !!(type & IEEE80211_TWT_REQTYPE_FLOWTYPE) &&
f->trigger == !!(type & IEEE80211_TWT_REQTYPE_TRIGGER))
return true;
}

return false;
}

void mt7915_mac_add_twt_setup(struct ieee80211_hw *hw,
struct ieee80211_sta *sta,
struct ieee80211_twt_setup *twt)
Expand Down Expand Up @@ -2723,6 +2751,9 @@ void mt7915_mac_add_twt_setup(struct ieee80211_hw *hw,
exp = FIELD_GET(IEEE80211_TWT_REQTYPE_WAKE_INT_EXP, req_type);
sta_setup_cmd = FIELD_GET(IEEE80211_TWT_REQTYPE_SETUP_CMD, req_type);

if (mt7915_mac_twt_param_equal(msta, twt_agrt))
goto unlock;

flow = &msta->twt.flow[flowid];
memset(flow, 0, sizeof(*flow));
INIT_LIST_HEAD(&flow->list);
Expand Down

0 comments on commit d39368f

Please sign in to comment.