Commit 8b7ac60a authored by David S. Miller's avatar David S. Miller

Merge tag 'batadv-next-for-davem-20160822' of git://git.open-mesh.org/linux-merge

Simon Wunderlich says:

====================
This feature patchset includes the following changes:

 - place kref_get near usage of referenced objects, separate patches
   for various used objects to improve readability and maintainability
   by Sven Eckelmann (18 patches)

 - Keep batadv net device when all hard interfaces disappear, to
   improve situations where tools currently use work arounds, by
   Sven Eckelmann

 - Add an option to disable debugfs support to minimize footprint when
   userspace uses netlink only, by Sven Eckelmann
====================
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parents a616b849 dc1cbd14
...@@ -73,10 +73,21 @@ config BATMAN_ADV_MCAST ...@@ -73,10 +73,21 @@ config BATMAN_ADV_MCAST
reduce the air overhead while improving the reliability of reduce the air overhead while improving the reliability of
multicast messages. multicast messages.
config BATMAN_ADV_DEBUG config BATMAN_ADV_DEBUGFS
bool "B.A.T.M.A.N. debugging" bool "batman-adv debugfs entries"
depends on BATMAN_ADV depends on BATMAN_ADV
depends on DEBUG_FS depends on DEBUG_FS
default y
help
Enable this to export routing related debug tables via debugfs.
The information for each soft-interface and used hard-interface can be
found under batman_adv/
If unsure, say Y.
config BATMAN_ADV_DEBUG
bool "B.A.T.M.A.N. debugging"
depends on BATMAN_ADV_DEBUGFS
help help
This is an option for use by developers; most people should This is an option for use by developers; most people should
say N here. This enables compilation of support for say N here. This enables compilation of support for
......
...@@ -24,14 +24,14 @@ batman-adv-$(CONFIG_BATMAN_ADV_BATMAN_V) += bat_v_elp.o ...@@ -24,14 +24,14 @@ batman-adv-$(CONFIG_BATMAN_ADV_BATMAN_V) += bat_v_elp.o
batman-adv-$(CONFIG_BATMAN_ADV_BATMAN_V) += bat_v_ogm.o batman-adv-$(CONFIG_BATMAN_ADV_BATMAN_V) += bat_v_ogm.o
batman-adv-y += bitarray.o batman-adv-y += bitarray.o
batman-adv-$(CONFIG_BATMAN_ADV_BLA) += bridge_loop_avoidance.o batman-adv-$(CONFIG_BATMAN_ADV_BLA) += bridge_loop_avoidance.o
batman-adv-$(CONFIG_DEBUG_FS) += debugfs.o batman-adv-$(CONFIG_BATMAN_ADV_DEBUGFS) += debugfs.o
batman-adv-$(CONFIG_BATMAN_ADV_DAT) += distributed-arp-table.o batman-adv-$(CONFIG_BATMAN_ADV_DAT) += distributed-arp-table.o
batman-adv-y += fragmentation.o batman-adv-y += fragmentation.o
batman-adv-y += gateway_client.o batman-adv-y += gateway_client.o
batman-adv-y += gateway_common.o batman-adv-y += gateway_common.o
batman-adv-y += hard-interface.o batman-adv-y += hard-interface.o
batman-adv-y += hash.o batman-adv-y += hash.o
batman-adv-y += icmp_socket.o batman-adv-$(CONFIG_BATMAN_ADV_DEBUGFS) += icmp_socket.o
batman-adv-$(CONFIG_BATMAN_ADV_DEBUG) += log.o batman-adv-$(CONFIG_BATMAN_ADV_DEBUG) += log.o
batman-adv-y += main.o batman-adv-y += main.o
batman-adv-$(CONFIG_BATMAN_ADV_MCAST) += multicast.o batman-adv-$(CONFIG_BATMAN_ADV_MCAST) += multicast.o
......
...@@ -101,6 +101,7 @@ int batadv_algo_select(struct batadv_priv *bat_priv, char *name) ...@@ -101,6 +101,7 @@ int batadv_algo_select(struct batadv_priv *bat_priv, char *name)
return 0; return 0;
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
int batadv_algo_seq_print_text(struct seq_file *seq, void *offset) int batadv_algo_seq_print_text(struct seq_file *seq, void *offset)
{ {
struct batadv_algo_ops *bat_algo_ops; struct batadv_algo_ops *bat_algo_ops;
...@@ -113,6 +114,7 @@ int batadv_algo_seq_print_text(struct seq_file *seq, void *offset) ...@@ -113,6 +114,7 @@ int batadv_algo_seq_print_text(struct seq_file *seq, void *offset)
return 0; return 0;
} }
#endif
static int batadv_param_set_ra(const char *val, const struct kernel_param *kp) static int batadv_param_set_ra(const char *val, const struct kernel_param *kp)
{ {
......
...@@ -324,17 +324,18 @@ batadv_iv_ogm_orig_get(struct batadv_priv *bat_priv, const u8 *addr) ...@@ -324,17 +324,18 @@ batadv_iv_ogm_orig_get(struct batadv_priv *bat_priv, const u8 *addr)
if (!orig_node->bat_iv.bcast_own_sum) if (!orig_node->bat_iv.bcast_own_sum)
goto free_orig_node; goto free_orig_node;
kref_get(&orig_node->refcount);
hash_added = batadv_hash_add(bat_priv->orig_hash, batadv_compare_orig, hash_added = batadv_hash_add(bat_priv->orig_hash, batadv_compare_orig,
batadv_choose_orig, orig_node, batadv_choose_orig, orig_node,
&orig_node->hash_entry); &orig_node->hash_entry);
if (hash_added != 0) if (hash_added != 0)
goto free_orig_node; goto free_orig_node_hash;
return orig_node; return orig_node;
free_orig_node: free_orig_node_hash:
/* free twice, as batadv_orig_node_new sets refcount to 2 */
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
free_orig_node:
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
return NULL; return NULL;
...@@ -1854,6 +1855,7 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb, ...@@ -1854,6 +1855,7 @@ static int batadv_iv_ogm_receive(struct sk_buff *skb,
return NET_RX_SUCCESS; return NET_RX_SUCCESS;
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
/** /**
* batadv_iv_ogm_orig_print_neigh - print neighbors for the originator table * batadv_iv_ogm_orig_print_neigh - print neighbors for the originator table
* @orig_node: the orig_node for which the neighbors are printed * @orig_node: the orig_node for which the neighbors are printed
...@@ -1951,6 +1953,7 @@ static void batadv_iv_ogm_orig_print(struct batadv_priv *bat_priv, ...@@ -1951,6 +1953,7 @@ static void batadv_iv_ogm_orig_print(struct batadv_priv *bat_priv,
if (batman_count == 0) if (batman_count == 0)
seq_puts(seq, "No batman nodes in range ...\n"); seq_puts(seq, "No batman nodes in range ...\n");
} }
#endif
/** /**
* batadv_iv_ogm_neigh_get_tq_avg - Get the TQ average for a neighbour on a * batadv_iv_ogm_neigh_get_tq_avg - Get the TQ average for a neighbour on a
...@@ -2181,6 +2184,7 @@ batadv_iv_ogm_orig_dump(struct sk_buff *msg, struct netlink_callback *cb, ...@@ -2181,6 +2184,7 @@ batadv_iv_ogm_orig_dump(struct sk_buff *msg, struct netlink_callback *cb,
cb->args[2] = sub; cb->args[2] = sub;
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
/** /**
* batadv_iv_hardif_neigh_print - print a single hop neighbour node * batadv_iv_hardif_neigh_print - print a single hop neighbour node
* @seq: neighbour table seq_file struct * @seq: neighbour table seq_file struct
...@@ -2231,6 +2235,7 @@ static void batadv_iv_neigh_print(struct batadv_priv *bat_priv, ...@@ -2231,6 +2235,7 @@ static void batadv_iv_neigh_print(struct batadv_priv *bat_priv,
if (batman_count == 0) if (batman_count == 0)
seq_puts(seq, "No batman nodes in range ...\n"); seq_puts(seq, "No batman nodes in range ...\n");
} }
#endif
/** /**
* batadv_iv_ogm_neigh_diff - calculate tq difference of two neighbors * batadv_iv_ogm_neigh_diff - calculate tq difference of two neighbors
...@@ -2617,6 +2622,7 @@ static bool batadv_iv_gw_is_eligible(struct batadv_priv *bat_priv, ...@@ -2617,6 +2622,7 @@ static bool batadv_iv_gw_is_eligible(struct batadv_priv *bat_priv,
return ret; return ret;
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
/* fails if orig_node has no router */ /* fails if orig_node has no router */
static int batadv_iv_gw_write_buffer_text(struct batadv_priv *bat_priv, static int batadv_iv_gw_write_buffer_text(struct batadv_priv *bat_priv,
struct seq_file *seq, struct seq_file *seq,
...@@ -2680,6 +2686,7 @@ static void batadv_iv_gw_print(struct batadv_priv *bat_priv, ...@@ -2680,6 +2686,7 @@ static void batadv_iv_gw_print(struct batadv_priv *bat_priv,
if (gw_count == 0) if (gw_count == 0)
seq_puts(seq, "No gateways in range ...\n"); seq_puts(seq, "No gateways in range ...\n");
} }
#endif
/** /**
* batadv_iv_gw_dump_entry - Dump a gateway into a message * batadv_iv_gw_dump_entry - Dump a gateway into a message
...@@ -2797,11 +2804,15 @@ static struct batadv_algo_ops batadv_batman_iv __read_mostly = { ...@@ -2797,11 +2804,15 @@ static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
.neigh = { .neigh = {
.cmp = batadv_iv_ogm_neigh_cmp, .cmp = batadv_iv_ogm_neigh_cmp,
.is_similar_or_better = batadv_iv_ogm_neigh_is_sob, .is_similar_or_better = batadv_iv_ogm_neigh_is_sob,
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
.print = batadv_iv_neigh_print, .print = batadv_iv_neigh_print,
#endif
.dump = batadv_iv_ogm_neigh_dump, .dump = batadv_iv_ogm_neigh_dump,
}, },
.orig = { .orig = {
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
.print = batadv_iv_ogm_orig_print, .print = batadv_iv_ogm_orig_print,
#endif
.dump = batadv_iv_ogm_orig_dump, .dump = batadv_iv_ogm_orig_dump,
.free = batadv_iv_ogm_orig_free, .free = batadv_iv_ogm_orig_free,
.add_if = batadv_iv_ogm_orig_add_if, .add_if = batadv_iv_ogm_orig_add_if,
...@@ -2810,7 +2821,9 @@ static struct batadv_algo_ops batadv_batman_iv __read_mostly = { ...@@ -2810,7 +2821,9 @@ static struct batadv_algo_ops batadv_batman_iv __read_mostly = {
.gw = { .gw = {
.get_best_gw_node = batadv_iv_gw_get_best_gw_node, .get_best_gw_node = batadv_iv_gw_get_best_gw_node,
.is_eligible = batadv_iv_gw_is_eligible, .is_eligible = batadv_iv_gw_is_eligible,
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
.print = batadv_iv_gw_print, .print = batadv_iv_gw_print,
#endif
.dump = batadv_iv_gw_dump, .dump = batadv_iv_gw_dump,
}, },
}; };
......
...@@ -129,6 +129,7 @@ batadv_v_hardif_neigh_init(struct batadv_hardif_neigh_node *hardif_neigh) ...@@ -129,6 +129,7 @@ batadv_v_hardif_neigh_init(struct batadv_hardif_neigh_node *hardif_neigh)
batadv_v_elp_throughput_metric_update); batadv_v_elp_throughput_metric_update);
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
/** /**
* batadv_v_orig_print_neigh - print neighbors for the originator table * batadv_v_orig_print_neigh - print neighbors for the originator table
* @orig_node: the orig_node for which the neighbors are printed * @orig_node: the orig_node for which the neighbors are printed
...@@ -212,6 +213,7 @@ static void batadv_v_neigh_print(struct batadv_priv *bat_priv, ...@@ -212,6 +213,7 @@ static void batadv_v_neigh_print(struct batadv_priv *bat_priv,
if (batman_count == 0) if (batman_count == 0)
seq_puts(seq, "No batman nodes in range ...\n"); seq_puts(seq, "No batman nodes in range ...\n");
} }
#endif
/** /**
* batadv_v_neigh_dump_neigh - Dump a neighbour into a message * batadv_v_neigh_dump_neigh - Dump a neighbour into a message
...@@ -345,6 +347,7 @@ batadv_v_neigh_dump(struct sk_buff *msg, struct netlink_callback *cb, ...@@ -345,6 +347,7 @@ batadv_v_neigh_dump(struct sk_buff *msg, struct netlink_callback *cb,
cb->args[1] = idx; cb->args[1] = idx;
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
/** /**
* batadv_v_orig_print - print the originator table * batadv_v_orig_print - print the originator table
* @bat_priv: the bat priv with all the soft interface information * @bat_priv: the bat priv with all the soft interface information
...@@ -411,6 +414,7 @@ static void batadv_v_orig_print(struct batadv_priv *bat_priv, ...@@ -411,6 +414,7 @@ static void batadv_v_orig_print(struct batadv_priv *bat_priv,
if (batman_count == 0) if (batman_count == 0)
seq_puts(seq, "No batman nodes in range ...\n"); seq_puts(seq, "No batman nodes in range ...\n");
} }
#endif
/** /**
* batadv_v_orig_dump_subentry - Dump an originator subentry into a * batadv_v_orig_dump_subentry - Dump an originator subentry into a
...@@ -827,6 +831,7 @@ static bool batadv_v_gw_is_eligible(struct batadv_priv *bat_priv, ...@@ -827,6 +831,7 @@ static bool batadv_v_gw_is_eligible(struct batadv_priv *bat_priv,
return ret; return ret;
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
/* fails if orig_node has no router */ /* fails if orig_node has no router */
static int batadv_v_gw_write_buffer_text(struct batadv_priv *bat_priv, static int batadv_v_gw_write_buffer_text(struct batadv_priv *bat_priv,
struct seq_file *seq, struct seq_file *seq,
...@@ -896,6 +901,7 @@ static void batadv_v_gw_print(struct batadv_priv *bat_priv, ...@@ -896,6 +901,7 @@ static void batadv_v_gw_print(struct batadv_priv *bat_priv,
if (gw_count == 0) if (gw_count == 0)
seq_puts(seq, "No gateways in range ...\n"); seq_puts(seq, "No gateways in range ...\n");
} }
#endif
/** /**
* batadv_v_gw_dump_entry - Dump a gateway into a message * batadv_v_gw_dump_entry - Dump a gateway into a message
...@@ -1034,11 +1040,15 @@ static struct batadv_algo_ops batadv_batman_v __read_mostly = { ...@@ -1034,11 +1040,15 @@ static struct batadv_algo_ops batadv_batman_v __read_mostly = {
.hardif_init = batadv_v_hardif_neigh_init, .hardif_init = batadv_v_hardif_neigh_init,
.cmp = batadv_v_neigh_cmp, .cmp = batadv_v_neigh_cmp,
.is_similar_or_better = batadv_v_neigh_is_sob, .is_similar_or_better = batadv_v_neigh_is_sob,
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
.print = batadv_v_neigh_print, .print = batadv_v_neigh_print,
#endif
.dump = batadv_v_neigh_dump, .dump = batadv_v_neigh_dump,
}, },
.orig = { .orig = {
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
.print = batadv_v_orig_print, .print = batadv_v_orig_print,
#endif
.dump = batadv_v_orig_dump, .dump = batadv_v_orig_dump,
}, },
.gw = { .gw = {
...@@ -1046,7 +1056,9 @@ static struct batadv_algo_ops batadv_batman_v __read_mostly = { ...@@ -1046,7 +1056,9 @@ static struct batadv_algo_ops batadv_batman_v __read_mostly = {
.show_sel_class = batadv_v_show_sel_class, .show_sel_class = batadv_v_show_sel_class,
.get_best_gw_node = batadv_v_gw_get_best_gw_node, .get_best_gw_node = batadv_v_gw_get_best_gw_node,
.is_eligible = batadv_v_gw_is_eligible, .is_eligible = batadv_v_gw_is_eligible,
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
.print = batadv_v_gw_print, .print = batadv_v_gw_print,
#endif
.dump = batadv_v_gw_dump, .dump = batadv_v_gw_dump,
}, },
}; };
......
...@@ -73,13 +73,12 @@ struct batadv_orig_node *batadv_v_ogm_orig_get(struct batadv_priv *bat_priv, ...@@ -73,13 +73,12 @@ struct batadv_orig_node *batadv_v_ogm_orig_get(struct batadv_priv *bat_priv,
if (!orig_node) if (!orig_node)
return NULL; return NULL;
kref_get(&orig_node->refcount);
hash_added = batadv_hash_add(bat_priv->orig_hash, batadv_compare_orig, hash_added = batadv_hash_add(bat_priv->orig_hash, batadv_compare_orig,
batadv_choose_orig, orig_node, batadv_choose_orig, orig_node,
&orig_node->hash_entry); &orig_node->hash_entry);
if (hash_added != 0) { if (hash_added != 0) {
/* orig_node->refcounter is initialised to 2 by /* remove refcnt for newly created orig_node and hash entry */
* batadv_orig_node_new()
*/
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
batadv_orig_node_put(orig_node); batadv_orig_node_put(orig_node);
orig_node = NULL; orig_node = NULL;
......
...@@ -526,11 +526,9 @@ batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, u8 *orig, ...@@ -526,11 +526,9 @@ batadv_bla_get_backbone_gw(struct batadv_priv *bat_priv, u8 *orig,
atomic_set(&entry->wait_periods, 0); atomic_set(&entry->wait_periods, 0);
ether_addr_copy(entry->orig, orig); ether_addr_copy(entry->orig, orig);
INIT_WORK(&entry->report_work, batadv_bla_loopdetect_report); INIT_WORK(&entry->report_work, batadv_bla_loopdetect_report);
/* one for the hash, one for returning */
kref_init(&entry->refcount); kref_init(&entry->refcount);
kref_get(&entry->refcount);
kref_get(&entry->refcount);
hash_added = batadv_hash_add(bat_priv->bla.backbone_hash, hash_added = batadv_hash_add(bat_priv->bla.backbone_hash,
batadv_compare_backbone_gw, batadv_compare_backbone_gw,
batadv_choose_backbone_gw, entry, batadv_choose_backbone_gw, entry,
...@@ -718,12 +716,13 @@ static void batadv_bla_add_claim(struct batadv_priv *bat_priv, ...@@ -718,12 +716,13 @@ static void batadv_bla_add_claim(struct batadv_priv *bat_priv,
claim->lasttime = jiffies; claim->lasttime = jiffies;
kref_get(&backbone_gw->refcount); kref_get(&backbone_gw->refcount);
claim->backbone_gw = backbone_gw; claim->backbone_gw = backbone_gw;
kref_init(&claim->refcount); kref_init(&claim->refcount);
kref_get(&claim->refcount);
batadv_dbg(BATADV_DBG_BLA, bat_priv, batadv_dbg(BATADV_DBG_BLA, bat_priv,
"bla_add_claim(): adding new entry %pM, vid %d to hash ...\n", "bla_add_claim(): adding new entry %pM, vid %d to hash ...\n",
mac, BATADV_PRINT_VID(vid)); mac, BATADV_PRINT_VID(vid));
kref_get(&claim->refcount);
hash_added = batadv_hash_add(bat_priv->bla.claim_hash, hash_added = batadv_hash_add(bat_priv->bla.claim_hash,
batadv_compare_claim, batadv_compare_claim,
batadv_choose_claim, claim, batadv_choose_claim, claim,
...@@ -1997,6 +1996,7 @@ bool batadv_bla_tx(struct batadv_priv *bat_priv, struct sk_buff *skb, ...@@ -1997,6 +1996,7 @@ bool batadv_bla_tx(struct batadv_priv *bat_priv, struct sk_buff *skb,
return ret; return ret;
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
/** /**
* batadv_bla_claim_table_seq_print_text - print the claim table in a seq file * batadv_bla_claim_table_seq_print_text - print the claim table in a seq file
* @seq: seq file to print on * @seq: seq file to print on
...@@ -2057,6 +2057,7 @@ int batadv_bla_claim_table_seq_print_text(struct seq_file *seq, void *offset) ...@@ -2057,6 +2057,7 @@ int batadv_bla_claim_table_seq_print_text(struct seq_file *seq, void *offset)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
return 0; return 0;
} }
#endif
/** /**
* batadv_bla_claim_dump_entry - dump one entry of the claim table * batadv_bla_claim_dump_entry - dump one entry of the claim table
...@@ -2220,6 +2221,7 @@ int batadv_bla_claim_dump(struct sk_buff *msg, struct netlink_callback *cb) ...@@ -2220,6 +2221,7 @@ int batadv_bla_claim_dump(struct sk_buff *msg, struct netlink_callback *cb)
return ret; return ret;
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
/** /**
* batadv_bla_backbone_table_seq_print_text - print the backbone table in a seq * batadv_bla_backbone_table_seq_print_text - print the backbone table in a seq
* file * file
...@@ -2283,6 +2285,7 @@ int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq, void *offset) ...@@ -2283,6 +2285,7 @@ int batadv_bla_backbone_table_seq_print_text(struct seq_file *seq, void *offset)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
return 0; return 0;
} }
#endif
/** /**
* batadv_bla_backbone_dump_entry - dump one entry of the backbone table * batadv_bla_backbone_dump_entry - dump one entry of the backbone table
......
...@@ -26,7 +26,7 @@ struct net_device; ...@@ -26,7 +26,7 @@ struct net_device;
#define BATADV_DEBUGFS_SUBDIR "batman_adv" #define BATADV_DEBUGFS_SUBDIR "batman_adv"
#if IS_ENABLED(CONFIG_DEBUG_FS) #if IS_ENABLED(CONFIG_BATMAN_ADV_DEBUGFS)
void batadv_debugfs_init(void); void batadv_debugfs_init(void);
void batadv_debugfs_destroy(void); void batadv_debugfs_destroy(void);
......
...@@ -343,8 +343,8 @@ static void batadv_dat_entry_add(struct batadv_priv *bat_priv, __be32 ip, ...@@ -343,8 +343,8 @@ static void batadv_dat_entry_add(struct batadv_priv *bat_priv, __be32 ip,
ether_addr_copy(dat_entry->mac_addr, mac_addr); ether_addr_copy(dat_entry->mac_addr, mac_addr);
dat_entry->last_update = jiffies; dat_entry->last_update = jiffies;
kref_init(&dat_entry->refcount); kref_init(&dat_entry->refcount);
kref_get(&dat_entry->refcount);
kref_get(&dat_entry->refcount);
hash_added = batadv_hash_add(bat_priv->dat.hash, batadv_compare_dat, hash_added = batadv_hash_add(bat_priv->dat.hash, batadv_compare_dat,
batadv_hash_dat, dat_entry, batadv_hash_dat, dat_entry,
&dat_entry->hash_entry); &dat_entry->hash_entry);
...@@ -795,6 +795,7 @@ void batadv_dat_free(struct batadv_priv *bat_priv) ...@@ -795,6 +795,7 @@ void batadv_dat_free(struct batadv_priv *bat_priv)
batadv_dat_hash_free(bat_priv); batadv_dat_hash_free(bat_priv);
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
/** /**
* batadv_dat_cache_seq_print_text - print the local DAT hash table * batadv_dat_cache_seq_print_text - print the local DAT hash table
* @seq: seq file to print on * @seq: seq file to print on
...@@ -846,6 +847,7 @@ int batadv_dat_cache_seq_print_text(struct seq_file *seq, void *offset) ...@@ -846,6 +847,7 @@ int batadv_dat_cache_seq_print_text(struct seq_file *seq, void *offset)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
return 0; return 0;
} }
#endif
/** /**
* batadv_arp_get_type - parse an ARP packet and gets the type * batadv_arp_get_type - parse an ARP packet and gets the type
......
...@@ -339,14 +339,15 @@ static void batadv_gw_node_add(struct batadv_priv *bat_priv, ...@@ -339,14 +339,15 @@ static void batadv_gw_node_add(struct batadv_priv *bat_priv,
if (!gw_node) if (!gw_node)
return; return;
kref_get(&orig_node->refcount); kref_init(&gw_node->refcount);
INIT_HLIST_NODE(&gw_node->list); INIT_HLIST_NODE(&gw_node->list);
kref_get(&orig_node->refcount);
gw_node->orig_node = orig_node; gw_node->orig_node = orig_node;
gw_node->bandwidth_down = ntohl(gateway->bandwidth_down); gw_node->bandwidth_down = ntohl(gateway->bandwidth_down);
gw_node->bandwidth_up = ntohl(gateway->bandwidth_up); gw_node->bandwidth_up = ntohl(gateway->bandwidth_up);
kref_init(&gw_node->refcount);
spin_lock_bh(&bat_priv->gw.list_lock); spin_lock_bh(&bat_priv->gw.list_lock);
kref_get(&gw_node->refcount);
hlist_add_head_rcu(&gw_node->list, &bat_priv->gw.list); hlist_add_head_rcu(&gw_node->list, &bat_priv->gw.list);
spin_unlock_bh(&bat_priv->gw.list_lock); spin_unlock_bh(&bat_priv->gw.list_lock);
...@@ -357,6 +358,9 @@ static void batadv_gw_node_add(struct batadv_priv *bat_priv, ...@@ -357,6 +358,9 @@ static void batadv_gw_node_add(struct batadv_priv *bat_priv,
ntohl(gateway->bandwidth_down) % 10, ntohl(gateway->bandwidth_down) % 10,
ntohl(gateway->bandwidth_up) / 10, ntohl(gateway->bandwidth_up) / 10,
ntohl(gateway->bandwidth_up) % 10); ntohl(gateway->bandwidth_up) % 10);
/* don't return reference to new gw_node */
batadv_gw_node_put(gw_node);
} }
/** /**
...@@ -478,6 +482,7 @@ void batadv_gw_node_free(struct batadv_priv *bat_priv) ...@@ -478,6 +482,7 @@ void batadv_gw_node_free(struct batadv_priv *bat_priv)
spin_unlock_bh(&bat_priv->gw.list_lock); spin_unlock_bh(&bat_priv->gw.list_lock);
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
int batadv_gw_client_seq_print_text(struct seq_file *seq, void *offset) int batadv_gw_client_seq_print_text(struct seq_file *seq, void *offset)
{ {
struct net_device *net_dev = (struct net_device *)seq->private; struct net_device *net_dev = (struct net_device *)seq->private;
...@@ -505,6 +510,7 @@ int batadv_gw_client_seq_print_text(struct seq_file *seq, void *offset) ...@@ -505,6 +510,7 @@ int batadv_gw_client_seq_print_text(struct seq_file *seq, void *offset)
return 0; return 0;
} }
#endif
/** /**
* batadv_gw_dump - Dump gateways into a message * batadv_gw_dump - Dump gateways into a message
......
...@@ -694,6 +694,7 @@ batadv_hardif_add_interface(struct net_device *net_dev) ...@@ -694,6 +694,7 @@ batadv_hardif_add_interface(struct net_device *net_dev)
INIT_HLIST_HEAD(&hard_iface->neigh_list); INIT_HLIST_HEAD(&hard_iface->neigh_list);
spin_lock_init(&hard_iface->neigh_list_lock); spin_lock_init(&hard_iface->neigh_list_lock);
kref_init(&hard_iface->refcount);
hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT; hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT;
if (batadv_is_wifi_netdev(net_dev)) if (batadv_is_wifi_netdev(net_dev))
...@@ -701,11 +702,8 @@ batadv_hardif_add_interface(struct net_device *net_dev) ...@@ -701,11 +702,8 @@ batadv_hardif_add_interface(struct net_device *net_dev)
batadv_v_hardif_init(hard_iface); batadv_v_hardif_init(hard_iface);
/* extra reference for return */
kref_init(&hard_iface->refcount);
kref_get(&hard_iface->refcount);
batadv_check_known_mac_addr(hard_iface->net_dev); batadv_check_known_mac_addr(hard_iface->net_dev);
kref_get(&hard_iface->refcount);
list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list); list_add_tail_rcu(&hard_iface->list, &batadv_hardif_list);
return hard_iface; return hard_iface;
...@@ -727,7 +725,7 @@ static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface) ...@@ -727,7 +725,7 @@ static void batadv_hardif_remove_interface(struct batadv_hard_iface *hard_iface)
/* first deactivate interface */ /* first deactivate interface */
if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
batadv_hardif_disable_interface(hard_iface, batadv_hardif_disable_interface(hard_iface,
BATADV_IF_CLEANUP_AUTO); BATADV_IF_CLEANUP_KEEP);
if (hard_iface->if_status != BATADV_IF_NOT_IN_USE) if (hard_iface->if_status != BATADV_IF_NOT_IN_USE)
return; return;
......
...@@ -26,9 +26,25 @@ struct batadv_icmp_header; ...@@ -26,9 +26,25 @@ struct batadv_icmp_header;
#define BATADV_ICMP_SOCKET "socket" #define BATADV_ICMP_SOCKET "socket"
void batadv_socket_init(void);
int batadv_socket_setup(struct batadv_priv *bat_priv); int batadv_socket_setup(struct batadv_priv *bat_priv);
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
void batadv_socket_init(void);
void batadv_socket_receive_packet(struct batadv_icmp_header *icmph, void batadv_socket_receive_packet(struct batadv_icmp_header *icmph,
size_t icmp_len); size_t icmp_len);
#else
static inline void batadv_socket_init(void)
{
}
static inline void
batadv_socket_receive_packet(struct batadv_icmp_header *icmph, size_t icmp_len)
{
}
#endif
#endif /* _NET_BATMAN_ADV_ICMP_SOCKET_H_ */ #endif /* _NET_BATMAN_ADV_ICMP_SOCKET_H_ */
...@@ -282,6 +282,7 @@ bool batadv_is_my_mac(struct batadv_priv *bat_priv, const u8 *addr) ...@@ -282,6 +282,7 @@ bool batadv_is_my_mac(struct batadv_priv *bat_priv, const u8 *addr)
return is_my_mac; return is_my_mac;
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
/** /**
* batadv_seq_print_text_primary_if_get - called from debugfs table printing * batadv_seq_print_text_primary_if_get - called from debugfs table printing
* function that requires the primary interface * function that requires the primary interface
...@@ -317,6 +318,7 @@ batadv_seq_print_text_primary_if_get(struct seq_file *seq) ...@@ -317,6 +318,7 @@ batadv_seq_print_text_primary_if_get(struct seq_file *seq)
out: out:
return primary_if; return primary_if;
} }
#endif
/** /**
* batadv_max_header_len - calculate maximum encapsulation overhead for a * batadv_max_header_len - calculate maximum encapsulation overhead for a
......
...@@ -1134,6 +1134,7 @@ void batadv_mcast_init(struct batadv_priv *bat_priv) ...@@ -1134,6 +1134,7 @@ void batadv_mcast_init(struct batadv_priv *bat_priv)
BATADV_TVLV_HANDLER_OGM_CIFNOTFND); BATADV_TVLV_HANDLER_OGM_CIFNOTFND);
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
/** /**
* batadv_mcast_flags_print_header - print own mcast flags to debugfs table * batadv_mcast_flags_print_header - print own mcast flags to debugfs table
* @bat_priv: the bat priv with all the soft interface information * @bat_priv: the bat priv with all the soft interface information
...@@ -1234,6 +1235,7 @@ int batadv_mcast_flags_seq_print_text(struct seq_file *seq, void *offset) ...@@ -1234,6 +1235,7 @@ int batadv_mcast_flags_seq_print_text(struct seq_file *seq, void *offset)
return 0; return 0;
} }
#endif
/** /**
* batadv_mcast_free - free the multicast optimizations structures * batadv_mcast_free - free the multicast optimizations structures
......
...@@ -856,14 +856,12 @@ batadv_nc_get_nc_node(struct batadv_priv *bat_priv, ...@@ -856,14 +856,12 @@ batadv_nc_get_nc_node(struct batadv_priv *bat_priv,
if (!nc_node) if (!nc_node)
return NULL; return NULL;
kref_get(&orig_neigh_node->refcount);
/* Initialize nc_node */ /* Initialize nc_node */
INIT_LIST_HEAD(&nc_node->list); INIT_LIST_HEAD(&nc_node->list);
kref_init(&nc_node->refcount);
ether_addr_copy(nc_node->addr, orig_node->orig); ether_addr_copy(nc_node->addr, orig_node->orig);
kref_get(&orig_neigh_node->refcount);
nc_node->orig_node = orig_neigh_node; nc_node->orig_node = orig_neigh_node;
kref_init(&nc_node->refcount);
kref_get(&nc_node->refcount);
/* Select ingoing or outgoing coding node */ /* Select ingoing or outgoing coding node */
if (in_coding) { if (in_coding) {
...@@ -879,6 +877,7 @@ batadv_nc_get_nc_node(struct batadv_priv *bat_priv, ...@@ -879,6 +877,7 @@ batadv_nc_get_nc_node(struct batadv_priv *bat_priv,
/* Add nc_node to orig_node */ /* Add nc_node to orig_node */
spin_lock_bh(lock); spin_lock_bh(lock);
kref_get(&nc_node->refcount);
list_add_tail_rcu(&nc_node->list, list); list_add_tail_rcu(&nc_node->list, list);
spin_unlock_bh(lock); spin_unlock_bh(lock);
...@@ -979,7 +978,6 @@ static struct batadv_nc_path *batadv_nc_get_path(struct batadv_priv *bat_priv, ...@@ -979,7 +978,6 @@ static struct batadv_nc_path *batadv_nc_get_path(struct batadv_priv *bat_priv,
INIT_LIST_HEAD(&nc_path->packet_list); INIT_LIST_HEAD(&nc_path->packet_list);
spin_lock_init(&nc_path->packet_list_lock); spin_lock_init(&nc_path->packet_list_lock);
kref_init(&nc_path->refcount); kref_init(&nc_path->refcount);
kref_get(&nc_path->refcount);
nc_path->last_valid = jiffies; nc_path->last_valid = jiffies;
ether_addr_copy(nc_path->next_hop, dst); ether_addr_copy(nc_path->next_hop, dst);
ether_addr_copy(nc_path->prev_hop, src); ether_addr_copy(nc_path->prev_hop, src);
...@@ -989,6 +987,7 @@ static struct batadv_nc_path *batadv_nc_get_path(struct batadv_priv *bat_priv, ...@@ -989,6 +987,7 @@ static struct batadv_nc_path *batadv_nc_get_path(struct batadv_priv *bat_priv,
nc_path->next_hop); nc_path->next_hop);
/* Add nc_path to hash table */ /* Add nc_path to hash table */
kref_get(&nc_path->refcount);
hash_added = batadv_hash_add(hash, batadv_nc_hash_compare, hash_added = batadv_hash_add(hash, batadv_nc_hash_compare,
batadv_nc_hash_choose, &nc_path_key, batadv_nc_hash_choose, &nc_path_key,
&nc_path->hash_entry); &nc_path->hash_entry);
...@@ -1882,6 +1881,7 @@ void batadv_nc_mesh_free(struct batadv_priv *bat_priv) ...@@ -1882,6 +1881,7 @@ void batadv_nc_mesh_free(struct batadv_priv *bat_priv)
batadv_hash_destroy(bat_priv->nc.decoding_hash); batadv_hash_destroy(bat_priv->nc.decoding_hash);
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
/** /**
* batadv_nc_nodes_seq_print_text - print the nc node information * batadv_nc_nodes_seq_print_text - print the nc node information
* @seq: seq file to print on * @seq: seq file to print on
...@@ -1981,3 +1981,4 @@ int batadv_nc_init_debugfs(struct batadv_priv *bat_priv) ...@@ -1981,3 +1981,4 @@ int batadv_nc_init_debugfs(struct batadv_priv *bat_priv)
out: out:
return -ENOMEM; return -ENOMEM;
} }
#endif
...@@ -133,9 +133,9 @@ batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node, ...@@ -133,9 +133,9 @@ batadv_orig_node_vlan_new(struct batadv_orig_node *orig_node,
goto out; goto out;
kref_init(&vlan->refcount); kref_init(&vlan->refcount);
kref_get(&vlan->refcount);
vlan->vid = vid; vlan->vid = vid;
kref_get(&vlan->refcount);
hlist_add_head_rcu(&vlan->list, &orig_node->vlan_list); hlist_add_head_rcu(&vlan->list, &orig_node->vlan_list);
out: out:
...@@ -386,6 +386,7 @@ batadv_orig_ifinfo_new(struct batadv_orig_node *orig_node, ...@@ -386,6 +386,7 @@ batadv_orig_ifinfo_new(struct batadv_orig_node *orig_node,
orig_ifinfo->if_outgoing = if_outgoing; orig_ifinfo->if_outgoing = if_outgoing;
INIT_HLIST_NODE(&orig_ifinfo->list); INIT_HLIST_NODE(&orig_ifinfo->list);
kref_init(&orig_ifinfo->refcount); kref_init(&orig_ifinfo->refcount);
kref_get(&orig_ifinfo->refcount); kref_get(&orig_ifinfo->refcount);
hlist_add_head_rcu(&orig_ifinfo->list, hlist_add_head_rcu(&orig_ifinfo->list,
&orig_node->ifinfo_list); &orig_node->ifinfo_list);
...@@ -459,9 +460,9 @@ batadv_neigh_ifinfo_new(struct batadv_neigh_node *neigh, ...@@ -459,9 +460,9 @@ batadv_neigh_ifinfo_new(struct batadv_neigh_node *neigh,
INIT_HLIST_NODE(&neigh_ifinfo->list); INIT_HLIST_NODE(&neigh_ifinfo->list);
kref_init(&neigh_ifinfo->refcount); kref_init(&neigh_ifinfo->refcount);
kref_get(&neigh_ifinfo->refcount);
neigh_ifinfo->if_outgoing = if_outgoing; neigh_ifinfo->if_outgoing = if_outgoing;
kref_get(&neigh_ifinfo->refcount);
hlist_add_head_rcu(&neigh_ifinfo->list, &neigh->ifinfo_list); hlist_add_head_rcu(&neigh_ifinfo->list, &neigh->ifinfo_list);
out: out:
...@@ -653,8 +654,8 @@ batadv_neigh_node_create(struct batadv_orig_node *orig_node, ...@@ -653,8 +654,8 @@ batadv_neigh_node_create(struct batadv_orig_node *orig_node,
/* extra reference for return */ /* extra reference for return */
kref_init(&neigh_node->refcount); kref_init(&neigh_node->refcount);
kref_get(&neigh_node->refcount);
kref_get(&neigh_node->refcount);
hlist_add_head_rcu(&neigh_node->list, &orig_node->neigh_list); hlist_add_head_rcu(&neigh_node->list, &orig_node->neigh_list);
batadv_dbg(BATADV_DBG_BATMAN, orig_node->bat_priv, batadv_dbg(BATADV_DBG_BATMAN, orig_node->bat_priv,
...@@ -692,6 +693,7 @@ batadv_neigh_node_get_or_create(struct batadv_orig_node *orig_node, ...@@ -692,6 +693,7 @@ batadv_neigh_node_get_or_create(struct batadv_orig_node *orig_node,
return batadv_neigh_node_create(orig_node, hard_iface, neigh_addr); return batadv_neigh_node_create(orig_node, hard_iface, neigh_addr);
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
/** /**
* batadv_hardif_neigh_seq_print_text - print the single hop neighbour list * batadv_hardif_neigh_seq_print_text - print the single hop neighbour list
* @seq: neighbour table seq_file struct * @seq: neighbour table seq_file struct
...@@ -725,6 +727,7 @@ int batadv_hardif_neigh_seq_print_text(struct seq_file *seq, void *offset) ...@@ -725,6 +727,7 @@ int batadv_hardif_neigh_seq_print_text(struct seq_file *seq, void *offset)
bat_priv->algo_ops->neigh.print(bat_priv, seq); bat_priv->algo_ops->neigh.print(bat_priv, seq);
return 0; return 0;
} }
#endif
/** /**
* batadv_hardif_neigh_dump - Dump to netlink the neighbor infos for a specific * batadv_hardif_neigh_dump - Dump to netlink the neighbor infos for a specific
...@@ -988,7 +991,6 @@ struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv, ...@@ -988,7 +991,6 @@ struct batadv_orig_node *batadv_orig_node_new(struct batadv_priv *bat_priv,
/* extra reference for return */ /* extra reference for return */
kref_init(&orig_node->refcount); kref_init(&orig_node->refcount);
kref_get(&orig_node->refcount);
orig_node->bat_priv = bat_priv; orig_node->bat_priv = bat_priv;
ether_addr_copy(orig_node->orig, addr); ether_addr_copy(orig_node->orig, addr);
...@@ -1339,6 +1341,7 @@ void batadv_purge_orig_ref(struct batadv_priv *bat_priv) ...@@ -1339,6 +1341,7 @@ void batadv_purge_orig_ref(struct batadv_priv *bat_priv)
_batadv_purge_orig(bat_priv); _batadv_purge_orig(bat_priv);
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
int batadv_orig_seq_print_text(struct seq_file *seq, void *offset) int batadv_orig_seq_print_text(struct seq_file *seq, void *offset)
{ {
struct net_device *net_dev = (struct net_device *)seq->private; struct net_device *net_dev = (struct net_device *)seq->private;
...@@ -1412,6 +1415,7 @@ int batadv_orig_hardif_seq_print_text(struct seq_file *seq, void *offset) ...@@ -1412,6 +1415,7 @@ int batadv_orig_hardif_seq_print_text(struct seq_file *seq, void *offset)
batadv_hardif_put(hard_iface); batadv_hardif_put(hard_iface);
return 0; return 0;
} }
#endif
/** /**
* batadv_orig_dump - Dump to netlink the originator infos for a specific * batadv_orig_dump - Dump to netlink the originator infos for a specific
......
...@@ -594,6 +594,7 @@ int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid) ...@@ -594,6 +594,7 @@ int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid)
} }
spin_lock_bh(&bat_priv->softif_vlan_list_lock); spin_lock_bh(&bat_priv->softif_vlan_list_lock);
kref_get(&vlan->refcount);
hlist_add_head_rcu(&vlan->list, &bat_priv->softif_vlan_list); hlist_add_head_rcu(&vlan->list, &bat_priv->softif_vlan_list);
spin_unlock_bh(&bat_priv->softif_vlan_list_lock); spin_unlock_bh(&bat_priv->softif_vlan_list_lock);
...@@ -604,6 +605,9 @@ int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid) ...@@ -604,6 +605,9 @@ int batadv_softif_create_vlan(struct batadv_priv *bat_priv, unsigned short vid)
bat_priv->soft_iface->dev_addr, vid, bat_priv->soft_iface->dev_addr, vid,
BATADV_NULL_IFINDEX, BATADV_NO_MARK); BATADV_NULL_IFINDEX, BATADV_NO_MARK);
/* don't return reference to new softif_vlan */
batadv_softif_vlan_put(vlan);
return 0; return 0;
} }
......
...@@ -734,7 +734,6 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const u8 *addr, ...@@ -734,7 +734,6 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const u8 *addr,
if (batadv_is_wifi_netdev(in_dev)) if (batadv_is_wifi_netdev(in_dev))
tt_local->common.flags |= BATADV_TT_CLIENT_WIFI; tt_local->common.flags |= BATADV_TT_CLIENT_WIFI;
kref_init(&tt_local->common.refcount); kref_init(&tt_local->common.refcount);
kref_get(&tt_local->common.refcount);
tt_local->last_seen = jiffies; tt_local->last_seen = jiffies;
tt_local->common.added_at = tt_local->last_seen; tt_local->common.added_at = tt_local->last_seen;
tt_local->vlan = vlan; tt_local->vlan = vlan;
...@@ -746,6 +745,7 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const u8 *addr, ...@@ -746,6 +745,7 @@ bool batadv_tt_local_add(struct net_device *soft_iface, const u8 *addr,
is_multicast_ether_addr(addr)) is_multicast_ether_addr(addr))
tt_local->common.flags |= BATADV_TT_CLIENT_NOPURGE; tt_local->common.flags |= BATADV_TT_CLIENT_NOPURGE;
kref_get(&tt_local->common.refcount);
hash_added = batadv_hash_add(bat_priv->tt.local_hash, batadv_compare_tt, hash_added = batadv_hash_add(bat_priv->tt.local_hash, batadv_compare_tt,
batadv_choose_tt, &tt_local->common, batadv_choose_tt, &tt_local->common,
&tt_local->common.hash_entry); &tt_local->common.hash_entry);
...@@ -1047,6 +1047,7 @@ static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv) ...@@ -1047,6 +1047,7 @@ static void batadv_tt_tvlv_container_update(struct batadv_priv *bat_priv)
kfree(tt_data); kfree(tt_data);
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset) int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset)
{ {
struct net_device *net_dev = (struct net_device *)seq->private; struct net_device *net_dev = (struct net_device *)seq->private;
...@@ -1114,6 +1115,7 @@ int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset) ...@@ -1114,6 +1115,7 @@ int batadv_tt_local_seq_print_text(struct seq_file *seq, void *offset)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
return 0; return 0;
} }
#endif
/** /**
* batadv_tt_local_dump_entry - Dump one TT local entry into a message * batadv_tt_local_dump_entry - Dump one TT local entry into a message
...@@ -1567,9 +1569,9 @@ batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global, ...@@ -1567,9 +1569,9 @@ batadv_tt_global_orig_entry_add(struct batadv_tt_global_entry *tt_global,
orig_entry->orig_node = orig_node; orig_entry->orig_node = orig_node;
orig_entry->ttvn = ttvn; orig_entry->ttvn = ttvn;
kref_init(&orig_entry->refcount); kref_init(&orig_entry->refcount);
kref_get(&orig_entry->refcount);
spin_lock_bh(&tt_global->list_lock); spin_lock_bh(&tt_global->list_lock);
kref_get(&orig_entry->refcount);
hlist_add_head_rcu(&orig_entry->list, hlist_add_head_rcu(&orig_entry->list,
&tt_global->orig_list); &tt_global->orig_list);
spin_unlock_bh(&tt_global->list_lock); spin_unlock_bh(&tt_global->list_lock);
...@@ -1645,13 +1647,13 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv, ...@@ -1645,13 +1647,13 @@ static bool batadv_tt_global_add(struct batadv_priv *bat_priv,
if (flags & BATADV_TT_CLIENT_ROAM) if (flags & BATADV_TT_CLIENT_ROAM)
tt_global_entry->roam_at = jiffies; tt_global_entry->roam_at = jiffies;
kref_init(&common->refcount); kref_init(&common->refcount);
kref_get(&common->refcount);
common->added_at = jiffies; common->added_at = jiffies;
INIT_HLIST_HEAD(&tt_global_entry->orig_list); INIT_HLIST_HEAD(&tt_global_entry->orig_list);
atomic_set(&tt_global_entry->orig_list_count, 0); atomic_set(&tt_global_entry->orig_list_count, 0);
spin_lock_init(&tt_global_entry->list_lock); spin_lock_init(&tt_global_entry->list_lock);
kref_get(&common->refcount);
hash_added = batadv_hash_add(bat_priv->tt.global_hash, hash_added = batadv_hash_add(bat_priv->tt.global_hash,
batadv_compare_tt, batadv_compare_tt,
batadv_choose_tt, common, batadv_choose_tt, common,
...@@ -1796,6 +1798,7 @@ batadv_transtable_best_orig(struct batadv_priv *bat_priv, ...@@ -1796,6 +1798,7 @@ batadv_transtable_best_orig(struct batadv_priv *bat_priv,
return best_entry; return best_entry;
} }
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
/** /**
* batadv_tt_global_print_entry - print all orig nodes who announce the address * batadv_tt_global_print_entry - print all orig nodes who announce the address
* for this global entry * for this global entry
...@@ -1919,6 +1922,7 @@ int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset) ...@@ -1919,6 +1922,7 @@ int batadv_tt_global_seq_print_text(struct seq_file *seq, void *offset)
batadv_hardif_put(primary_if); batadv_hardif_put(primary_if);
return 0; return 0;
} }
#endif
/** /**
* batadv_tt_global_dump_subentry - Dump all TT local entries into a message * batadv_tt_global_dump_subentry - Dump all TT local entries into a message
......
...@@ -257,8 +257,13 @@ void batadv_tvlv_container_register(struct batadv_priv *bat_priv, ...@@ -257,8 +257,13 @@ void batadv_tvlv_container_register(struct batadv_priv *bat_priv,
spin_lock_bh(&bat_priv->tvlv.container_list_lock); spin_lock_bh(&bat_priv->tvlv.container_list_lock);
tvlv_old = batadv_tvlv_container_get(bat_priv, type, version); tvlv_old = batadv_tvlv_container_get(bat_priv, type, version);
batadv_tvlv_container_remove(bat_priv, tvlv_old); batadv_tvlv_container_remove(bat_priv, tvlv_old);
kref_get(&tvlv_new->refcount);
hlist_add_head(&tvlv_new->list, &bat_priv->tvlv.container_list); hlist_add_head(&tvlv_new->list, &bat_priv->tvlv.container_list);
spin_unlock_bh(&bat_priv->tvlv.container_list_lock); spin_unlock_bh(&bat_priv->tvlv.container_list_lock);
/* don't return reference to new tvlv_container */
batadv_tvlv_container_put(tvlv_new);
} }
/** /**
...@@ -542,8 +547,12 @@ void batadv_tvlv_handler_register(struct batadv_priv *bat_priv, ...@@ -542,8 +547,12 @@ void batadv_tvlv_handler_register(struct batadv_priv *bat_priv,
INIT_HLIST_NODE(&tvlv_handler->list); INIT_HLIST_NODE(&tvlv_handler->list);
spin_lock_bh(&bat_priv->tvlv.handler_list_lock); spin_lock_bh(&bat_priv->tvlv.handler_list_lock);
kref_get(&tvlv_handler->refcount);
hlist_add_head_rcu(&tvlv_handler->list, &bat_priv->tvlv.handler_list); hlist_add_head_rcu(&tvlv_handler->list, &bat_priv->tvlv.handler_list);
spin_unlock_bh(&bat_priv->tvlv.handler_list_lock); spin_unlock_bh(&bat_priv->tvlv.handler_list_lock);
/* don't return reference to new tvlv_handler */
batadv_tvlv_handler_put(tvlv_handler);
} }
/** /**
......
...@@ -1431,7 +1431,9 @@ struct batadv_algo_neigh_ops { ...@@ -1431,7 +1431,9 @@ struct batadv_algo_neigh_ops {
struct batadv_hard_iface *if_outgoing1, struct batadv_hard_iface *if_outgoing1,
struct batadv_neigh_node *neigh2, struct batadv_neigh_node *neigh2,
struct batadv_hard_iface *if_outgoing2); struct batadv_hard_iface *if_outgoing2);
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
void (*print)(struct batadv_priv *priv, struct seq_file *seq); void (*print)(struct batadv_priv *priv, struct seq_file *seq);
#endif
void (*dump)(struct sk_buff *msg, struct netlink_callback *cb, void (*dump)(struct sk_buff *msg, struct netlink_callback *cb,
struct batadv_priv *priv, struct batadv_priv *priv,
struct batadv_hard_iface *hard_iface); struct batadv_hard_iface *hard_iface);
...@@ -1453,8 +1455,10 @@ struct batadv_algo_orig_ops { ...@@ -1453,8 +1455,10 @@ struct batadv_algo_orig_ops {
int (*add_if)(struct batadv_orig_node *orig_node, int max_if_num); int (*add_if)(struct batadv_orig_node *orig_node, int max_if_num);
int (*del_if)(struct batadv_orig_node *orig_node, int max_if_num, int (*del_if)(struct batadv_orig_node *orig_node, int max_if_num,
int del_if_num); int del_if_num);
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
void (*print)(struct batadv_priv *priv, struct seq_file *seq, void (*print)(struct batadv_priv *priv, struct seq_file *seq,
struct batadv_hard_iface *hard_iface); struct batadv_hard_iface *hard_iface);
#endif
void (*dump)(struct sk_buff *msg, struct netlink_callback *cb, void (*dump)(struct sk_buff *msg, struct netlink_callback *cb,
struct batadv_priv *priv, struct batadv_priv *priv,
struct batadv_hard_iface *hard_iface); struct batadv_hard_iface *hard_iface);
...@@ -1480,7 +1484,9 @@ struct batadv_algo_gw_ops { ...@@ -1480,7 +1484,9 @@ struct batadv_algo_gw_ops {
bool (*is_eligible)(struct batadv_priv *bat_priv, bool (*is_eligible)(struct batadv_priv *bat_priv,
struct batadv_orig_node *curr_gw_orig, struct batadv_orig_node *curr_gw_orig,
struct batadv_orig_node *orig_node); struct batadv_orig_node *orig_node);
#ifdef CONFIG_BATMAN_ADV_DEBUGFS
void (*print)(struct batadv_priv *bat_priv, struct seq_file *seq); void (*print)(struct batadv_priv *bat_priv, struct seq_file *seq);
#endif
void (*dump)(struct sk_buff *msg, struct netlink_callback *cb, void (*dump)(struct sk_buff *msg, struct netlink_callback *cb,
struct batadv_priv *priv); struct batadv_priv *priv);
}; };
......
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