Hi Javier,
even using 100ms still causes problems.
Maybe I should give an idea of my setup. I have 6 mesh nodes within 
range of each other. They all transmit TCP traffic at a constant bit 
rate (500Kbps in my test) to an external laptop through a mesh portal. 
With the current implementation and the default values, to refresh a 
path a burst of preq are queued and transmitted during one second. Also 
each  PREQ is a broadcast to the all the mesh nodes. This puts a lot of 
unnecessary load on the mesh.
I also noticed that in mesh_queue_preq() ifmsh->last_preq is not updated 
until the preq is sent out, which will cause more preqs to be queued if 
tx rate < rx rate.
The spec does specify minpreqinterval to be 100ms, it also specify 
dot11MeshHWMPmaintenanceInterval to be 2000. "This attribute specifies 
the minimum interval of time (in TUs) during which a mesh STA can send 
only one Action frame containing PREQ element for path maintenance."
With that in mind I think a path should be refreshed at that rate 
regardless of the path expiration time.
Even in nl8022.h the refresh time is specified as follows:  "* 
@NL80211_MESHCONF_PATH_REFRESH_TIME: how frequently to refresh mesh 
paths * (in milliseconds)"

The core of the change would look like this: (note: an extra variable: 
last_refresh_time is added to the path struct)

         mpath = mesh_path_lookup(target_addr, sdata);
@@ -931,15 +941,20 @@
         }

         if (mpath->flags & MESH_PATH_ACTIVE) {
-               if (time_after(jiffies,
-                              mpath->exp_time -
-                              
msecs_to_jiffies(sdata->u.mesh.mshcfg.path_refresh_time)) &&
+               if (time_after_eq(jiffies,
+                   mpath->last_refresh_time +
+                   
msecs_to_jiffies(sdata->u.mesh.mshcfg.path_refresh_time)) &&
                     !memcmp(sdata->vif.addr, hdr->addr4, ETH_ALEN) &&
                     !(mpath->flags & MESH_PATH_RESOLVING) &&
                     !(mpath->flags & MESH_PATH_FIXED)) {
                         mesh_queue_preq(mpath,
                                         PREQ_Q_F_START | PREQ_Q_F_REFRESH);
+                      mpath->last_refresh_time = jiffies;

                 }

What do you think?

--Fabrice



_______________________________________________
Devel mailing list
Devel@lists.open80211s.org
http://open80211s.com/mailman/listinfo/devel

Reply via email to