Message ID | 1331417873-19354-1-git-send-email-lindner_marek@yahoo.de |
---|---|
State | Accepted, archived |
Commit | c9619b5e07a756af43c196874e9e9e91e3251154 |
Headers |
Return-Path: <lindner_marek@yahoo.de> Received: from nm4-vm0.bullet.mail.ukl.yahoo.com (nm4-vm0.bullet.mail.ukl.yahoo.com [217.146.183.230]) by open-mesh.org (Postfix) with SMTP id BBBBD600853 for <b.a.t.m.a.n@lists.open-mesh.org>; Sat, 10 Mar 2012 23:18:19 +0100 (CET) Authentication-Results: open-mesh.org; dkim=pass (1024-bit key) header.i=@yahoo.de; dkim-adsp=none Received: from [217.146.183.209] by nm4.bullet.mail.ukl.yahoo.com with NNFMP; 10 Mar 2012 22:18:19 -0000 Received: from [217.146.182.149] by tm2.bullet.mail.ukl.yahoo.com with NNFMP; 10 Mar 2012 22:18:19 -0000 Received: from [127.0.0.1] by smtp118.mail.ukl.yahoo.com with NNFMP; 10 Mar 2012 22:18:19 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s1024; t=1331417899; bh=aKQu4Ie6qD23g48hzBzw2uKzr+nFUdh03Qxc0U47Qyg=; h=X-Yahoo-Newman-Id:X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:From:To:Cc:Subject:Date:Message-Id:X-Mailer; b=zm43N67hZp58VLLDKd2BDIrpN/pt4PyPvHZxyPIwwNpFauzH8+fvbJr1PZiXdaDDsabLivaYeOhqP2mdnru+wf+xG9JGcS5hL9EE9ZPNq2M569XTsqGxP8EJD2d1GQ3vNha3jaUs76nD/Jk7JNcEO9WzLGzViGkhX84AXQrp5LE= X-Yahoo-Newman-Id: 520320.71722.bm@smtp118.mail.ukl.yahoo.com X-Yahoo-Newman-Property: ymail-3 X-YMail-OSG: FwTY5vkVM1kGOlfLXNFNUK_ogZpE9W8Zdj2fh14nF5q8X4Q brPUnAoEMwJOrYKQB0hpUk6P3zKO291dwmN7iYzLigaQbAg6ndGpT4xA9Nf1 PcwGGiCpNR3J2iY3t2UGFE.ZuAEdcWmXWtbhGKRE.HWjK4WyWcWBjTD5PoZu HY0K.dd3mV5ou5h5oso6vegRd7xOkTQUuFqhUE4TLJbitbqEWGA8ZKnUFChy 7azspjod4iXgKRDmYVZP.gYaDI8IDwWfbRtvPa8oOAE3he8ESRfZ1g7JkHvq E71CyzOg0OKFKmljQt6Z3gtYb2iaTjRB_kSa_Isf17b0z8NsqhXPm0Inmi1Q 7SaupUEp3gxODe7qnHmb9hTmLELrsd0eMOJtMLkcR8hZFsDYYk67dA3zV1Y_ 2jN02A6vGYUzQpf.fAtPICGsLPa3Pj8VthRepSXkR_eUr X-Yahoo-SMTP: tW.h3tiswBBMXO2coYcbPigGD5Lt6zY_.Zc- Received: from localhost (lindner_marek@119.236.110.45 with plain) by smtp118.mail.ukl.yahoo.com with SMTP; 10 Mar 2012 14:18:18 -0800 PST From: Marek Lindner <lindner_marek@yahoo.de> To: b.a.t.m.a.n@lists.open-mesh.org Date: Sun, 11 Mar 2012 06:17:49 +0800 Message-Id: <1331417873-19354-1-git-send-email-lindner_marek@yahoo.de> X-Mailer: git-send-email 1.7.9.1 Cc: Marek Lindner <lindner_marek@yahoo.de> Subject: [B.A.T.M.A.N.] [PATCH 1/5] batman-adv: ignore protocol packets if the interface did not enable this protocol X-BeenThere: b.a.t.m.a.n@lists.open-mesh.org X-Mailman-Version: 2.1.13 Precedence: list Reply-To: The list for a Better Approach To Mobile Ad-hoc Networking <b.a.t.m.a.n@lists.open-mesh.org> List-Id: The list for a Better Approach To Mobile Ad-hoc Networking <b.a.t.m.a.n.lists.open-mesh.org> List-Unsubscribe: <https://lists.open-mesh.org/mm/options/b.a.t.m.a.n>, <mailto:b.a.t.m.a.n-request@lists.open-mesh.org?subject=unsubscribe> List-Archive: <http://lists.open-mesh.org/pipermail/b.a.t.m.a.n> List-Post: <mailto:b.a.t.m.a.n@lists.open-mesh.org> List-Help: <mailto:b.a.t.m.a.n-request@lists.open-mesh.org?subject=help> List-Subscribe: <https://lists.open-mesh.org/mm/listinfo/b.a.t.m.a.n>, <mailto:b.a.t.m.a.n-request@lists.open-mesh.org?subject=subscribe> X-List-Received-Date: Sat, 10 Mar 2012 22:18:20 -0000 |
Commit Message
Marek Lindner
March 10, 2012, 10:17 p.m. UTC
Reported-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de>
Signed-off-by: Marek Lindner <lindner_marek@yahoo.de>
---
bat_iv_ogm.c | 6 ++++++
1 files changed, 6 insertions(+), 0 deletions(-)
Comments
Hey there, I've tested this patch on my old ring setup which used to create temporary routing loops, and this patch improved the situation. Feel free to add: Tested-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> On Sun, Mar 11, 2012 at 06:17:53AM +0800, Marek Lindner wrote: > batman-adv would forward OGMs from non-besthops while replacing the the TQ > and TTL values with the values from the best hop. In certain corner cases > this leads to a temporary routing loop. > This patch changes this behavior: Only packets from best next hops are > forwarded - TQ and TTL values won't be replaced anymore. However, the protocol > needs to rebroadcast OGMs from single hop neighbors regardless of whether or > not they are the best hop. To handle this case a new flag is introduced to > alert neighboring nodes about the forwarded OGM that is not from my best > next hop. It is to be discarded by all nodes except for the one originating > the OGM. > > Signed-off-by: Marek Lindner <lindner_marek@yahoo.de> > --- > bat_iv_ogm.c | 61 ++++++++++++++++++++++++++++++--------------------------- > packet.h | 1 + > 2 files changed, 33 insertions(+), 29 deletions(-) > > diff --git a/bat_iv_ogm.c b/bat_iv_ogm.c > index 1e92e38..85617c4 100644 > --- a/bat_iv_ogm.c > +++ b/bat_iv_ogm.c > @@ -507,11 +507,10 @@ static void bat_iv_ogm_forward(struct orig_node *orig_node, > const struct ethhdr *ethhdr, > struct batman_ogm_packet *batman_ogm_packet, > bool is_single_hop_neigh, > + bool is_from_best_next_hop, > struct hard_iface *if_incoming) > { > struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface); > - struct neigh_node *router; > - uint8_t in_tq, in_ttl, tq_avg = 0; > uint8_t tt_num_changes; > > if (batman_ogm_packet->header.ttl <= 1) { > @@ -519,41 +518,31 @@ static void bat_iv_ogm_forward(struct orig_node *orig_node, > return; > } > > - router = orig_node_get_router(orig_node); > + if (!is_from_best_next_hop) { > + /** > + * Mark the forwarded packet when it is not coming from our best > + * next hop. We still need to forward the packet for our neighbor > + * link quality detection to work in case the packet originated > + * from a single hop neighbor. Otherwise we can simply drop the > + * ogm. > + */ > + if (is_single_hop_neigh) > + batman_ogm_packet->flags |= NOT_BEST_NEXT_HOP; > + else > + return; > + } > > - in_tq = batman_ogm_packet->tq; > - in_ttl = batman_ogm_packet->header.ttl; > tt_num_changes = batman_ogm_packet->tt_num_changes; > > batman_ogm_packet->header.ttl--; > memcpy(batman_ogm_packet->prev_sender, ethhdr->h_source, ETH_ALEN); > > - /* rebroadcast tq of our best ranking neighbor to ensure the rebroadcast > - * of our best tq value */ > - if (router && router->tq_avg != 0) { > - > - /* rebroadcast ogm of best ranking neighbor as is */ > - if (!compare_eth(router->addr, ethhdr->h_source)) { > - batman_ogm_packet->tq = router->tq_avg; > - > - if (router->last_ttl) > - batman_ogm_packet->header.ttl = > - router->last_ttl - 1; > - } > - > - tq_avg = router->tq_avg; > - } > - > - if (router) > - neigh_node_free_ref(router); > - > /* apply hop penalty */ > batman_ogm_packet->tq = hop_penalty(batman_ogm_packet->tq, bat_priv); > > bat_dbg(DBG_BATMAN, bat_priv, > - "Forwarding packet: tq_orig: %i, tq_avg: %i, tq_forw: %i, ttl_orig: %i, ttl_forw: %i\n", > - in_tq, tq_avg, batman_ogm_packet->tq, in_ttl - 1, > - batman_ogm_packet->header.ttl); > + "Forwarding packet: tq: %i, ttl: %i\n", > + batman_ogm_packet->tq, batman_ogm_packet->header.ttl); > > batman_ogm_packet->seqno = htonl(batman_ogm_packet->seqno); > batman_ogm_packet->tt_crc = htons(batman_ogm_packet->tt_crc); > @@ -949,6 +938,7 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, > int is_my_addr = 0, is_my_orig = 0, is_my_oldorig = 0; > int is_broadcast = 0, is_bidirectional; > bool is_single_hop_neigh = false; > + bool is_from_best_next_hop = false; > int is_duplicate; > uint32_t if_incoming_seqno; > > @@ -1070,6 +1060,13 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, > return; > } > > + if (batman_ogm_packet->flags & NOT_BEST_NEXT_HOP) { > + bat_dbg(DBG_BATMAN, bat_priv, > + "Drop packet: ignoring all packets not forwarded from " > + "the best next hop (sender: %pM)\n", ethhdr->h_source); > + return; > + } > + > orig_node = get_orig_node(bat_priv, batman_ogm_packet->orig); > if (!orig_node) > return; > @@ -1094,6 +1091,10 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, > if (router) > router_router = orig_node_get_router(router->orig_node); > > + if ((router && router->tq_avg != 0) && > + (compare_eth(router->addr, ethhdr->h_source))) > + is_from_best_next_hop = true; > + > /* avoid temporary routing loops */ > if (router && router_router && > (compare_eth(router->addr, batman_ogm_packet->prev_sender)) && > @@ -1144,7 +1145,8 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, > > /* mark direct link on incoming interface */ > bat_iv_ogm_forward(orig_node, ethhdr, batman_ogm_packet, > - is_single_hop_neigh, if_incoming); > + is_single_hop_neigh, is_from_best_next_hop, > + if_incoming); > > bat_dbg(DBG_BATMAN, bat_priv, > "Forwarding packet: rebroadcast neighbor packet with direct link flag\n"); > @@ -1167,7 +1169,8 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, > bat_dbg(DBG_BATMAN, bat_priv, > "Forwarding packet: rebroadcast originator packet\n"); > bat_iv_ogm_forward(orig_node, ethhdr, batman_ogm_packet, > - is_single_hop_neigh, if_incoming); > + is_single_hop_neigh, is_from_best_next_hop, > + if_incoming); > > out_neigh: > if ((orig_neigh_node) && (!is_single_hop_neigh)) > diff --git a/packet.h b/packet.h > index 02b0c87..3c4c533 100644 > --- a/packet.h > +++ b/packet.h > @@ -47,6 +47,7 @@ enum bat_subtype { > #define COMPAT_VERSION 14 > > enum batman_iv_flags { > + NOT_BEST_NEXT_HOP = 1 << 3, > PRIMARIES_FIRST_HOP = 1 << 4, > VIS_SERVER = 1 << 5, > DIRECTLINK = 1 << 6 > -- > 1.7.9.1 > >
Hi, I agree with this patch, actually it should solve the loop problem as it is very similar to the proposed modification in my thesis. In this way I think it is not necessary a global window to average TQ values but only the latest value can be sufficient. Doing this can be re-implemented a mechanism to improve OGM reliability sending old TQ ant TTL (and also sequence number) of the current best router if for example 2 OGM are missing. Regards. 2012/3/11 Simon Wunderlich <simon.wunderlich@s2003.tu-chemnitz.de>: > Hey there, > > I've tested this patch on my old ring setup which used to create temporary > routing loops, and this patch improved the situation. > > Feel free to add: > > Tested-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> > > On Sun, Mar 11, 2012 at 06:17:53AM +0800, Marek Lindner wrote: >> batman-adv would forward OGMs from non-besthops while replacing the the TQ >> and TTL values with the values from the best hop. In certain corner cases >> this leads to a temporary routing loop. >> This patch changes this behavior: Only packets from best next hops are >> forwarded - TQ and TTL values won't be replaced anymore. However, the protocol >> needs to rebroadcast OGMs from single hop neighbors regardless of whether or >> not they are the best hop. To handle this case a new flag is introduced to >> alert neighboring nodes about the forwarded OGM that is not from my best >> next hop. It is to be discarded by all nodes except for the one originating >> the OGM. >> >> Signed-off-by: Marek Lindner <lindner_marek@yahoo.de> >> --- >> bat_iv_ogm.c | 61 ++++++++++++++++++++++++++++++--------------------------- >> packet.h | 1 + >> 2 files changed, 33 insertions(+), 29 deletions(-) >> >> diff --git a/bat_iv_ogm.c b/bat_iv_ogm.c >> index 1e92e38..85617c4 100644 >> --- a/bat_iv_ogm.c >> +++ b/bat_iv_ogm.c >> @@ -507,11 +507,10 @@ static void bat_iv_ogm_forward(struct orig_node *orig_node, >> const struct ethhdr *ethhdr, >> struct batman_ogm_packet *batman_ogm_packet, >> bool is_single_hop_neigh, >> + bool is_from_best_next_hop, >> struct hard_iface *if_incoming) >> { >> struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface); >> - struct neigh_node *router; >> - uint8_t in_tq, in_ttl, tq_avg = 0; >> uint8_t tt_num_changes; >> >> if (batman_ogm_packet->header.ttl <= 1) { >> @@ -519,41 +518,31 @@ static void bat_iv_ogm_forward(struct orig_node *orig_node, >> return; >> } >> >> - router = orig_node_get_router(orig_node); >> + if (!is_from_best_next_hop) { >> + /** >> + * Mark the forwarded packet when it is not coming from our best >> + * next hop. We still need to forward the packet for our neighbor >> + * link quality detection to work in case the packet originated >> + * from a single hop neighbor. Otherwise we can simply drop the >> + * ogm. >> + */ >> + if (is_single_hop_neigh) >> + batman_ogm_packet->flags |= NOT_BEST_NEXT_HOP; >> + else >> + return; >> + } >> >> - in_tq = batman_ogm_packet->tq; >> - in_ttl = batman_ogm_packet->header.ttl; >> tt_num_changes = batman_ogm_packet->tt_num_changes; >> >> batman_ogm_packet->header.ttl--; >> memcpy(batman_ogm_packet->prev_sender, ethhdr->h_source, ETH_ALEN); >> >> - /* rebroadcast tq of our best ranking neighbor to ensure the rebroadcast >> - * of our best tq value */ >> - if (router && router->tq_avg != 0) { >> - >> - /* rebroadcast ogm of best ranking neighbor as is */ >> - if (!compare_eth(router->addr, ethhdr->h_source)) { >> - batman_ogm_packet->tq = router->tq_avg; >> - >> - if (router->last_ttl) >> - batman_ogm_packet->header.ttl = >> - router->last_ttl - 1; >> - } >> - >> - tq_avg = router->tq_avg; >> - } >> - >> - if (router) >> - neigh_node_free_ref(router); >> - >> /* apply hop penalty */ >> batman_ogm_packet->tq = hop_penalty(batman_ogm_packet->tq, bat_priv); >> >> bat_dbg(DBG_BATMAN, bat_priv, >> - "Forwarding packet: tq_orig: %i, tq_avg: %i, tq_forw: %i, ttl_orig: %i, ttl_forw: %i\n", >> - in_tq, tq_avg, batman_ogm_packet->tq, in_ttl - 1, >> - batman_ogm_packet->header.ttl); >> + "Forwarding packet: tq: %i, ttl: %i\n", >> + batman_ogm_packet->tq, batman_ogm_packet->header.ttl); >> >> batman_ogm_packet->seqno = htonl(batman_ogm_packet->seqno); >> batman_ogm_packet->tt_crc = htons(batman_ogm_packet->tt_crc); >> @@ -949,6 +938,7 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, >> int is_my_addr = 0, is_my_orig = 0, is_my_oldorig = 0; >> int is_broadcast = 0, is_bidirectional; >> bool is_single_hop_neigh = false; >> + bool is_from_best_next_hop = false; >> int is_duplicate; >> uint32_t if_incoming_seqno; >> >> @@ -1070,6 +1060,13 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, >> return; >> } >> >> + if (batman_ogm_packet->flags & NOT_BEST_NEXT_HOP) { >> + bat_dbg(DBG_BATMAN, bat_priv, >> + "Drop packet: ignoring all packets not forwarded from " >> + "the best next hop (sender: %pM)\n", ethhdr->h_source); >> + return; >> + } >> + >> orig_node = get_orig_node(bat_priv, batman_ogm_packet->orig); >> if (!orig_node) >> return; >> @@ -1094,6 +1091,10 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, >> if (router) >> router_router = orig_node_get_router(router->orig_node); >> >> + if ((router && router->tq_avg != 0) && >> + (compare_eth(router->addr, ethhdr->h_source))) >> + is_from_best_next_hop = true; >> + >> /* avoid temporary routing loops */ >> if (router && router_router && >> (compare_eth(router->addr, batman_ogm_packet->prev_sender)) && >> @@ -1144,7 +1145,8 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, >> >> /* mark direct link on incoming interface */ >> bat_iv_ogm_forward(orig_node, ethhdr, batman_ogm_packet, >> - is_single_hop_neigh, if_incoming); >> + is_single_hop_neigh, is_from_best_next_hop, >> + if_incoming); >> >> bat_dbg(DBG_BATMAN, bat_priv, >> "Forwarding packet: rebroadcast neighbor packet with direct link flag\n"); >> @@ -1167,7 +1169,8 @@ static void bat_iv_ogm_process(const struct ethhdr *ethhdr, >> bat_dbg(DBG_BATMAN, bat_priv, >> "Forwarding packet: rebroadcast originator packet\n"); >> bat_iv_ogm_forward(orig_node, ethhdr, batman_ogm_packet, >> - is_single_hop_neigh, if_incoming); >> + is_single_hop_neigh, is_from_best_next_hop, >> + if_incoming); >> >> out_neigh: >> if ((orig_neigh_node) && (!is_single_hop_neigh)) >> diff --git a/packet.h b/packet.h >> index 02b0c87..3c4c533 100644 >> --- a/packet.h >> +++ b/packet.h >> @@ -47,6 +47,7 @@ enum bat_subtype { >> #define COMPAT_VERSION 14 >> >> enum batman_iv_flags { >> + NOT_BEST_NEXT_HOP = 1 << 3, >> PRIMARIES_FIRST_HOP = 1 << 4, >> VIS_SERVER = 1 << 5, >> DIRECTLINK = 1 << 6 >> -- >> 1.7.9.1 >> >> > > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v1.4.10 (GNU/Linux) > > iEYEARECAAYFAk9dHi8ACgkQrzg/fFk7axbJ+QCg5TaIOetOvSoTjr5vHCHr4k7M > /6YAoKC76tkASLbl9TuYFKqLTIHXRK2s > =JNhg > -----END PGP SIGNATURE----- >
Hi, > I agree with this patch, actually it should solve the loop problem as it is > very similar to the proposed modification in my thesis. thanks for the feedback! > In this way I think it is not necessary a global window to average TQ > values but only the latest value can be sufficient. Doing this can be > re-implemented a mechanism to improve OGM reliability sending old TQ ant > TTL (and also sequence number) of the current best router if for example 2 > OGM are missing. I don't quite understand what you are proposing. Are you saying removing the averaging mechanism makes this patch obsolete and allows replacing the TTL/TQ values as the code does now (without the patch) ? Cheers, Marek
2012/3/12 Marek Lindner <lindner_marek@yahoo.de>: > > Hi, > >> I agree with this patch, actually it should solve the loop problem as it is >> very similar to the proposed modification in my thesis. > > thanks for the feedback! > > >> In this way I think it is not necessary a global window to average TQ >> values but only the latest value can be sufficient. Doing this can be >> re-implemented a mechanism to improve OGM reliability sending old TQ ant >> TTL (and also sequence number) of the current best router if for example 2 >> OGM are missing. > > I don't quite understand what you are proposing. Are you saying removing the > averaging mechanism makes this patch obsolete and allows replacing the TTL/TQ > values as the code does now (without the patch) ? > No no this patch is good, the removing of TQ average can be a following step as now average is not forwarded anymore, but only used as a comparative value between path in another point of the source code. Also the mechanism of forwarding OGM even if it does not come from the best router can be added later, on top of this patch. > Cheers, > Marek
On Monday, March 12, 2012 15:49:26 Daniele Furlan wrote: > > I don't quite understand what you are proposing. Are you saying removing > > the averaging mechanism makes this patch obsolete and allows replacing > > the TTL/TQ values as the code does now (without the patch) ? > > No no this patch is good, the removing of TQ average can be a following > step as now average is not forwarded anymore, but only used as a > comparative value between path in another point of the source code. This follow-up step needs a volunteer. It is a bigger operation to remove the averaging and ensure everything still works. :-) Do you mind explaining in simple words how the averaging could cause routing havoc together with the strict OGM forwarding patch ? I did not understand. Or are you in favor of removing the averaging for style / performance reasons? Cheers, Marek
2012/3/12 Marek Lindner <lindner_marek@yahoo.de>: > On Monday, March 12, 2012 15:49:26 Daniele Furlan wrote: >> > I don't quite understand what you are proposing. Are you saying removing >> > the averaging mechanism makes this patch obsolete and allows replacing >> > the TTL/TQ values as the code does now (without the patch) ? >> >> No no this patch is good, the removing of TQ average can be a following >> step as now average is not forwarded anymore, but only used as a >> comparative value between path in another point of the source code. > > This follow-up step needs a volunteer. It is a bigger operation to remove the > averaging and ensure everything still works. :-) > I can try to send some patch next week to start this operation.. :) > Do you mind explaining in simple words how the averaging could cause routing > havoc together with the strict OGM forwarding patch ? I did not understand. > Or are you in favor of removing the averaging for style / performance reasons? > Actually the average as it is calculated in the current version (without "considering" lost OGMs) is not monotonically decreasing. This cause routing loops when it is forwarded so with this patch the problem does not happen. Remain the fact of non monotonicity and this could cause loop anyway in some corner situation. Surely if we guarantee monotonicity we obtain LOOP-FRENESS IN ANY CASE and this is an important feature I think!! Also maintaing only the latest TQ guarantee to have a more updated information about the path. Furthermore an average is already done at every link TQ calculation so it is superfluous to have another window. This reduce also memory and computational requirements. > Cheers, > Marek >
On Monday, March 12, 2012 16:23:30 Daniele Furlan wrote: > 2012/3/12 Marek Lindner <lindner_marek@yahoo.de>: > > On Monday, March 12, 2012 15:49:26 Daniele Furlan wrote: > >> > I don't quite understand what you are proposing. Are you saying > >> > removing the averaging mechanism makes this patch obsolete and allows > >> > replacing the TTL/TQ values as the code does now (without the patch) > >> > ? > >> > >> No no this patch is good, the removing of TQ average can be a following > >> step as now average is not forwarded anymore, but only used as a > >> comparative value between path in another point of the source code. > > > > This follow-up step needs a volunteer. It is a bigger operation to remove > > the averaging and ensure everything still works. :-) > > I can try to send some patch next week to start this operation.. :) Wow - cool! > > Do you mind explaining in simple words how the averaging could cause > > routing havoc together with the strict OGM forwarding patch ? I did not > > understand. Or are you in favor of removing the averaging for style / > > performance reasons? > > Actually the average as it is calculated in the current version > (without "considering" lost OGMs) is not monotonically decreasing. This > cause routing loops when it is forwarded so with this patch the problem does > not happen. That is what I thought. This patch also enforces monotonicity, thereby eliminating the loop "potential" created by averaging the TQ. > Also maintaing only the latest TQ guarantee to have a more updated > information about the path. Furthermore an average is already done at > every link TQ calculation so it is superfluous to have another window. > This reduce also memory and computational requirements. Full agreement on this part. At the moment, I was more worried about temporary loops which seems to be addressed with this patch. Thanks for all your feedback! Cheers, Marek
On Sunday, March 11, 2012 06:17:49 Marek Lindner wrote: > Reported-by: Simon Wunderlich <siwu@hrz.tu-chemnitz.de> > Signed-off-by: Marek Lindner <lindner_marek@yahoo.de> > --- > bat_iv_ogm.c | 6 ++++++ > 1 files changed, 6 insertions(+), 0 deletions(-) Applied in revision c9619b5. Regards, Marek
diff --git a/bat_iv_ogm.c b/bat_iv_ogm.c index eca2b44..819ae49 100644 --- a/bat_iv_ogm.c +++ b/bat_iv_ogm.c @@ -1186,6 +1186,7 @@ out: static int bat_iv_ogm_receive(struct sk_buff *skb, struct hard_iface *if_incoming) { + struct bat_priv *bat_priv = netdev_priv(if_incoming->soft_iface); struct batman_ogm_packet *batman_ogm_packet; struct ethhdr *ethhdr; int buff_pos = 0, packet_len; @@ -1196,6 +1197,11 @@ static int bat_iv_ogm_receive(struct sk_buff *skb, if (!ret) return NET_RX_DROP; + /* did we receive a B.A.T.M.A.N. IV OGM packet on an interface + * that does not have B.A.T.M.A.N. IV enabled ? */ + if (bat_priv->bat_algo_ops->bat_ogm_emit != bat_iv_ogm_emit) + return NET_RX_DROP; + packet_len = skb_headlen(skb); ethhdr = (struct ethhdr *)skb_mac_header(skb); packet_buff = skb->data;