{nl,cfg,mac}80211: implement dot11MeshHWMPperrMinInterval
As per 802.11mb 13.9.11.3 Signed-off-by: Thomas Pedersen <thomas@cozybit.com> Signed-off-by: Javier Cardona <javier@cozybit.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
d3c1597b8d
commit
dca7e9430c
@@ -1272,6 +1272,9 @@ static int ieee80211_update_mesh_config(struct wiphy *wiphy,
|
||||
if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PREQ_MIN_INTERVAL, mask))
|
||||
conf->dot11MeshHWMPpreqMinInterval =
|
||||
nconf->dot11MeshHWMPpreqMinInterval;
|
||||
if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_PERR_MIN_INTERVAL, mask))
|
||||
conf->dot11MeshHWMPperrMinInterval =
|
||||
nconf->dot11MeshHWMPperrMinInterval;
|
||||
if (_chg_mesh_attr(NL80211_MESHCONF_HWMP_NET_DIAM_TRVS_TIME,
|
||||
mask))
|
||||
conf->dot11MeshHWMPnetDiameterTraversalTime =
|
||||
|
@@ -405,6 +405,8 @@ IEEE80211_IF_FILE(dot11MeshHWMPactivePathTimeout,
|
||||
u.mesh.mshcfg.dot11MeshHWMPactivePathTimeout, DEC);
|
||||
IEEE80211_IF_FILE(dot11MeshHWMPpreqMinInterval,
|
||||
u.mesh.mshcfg.dot11MeshHWMPpreqMinInterval, DEC);
|
||||
IEEE80211_IF_FILE(dot11MeshHWMPperrMinInterval,
|
||||
u.mesh.mshcfg.dot11MeshHWMPperrMinInterval, DEC);
|
||||
IEEE80211_IF_FILE(dot11MeshHWMPnetDiameterTraversalTime,
|
||||
u.mesh.mshcfg.dot11MeshHWMPnetDiameterTraversalTime, DEC);
|
||||
IEEE80211_IF_FILE(dot11MeshHWMPmaxPREQretries,
|
||||
@@ -534,6 +536,7 @@ static void add_mesh_config(struct ieee80211_sub_if_data *sdata)
|
||||
MESHPARAMS_ADD(dot11MeshMaxPeerLinks);
|
||||
MESHPARAMS_ADD(dot11MeshHWMPactivePathTimeout);
|
||||
MESHPARAMS_ADD(dot11MeshHWMPpreqMinInterval);
|
||||
MESHPARAMS_ADD(dot11MeshHWMPperrMinInterval);
|
||||
MESHPARAMS_ADD(dot11MeshHWMPnetDiameterTraversalTime);
|
||||
MESHPARAMS_ADD(dot11MeshHWMPmaxPREQretries);
|
||||
MESHPARAMS_ADD(path_refresh_time);
|
||||
|
@@ -514,7 +514,9 @@ struct ieee80211_if_mesh {
|
||||
atomic_t mpaths;
|
||||
/* Timestamp of last SN update */
|
||||
unsigned long last_sn_update;
|
||||
/* Timestamp of last SN sent */
|
||||
/* Time when it's ok to send next PERR */
|
||||
unsigned long next_perr;
|
||||
/* Timestamp of last PREQ sent */
|
||||
unsigned long last_preq;
|
||||
struct mesh_rmc *rmc;
|
||||
spinlock_t mesh_preq_queue_lock;
|
||||
|
@@ -749,6 +749,7 @@ void ieee80211_mesh_init_sdata(struct ieee80211_sub_if_data *sdata)
|
||||
atomic_set(&ifmsh->mpaths, 0);
|
||||
mesh_rmc_init(sdata);
|
||||
ifmsh->last_preq = jiffies;
|
||||
ifmsh->next_perr = jiffies;
|
||||
/* Allocate all mesh structures when creating the first mesh interface. */
|
||||
if (!mesh_allocated)
|
||||
ieee80211s_init();
|
||||
|
@@ -241,11 +241,15 @@ int mesh_path_error_tx(u8 ttl, u8 *target, __le32 target_sn,
|
||||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct sk_buff *skb;
|
||||
struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
|
||||
struct ieee80211_mgmt *mgmt;
|
||||
u8 *pos, ie_len;
|
||||
int hdr_len = offsetof(struct ieee80211_mgmt, u.action.u.mesh_action) +
|
||||
sizeof(mgmt->u.action.u.mesh_action);
|
||||
|
||||
if (time_before(jiffies, ifmsh->next_perr))
|
||||
return -EAGAIN;
|
||||
|
||||
skb = dev_alloc_skb(local->hw.extra_tx_headroom +
|
||||
hdr_len +
|
||||
2 + 15 /* PERR IE */);
|
||||
@@ -290,6 +294,8 @@ int mesh_path_error_tx(u8 ttl, u8 *target, __le32 target_sn,
|
||||
|
||||
/* see note in function header */
|
||||
prepare_frame_for_deferred_tx(sdata, skb);
|
||||
ifmsh->next_perr = TU_TO_EXP_TIME(
|
||||
ifmsh->mshcfg.dot11MeshHWMPperrMinInterval);
|
||||
ieee80211_add_pending_skb(local, skb);
|
||||
return 0;
|
||||
}
|
||||
|
Reference in New Issue
Block a user