From patchwork Sat Jan 22 01:21:35 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Linus_L=C3=BCssing?= X-Patchwork-Id: 740 Return-Path: Received: from fmmailgate01.web.de (fmmailgate01.web.de [217.72.192.221]) by open-mesh.org (Postfix) with ESMTP id 9C428154652 for ; Sat, 22 Jan 2011 02:22:20 +0100 (CET) Received: from smtp03.web.de ( [172.20.0.65]) by fmmailgate01.web.de (Postfix) with ESMTP id 3D99818554F09; Sat, 22 Jan 2011 02:22:20 +0100 (CET) Received: from [46.126.246.98] (helo=localhost) by smtp03.web.de with asmtp (TLSv1:AES128-SHA:128) (WEB.DE 4.110 #4) id 1PgSBI-0003GP-00; Sat, 22 Jan 2011 02:22:20 +0100 From: =?UTF-8?q?Linus=20L=C3=BCssing?= To: b.a.t.m.a.n@lists.open-mesh.org Date: Sat, 22 Jan 2011 02:21:35 +0100 Message-Id: <1295659302-7171-13-git-send-email-linus.luessing@saxnet.de> X-Mailer: git-send-email 1.7.2.3 In-Reply-To: <1295659302-7171-1-git-send-email-linus.luessing@saxnet.de> References: <1295659302-7171-1-git-send-email-linus.luessing@saxnet.de> MIME-Version: 1.0 Sender: linus.luessing@web.de X-Sender: linus.luessing@web.de X-Provags-ID: V01U2FsdGVkX1+zeFNpL969vkkuv33rE/o5BNGpP8kgI9IywDEI 42GkPR4o8wK+n/bz8lGsN43xV4EzbSHJZR+a+MLSKhegeQYFUh l5Z4K4TBT4q0rXM61JTA== Cc: =?UTF-8?q?Linus=20L=C3=BCssing?= Subject: [B.A.T.M.A.N.] [PATCH 12/19] batman-adv: Purge timeouted entries in mcast forw table 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: Sat, 22 Jan 2011 01:22:21 -0000 With this commit, the multicast forwarding table, which has been previously filled up due to multicast tracker packets, will now be checked frequently (once per second) for timeouted entries. If so these entries get removed from the table. Note, that a more frequent check interval is not necessary, as multicast data will not only be forwarded if an entry exists, but also if that one might not have timeouted yet. Signed-off-by: Linus Lüssing --- multicast.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ multicast.h | 1 + originator.c | 2 + 3 files changed, 73 insertions(+), 0 deletions(-) diff --git a/batman-adv/multicast.c b/batman-adv/multicast.c index 686e10b..e47cc56 100644 --- a/batman-adv/multicast.c +++ b/batman-adv/multicast.c @@ -898,6 +898,76 @@ out: rcu_read_unlock(); } +static void purge_mcast_nexthop_list(struct list_head *mcast_nexthop_list, + int *num_nexthops, + struct bat_priv *bat_priv) +{ + struct mcast_forw_nexthop_entry *nexthop_entry, *tmp_nexthop_entry; + + list_for_each_entry_safe(nexthop_entry, tmp_nexthop_entry, + mcast_nexthop_list, list) { + if (get_remaining_timeout(nexthop_entry, bat_priv)) + continue; + + list_del(&nexthop_entry->list); + kfree(nexthop_entry); + *num_nexthops = *num_nexthops - 1; + } +} + +static void purge_mcast_if_list(struct list_head *mcast_if_list, + struct bat_priv *bat_priv) +{ + struct mcast_forw_if_entry *if_entry, *tmp_if_entry; + + list_for_each_entry_safe(if_entry, tmp_if_entry, mcast_if_list, list) { + purge_mcast_nexthop_list(&if_entry->mcast_nexthop_list, + &if_entry->num_nexthops, + bat_priv); + + if (!list_empty(&if_entry->mcast_nexthop_list)) + continue; + + list_del(&if_entry->list); + kfree(if_entry); + } +} + +static void purge_mcast_orig_list(struct list_head *mcast_orig_list, + struct bat_priv *bat_priv) +{ + struct mcast_forw_orig_entry *orig_entry, *tmp_orig_entry; + + list_for_each_entry_safe(orig_entry, tmp_orig_entry, mcast_orig_list, + list) { + purge_mcast_if_list(&orig_entry->mcast_if_list, bat_priv); + + if (!list_empty(&orig_entry->mcast_if_list)) + continue; + + list_del(&orig_entry->list); + kfree(orig_entry); + } +} + +void purge_mcast_forw_table(struct bat_priv *bat_priv) +{ + struct mcast_forw_table_entry *table_entry, *tmp_table_entry; + + spin_lock_bh(&bat_priv->mcast_forw_table_lock); + list_for_each_entry_safe(table_entry, tmp_table_entry, + &bat_priv->mcast_forw_table, list) { + purge_mcast_orig_list(&table_entry->mcast_orig_list, bat_priv); + + if (!list_empty(&table_entry->mcast_orig_list)) + continue; + + list_del(&table_entry->list); + kfree(table_entry); + } + spin_unlock_bh(&bat_priv->mcast_forw_table_lock); +} + static void mcast_tracker_timer(struct work_struct *work) { struct bat_priv *bat_priv = container_of(work, struct bat_priv, diff --git a/batman-adv/multicast.h b/batman-adv/multicast.h index 0bd0590..7312afa 100644 --- a/batman-adv/multicast.h +++ b/batman-adv/multicast.h @@ -30,6 +30,7 @@ void mcast_tracker_reset(struct bat_priv *bat_priv); void route_mcast_tracker_packet( struct mcast_tracker_packet *tracker_packet, int tracker_packet_len, struct bat_priv *bat_priv); +void purge_mcast_forw_table(struct bat_priv *bat_priv); int mcast_forw_table_seq_print_text(struct seq_file *seq, void *offset); int mcast_init(struct bat_priv *bat_priv); void mcast_free(struct bat_priv *bat_priv); diff --git a/batman-adv/originator.c b/batman-adv/originator.c index aee77d3..6c964e5 100644 --- a/batman-adv/originator.c +++ b/batman-adv/originator.c @@ -30,6 +30,7 @@ #include "hard-interface.h" #include "unicast.h" #include "soft-interface.h" +#include "multicast.h" static void purge_orig(struct work_struct *work); @@ -402,6 +403,7 @@ static void purge_orig(struct work_struct *work) struct bat_priv *bat_priv = container_of(delayed_work, struct bat_priv, orig_work); + purge_mcast_forw_table(bat_priv); _purge_orig(bat_priv); start_purge_timer(bat_priv); }