From patchwork Tue Dec 7 14:39:31 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Linus_L=C3=BCssing?= X-Patchwork-Id: 637 Return-Path: Received: from ascomax.hasler.ascom.ch (ascomax.hasler.ascom.ch [139.79.135.1]) by open-mesh.org (Postfix) with ESMTPS id 170BD154139 for ; Tue, 7 Dec 2010 15:39:30 +0100 (CET) Received: from eiger.ma.tech.ascom.ch (eiger.ma.tech.ascom.ch [139.79.100.1]) by ascomax.hasler.ascom.ch (8.14.4/8.14.4) with ESMTP id oB7EdTsa028371; Tue, 7 Dec 2010 15:39:29 +0100 (MET) Received: from [139.79.100.248] (helo=localhost) by eiger.ma.tech.ascom.ch with esmtp (Exim 3.16 #1) id 1PPyhT-0005uA-00; Tue, 07 Dec 2010 15:39:27 +0100 From: =?UTF-8?q?Linus=20L=C3=BCssing?= To: b.a.t.m.a.n@lists.open-mesh.org Date: Tue, 7 Dec 2010 15:39:31 +0100 Message-Id: <1291732778-27441-4-git-send-email-linus.luessing@ascom.ch> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1291732778-27441-1-git-send-email-linus.luessing@ascom.ch> References: <1291732778-27441-1-git-send-email-linus.luessing@ascom.ch> Cc: =?UTF-8?q?Linus=20L=C3=BCssing?= Subject: [B.A.T.M.A.N.] [PATCH 03/10] batman-adv: Adding workqueue for new ndp packets X-BeenThere: b.a.t.m.a.n@lists.open-mesh.org X-Mailman-Version: 2.1.11 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, 07 Dec 2010 14:39:31 -0000 The new neighbor discovery packets will later need their own interval per interface. For instance on a wifi interface which has regularly changing link qualities the ndp interval should be faster than on a static cable link where we would need some probes from time to time only. This patch adds a workqueue per interface used by batman-adv. When an interface is active, a ndp_send() with the according batman_if structure will be called every second now. --- Makefile.kbuild | 1 + hard-interface.c | 6 ++++++ ndp.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ ndp.h | 6 ++++++ types.h | 2 ++ 5 files changed, 59 insertions(+), 0 deletions(-) create mode 100644 ndp.c create mode 100644 ndp.h diff --git a/Makefile.kbuild b/Makefile.kbuild index e99c198..094eb31 100644 --- a/Makefile.kbuild +++ b/Makefile.kbuild @@ -42,6 +42,7 @@ batman-adv-y += hard-interface.o batman-adv-y += hash.o batman-adv-y += icmp_socket.o batman-adv-y += main.o +batman-adv-y += ndp.o batman-adv-y += originator.o batman-adv-y += ring_buffer.o batman-adv-y += routing.o diff --git a/hard-interface.c b/hard-interface.c index da7b9a9..cb81c13 100644 --- a/hard-interface.c +++ b/hard-interface.c @@ -26,6 +26,7 @@ #include "translation-table.h" #include "routing.h" #include "bat_sysfs.h" +#include "ndp.h" #include "originator.h" #include "hash.h" @@ -260,6 +261,7 @@ static void hardif_activate_interface(struct batman_if *batman_if) batman_if->net_dev->name); update_min_mtu(batman_if->soft_iface); + start_ndp_timer(batman_if); return; } @@ -274,6 +276,7 @@ static void hardif_deactivate_interface(struct batman_if *batman_if) bat_info(batman_if->soft_iface, "Interface deactivated: %s\n", batman_if->net_dev->name); + stop_ndp_timer(batman_if); update_min_mtu(batman_if->soft_iface); } @@ -328,6 +331,8 @@ int hardif_enable_interface(struct batman_if *batman_if, char *iface_name) atomic_set(&batman_if->seqno, 1); atomic_set(&batman_if->frag_seqno, 1); + ndp_init(batman_if); + bat_info(batman_if->soft_iface, "Adding interface: %s\n", batman_if->net_dev->name); @@ -381,6 +386,7 @@ void hardif_disable_interface(struct batman_if *batman_if) bat_info(batman_if->soft_iface, "Removing interface: %s\n", batman_if->net_dev->name); + ndp_free(batman_if); dev_remove_pack(&batman_if->batman_adv_ptype); kref_put(&batman_if->refcount, hardif_free_ref); diff --git a/ndp.c b/ndp.c new file mode 100644 index 0000000..2dfb06d --- /dev/null +++ b/ndp.c @@ -0,0 +1,44 @@ +#include "main.h" +#include "send.h" +#include "ndp.h" + +void start_ndp_timer(struct batman_if *batman_if) +{ + // adding some jitter + unsigned long ndp_interval = own_ndp_send_time(batman_if); + queue_delayed_work(bat_event_workqueue, &batman_if->ndp_wq, + ndp_interval - jiffies); +} + +void stop_ndp_timer(struct batman_if *batman_if) +{ + cancel_delayed_work_sync(&batman_if->ndp_wq); +} + +static void ndp_send(struct work_struct *work) +{ + struct batman_if *batman_if = container_of(work, struct batman_if, + ndp_wq.work); + struct bat_priv *bat_priv = netdev_priv(batman_if->soft_iface); + + bat_dbg(DBG_BATMAN, bat_priv, + "batman-adv:Sending ndp packet on interface %s, seqno %d\n", + batman_if->net_dev, atomic_read(&batman_if->ndp_seqno)); + + atomic_inc(&batman_if->ndp_seqno); + start_ndp_timer(batman_if); +} + +int ndp_init(struct batman_if *batman_if) +{ + atomic_set(&batman_if->ndp_interval, 500); + atomic_set(&batman_if->ndp_seqno, 0); + INIT_DELAYED_WORK(&batman_if->ndp_wq, ndp_send); + + return 0; +} + +void ndp_free(struct batman_if *batman_if) +{ + stop_ndp_timer(batman_if); +} diff --git a/ndp.h b/ndp.h new file mode 100644 index 0000000..de85910 --- /dev/null +++ b/ndp.h @@ -0,0 +1,6 @@ + +void start_ndp_timer(struct batman_if *batman_if); +void stop_ndp_timer(struct batman_if *batman_if); + +int ndp_init(struct batman_if *batman_if); +void ndp_free(struct batman_if *batman_if); diff --git a/types.h b/types.h index 8921e20..e8dfdf6 100644 --- a/types.h +++ b/types.h @@ -48,6 +48,8 @@ struct batman_if { struct net_device *soft_iface; struct rcu_head rcu; atomic_t ndp_interval; + atomic_t ndp_seqno; + struct delayed_work ndp_wq; }; /**