Commit 196896d4 authored by David S. Miller's avatar David S. Miller

Merge tag 'batman-adv-fix-for-davem' of git://git.open-mesh.org/linux-merge

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)
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents 569943d0 6c519bad
...@@ -65,6 +65,7 @@ static int __init batadv_init(void) ...@@ -65,6 +65,7 @@ static int __init batadv_init(void)
batadv_recv_handler_init(); batadv_recv_handler_init();
batadv_iv_init(); batadv_iv_init();
batadv_nc_init();
batadv_event_workqueue = create_singlethread_workqueue("bat_events"); batadv_event_workqueue = create_singlethread_workqueue("bat_events");
...@@ -142,7 +143,7 @@ int batadv_mesh_init(struct net_device *soft_iface) ...@@ -142,7 +143,7 @@ int batadv_mesh_init(struct net_device *soft_iface)
if (ret < 0) if (ret < 0)
goto err; goto err;
ret = batadv_nc_init(bat_priv); ret = batadv_nc_mesh_init(bat_priv);
if (ret < 0) if (ret < 0)
goto err; goto err;
...@@ -167,7 +168,7 @@ void batadv_mesh_free(struct net_device *soft_iface) ...@@ -167,7 +168,7 @@ void batadv_mesh_free(struct net_device *soft_iface)
batadv_vis_quit(bat_priv); batadv_vis_quit(bat_priv);
batadv_gw_node_purge(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_dat_free(bat_priv);
batadv_bla_free(bat_priv); batadv_bla_free(bat_priv);
......
...@@ -34,6 +34,20 @@ static void batadv_nc_worker(struct work_struct *work); ...@@ -34,6 +34,20 @@ static void batadv_nc_worker(struct work_struct *work);
static int batadv_nc_recv_coded_packet(struct sk_buff *skb, static int batadv_nc_recv_coded_packet(struct sk_buff *skb,
struct batadv_hard_iface *recv_if); 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 * batadv_nc_start_timer - initialise the nc periodic worker
* @bat_priv: the bat priv with all the soft interface information * @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) ...@@ -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 * @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_fwd_flush = jiffies;
bat_priv->nc.timestamp_sniffed_purge = jiffies; bat_priv->nc.timestamp_sniffed_purge = jiffies;
...@@ -70,11 +84,6 @@ int batadv_nc_init(struct batadv_priv *bat_priv) ...@@ -70,11 +84,6 @@ int batadv_nc_init(struct batadv_priv *bat_priv)
batadv_hash_set_lock_class(bat_priv->nc.coding_hash, batadv_hash_set_lock_class(bat_priv->nc.coding_hash,
&batadv_nc_decoding_hash_lock_class_key); &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); INIT_DELAYED_WORK(&bat_priv->nc.work, batadv_nc_worker);
batadv_nc_start_timer(bat_priv); batadv_nc_start_timer(bat_priv);
...@@ -1721,12 +1730,11 @@ static int batadv_nc_recv_coded_packet(struct sk_buff *skb, ...@@ -1721,12 +1730,11 @@ static int batadv_nc_recv_coded_packet(struct sk_buff *skb,
} }
/** /**
* 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 * @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); cancel_delayed_work_sync(&bat_priv->nc.work);
batadv_nc_purge_paths(bat_priv, bat_priv->nc.coding_hash, NULL); batadv_nc_purge_paths(bat_priv, bat_priv->nc.coding_hash, NULL);
......
...@@ -22,8 +22,9 @@ ...@@ -22,8 +22,9 @@
#ifdef CONFIG_BATMAN_ADV_NC #ifdef CONFIG_BATMAN_ADV_NC
int batadv_nc_init(struct batadv_priv *bat_priv); int batadv_nc_init(void);
void batadv_nc_free(struct batadv_priv *bat_priv); 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, void batadv_nc_update_nc_node(struct batadv_priv *bat_priv,
struct batadv_orig_node *orig_node, struct batadv_orig_node *orig_node,
struct batadv_orig_node *orig_neigh_node, struct batadv_orig_node *orig_neigh_node,
...@@ -46,12 +47,17 @@ int batadv_nc_init_debugfs(struct batadv_priv *bat_priv); ...@@ -46,12 +47,17 @@ int batadv_nc_init_debugfs(struct batadv_priv *bat_priv);
#else /* ifdef CONFIG_BATMAN_ADV_NC */ #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; 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; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment