On Fri, Apr 4, 2014 at 4:53 PM, Colleen T <[email protected]> wrote:
> On Fri, Apr 4, 2014 at 11:39 AM, Thomas Pedersen <[email protected]> wrote:
>> On Thu, Apr 3, 2014 at 9:57 PM, Colleen Twitty <[email protected]> wrote:
>>> [PATCH] Update target SN when a new origin SN is RX'ed.
>>>
>>> Before possibly updating the mpath towards a station in
>>> hwmp_route_info_get, get the SN from the mpath table.
>>> Then pass this on to the function that processes PREQ's so
>>> that we can use this information to update the target SN
>>> if the origin SN has been updated.
>>
>> Why? What bug does this patch fix?
>>
>>> Signed-off-by: Colleen Twitty <[email protected]>
>>> ---
>>> This patch is meant to solve the some issue as Bob's, but with a different
>>> approach.  This removes considering net_traversal_jiffies in updating the
>>> sequence number.
>>
>> Does that mean we can get rid of net_traversal_jiffies entirely then?
>> PREQs are already gated by dot11MeshHWMPpreqMinInterval, so it seems
>> kind of redundant now.
>
> No, they are used correctly in limiting the increment rate of a STA's
> origin SN.  I think we still need them there.

Hmm. Ok then I'm missing something. Why is origin SN even incremented
when receiving a PREQ for which ifmsh is the target?

>>>  net/mac80211/mesh_hwmp.c | 39 +++++++++++++++++++++++++++++++--------
>>>  1 file changed, 31 insertions(+), 8 deletions(-)
>>>
>>> diff --git a/net/mac80211/mesh_hwmp.c b/net/mac80211/mesh_hwmp.c
>>> index f951468..505e180 100644
>>> --- a/net/mac80211/mesh_hwmp.c
>>> +++ b/net/mac80211/mesh_hwmp.c
>>> @@ -511,7 +511,8 @@ static u32 hwmp_route_info_get(struct 
>>> ieee80211_sub_if_data *sdata,
>>>
>>>  static void hwmp_preq_frame_process(struct ieee80211_sub_if_data *sdata,
>>>                                     struct ieee80211_mgmt *mgmt,
>>> -                                   const u8 *preq_elem, u32 metric)
>>> +                                   const u8 *preq_elem, u32 metric,
>>> +                                   bool chk_old_sn, u32 old_sn)
>>>  {
>>>         struct ieee80211_if_mesh *ifmsh = &sdata->u.mesh;
>>>         struct mesh_path *mpath = NULL;
>>> @@ -541,12 +542,9 @@ static void hwmp_preq_frame_process(struct 
>>> ieee80211_sub_if_data *sdata,
>>>                 forward = false;
>>>                 reply = true;
>>>                 metric = 0;
>>> -               if (time_after(jiffies, ifmsh->last_sn_update +
>>> -                                       net_traversal_jiffies(sdata)) ||
>>> -                   time_before(jiffies, ifmsh->last_sn_update)) {
>>> -                       target_sn = ++ifmsh->sn;
>>> -                       ifmsh->last_sn_update = jiffies;
>>> -               }
>>> +       if (chk_old_sn && SN_LT(old_sn, orig_sn))
>>> +               ifmsh->sn = max(ifmsh->sn, target_sn)+1;
>>> +       target_sn = ifmsh->sn;
>>>         } else if (is_broadcast_ether_addr(target_addr) &&
>>>                    (target_flags & IEEE80211_PREQ_TO_FLAG)) {
>>>                 rcu_read_lock();
>>> @@ -855,7 +853,11 @@ void mesh_rx_path_sel_frame(struct 
>>> ieee80211_sub_if_data *sdata,
>>>         struct ieee802_11_elems elems;
>>>         size_t baselen;
>>>         u32 last_hop_metric;
>>> +       const u8 *orig_addr;
>>>         struct sta_info *sta;
>>> +       bool chk_old_sn = false;
>>> +       u32 old_sn;
>>> +       struct mesh_path *mpath = NULL;
>>>
>>>         /* need action_code */
>>>         if (len < IEEE80211_MIN_ACTION_SIZE + 1)
>>> @@ -877,11 +879,32 @@ void mesh_rx_path_sel_frame(struct 
>>> ieee80211_sub_if_data *sdata,
>>>                 if (elems.preq_len != 37)
>>>                         /* Right now we support just 1 destination and no 
>>> AE */
>>>                         return;
>>> +
>>> +               orig_addr = PREQ_IE_ORIG_ADDR(elems.preq);
>>> +
>>> +               /* Sec. 13.10.8.3 HWMP sequence numbering calls for the 
>>> target
>>> +               * HWMP seq number to be incremented after each processed 
>>> PREQ,
>>> +               * but that would result in all but the last PREP metric info
>>> +               * to be ignored.  Instead, we only increment the target SN
>>> +               * when we detect that the originator SN has changed.  This
>>> +               * results in all the PREPs generated in response to a single
>>> +               * PREQ to have the same seq num, and, therefore, for the
>>> +               * metrics for the different paths to be taken into account.
>>> +               */
>>> +               rcu_read_lock();
>>> +               mpath = mesh_path_lookup(sdata, orig_addr);
>>> +               if (mpath) {
>>> +                       chk_old_sn = true;
>>> +                       old_sn = mpath->sn;
>>> +               }
>>> +               rcu_read_unlock();
>>
>> hwmp_preq_frame_process() already does a mesh_path_lookup(), so why do
>> it out here? If you get rid of this you could save the parameter bloat
>> as well.
>
> Yes, hwmp_preq_fame_process does a mesh-path_lookup.  However, it also
> may update the information in the mpath table, and I am trying to
> detect if the origin SN has changed. I am doing this lookup in order
> to get the SN before it is (maybe) updated.  I think the next step,
> assuming this is the behavior we want for updating the target sequence
> number, is to restructure some of the mpath code to avoid this.  Can
> you see a more straightfoward path here?

Yes, get the old_sn in hwmp_preq_frame_process() before updating the mpath.
_______________________________________________
Devel mailing list
[email protected]
http://lists.open80211s.org/cgi-bin/mailman/listinfo/devel

Reply via email to