From patchwork Tue Mar 20 12:51:02 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Marek Lindner X-Patchwork-Id: 1606 Return-Path: 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 3EB7E6006C9 for ; Tue, 20 Mar 2012 13:51:13 +0100 (CET) Authentication-Results: open-mesh.org; dkim=pass (1024-bit key) header.i=@yahoo.de; dkim-adsp=none Received: from [217.146.183.213] by nm4.bullet.mail.ukl.yahoo.com with NNFMP; 20 Mar 2012 12:51:13 -0000 Received: from [77.238.184.67] by tm6.bullet.mail.ukl.yahoo.com with NNFMP; 20 Mar 2012 12:51:13 -0000 Received: from [127.0.0.1] by smtp136.mail.ukl.yahoo.com with NNFMP; 20 Mar 2012 12:51:13 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.de; s=s1024; t=1332247872; bh=HPr8WdGGFJIz/HWiBbOuTI3usZbSdKf//hsZFMlQXLM=; h=X-Yahoo-Newman-Id:X-Yahoo-Newman-Property:X-YMail-OSG:X-Yahoo-SMTP:Received:From:To:Subject:Date:User-Agent:References:In-Reply-To:MIME-Version:Content-Type:Message-Id; b=0kShgsSz/JUdZ0Ldwd+xTGLOIHzd+FJpd3zMnB9aSWtA7lYMIfvr+EzsuOYpypmQdx8IvoVSttaGx87nZ/jvjOy5w61iCdUOs0WQimQWOuWC9M4GTsqCg8j8Xc1NZZDO4Xc6fD/ZF8WetWYb6auSlVdrBWDzK2X7lSjUp+eY5wU= X-Yahoo-Newman-Id: 991687.28815.bm@smtp136.mail.ukl.yahoo.com X-Yahoo-Newman-Property: ymail-3 X-YMail-OSG: IrHa5jUVM1nK2gkBlWITc6Lw8EQHRwIvcOXmlyNrIeMuEkt nVsykG68S3_XB876k.v64txW1EQS2UZ_gXMdGYOu4BlwN1zYz0QvKhETudzN RxuZJ04lE3pmUf9PWE4UctsKC9GEupWsCkEyaVvrA8IVea0Qp_fohL2oLGIk FyUYwv0f7wyrbFPX3ypRe7H9VoBt_7ZdRlNFBxPoc3VNcjTEgHt0MsIkugDm O7rhLFpp260bEaoVT.mQnZ9YeYBGKWe2BmDHt.yGqZ3Kerhs7Iwu02xmh5rt tJK8SB.yi1rpVypgrxyItL61PRQCjsfJpkymmGVLImliEdw_1s3I3fGssTDV JXzITImdaHcrOrz_2lBANnHwUCpSAgNMFqhgau5TGYFKPWRBouPnBDebfzVu KELE. X-Yahoo-SMTP: tW.h3tiswBBMXO2coYcbPigGD5Lt6zY_.Zc- Received: from turgot.localnet (lindner_marek@217.85.87.108 with plain) by smtp136.mail.ukl.yahoo.com with SMTP; 20 Mar 2012 12:51:12 +0000 GMT From: Marek Lindner To: "The list for a Better Approach To Mobile Ad-hoc Networking" Date: Tue, 20 Mar 2012 13:51:02 +0100 User-Agent: KMail/1.13.7 (Linux/3.0.0-1-amd64; KDE/4.6.5; x86_64; ; ) References: <4F51CA9D.2090404@codigosur.org> <201203041852.17799.lindner_marek@yahoo.de> <4F65815D.4090605@codigosur.org> In-Reply-To: <4F65815D.4090605@codigosur.org> MIME-Version: 1.0 Message-Id: <201203201351.02931.lindner_marek@yahoo.de> Subject: Re: [B.A.T.M.A.N.] routing loops on interconnected routers / adhoc + ethernet 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 List-Id: The list for a Better Approach To Mobile Ad-hoc Networking List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 20 Mar 2012 12:51:13 -0000 On Sunday, March 18, 2012 07:31:57 Nicolás Echániz wrote: > I've finally had the time to look into this again. > > The routers have been updated to current OpenWRT trunk and batman-adv > version has changed, would it be too much inconvenience for you to send > me your patches for 2012.0.0? Here you go. Regards, Marek From dcda7aca8c2adb7d35e55ef66479941fd82c6b4e Mon Sep 17 00:00:00 2001 From: Marek Lindner Date: Sun, 11 Mar 2012 06:17:53 +0800 Subject: [PATCH 2/2] batman-adv: avoid temporary routing loops by being strict on forwarded OGMs 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 Acked-by: Daniele Furlan Tested-by: Simon Wunderlich --- bat_iv_ogm.c | 62 ++++++++++++++++++++++++++++++--------------------------- packet.h | 1 + 2 files changed, 34 insertions(+), 29 deletions(-) diff --git a/bat_iv_ogm.c b/bat_iv_ogm.c index 2b14828..9143271 100644 --- a/bat_iv_ogm.c +++ b/bat_iv_ogm.c @@ -465,11 +465,10 @@ static void bat_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->ttl <= 1) { @@ -477,41 +476,31 @@ static void bat_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->ttl; tt_num_changes = batman_ogm_packet->tt_num_changes; batman_ogm_packet->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->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->ttl); + "Forwarding packet: tq: %i, ttl: %i\n", + batman_ogm_packet->tq, batman_ogm_packet->ttl); batman_ogm_packet->seqno = htonl(batman_ogm_packet->seqno); batman_ogm_packet->tt_crc = htons(batman_ogm_packet->tt_crc); @@ -905,6 +894,7 @@ static void bat_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; @@ -1029,6 +1019,13 @@ static void bat_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; @@ -1053,6 +1050,10 @@ static void bat_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)) && @@ -1103,7 +1104,8 @@ static void bat_ogm_process(const struct ethhdr *ethhdr, /* mark direct link on incoming interface */ bat_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"); @@ -1125,8 +1127,10 @@ static void bat_ogm_process(const struct ethhdr *ethhdr, bat_dbg(DBG_BATMAN, bat_priv, "Forwarding packet: rebroadcast originator packet\n"); + bat_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 4d9e54c..667ed75 100644 --- a/packet.h +++ b/packet.h @@ -39,6 +39,7 @@ enum bat_packettype { #define COMPAT_VERSION 14 enum batman_flags { + NOT_BEST_NEXT_HOP = 1 << 3, PRIMARIES_FIRST_HOP = 1 << 4, VIS_SERVER = 1 << 5, DIRECTLINK = 1 << 6 -- 1.7.9.1