pull request: batman-adv 20150828
Subsystems (3)
Hello David,
this is our very last batch of patches intended for net-next/linux-4.3
It includes again 2 non-critical fixes which we couldn't send to net and then the rest is just code restyling and beautification. No major behavioural change was introduced.
Please pull or let me know of any problem!
Thanks a lot,
Antonio
The following changes since commit 1dd34b5ad8aebaff17b625fc0126e18243008a3f:
bpf: fix bpf_skb_set_tunnel_key() helper (2015-08-26 17:38:13 -0700)
are available in the git repository at:
git://git.open-mesh.org/linux-merge.git tags/batman-adv-for-davem
for you to fetch changes up to ed29266347025a19ee689807b07d121f0a7441f1:
batman-adv: turn batadv_neigh_node_get() into local function (2015-08-27 20:15:34 +0200)
----------------------------------------------------------------
Included changes:
- code beautification
- remove obsolete 'deleted' attribute for bat-gw node
- increase internal version number
- prevent potential access to netdev object after deregistration
- set needed_head/tail_room for batman virtual interface
----------------------------------------------------------------
Antonio Quartulli (1):
batman-adv: don't access unregistered net_device object
Marek Lindner (5):
batman-adv: move hardif refcount inc to batadv_neigh_node_new()
batman-adv: remove redundant hard_iface assignment
batman-adv: move neigh_node list add into batadv_neigh_node_new()
batman-adv: rearrange batadv_neigh_node_new() arguments to follow convention
batman-adv: turn batadv_neigh_node_get() into local function
Simon Wunderlich (3):
batman-adv: remove obsolete deleted attribute for gateway node
batman-adv: fix gateway client style issues
batman-adv: Start new development cycle
Sven Eckelmann (1):
batman-adv: Add lower layer needed_(head|tail)room to own ones
net/batman-adv/bat_iv_ogm.c | 30 +------------- net/batman-adv/gateway_client.c | 50 ++++++----------------- net/batman-adv/gateway_client.h | 2 +- net/batman-adv/hard-interface.c | 44 +++++++++++++++++++- net/batman-adv/main.c | 2 +- net/batman-adv/main.h | 2 +- net/batman-adv/originator.c | 90 ++++++++++++++++++++++++----------------- net/batman-adv/originator.h | 9 ++--- net/batman-adv/soft-interface.c | 2 - net/batman-adv/types.h | 2 - 10 files changed, 117 insertions(+), 116 deletions(-)
PATCH 1/10 batman-adv: move hardif refcount inc to batadv_neigh_node_new()
From: Marek Lindner <[email protected]>
The batadv_neigh_node cleanup function 'batadv_neigh_node_free_rcu()' takes care of reducing the hardif refcounter, hence it's only logical to assume the creating function of that same object 'batadv_neigh_node_new()' takes care of increasing the same refcounter.
--- net/batman-adv/bat_iv_ogm.c | 6 ------ net/batman-adv/originator.c | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-)
net/batman-adv/bat_iv_ogm.c +0 -6
@@ -303,12 +303,6 @@ batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface,if (!neigh_node) goto out; -if (!atomic_inc_not_zero (&hard_iface->refcount)) { -kfree (neigh_node); - neigh_node =NULL ; - goto out; - } - neigh_node->orig_node = orig_neigh; neigh_node->if_incoming = hard_iface;
net/batman-adv/originator.c +6 -0
@@ -461,6 +461,12 @@ batadv_neigh_node_new(struct batadv_hard_iface *hard_iface,if (!neigh_node) goto out; +if (!atomic_inc_not_zero (&hard_iface->refcount)) { +kfree (neigh_node); + neigh_node =NULL ; + goto out; + } +INIT_HLIST_NODE (&neigh_node->list);INIT_HLIST_HEAD (&neigh_node->ifinfo_list);spin_lock_init (&neigh_node->ifinfo_lock);
Signature · 1 line
2.5.0
PATCH 1/10 batman-adv: move hardif refcount inc to batadv_neigh_node_new()
In reply to Antonio QuartulliFrom: Marek Lindner <[email protected]>
The batadv_neigh_node cleanup function 'batadv_neigh_node_free_rcu()' takes care of reducing the hardif refcounter, hence it's only logical to assume the creating function of that same object 'batadv_neigh_node_new()' takes care of increasing the same refcounter.
--- net/batman-adv/bat_iv_ogm.c | 6 ------ net/batman-adv/originator.c | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-)
net/batman-adv/bat_iv_ogm.c +0 -6
@@ -303,12 +303,6 @@ batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface,if (!neigh_node) goto out; -if (!atomic_inc_not_zero (&hard_iface->refcount)) { -kfree (neigh_node); - neigh_node =NULL ; - goto out; - } - neigh_node->orig_node = orig_neigh; neigh_node->if_incoming = hard_iface;
net/batman-adv/originator.c +6 -0
@@ -461,6 +461,12 @@ batadv_neigh_node_new(struct batadv_hard_iface *hard_iface,if (!neigh_node) goto out; +if (!atomic_inc_not_zero (&hard_iface->refcount)) { +kfree (neigh_node); + neigh_node =NULL ; + goto out; + } +INIT_HLIST_NODE (&neigh_node->list);INIT_HLIST_HEAD (&neigh_node->ifinfo_list);spin_lock_init (&neigh_node->ifinfo_lock);
Signature · 1 line
2.5.0
PATCH 2/10 batman-adv: remove redundant hard_iface assignment
In reply to Antonio QuartulliFrom: Marek Lindner <[email protected]>
The batadv_neigh_node_new() function already sets the hard_iface pointer.
--- net/batman-adv/bat_iv_ogm.c | 1 - 1 file changed, 1 deletion(-)
net/batman-adv/bat_iv_ogm.c +0 -1
@@ -304,7 +304,6 @@ batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface, goto out; neigh_node->orig_node = orig_neigh; - neigh_node->if_incoming = hard_iface;spin_lock_bh (&orig_node->neigh_list_lock); tmp_neigh_node = batadv_neigh_node_get(orig_node, hard_iface,
Signature · 1 line
2.5.0
PATCH 3/10 batman-adv: move neigh_node list add into batadv_neigh_node_new()
In reply to Antonio QuartulliFrom: Marek Lindner <[email protected]>
All batadv_neigh_node_* functions expect the neigh_node list item to be part of the orig_node->neigh_list, therefore the constructor of said list item should be adding the newly created neigh_node to the respective list.
--- net/batman-adv/bat_iv_ogm.c | 21 +-------------------- net/batman-adv/originator.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 20 deletions(-)
net/batman-adv/bat_iv_ogm.c +1 -20
@@ -296,8 +296,7 @@ batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface,struct batadv_orig_node *orig_node, struct batadv_orig_node *orig_neigh) { - struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); -struct batadv_neigh_node *neigh_node, *tmp_neigh_node; + struct batadv_neigh_node *neigh_node; neigh_node =batadv_neigh_node_new (hard_iface, neigh_addr, orig_node);if (!neigh_node)
@@ -305,24 +304,6 @@ batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface, neigh_node->orig_node = orig_neigh; -spin_lock_bh (&orig_node->neigh_list_lock); - tmp_neigh_node =batadv_neigh_node_get (orig_node, hard_iface, - neigh_addr); -if (!tmp_neigh_node) { -hlist_add_head_rcu (&neigh_node->list, &orig_node->neigh_list); - }else { -kfree (neigh_node); -batadv_hardif_free_ref (hard_iface); - neigh_node = tmp_neigh_node; - } -spin_unlock_bh (&orig_node->neigh_list_lock); - -if (!tmp_neigh_node) -batadv_dbg (BATADV_DBG_BATMAN , bat_priv, -"Creating new neighbor %pM for orig_node %pM on interface %s\n" , - neigh_addr, orig_node->orig, - hard_iface->net_dev->name); - out:return neigh_node; }
net/batman-adv/originator.c +12 -0
@@ -457,6 +457,10 @@ batadv_neigh_node_new(struct batadv_hard_iface *hard_iface, {struct batadv_neigh_node *neigh_node; + neigh_node =batadv_neigh_node_get (orig_node, hard_iface, neigh_addr); +if (neigh_node) + goto out; + neigh_node =kzalloc (sizeof (*neigh_node),GFP_ATOMIC );if (!neigh_node) goto out;
@@ -478,6 +482,14 @@ batadv_neigh_node_new(struct batadv_hard_iface *hard_iface,/* extra reference for return */ atomic_set (&neigh_node->refcount,2 ); +spin_lock_bh (&orig_node->neigh_list_lock); +hlist_add_head_rcu (&neigh_node->list, &orig_node->neigh_list); +spin_unlock_bh (&orig_node->neigh_list_lock); + +batadv_dbg (BATADV_DBG_BATMAN , orig_node->bat_priv, +"Creating new neighbor %pM for orig_node %pM on interface %s\n" , + neigh_addr, orig_node->orig, hard_iface->net_dev->name); + out:return neigh_node; }
Signature · 1 line
2.5.0
PATCH 3/10 batman-adv: move neigh_node list add into batadv_neigh_node_new()
In reply to Antonio QuartulliFrom: Marek Lindner <[email protected]>
All batadv_neigh_node_* functions expect the neigh_node list item to be part of the orig_node->neigh_list, therefore the constructor of said list item should be adding the newly created neigh_node to the respective list.
--- net/batman-adv/bat_iv_ogm.c | 21 +-------------------- net/batman-adv/originator.c | 12 ++++++++++++ 2 files changed, 13 insertions(+), 20 deletions(-)
net/batman-adv/bat_iv_ogm.c +1 -20
@@ -296,8 +296,7 @@ batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface,struct batadv_orig_node *orig_node, struct batadv_orig_node *orig_neigh) { - struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); -struct batadv_neigh_node *neigh_node, *tmp_neigh_node; + struct batadv_neigh_node *neigh_node; neigh_node =batadv_neigh_node_new (hard_iface, neigh_addr, orig_node);if (!neigh_node)
@@ -305,24 +304,6 @@ batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface, neigh_node->orig_node = orig_neigh; -spin_lock_bh (&orig_node->neigh_list_lock); - tmp_neigh_node =batadv_neigh_node_get (orig_node, hard_iface, - neigh_addr); -if (!tmp_neigh_node) { -hlist_add_head_rcu (&neigh_node->list, &orig_node->neigh_list); - }else { -kfree (neigh_node); -batadv_hardif_free_ref (hard_iface); - neigh_node = tmp_neigh_node; - } -spin_unlock_bh (&orig_node->neigh_list_lock); - -if (!tmp_neigh_node) -batadv_dbg (BATADV_DBG_BATMAN , bat_priv, -"Creating new neighbor %pM for orig_node %pM on interface %s\n" , - neigh_addr, orig_node->orig, - hard_iface->net_dev->name); - out:return neigh_node; }
net/batman-adv/originator.c +12 -0
@@ -457,6 +457,10 @@ batadv_neigh_node_new(struct batadv_hard_iface *hard_iface, {struct batadv_neigh_node *neigh_node; + neigh_node =batadv_neigh_node_get (orig_node, hard_iface, neigh_addr); +if (neigh_node) + goto out; + neigh_node =kzalloc (sizeof (*neigh_node),GFP_ATOMIC );if (!neigh_node) goto out;
@@ -478,6 +482,14 @@ batadv_neigh_node_new(struct batadv_hard_iface *hard_iface,/* extra reference for return */ atomic_set (&neigh_node->refcount,2 ); +spin_lock_bh (&orig_node->neigh_list_lock); +hlist_add_head_rcu (&neigh_node->list, &orig_node->neigh_list); +spin_unlock_bh (&orig_node->neigh_list_lock); + +batadv_dbg (BATADV_DBG_BATMAN , orig_node->bat_priv, +"Creating new neighbor %pM for orig_node %pM on interface %s\n" , + neigh_addr, orig_node->orig, hard_iface->net_dev->name); + out:return neigh_node; }
Signature · 1 line
2.5.0
PATCH 4/10 batman-adv: remove obsolete deleted attribute for gateway node
In reply to Antonio QuartulliFrom: Simon Wunderlich <[email protected]>
With rcu, the gateway node deleted attribute is not needed anymore. In fact, it may delay the free of the gateway node and its referenced structures. Therefore remove it altogether and simplify purging as well.
--- net/batman-adv/gateway_client.c | 48 +++++++++++------------------------------ net/batman-adv/gateway_client.h | 2 +- net/batman-adv/main.c | 2 +- net/batman-adv/originator.c | 1 - net/batman-adv/types.h | 2 -- 5 files changed, 14 insertions(+), 41 deletions(-)
net/batman-adv/gateway_client.c +12 -36
@@ -161,9 +161,6 @@ batadv_gw_get_best_gw_node(struct batadv_priv *bat_priv)rcu_read_lock ();hlist_for_each_entry_rcu (gw_node, &bat_priv->gw.list, list) { -if (gw_node->deleted) -continue ; - orig_node = gw_node->orig_node; router =batadv_orig_router_get (orig_node,BATADV_IF_DEFAULT );if (!router)
@@ -473,9 +470,6 @@ batadv_gw_node_get(struct batadv_priv *bat_priv,if (gw_node_tmp->orig_node != orig_node)continue ; -if (gw_node_tmp->deleted) -continue ; -if (!atomic_inc_not_zero (&gw_node_tmp->refcount))continue ;
@@ -525,9 +519,7 @@ void batadv_gw_node_update(struct batadv_priv *bat_priv, gw_node->bandwidth_down =ntohl (gateway->bandwidth_down); gw_node->bandwidth_up =ntohl (gateway->bandwidth_up); - gw_node->deleted =0 ;if (ntohl (gateway->bandwidth_down) ==0 ) { - gw_node->deleted = jiffies;batadv_dbg (BATADV_DBG_BATMAN , bat_priv,"Gateway %pM removed from gateway list\n" , orig_node->orig);
@@ -535,14 +527,21 @@ void batadv_gw_node_update(struct batadv_priv *bat_priv,/* Note: We don't need a NULL check here, since curr_gw never * gets dereferenced. */ +spin_lock_bh (&bat_priv->gw.list_lock); +hlist_del_init_rcu (&gw_node->list); +spin_unlock_bh (&bat_priv->gw.list_lock); + +batadv_gw_node_free_ref (gw_node); + curr_gw =batadv_gw_get_selected_gw_node (bat_priv);if (gw_node == curr_gw)batadv_gw_reselect (bat_priv); + +if (curr_gw) +batadv_gw_node_free_ref (curr_gw); } out: -if (curr_gw) -batadv_gw_node_free_ref (curr_gw);if (gw_node)batadv_gw_node_free_ref (gw_node); }
@@ -558,39 +557,19 @@ void batadv_gw_node_delete(struct batadv_priv *bat_priv,batadv_gw_node_update (bat_priv, orig_node, &gateway); } -void batadv_gw_node_purge (struct batadv_priv *bat_priv) +void batadv_gw_node_free (struct batadv_priv *bat_priv) { -struct batadv_gw_node *gw_node, *curr_gw; +struct batadv_gw_node *gw_node;struct hlist_node *node_tmp; -unsigned long timeout =msecs_to_jiffies (2 *BATADV_PURGE_TIMEOUT ); -int do_reselect =0 ; - - curr_gw =batadv_gw_get_selected_gw_node (bat_priv);spin_lock_bh (&bat_priv->gw.list_lock); -hlist_for_each_entry_safe (gw_node, node_tmp, &bat_priv->gw.list, list) { -if (((!gw_node->deleted) || - (time_before (jiffies, gw_node->deleted + timeout))) && -atomic_read (&bat_priv->mesh_state) ==BATADV_MESH_ACTIVE ) -continue ; -if (curr_gw == gw_node) - do_reselect =1 ; - -hlist_del_rcu (&gw_node->list); +hlist_del_init_rcu (&gw_node->list);batadv_gw_node_free_ref (gw_node); } -spin_unlock_bh (&bat_priv->gw.list_lock); - -/* gw_reselect() needs to acquire the gw_list_lock */ -if (do_reselect) -batadv_gw_reselect (bat_priv); - -if (curr_gw) -batadv_gw_node_free_ref (curr_gw); }/* fails if orig_node has no router */
@@ -654,9 +633,6 @@ int batadv_gw_client_seq_print_text(struct seq_file *seq, void *offset)rcu_read_lock ();hlist_for_each_entry_rcu (gw_node, &bat_priv->gw.list, list) { -if (gw_node->deleted) -continue ; -/* fails if orig_node has no router */ if (batadv_write_buffer_text (bat_priv, seq, gw_node) <0 )continue ;
net/batman-adv/gateway_client.h +1 -1
@@ -38,7 +38,7 @@ void batadv_gw_node_update(struct batadv_priv *bat_priv, struct batadv_tvlv_gateway_data *gateway);void batadv_gw_node_delete (struct batadv_priv *bat_priv,struct batadv_orig_node *orig_node); -void batadv_gw_node_purge (struct batadv_priv *bat_priv); +void batadv_gw_node_free (struct batadv_priv *bat_priv);int batadv_gw_client_seq_print_text (struct seq_file *seq,void *offset);bool batadv_gw_out_of_range (struct batadv_priv *bat_priv,struct sk_buff *skb);enum batadv_dhcp_recipient
net/batman-adv/main.c +1 -1
@@ -199,7 +199,7 @@ void batadv_mesh_free(struct net_device *soft_iface)batadv_purge_outstanding_packets (bat_priv,NULL ); -batadv_gw_node_purge (bat_priv); +batadv_gw_node_free (bat_priv);batadv_nc_mesh_free (bat_priv);batadv_dat_free (bat_priv);batadv_bla_free (bat_priv);
net/batman-adv/originator.c +0 -1
@@ -1028,7 +1028,6 @@ static void _batadv_purge_orig(struct batadv_priv *bat_priv)spin_unlock_bh (list_lock); } -batadv_gw_node_purge (bat_priv);batadv_gw_election (bat_priv); }
net/batman-adv/types.h +0 -2
@@ -328,7 +328,6 @@ enum batadv_orig_capabilities {* @orig_node: pointer to corresponding orig node * @bandwidth_down: advertised uplink download bandwidth * @bandwidth_up: advertised uplink upload bandwidth -* @deleted: this struct is scheduled for deletion * @refcount: number of contexts the object is used * @rcu: struct used for freeing in an RCU-safe manner */
@@ -337,7 +336,6 @@ struct batadv_gw_node {struct batadv_orig_node *orig_node;u32 bandwidth_down;u32 bandwidth_up; -unsigned long deleted;atomic_t refcount;struct rcu_head rcu; };
Signature · 1 line
2.5.0
PATCH 5/10 batman-adv: rearrange batadv_neigh_node_new() arguments to follow convention
In reply to Antonio QuartulliFrom: Marek Lindner <[email protected]>
--- net/batman-adv/bat_iv_ogm.c | 2 +- net/batman-adv/originator.c | 7 ++++--- net/batman-adv/originator.h | 5 +++-- 3 files changed, 8 insertions(+), 6 deletions(-)
net/batman-adv/bat_iv_ogm.c +1 -1
@@ -298,7 +298,7 @@ batadv_iv_ogm_neigh_new(struct batadv_hard_iface *hard_iface, {struct batadv_neigh_node *neigh_node; - neigh_node =batadv_neigh_node_new (hard_iface, neigh_addr, orig_node); + neigh_node =batadv_neigh_node_new (orig_node, hard_iface, neigh_addr);if (!neigh_node) goto out;
net/batman-adv/originator.c +4 -3
@@ -444,16 +444,17 @@ out:/** * batadv_neigh_node_new - create and init a new neigh_node object +* @orig_node: originator object representing the neighbour * @hard_iface: the interface where the neighbour is connected to * @neigh_addr: the mac address of the neighbour interface -* @orig_node: originator object representing the neighbour * * Allocates a new neigh_node object and initialises all the generic fields. * Returns the new object or NULL on failure. */ struct batadv_neigh_node * -batadv_neigh_node_new (struct batadv_hard_iface *hard_iface, -const u8 *neigh_addr,struct batadv_orig_node *orig_node) +batadv_neigh_node_new (struct batadv_orig_node *orig_node, +struct batadv_hard_iface *hard_iface, +const u8 *neigh_addr) {struct batadv_neigh_node *neigh_node;
net/batman-adv/originator.h +3 -2
@@ -46,8 +46,9 @@ batadv_neigh_node_get(const struct batadv_orig_node *orig_node,const struct batadv_hard_iface *hard_iface, const u8 *addr);struct batadv_neigh_node * -batadv_neigh_node_new (struct batadv_hard_iface *hard_iface, -const u8 *neigh_addr,struct batadv_orig_node *orig_node); +batadv_neigh_node_new (struct batadv_orig_node *orig_node, +struct batadv_hard_iface *hard_iface, +const u8 *neigh_addr);void batadv_neigh_node_free_ref (struct batadv_neigh_node *neigh_node);struct batadv_neigh_node * batadv_orig_router_get(struct batadv_orig_node *orig_node,
Signature · 1 line
2.5.0
PATCH 6/10 batman-adv: fix gateway client style issues
In reply to Antonio QuartulliFrom: Simon Wunderlich <[email protected]>
commit 0511575c4d03 ("batman-adv: remove obsolete deleted attribute for gateway node") incorrectly added an empy line and forgot to remove an include.
--- net/batman-adv/gateway_client.c | 2 -- 1 file changed, 2 deletions(-)
net/batman-adv/gateway_client.c +0 -2
@@ -27,7 +27,6 @@#include <linux/in.h> #include <linux/ip.h> #include <linux/ipv6.h> -#include <linux/jiffies.h> #include <linux/kernel.h> #include <linux/list.h> #include <linux/netdevice.h>
@@ -565,7 +564,6 @@ void batadv_gw_node_free(struct batadv_priv *bat_priv)spin_lock_bh (&bat_priv->gw.list_lock);hlist_for_each_entry_safe (gw_node, node_tmp, &bat_priv->gw.list, list) { -hlist_del_init_rcu (&gw_node->list);batadv_gw_node_free_ref (gw_node); }
Signature · 1 line
2.5.0
PATCH 7/10 batman-adv: Start new development cycle
In reply to Antonio QuartulliFrom: Simon Wunderlich <[email protected]>
--- net/batman-adv/main.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/batman-adv/main.h +1 -1
@@ -24,7 +24,7 @@#define BATADV_DRIVER_DEVICE "batman-adv"#ifndef BATADV_SOURCE_VERSION -#define BATADV_SOURCE_VERSION "2015.1" +#define BATADV_SOURCE_VERSION "2015.2"#endif /* B.A.T.M.A.N. parameters */
Signature · 1 line
2.5.0
PATCH 8/10 batman-adv: don't access unregistered net_device object
In reply to Antonio QuartulliIn batadv_hardif_disable_interface() there is a call to batadv_softif_destroy_sysfs() which in turns invokes unregister_netdevice() on the soft_iface.
After this point we cannot rely on the soft_iface object anymore because it might get free'd by the netdev periodic routine at any time.
For this reason the netdev_upper_dev_unlink(.., soft_iface) call is moved before the invocation of batadv_softif_destroy_sysfs() so that we can be sure that the soft_iface object is still valid.
--- net/batman-adv/hard-interface.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/batman-adv/hard-interface.c +2 -1
@@ -528,6 +528,8 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,batadv_purge_outstanding_packets (bat_priv, hard_iface);dev_put (hard_iface->soft_iface); +netdev_upper_dev_unlink (hard_iface->net_dev, hard_iface->soft_iface); +/* nobody uses this interface anymore */ if (!bat_priv->num_ifaces) {batadv_gw_check_client_stop (bat_priv);
@@ -536,7 +538,6 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,batadv_softif_destroy_sysfs (hard_iface->soft_iface); } -netdev_upper_dev_unlink (hard_iface->net_dev, hard_iface->soft_iface); hard_iface->soft_iface =NULL ;batadv_hardif_free_ref (hard_iface);
Signature · 1 line
2.5.0
PATCH 9/10 batman-adv: Add lower layer needed_(head|tail)room to own ones
In reply to Antonio QuartulliFrom: Sven Eckelmann <[email protected]>
The maximum of hard_header_len and maximum of all needed_(head|tail)room of all slave interfaces of a batman-adv device must be used to define the batman-adv device needed_(head|tail)room. This is required to avoid too small buffer problems when these slave devices try to send the encapsulated packet in a tx path without the possibility to resize the skbuff.
--- net/batman-adv/hard-interface.c | 41 +++++++++++++++++++++++++++++++++++++++++ net/batman-adv/soft-interface.c | 2 -- 2 files changed, 41 insertions(+), 2 deletions(-)
net/batman-adv/hard-interface.c +41 -0
@@ -252,6 +252,44 @@ static void batadv_check_known_mac_addr(const struct net_device *net_dev)rcu_read_unlock (); } +/** +* batadv_hardif_recalc_extra_skbroom() - Recalculate skbuff extra head/tailroom +* @soft_iface: netdev struct of the mesh interface +*/ +static void batadv_hardif_recalc_extra_skbroom (struct net_device *soft_iface) +{ +const struct batadv_hard_iface *hard_iface; +unsigned short lower_header_len =ETH_HLEN ; +unsigned short lower_headroom =0 ; +unsigned short lower_tailroom =0 ; +unsigned short needed_headroom; + +rcu_read_lock (); +list_for_each_entry_rcu (hard_iface, &batadv_hardif_list, list) { +if (hard_iface->if_status ==BATADV_IF_NOT_IN_USE ) +continue ; + +if (hard_iface->soft_iface != soft_iface) +continue ; + + lower_header_len = max_t(unsigned short, lower_header_len, + hard_iface->net_dev->hard_header_len); + + lower_headroom = max_t(unsigned short, lower_headroom, + hard_iface->net_dev->needed_headroom); + + lower_tailroom = max_t(unsigned short, lower_tailroom, + hard_iface->net_dev->needed_tailroom); + } +rcu_read_unlock (); + + needed_headroom = lower_headroom + (lower_header_len -ETH_HLEN ); + needed_headroom +=batadv_max_header_len (); + + soft_iface->needed_headroom = needed_headroom; + soft_iface->needed_tailroom = lower_tailroom; +} +int batadv_hardif_min_mtu (struct net_device *soft_iface) {struct batadv_priv *bat_priv =netdev_priv (soft_iface);
@@ -474,6 +512,8 @@ int batadv_hardif_enable_interface(struct batadv_hard_iface *hard_iface,"Not using interface %s (retrying later): interface not active\n" , hard_iface->net_dev->name); +batadv_hardif_recalc_extra_skbroom (soft_iface); +/* begin scheduling originator messages on that interface */ batadv_schedule_bat_ogm (hard_iface);
@@ -529,6 +569,7 @@ void batadv_hardif_disable_interface(struct batadv_hard_iface *hard_iface,dev_put (hard_iface->soft_iface);netdev_upper_dev_unlink (hard_iface->net_dev, hard_iface->soft_iface); +batadv_hardif_recalc_extra_skbroom (hard_iface->soft_iface);/* nobody uses this interface anymore */ if (!bat_priv->num_ifaces) {
net/batman-adv/soft-interface.c +0 -2
@@ -947,8 +947,6 @@ static void batadv_softif_init_early(struct net_device *dev)* have not been initialized yet */ dev->mtu =ETH_DATA_LEN ; -/* reserve more space in the skbuff for our header */ - dev->hard_header_len =batadv_max_header_len ();/* generate random address */ eth_hw_addr_random (dev);
Signature · 1 line
2.5.0
PATCH 10/10 batman-adv: turn batadv_neigh_node_get() into local function
In reply to Antonio QuartulliFrom: Marek Lindner <[email protected]>
commit c214ebe1eb29 ("batman-adv: move neigh_node list add into batadv_neigh_node_new()") removed external calls to batadv_neigh_node_get().
--- net/batman-adv/originator.c | 72 ++++++++++++++++++++++----------------------- net/batman-adv/originator.h | 4 --- 2 files changed, 36 insertions(+), 40 deletions(-)
net/batman-adv/originator.c +36 -36
@@ -443,6 +443,42 @@ out: }/** +* batadv_neigh_node_get - retrieve a neighbour from the list +* @orig_node: originator which the neighbour belongs to +* @hard_iface: the interface where this neighbour is connected to +* @addr: the address of the neighbour +* +* Looks for and possibly returns a neighbour belonging to this originator list +* which is connected through the provided hard interface. +* Returns NULL if the neighbour is not found. +*/ +static struct batadv_neigh_node * +batadv_neigh_node_get (const struct batadv_orig_node *orig_node, +const struct batadv_hard_iface *hard_iface, +const u8 *addr) +{ +struct batadv_neigh_node *tmp_neigh_node, *res =NULL ; + +rcu_read_lock (); +hlist_for_each_entry_rcu (tmp_neigh_node, &orig_node->neigh_list, list) { +if (!batadv_compare_eth (tmp_neigh_node->addr, addr)) +continue ; + +if (tmp_neigh_node->if_incoming != hard_iface) +continue ; + +if (!atomic_inc_not_zero (&tmp_neigh_node->refcount)) +continue ; + + res = tmp_neigh_node; +break ; + } +rcu_read_unlock (); + +return res; +} + +/** * batadv_neigh_node_new - create and init a new neigh_node object * @orig_node: originator object representing the neighbour * @hard_iface: the interface where the neighbour is connected to
@@ -496,42 +532,6 @@ out: }/** -* batadv_neigh_node_get - retrieve a neighbour from the list -* @orig_node: originator which the neighbour belongs to -* @hard_iface: the interface where this neighbour is connected to -* @addr: the address of the neighbour -* -* Looks for and possibly returns a neighbour belonging to this originator list -* which is connected through the provided hard interface. -* Returns NULL if the neighbour is not found. -*/ -struct batadv_neigh_node * -batadv_neigh_node_get (const struct batadv_orig_node *orig_node, -const struct batadv_hard_iface *hard_iface, -const u8 *addr) -{ -struct batadv_neigh_node *tmp_neigh_node, *res =NULL ; - -rcu_read_lock (); -hlist_for_each_entry_rcu (tmp_neigh_node, &orig_node->neigh_list, list) { -if (!batadv_compare_eth (tmp_neigh_node->addr, addr)) -continue ; - -if (tmp_neigh_node->if_incoming != hard_iface) -continue ; - -if (!atomic_inc_not_zero (&tmp_neigh_node->refcount)) -continue ; - - res = tmp_neigh_node; -break ; - } -rcu_read_unlock (); - -return res; -} - -/** * batadv_orig_ifinfo_free_rcu - free the orig_ifinfo object * @rcu: rcu pointer of the orig_ifinfo object */
net/batman-adv/originator.h +0 -4
@@ -42,10 +42,6 @@ void batadv_orig_node_free_ref_now(struct batadv_orig_node *orig_node);struct batadv_orig_node *batadv_orig_node_new (struct batadv_priv *bat_priv,const u8 *addr);struct batadv_neigh_node * -batadv_neigh_node_get (const struct batadv_orig_node *orig_node, -const struct batadv_hard_iface *hard_iface, -const u8 *addr); -struct batadv_neigh_node *batadv_neigh_node_new (struct batadv_orig_node *orig_node,struct batadv_hard_iface *hard_iface,const u8 *neigh_addr);
Signature · 1 line
2.5.0
PATCH 10/10 batman-adv: turn batadv_neigh_node_get() into local function
In reply to Antonio QuartulliFrom: Marek Lindner <[email protected]>
commit c214ebe1eb29 ("batman-adv: move neigh_node list add into batadv_neigh_node_new()") removed external calls to batadv_neigh_node_get().
--- net/batman-adv/originator.c | 72 ++++++++++++++++++++++----------------------- net/batman-adv/originator.h | 4 --- 2 files changed, 36 insertions(+), 40 deletions(-)
net/batman-adv/originator.c +36 -36
@@ -443,6 +443,42 @@ out: }/** +* batadv_neigh_node_get - retrieve a neighbour from the list +* @orig_node: originator which the neighbour belongs to +* @hard_iface: the interface where this neighbour is connected to +* @addr: the address of the neighbour +* +* Looks for and possibly returns a neighbour belonging to this originator list +* which is connected through the provided hard interface. +* Returns NULL if the neighbour is not found. +*/ +static struct batadv_neigh_node * +batadv_neigh_node_get (const struct batadv_orig_node *orig_node, +const struct batadv_hard_iface *hard_iface, +const u8 *addr) +{ +struct batadv_neigh_node *tmp_neigh_node, *res =NULL ; + +rcu_read_lock (); +hlist_for_each_entry_rcu (tmp_neigh_node, &orig_node->neigh_list, list) { +if (!batadv_compare_eth (tmp_neigh_node->addr, addr)) +continue ; + +if (tmp_neigh_node->if_incoming != hard_iface) +continue ; + +if (!atomic_inc_not_zero (&tmp_neigh_node->refcount)) +continue ; + + res = tmp_neigh_node; +break ; + } +rcu_read_unlock (); + +return res; +} + +/** * batadv_neigh_node_new - create and init a new neigh_node object * @orig_node: originator object representing the neighbour * @hard_iface: the interface where the neighbour is connected to
@@ -496,42 +532,6 @@ out: }/** -* batadv_neigh_node_get - retrieve a neighbour from the list -* @orig_node: originator which the neighbour belongs to -* @hard_iface: the interface where this neighbour is connected to -* @addr: the address of the neighbour -* -* Looks for and possibly returns a neighbour belonging to this originator list -* which is connected through the provided hard interface. -* Returns NULL if the neighbour is not found. -*/ -struct batadv_neigh_node * -batadv_neigh_node_get (const struct batadv_orig_node *orig_node, -const struct batadv_hard_iface *hard_iface, -const u8 *addr) -{ -struct batadv_neigh_node *tmp_neigh_node, *res =NULL ; - -rcu_read_lock (); -hlist_for_each_entry_rcu (tmp_neigh_node, &orig_node->neigh_list, list) { -if (!batadv_compare_eth (tmp_neigh_node->addr, addr)) -continue ; - -if (tmp_neigh_node->if_incoming != hard_iface) -continue ; - -if (!atomic_inc_not_zero (&tmp_neigh_node->refcount)) -continue ; - - res = tmp_neigh_node; -break ; - } -rcu_read_unlock (); - -return res; -} - -/** * batadv_orig_ifinfo_free_rcu - free the orig_ifinfo object * @rcu: rcu pointer of the orig_ifinfo object */
net/batman-adv/originator.h +0 -4
@@ -42,10 +42,6 @@ void batadv_orig_node_free_ref_now(struct batadv_orig_node *orig_node);struct batadv_orig_node *batadv_orig_node_new (struct batadv_priv *bat_priv,const u8 *addr);struct batadv_neigh_node * -batadv_neigh_node_get (const struct batadv_orig_node *orig_node, -const struct batadv_hard_iface *hard_iface, -const u8 *addr); -struct batadv_neigh_node *batadv_neigh_node_new (struct batadv_orig_node *orig_node,struct batadv_hard_iface *hard_iface,const u8 *neigh_addr);
Signature · 1 line
2.5.0
A message that is not in the archive (sent off-list or not yet received): 1440753156-7808-1-git-send-email-antonio-x4xJYDvStAgysxA8WJXlww@public.gmane.org
From: Antonio Quartulli <[email protected]>
Date: Fri, 28 Aug 2015 11:12:26 +0200
Quoted 7 lines
this is our very last batch of patches intended for net-next/linux-4.3
It includes again 2 non-critical fixes which we couldn't send to net and then the rest is just code restyling and beautification. No major behavioural change was introduced.
Please pull or let me know of any problem!
Pulled, thanks Antonio.