Hello David,
this is a "one-change" pull request intended for net/linux-3.{12,11,10}.
This patch from Matthias Schiffer is fixing the init routine of the Network Coding component by preventing it from registering the handler for the CODED packet type each time a new soft-interface is created.
Without this fix a second soft-interface cannot be created unless the Network Coding component is not part of the module (not compiled-in).
As I mentioned before, this fix should be queued for stable as it aims kernels older than linux-3.12.
Please pull or let me know of any problem. Thanks a lot, Antonio
p.s. this change generates some non-negligible conflicts with the patchset I'd like to send to net-next during this week. Since I'd like to solve them all by myself before sending the new patches, I'd kindly ask you to merge net into net-next when possible.
The following changes since commit c31eeaced22ce8bd61268a3c595d542bb38c0a4f:
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net (2013-10-01 12:58:48 -0700)
are available in the git repository at:
git://git.open-mesh.org/linux-merge.git tags/batman-adv-fix-for-davem
for you to fetch changes up to 6c519bad7b19a2c14a075b400edabaa630330123:
batman-adv: set up network coding packet handlers during module init (2013-10-02 13:46:19 +0200)
---------------------------------------------------------------- Included change: - fix multi soft-interfaces setups with Network Coding enabled by registering the CODED packet type once only (instead of once per soft-if)
---------------------------------------------------------------- Matthias Schiffer (1): batman-adv: set up network coding packet handlers during module init
net/batman-adv/main.c | 5 +++-- net/batman-adv/network-coding.c | 28 ++++++++++++++++++---------- net/batman-adv/network-coding.h | 14 ++++++++++---- 3 files changed, 31 insertions(+), 16 deletions(-)
From: Matthias Schiffer mschiffer@universe-factory.net
batman-adv saves its table of packet handlers as a global state, so handlers must be set up only once (and setting them up a second time will fail).
The recently-added network coding support tries to set up its handler each time a new softif is registered, which obviously fails when more that one softif is used (and in consequence, the softif creation fails).
Fix this by splitting up batadv_nc_init into batadv_nc_init (which is called only once) and batadv_nc_mesh_init (which is called for each softif); in addition batadv_nc_free is renamed to batadv_nc_mesh_free to keep naming consistent.
Signed-off-by: Matthias Schiffer mschiffer@universe-factory.net Signed-off-by: Marek Lindner mareklindner@neomailbox.ch Signed-off-by: Antonio Quartulli antonio@meshcoding.com --- net/batman-adv/main.c | 5 +++-- net/batman-adv/network-coding.c | 28 ++++++++++++++++++---------- net/batman-adv/network-coding.h | 14 ++++++++++---- 3 files changed, 31 insertions(+), 16 deletions(-)
diff --git a/net/batman-adv/main.c b/net/batman-adv/main.c index c72d1bc..1356af6 100644 --- a/net/batman-adv/main.c +++ b/net/batman-adv/main.c @@ -65,6 +65,7 @@ static int __init batadv_init(void) batadv_recv_handler_init();
batadv_iv_init(); + batadv_nc_init();
batadv_event_workqueue = create_singlethread_workqueue("bat_events");
@@ -142,7 +143,7 @@ int batadv_mesh_init(struct net_device *soft_iface) if (ret < 0) goto err;
- ret = batadv_nc_init(bat_priv); + ret = batadv_nc_mesh_init(bat_priv); if (ret < 0) goto err;
@@ -167,7 +168,7 @@ void batadv_mesh_free(struct net_device *soft_iface) batadv_vis_quit(bat_priv);
batadv_gw_node_purge(bat_priv); - batadv_nc_free(bat_priv); + batadv_nc_mesh_free(bat_priv); batadv_dat_free(bat_priv); batadv_bla_free(bat_priv);
diff --git a/net/batman-adv/network-coding.c b/net/batman-adv/network-coding.c index a487d46..4ecc0b6 100644 --- a/net/batman-adv/network-coding.c +++ b/net/batman-adv/network-coding.c @@ -35,6 +35,20 @@ static int batadv_nc_recv_coded_packet(struct sk_buff *skb, struct batadv_hard_iface *recv_if);
/** + * batadv_nc_init - one-time initialization for network coding + */ +int __init batadv_nc_init(void) +{ + int ret; + + /* Register our packet type */ + ret = batadv_recv_handler_register(BATADV_CODED, + batadv_nc_recv_coded_packet); + + return ret; +} + +/** * batadv_nc_start_timer - initialise the nc periodic worker * @bat_priv: the bat priv with all the soft interface information */ @@ -45,10 +59,10 @@ static void batadv_nc_start_timer(struct batadv_priv *bat_priv) }
/** - * batadv_nc_init - initialise coding hash table and start house keeping + * batadv_nc_mesh_init - initialise coding hash table and start house keeping * @bat_priv: the bat priv with all the soft interface information */ -int batadv_nc_init(struct batadv_priv *bat_priv) +int batadv_nc_mesh_init(struct batadv_priv *bat_priv) { bat_priv->nc.timestamp_fwd_flush = jiffies; bat_priv->nc.timestamp_sniffed_purge = jiffies; @@ -70,11 +84,6 @@ int batadv_nc_init(struct batadv_priv *bat_priv) batadv_hash_set_lock_class(bat_priv->nc.coding_hash, &batadv_nc_decoding_hash_lock_class_key);
- /* Register our packet type */ - if (batadv_recv_handler_register(BATADV_CODED, - batadv_nc_recv_coded_packet) < 0) - goto err; - INIT_DELAYED_WORK(&bat_priv->nc.work, batadv_nc_worker); batadv_nc_start_timer(bat_priv);
@@ -1721,12 +1730,11 @@ free_nc_packet: }
/** - * batadv_nc_free - clean up network coding memory + * batadv_nc_mesh_free - clean up network coding memory * @bat_priv: the bat priv with all the soft interface information */ -void batadv_nc_free(struct batadv_priv *bat_priv) +void batadv_nc_mesh_free(struct batadv_priv *bat_priv) { - batadv_recv_handler_unregister(BATADV_CODED); cancel_delayed_work_sync(&bat_priv->nc.work);
batadv_nc_purge_paths(bat_priv, bat_priv->nc.coding_hash, NULL); diff --git a/net/batman-adv/network-coding.h b/net/batman-adv/network-coding.h index 85a4ec8..ddfa618 100644 --- a/net/batman-adv/network-coding.h +++ b/net/batman-adv/network-coding.h @@ -22,8 +22,9 @@
#ifdef CONFIG_BATMAN_ADV_NC
-int batadv_nc_init(struct batadv_priv *bat_priv); -void batadv_nc_free(struct batadv_priv *bat_priv); +int batadv_nc_init(void); +int batadv_nc_mesh_init(struct batadv_priv *bat_priv); +void batadv_nc_mesh_free(struct batadv_priv *bat_priv); void batadv_nc_update_nc_node(struct batadv_priv *bat_priv, struct batadv_orig_node *orig_node, struct batadv_orig_node *orig_neigh_node, @@ -46,12 +47,17 @@ int batadv_nc_init_debugfs(struct batadv_priv *bat_priv);
#else /* ifdef CONFIG_BATMAN_ADV_NC */
-static inline int batadv_nc_init(struct batadv_priv *bat_priv) +static inline int batadv_nc_init(void) { return 0; }
-static inline void batadv_nc_free(struct batadv_priv *bat_priv) +static inline int batadv_nc_mesh_init(struct batadv_priv *bat_priv) +{ + return 0; +} + +static inline void batadv_nc_mesh_free(struct batadv_priv *bat_priv) { return; }
From: Antonio Quartulli antonio@meshcoding.com Date: Wed, 2 Oct 2013 22:03:20 +0200
this is a "one-change" pull request intended for net/linux-3.{12,11,10}.
This patch from Matthias Schiffer is fixing the init routine of the Network Coding component by preventing it from registering the handler for the CODED packet type each time a new soft-interface is created.
Without this fix a second soft-interface cannot be created unless the Network Coding component is not part of the module (not compiled-in).
As I mentioned before, this fix should be queued for stable as it aims kernels older than linux-3.12.
Please pull or let me know of any problem.
Pulled, thanks Antonio.
On Thu, Oct 03, 2013 at 03:58:02PM -0400, David Miller wrote:
From: Antonio Quartulli antonio@meshcoding.com Date: Wed, 2 Oct 2013 22:03:20 +0200
this is a "one-change" pull request intended for net/linux-3.{12,11,10}.
This patch from Matthias Schiffer is fixing the init routine of the Network Coding component by preventing it from registering the handler for the CODED packet type each time a new soft-interface is created.
Without this fix a second soft-interface cannot be created unless the Network Coding component is not part of the module (not compiled-in).
As I mentioned before, this fix should be queued for stable as it aims kernels older than linux-3.12.
Please pull or let me know of any problem.
Pulled, thanks Antonio.
David,
please consider queuing the patch for stable as it is rather important (if you already did so then I can't see this in patchwork).
Regards,
From: Antonio Quartulli antonio@meshcoding.com Date: Thu, 3 Oct 2013 22:14:13 +0200
please consider queuing the patch for stable as it is rather important (if you already did so then I can't see this in patchwork).
Queued up for -stable, thanks.
b.a.t.m.a.n@lists.open-mesh.org