Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -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)
	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)
	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);


+18 −10
Original line number Original line Diff line number Diff line
@@ -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)
}
}


/**
/**
 * 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)
	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,
}
}


/**
/**
 * 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);
+10 −4
Original line number Original line Diff line number Diff line
@@ -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);


#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;
}
}