From patchwork Sat Mar 19 12:55:21 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sven Eckelmann X-Patchwork-Id: 15938 X-Patchwork-Delegate: mareklindner@neomailbox.ch Return-Path: X-Original-To: patchwork@open-mesh.org Delivered-To: patchwork@open-mesh.org Received: from open-mesh.org (localhost [127.0.0.1]) by open-mesh.org (Postfix) with ESMTP id 5B58480727; Sat, 19 Mar 2016 13:55:27 +0100 (CET) Authentication-Results: open-mesh.org; dkim=fail reason="verification failed; unprotected key" header.d=narfation.org header.i=@narfation.org header.b=SN0bkbTE; dkim-adsp=fail (unprotected policy); dkim-atps=neutral Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=79.140.41.39; helo=v3-1039.vlinux.de; envelope-from=sven@narfation.org; receiver=b.a.t.m.a.n@lists.open-mesh.org Authentication-Results: open-mesh.org; dmarc=pass header.from=narfation.org Received: from v3-1039.vlinux.de (narfation.org [79.140.41.39]) by open-mesh.org (Postfix) with ESMTPS id 342A780723 for ; Sat, 19 Mar 2016 13:55:26 +0100 (CET) Received: from sven-desktop.home.narfation.org (p200300C593C32DFD0000000000002E16.dip0.t-ipconnect.de [IPv6:2003:c5:93c3:2dfd::2e16]) by v3-1039.vlinux.de (Postfix) with ESMTPSA id 8015B1100A5; Sat, 19 Mar 2016 13:55:25 +0100 (CET) Authentication-Results: v3-1039.vlinux.de; dmarc=none header.from=narfation.org DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=narfation.org; s=20121; t=1458392125; bh=POREz7C2/fGKwuDUNKDp+q30/Ed3w1dYs+GkoxUbheo=; h=From:To:Cc:Subject:Date:From; b=SN0bkbTEqk+x801Nu4rY9JhJpW0VPJw0U6cHsgrZZPj1LxJ65g5+cLdQVrpVsWvbS 7R7yde4B32H/+hLpPtT0n11FT46GIvBVALngMg/Q+jaWrw/b/Ut2BgpN7dG/1LmyIR wVnc9dp3OEexi8pQQqfMunU7ld9eK6OLUlaNvYhI= From: Sven Eckelmann To: b.a.t.m.a.n@lists.open-mesh.org Date: Sat, 19 Mar 2016 13:55:21 +0100 Message-Id: <1458392121-23608-1-git-send-email-sven@narfation.org> X-Mailer: git-send-email 2.8.0.rc3 Subject: [B.A.T.M.A.N.] [PATCH] batman-adv: Deactive TO_BE_ACTIVATED hardif on shutdown X-BeenThere: b.a.t.m.a.n@lists.open-mesh.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: The list for a Better Approach To Mobile Ad-hoc Networking List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: The list for a Better Approach To Mobile Ad-hoc Networking Errors-To: b.a.t.m.a.n-bounces@lists.open-mesh.org Sender: "B.A.T.M.A.N" The shutdown of an batman-adv interface can happen with one of its slave interfaces still being in the BATADV_IF_TO_BE_ACTIVATED state. A possible reason for it is that the routing algorithm BATMAN_V was selected and batadv_schedule_bat_ogm was not yet called for this interface. This slave interface still has to be set to BATADV_IF_INACTIVE or the batman-adv interface will never reduce its usage counter and thus never gets shutdown. This problem can be simulated via: $ modprobe dummy $ modprobe batman-adv routing_algo=BATMAN_V $ ip link add bat0 type batadv $ ip link set dummy0 master bat0 $ ip link set dummy0 up $ ip link del bat0 unregister_netdevice: waiting for bat0 to become free. Usage count = 3 Fixes: 88861ea9acb7 ("[batman-adv] replacing if up/down timer with kernel notifications") Reported-by: Matthias Schiffer Signed-off-by: Sven Eckelmann --- Please check https://www.open-mesh.org/issues/248 to learn more about the bug I have not checked why batadv_schedule_bat_ogm isn't called successfully (which would mark the interface as active) in this situation. --- net/batman-adv/hard-interface.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c index 3240a67..f41b472 100644 --- a/net/batman-adv/hard-interface.c +++ b/net/batman-adv/hard-interface.c @@ -572,8 +572,7 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface, struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); struct batadv_hard_iface *primary_if = NULL; - if (hard_iface->if_status == BATADV_IF_ACTIVE) - batadv_hardif_deactivate_interface(hard_iface); + batadv_hardif_deactivate_interface(hard_iface); if (hard_iface->if_status != BATADV_IF_INACTIVE) goto out;