* [B.A.T.M.A.N.] [PATCHv3 1/4] batman-adv: add list of unique single hop neighbors per hard-interface
@ 2015-08-04 13:09 Marek Lindner
2015-08-04 13:09 ` [B.A.T.M.A.N.] [PATCHv3 2/4] batman-adv: add bat_hardif_neigh_init algo ops call Marek Lindner
` (3 more replies)
0 siblings, 4 replies; 9+ messages in thread
From: Marek Lindner @ 2015-08-04 13:09 UTC (permalink / raw)
To: b.a.t.m.a.n; +Cc: Marek Lindner
Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
---
v3: prevent inconsistencies when adding new neighbors
v2: last_seen added & checkpatch cleaner
net/batman-adv/hard-interface.c | 3 +
net/batman-adv/originator.c | 156 ++++++++++++++++++++++++++++++++++++++++
net/batman-adv/originator.h | 7 ++
net/batman-adv/types.h | 22 ++++++
4 files changed, 188 insertions(+)
diff --git a/net/batman-adv/hard-interface.c b/net/batman-adv/hard-interface.c
index f4a15d2..608ea4a 100644
--- a/net/batman-adv/hard-interface.c
+++ b/net/batman-adv/hard-interface.c
@@ -596,9 +596,12 @@ batadv_hardif_add_interface(struct net_device *net_dev)
goto free_sysfs;
INIT_LIST_HEAD(&hard_iface->list);
+ INIT_HLIST_HEAD(&hard_iface->neigh_list);
INIT_WORK(&hard_iface->cleanup_work,
batadv_hardif_remove_interface_finish);
+ spin_lock_init(&hard_iface->neigh_list_lock);
+
hard_iface->num_bcasts = BATADV_NUM_BCASTS_DEFAULT;
if (batadv_is_wifi_netdev(net_dev))
hard_iface->num_bcasts = BATADV_NUM_BCASTS_WIRELESS;
diff --git a/net/batman-adv/originator.c b/net/batman-adv/originator.c
index 7b03fa9..4029bbe 100644
--- a/net/batman-adv/originator.c
+++ b/net/batman-adv/originator.c
@@ -202,6 +202,46 @@ void batadv_neigh_ifinfo_free_ref(struct batadv_neigh_ifinfo *neigh_ifinfo)
}
/**
+ * batadv_hardif_neigh_free_rcu - free the hardif neigh_node
+ * @rcu: rcu pointer of the neigh_node
+ */
+static void batadv_hardif_neigh_free_rcu(struct rcu_head *rcu)
+{
+ struct batadv_hardif_neigh_node *hardif_neigh;
+
+ hardif_neigh = container_of(rcu, struct batadv_hardif_neigh_node, rcu);
+
+ spin_lock_bh(&hardif_neigh->if_incoming->neigh_list_lock);
+ hlist_del_init_rcu(&hardif_neigh->list);
+ spin_unlock_bh(&hardif_neigh->if_incoming->neigh_list_lock);
+
+ batadv_hardif_free_ref_now(hardif_neigh->if_incoming);
+ kfree(hardif_neigh);
+}
+
+/**
+ * batadv_hardif_neigh_free_now - decrement the hardif neighbors refcounter
+ * and possibly free it (without rcu callback)
+ * @hardif_neigh: hardif neigh neighbor to free
+ */
+void batadv_hardif_neigh_free_now(struct batadv_hardif_neigh_node *hardif_neigh)
+{
+ if (atomic_dec_and_test(&hardif_neigh->refcount))
+ batadv_hardif_neigh_free_rcu(&hardif_neigh->rcu);
+}
+
+/**
+ * batadv_hardif_neigh_free_ref - decrement the hardif neighbors refcounter
+ * and possibly free it
+ * @hardif_neigh: hardif neigh neighbor to free
+ */
+void batadv_hardif_neigh_free_ref(struct batadv_hardif_neigh_node *hardif_neigh)
+{
+ if (atomic_dec_and_test(&hardif_neigh->refcount))
+ call_rcu(&hardif_neigh->rcu, batadv_hardif_neigh_free_rcu);
+}
+
+/**
* batadv_neigh_node_free_rcu - free the neigh_node
* @rcu: rcu pointer of the neigh_node
*/
@@ -209,6 +249,7 @@ static void batadv_neigh_node_free_rcu(struct rcu_head *rcu)
{
struct hlist_node *node_tmp;
struct batadv_neigh_node *neigh_node;
+ struct batadv_hardif_neigh_node *hardif_neigh;
struct batadv_neigh_ifinfo *neigh_ifinfo;
struct batadv_algo_ops *bao;
@@ -220,6 +261,14 @@ static void batadv_neigh_node_free_rcu(struct rcu_head *rcu)
batadv_neigh_ifinfo_free_ref_now(neigh_ifinfo);
}
+ hardif_neigh = batadv_hardif_neigh_get(neigh_node->if_incoming,
+ neigh_node->addr);
+ if (hardif_neigh) {
+ /* batadv_hardif_neigh_get() increases refcount too */
+ batadv_hardif_neigh_free_now(hardif_neigh);
+ batadv_hardif_neigh_free_now(hardif_neigh);
+ }
+
if (bao->bat_neigh_free)
bao->bat_neigh_free(neigh_node);
@@ -443,6 +492,102 @@ out:
}
/**
+ * batadv_hardif_neigh_create - create a hardif neighbour node
+ * @hard_iface: the interface this neighbour is connected to
+ * @neigh_addr: the interface address of the neighbour to retrieve
+ *
+ * Returns the hardif neighbour node if found or created or NULL otherwise.
+ */
+static struct batadv_hardif_neigh_node *
+batadv_hardif_neigh_create(struct batadv_hard_iface *hard_iface,
+ const u8 *neigh_addr)
+{
+ struct batadv_hardif_neigh_node *hardif_neigh = NULL;
+
+ spin_lock_bh(&hard_iface->neigh_list_lock);
+
+ /* check if neighbor hasn't been added in the meantime */
+ hardif_neigh = batadv_hardif_neigh_get(hard_iface, neigh_addr);
+ if (hardif_neigh)
+ goto out;
+
+ if (!atomic_inc_not_zero(&hard_iface->refcount))
+ goto out;
+
+ hardif_neigh = kzalloc(sizeof(*hardif_neigh), GFP_ATOMIC);
+ if (!hardif_neigh) {
+ batadv_hardif_free_ref(hard_iface);
+ goto out;
+ }
+
+ INIT_HLIST_NODE(&hardif_neigh->list);
+ ether_addr_copy(hardif_neigh->addr, neigh_addr);
+ hardif_neigh->if_incoming = hard_iface;
+ hardif_neigh->last_seen = jiffies;
+
+ atomic_set(&hardif_neigh->refcount, 1);
+
+ hlist_add_head(&hardif_neigh->list, &hard_iface->neigh_list);
+
+out:
+ spin_unlock_bh(&hard_iface->neigh_list_lock);
+ return hardif_neigh;
+}
+
+/**
+ * batadv_hardif_neigh_get_or_create - retrieve or create a hardif neighbour
+ * node
+ * @hard_iface: the interface this neighbour is connected to
+ * @neigh_addr: the interface address of the neighbour to retrieve
+ *
+ * Returns the hardif neighbour node if found or created or NULL otherwise.
+ */
+static struct batadv_hardif_neigh_node *
+batadv_hardif_neigh_get_or_create(struct batadv_hard_iface *hard_iface,
+ const u8 *neigh_addr)
+{
+ struct batadv_hardif_neigh_node *hardif_neigh = NULL;
+
+ /* first check without locking to avoid the overhead */
+ hardif_neigh = batadv_hardif_neigh_get(hard_iface, neigh_addr);
+ if (hardif_neigh)
+ return hardif_neigh;
+
+ return batadv_hardif_neigh_create(hard_iface, neigh_addr);
+}
+
+/**
+ * batadv_hardif_neigh_get - retrieve a hardif neighbour from the list
+ * @hard_iface: the interface where this neighbour is connected to
+ * @neigh_addr: the address of the neighbour
+ *
+ * Looks for and possibly returns a neighbour belonging to this hard interface.
+ * Returns NULL if the neighbour is not found.
+ */
+struct batadv_hardif_neigh_node *
+batadv_hardif_neigh_get(const struct batadv_hard_iface *hard_iface,
+ const u8 *neigh_addr)
+{
+ struct batadv_hardif_neigh_node *tmp_hardif_neigh, *hardif_neigh = NULL;
+
+ rcu_read_lock();
+ hlist_for_each_entry_rcu(tmp_hardif_neigh,
+ &hard_iface->neigh_list, list) {
+ if (!batadv_compare_eth(tmp_hardif_neigh->addr, neigh_addr))
+ continue;
+
+ if (!atomic_inc_not_zero(&tmp_hardif_neigh->refcount))
+ continue;
+
+ hardif_neigh = tmp_hardif_neigh;
+ break;
+ }
+ rcu_read_unlock();
+
+ return hardif_neigh;
+}
+
+/**
* 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
@@ -457,11 +602,17 @@ batadv_neigh_node_new(struct batadv_orig_node *orig_node,
const u8 *neigh_addr)
{
struct batadv_neigh_node *neigh_node;
+ struct batadv_hardif_neigh_node *hardif_neigh = NULL;
neigh_node = batadv_neigh_node_get(orig_node, hard_iface, neigh_addr);
if (neigh_node)
goto out;
+ hardif_neigh = batadv_hardif_neigh_get_or_create(hard_iface,
+ neigh_addr);
+ if (!hardif_neigh)
+ goto out;
+
neigh_node = kzalloc(sizeof(*neigh_node), GFP_ATOMIC);
if (!neigh_node)
goto out;
@@ -488,11 +639,16 @@ batadv_neigh_node_new(struct batadv_orig_node *orig_node,
hlist_add_head_rcu(&neigh_node->list, &orig_node->neigh_list);
spin_unlock_bh(&orig_node->neigh_list_lock);
+ /* increment unique neighbor refcount */
+ atomic_inc(&hardif_neigh->refcount);
+
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:
+ if (hardif_neigh)
+ batadv_hardif_neigh_free_ref(hardif_neigh);
return neigh_node;
}
diff --git a/net/batman-adv/originator.h b/net/batman-adv/originator.h
index fde3438..458ce81 100644
--- a/net/batman-adv/originator.h
+++ b/net/batman-adv/originator.h
@@ -41,6 +41,13 @@ void batadv_orig_node_free_ref(struct batadv_orig_node *orig_node);
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_hardif_neigh_node *
+batadv_hardif_neigh_get(const struct batadv_hard_iface *hard_iface,
+ const u8 *neigh_addr);
+void
+batadv_hardif_neigh_free_ref(struct batadv_hardif_neigh_node *hardif_neigh);
+void
+batadv_hardif_neigh_free_now(struct batadv_hardif_neigh_node *hardif_neigh);
struct batadv_neigh_node *
batadv_neigh_node_get(const struct batadv_orig_node *orig_node,
const struct batadv_hard_iface *hard_iface,
diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h
index d260efd..71c7d9f 100644
--- a/net/batman-adv/types.h
+++ b/net/batman-adv/types.h
@@ -100,6 +100,8 @@ struct batadv_hard_iface_bat_iv {
* @bat_iv: BATMAN IV specific per hard interface data
* @cleanup_work: work queue callback item for hard interface deinit
* @debug_dir: dentry for nc subdir in batman-adv directory in debugfs
+ * @neigh_list: list of unique single hop neighbors via this interface
+ * @neigh_list_lock: lock protecting neigh_list
*/
struct batadv_hard_iface {
struct list_head list;
@@ -115,6 +117,9 @@ struct batadv_hard_iface {
struct batadv_hard_iface_bat_iv bat_iv;
struct work_struct cleanup_work;
struct dentry *debug_dir;
+ struct hlist_head neigh_list;
+ /* neigh_list_lock protects: neigh_list */
+ spinlock_t neigh_list_lock;
};
/**
@@ -341,6 +346,23 @@ struct batadv_gw_node {
};
/**
+ * batadv_hardif_neigh_node - unique neighbor per hard interface
+ * @list: list node for batadv_hard_iface::neigh_list
+ * @addr: the MAC address of the neighboring interface
+ * @if_incoming: pointer to incoming hard interface
+ * @refcount: number of contexts the object is used
+ * @rcu: struct used for freeing in a RCU-safe manner
+ */
+struct batadv_hardif_neigh_node {
+ struct hlist_node list;
+ u8 addr[ETH_ALEN];
+ struct batadv_hard_iface *if_incoming;
+ unsigned long last_seen;
+ atomic_t refcount;
+ struct rcu_head rcu;
+};
+
+/**
* struct batadv_neigh_node - structure for single hops neighbors
* @list: list node for batadv_orig_node::neigh_list
* @orig_node: pointer to corresponding orig_node
--
2.5.0
^ permalink raw reply related [flat|nested] 9+ messages in thread* [B.A.T.M.A.N.] [PATCHv3 2/4] batman-adv: add bat_hardif_neigh_init algo ops call 2015-08-04 13:09 [B.A.T.M.A.N.] [PATCHv3 1/4] batman-adv: add list of unique single hop neighbors per hard-interface Marek Lindner @ 2015-08-04 13:09 ` Marek Lindner 2015-08-06 12:55 ` Marek Lindner 2015-08-04 13:09 ` [B.A.T.M.A.N.] [PATCHv3 3/4] batman-adv: export singe hop neighbor list via debugfs Marek Lindner ` (2 subsequent siblings) 3 siblings, 1 reply; 9+ messages in thread From: Marek Lindner @ 2015-08-04 13:09 UTC (permalink / raw) To: b.a.t.m.a.n; +Cc: Marek Lindner Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch> --- v3: no change v2: no change net/batman-adv/originator.c | 4 ++++ net/batman-adv/types.h | 2 ++ 2 files changed, 6 insertions(+) diff --git a/net/batman-adv/originator.c b/net/batman-adv/originator.c index 4029bbe..db949b8 100644 --- a/net/batman-adv/originator.c +++ b/net/batman-adv/originator.c @@ -527,6 +527,9 @@ batadv_hardif_neigh_create(struct batadv_hard_iface *hard_iface, atomic_set(&hardif_neigh->refcount, 1); + if (bat_priv->bat_algo_ops->bat_hardif_neigh_init) + bat_priv->bat_algo_ops->bat_hardif_neigh_init(hardif_neigh); + hlist_add_head(&hardif_neigh->list, &hard_iface->neigh_list); out: @@ -547,6 +550,7 @@ batadv_hardif_neigh_get_or_create(struct batadv_hard_iface *hard_iface, const u8 *neigh_addr) { struct batadv_hardif_neigh_node *hardif_neigh = NULL; + struct batadv_priv *bat_priv = netdev_priv(hard_iface->soft_iface); /* first check without locking to avoid the overhead */ hardif_neigh = batadv_hardif_neigh_get(hard_iface, neigh_addr); diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h index 71c7d9f..838d55e 100644 --- a/net/batman-adv/types.h +++ b/net/batman-adv/types.h @@ -1153,6 +1153,7 @@ struct batadv_forw_packet { * @bat_primary_iface_set: called when primary interface is selected / changed * @bat_ogm_schedule: prepare a new outgoing OGM for the send queue * @bat_ogm_emit: send scheduled OGM + * @bat_hardif_neigh_init: called on creation of single hop entry * @bat_neigh_cmp: compare the metrics of two neighbors for their respective * outgoing interfaces * @bat_neigh_is_equiv_or_better: check if neigh1 is equally good or better @@ -1178,6 +1179,7 @@ struct batadv_algo_ops { void (*bat_ogm_schedule)(struct batadv_hard_iface *hard_iface); void (*bat_ogm_emit)(struct batadv_forw_packet *forw_packet); /* neigh_node handling API */ + void (*bat_hardif_neigh_init)(struct batadv_hardif_neigh_node *neigh); int (*bat_neigh_cmp)(struct batadv_neigh_node *neigh1, struct batadv_hard_iface *if_outgoing1, struct batadv_neigh_node *neigh2, -- 2.5.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCHv3 2/4] batman-adv: add bat_hardif_neigh_init algo ops call 2015-08-04 13:09 ` [B.A.T.M.A.N.] [PATCHv3 2/4] batman-adv: add bat_hardif_neigh_init algo ops call Marek Lindner @ 2015-08-06 12:55 ` Marek Lindner 0 siblings, 0 replies; 9+ messages in thread From: Marek Lindner @ 2015-08-06 12:55 UTC (permalink / raw) To: The list for a Better Approach To Mobile Ad-hoc Networking [-- Attachment #1: Type: text/plain, Size: 319 bytes --] On Tuesday, August 04, 2015 21:09:56 Marek Lindner wrote: > Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch> > --- > v3: no change > v2: no change > > net/batman-adv/originator.c | 4 ++++ > net/batman-adv/types.h | 2 ++ > 2 files changed, 6 insertions(+) Applied in revision e46832d. Regards, Marek [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 473 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* [B.A.T.M.A.N.] [PATCHv3 3/4] batman-adv: export singe hop neighbor list via debugfs 2015-08-04 13:09 [B.A.T.M.A.N.] [PATCHv3 1/4] batman-adv: add list of unique single hop neighbors per hard-interface Marek Lindner 2015-08-04 13:09 ` [B.A.T.M.A.N.] [PATCHv3 2/4] batman-adv: add bat_hardif_neigh_init algo ops call Marek Lindner @ 2015-08-04 13:09 ` Marek Lindner 2015-08-04 20:48 ` Sven Eckelmann 2015-08-04 13:09 ` [B.A.T.M.A.N.] [PATCHv3 4/4] batman-adv: update last seen field of single hop originators Marek Lindner 2015-08-06 12:49 ` [B.A.T.M.A.N.] [PATCHv3 1/4] batman-adv: add list of unique single hop neighbors per hard-interface Marek Lindner 3 siblings, 1 reply; 9+ messages in thread From: Marek Lindner @ 2015-08-04 13:09 UTC (permalink / raw) To: b.a.t.m.a.n; +Cc: Marek Lindner Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch> --- v3: no change v2: last_seen printed & checkpatch cleaner net/batman-adv/bat_iv_ogm.c | 52 +++++++++++++++++++++++++++++++++++++++++++++ net/batman-adv/debugfs.c | 9 ++++++++ net/batman-adv/originator.c | 34 +++++++++++++++++++++++++++++ net/batman-adv/originator.h | 2 ++ net/batman-adv/types.h | 2 ++ 5 files changed, 99 insertions(+) diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c index 912d9c3..39fab03 100644 --- a/net/batman-adv/bat_iv_ogm.c +++ b/net/batman-adv/bat_iv_ogm.c @@ -1862,6 +1862,57 @@ next: } /** + * batadv_iv_hardif_neigh_print - print a single hop neighbour node + * @seq: neighbour table seq_file struct + * @hardif_neigh: hardif neighbour information + */ +static void +batadv_iv_hardif_neigh_print(struct seq_file *seq, + struct batadv_hardif_neigh_node *hardif_neigh) +{ + int last_secs, last_msecs; + + last_secs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen) / 1000; + last_msecs = jiffies_to_msecs(jiffies - hardif_neigh->last_seen) % 1000; + + seq_printf(seq, " %10s %pM %4i.%03is\n", + hardif_neigh->if_incoming->net_dev->name, + hardif_neigh->addr, last_secs, last_msecs); +} + +/** + * batadv_iv_ogm_neigh_print - print the single hop neighbour list + * @bat_priv: the bat priv with all the soft interface information + * @seq: neighbour table seq_file struct + */ +void batadv_iv_neigh_print(struct batadv_priv *bat_priv, struct seq_file *seq) +{ + struct net_device *net_dev = (struct net_device *)seq->private; + struct batadv_hardif_neigh_node *hardif_neigh; + struct batadv_hard_iface *hard_iface; + int batman_count = 0; + + seq_printf(seq, " %10s %-13s %s\n", + "IF", "Neighbor", "last-seen"); + + rcu_read_lock(); + list_for_each_entry_rcu(hard_iface, &batadv_hardif_list, list) { + if (hard_iface->soft_iface != net_dev) + continue; + + hlist_for_each_entry_rcu(hardif_neigh, + &hard_iface->neigh_list, list) { + batadv_iv_hardif_neigh_print(seq, hardif_neigh); + batman_count++; + } + } + rcu_read_unlock(); + + if (batman_count == 0) + seq_puts(seq, "No batman nodes in range ...\n"); +} + +/** * batadv_iv_ogm_neigh_cmp - compare the metrics of two neighbors * @neigh1: the first neighbor object of the comparison * @if_outgoing1: outgoing interface for the first neighbor @@ -1954,6 +2005,7 @@ static struct batadv_algo_ops batadv_batman_iv __read_mostly = { .bat_ogm_emit = batadv_iv_ogm_emit, .bat_neigh_cmp = batadv_iv_ogm_neigh_cmp, .bat_neigh_is_equiv_or_better = batadv_iv_ogm_neigh_is_eob, + .bat_neigh_print = batadv_iv_neigh_print, .bat_orig_print = batadv_iv_ogm_orig_print, .bat_orig_free = batadv_iv_ogm_orig_free, .bat_orig_add_if = batadv_iv_ogm_orig_add_if, diff --git a/net/batman-adv/debugfs.c b/net/batman-adv/debugfs.c index c4c1e80..037ad0a 100644 --- a/net/batman-adv/debugfs.c +++ b/net/batman-adv/debugfs.c @@ -262,6 +262,13 @@ static int batadv_algorithms_open(struct inode *inode, struct file *file) return single_open(file, batadv_algo_seq_print_text, NULL); } +static int neighbors_open(struct inode *inode, struct file *file) +{ + struct net_device *net_dev = (struct net_device *)inode->i_private; + + return single_open(file, batadv_hardif_neigh_seq_print_text, net_dev); +} + static int batadv_originators_open(struct inode *inode, struct file *file) { struct net_device *net_dev = (struct net_device *)inode->i_private; @@ -375,6 +382,7 @@ static struct batadv_debuginfo *batadv_general_debuginfos[] = { }; /* The following attributes are per soft interface */ +static BATADV_DEBUGINFO(neighbors, S_IRUGO, neighbors_open); static BATADV_DEBUGINFO(originators, S_IRUGO, batadv_originators_open); static BATADV_DEBUGINFO(gateways, S_IRUGO, batadv_gateways_open); static BATADV_DEBUGINFO(transtable_global, S_IRUGO, @@ -394,6 +402,7 @@ static BATADV_DEBUGINFO(nc_nodes, S_IRUGO, batadv_nc_nodes_open); #endif static struct batadv_debuginfo *batadv_mesh_debuginfos[] = { + &batadv_debuginfo_neighbors, &batadv_debuginfo_originators, &batadv_debuginfo_gateways, &batadv_debuginfo_transtable_global, diff --git a/net/batman-adv/originator.c b/net/batman-adv/originator.c index db949b8..56a83d8 100644 --- a/net/batman-adv/originator.c +++ b/net/batman-adv/originator.c @@ -693,6 +693,40 @@ batadv_neigh_node_get(const struct batadv_orig_node *orig_node, } /** + * batadv_hardif_neigh_seq_print_text - print the single hop neighbour list + * @seq: neighbour table seq_file struct + * @offset: not used + * + * Always returns 0. + */ +int batadv_hardif_neigh_seq_print_text(struct seq_file *seq, void *offset) +{ + struct net_device *net_dev = (struct net_device *)seq->private; + struct batadv_priv *bat_priv = netdev_priv(net_dev); + struct batadv_hard_iface *primary_if; + + primary_if = batadv_seq_print_text_primary_if_get(seq); + if (!primary_if) + return 0; + + seq_printf(seq, "[B.A.T.M.A.N. adv %s, MainIF/MAC: %s/%pM (%s %s)]\n", + BATADV_SOURCE_VERSION, primary_if->net_dev->name, + primary_if->net_dev->dev_addr, net_dev->name, + bat_priv->bat_algo_ops->name); + + batadv_hardif_free_ref(primary_if); + + if (!bat_priv->bat_algo_ops->bat_neigh_print) { + seq_puts(seq, + "No printing function for this routing protocol\n"); + return 0; + } + + bat_priv->bat_algo_ops->bat_neigh_print(bat_priv, seq); + return 0; +} + +/** * batadv_orig_ifinfo_free_rcu - free the orig_ifinfo object * @rcu: rcu pointer of the orig_ifinfo object */ diff --git a/net/batman-adv/originator.h b/net/batman-adv/originator.h index 458ce81..493632f 100644 --- a/net/batman-adv/originator.h +++ b/net/batman-adv/originator.h @@ -68,6 +68,8 @@ batadv_neigh_ifinfo_get(struct batadv_neigh_node *neigh, struct batadv_hard_iface *if_outgoing); void batadv_neigh_ifinfo_free_ref(struct batadv_neigh_ifinfo *neigh_ifinfo); +int batadv_hardif_neigh_seq_print_text(struct seq_file *seq, void *offset); + struct batadv_orig_ifinfo * batadv_orig_ifinfo_get(struct batadv_orig_node *orig_node, struct batadv_hard_iface *if_outgoing); diff --git a/net/batman-adv/types.h b/net/batman-adv/types.h index 838d55e..78f6b48 100644 --- a/net/batman-adv/types.h +++ b/net/batman-adv/types.h @@ -1159,6 +1159,7 @@ struct batadv_forw_packet { * @bat_neigh_is_equiv_or_better: check if neigh1 is equally good or better * than neigh2 for their respective outgoing interface from the metric * prospective + * @bat_neigh_print: print the signle hop neighbor list (optional) * @bat_neigh_free: free the resources allocated by the routing algorithm for a * neigh_node object * @bat_orig_print: print the originator table (optional) @@ -1189,6 +1190,7 @@ struct batadv_algo_ops { struct batadv_hard_iface *if_outgoing1, struct batadv_neigh_node *neigh2, struct batadv_hard_iface *if_outgoing2); + void (*bat_neigh_print)(struct batadv_priv *priv, struct seq_file *seq); void (*bat_neigh_free)(struct batadv_neigh_node *neigh); /* orig_node handling API */ void (*bat_orig_print)(struct batadv_priv *priv, struct seq_file *seq, -- 2.5.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCHv3 3/4] batman-adv: export singe hop neighbor list via debugfs 2015-08-04 13:09 ` [B.A.T.M.A.N.] [PATCHv3 3/4] batman-adv: export singe hop neighbor list via debugfs Marek Lindner @ 2015-08-04 20:48 ` Sven Eckelmann 2015-08-06 12:58 ` Marek Lindner 0 siblings, 1 reply; 9+ messages in thread From: Sven Eckelmann @ 2015-08-04 20:48 UTC (permalink / raw) To: b.a.t.m.a.n; +Cc: Marek Lindner [-- Attachment #1: Type: text/plain, Size: 167 bytes --] On Tuesday 04 August 2015 21:09:57 Marek Lindner wrote: > + * @bat_neigh_print: print the signle hop neighbor list (optional) > Just a minor thing: signle -> single [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 819 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCHv3 3/4] batman-adv: export singe hop neighbor list via debugfs 2015-08-04 20:48 ` Sven Eckelmann @ 2015-08-06 12:58 ` Marek Lindner 0 siblings, 0 replies; 9+ messages in thread From: Marek Lindner @ 2015-08-06 12:58 UTC (permalink / raw) To: b.a.t.m.a.n [-- Attachment #1: Type: text/plain, Size: 299 bytes --] On Tuesday, August 04, 2015 22:48:07 Sven Eckelmann wrote: > On Tuesday 04 August 2015 21:09:57 Marek Lindner wrote: > > + * @bat_neigh_print: print the signle hop neighbor list (optional) > > Just a minor thing: signle -> single Thanks for the hint. Applied in revision 3d51cbb. Regards, Marek [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 473 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* [B.A.T.M.A.N.] [PATCHv3 4/4] batman-adv: update last seen field of single hop originators 2015-08-04 13:09 [B.A.T.M.A.N.] [PATCHv3 1/4] batman-adv: add list of unique single hop neighbors per hard-interface Marek Lindner 2015-08-04 13:09 ` [B.A.T.M.A.N.] [PATCHv3 2/4] batman-adv: add bat_hardif_neigh_init algo ops call Marek Lindner 2015-08-04 13:09 ` [B.A.T.M.A.N.] [PATCHv3 3/4] batman-adv: export singe hop neighbor list via debugfs Marek Lindner @ 2015-08-04 13:09 ` Marek Lindner 2015-08-06 13:01 ` Marek Lindner 2015-08-06 12:49 ` [B.A.T.M.A.N.] [PATCHv3 1/4] batman-adv: add list of unique single hop neighbors per hard-interface Marek Lindner 3 siblings, 1 reply; 9+ messages in thread From: Marek Lindner @ 2015-08-04 13:09 UTC (permalink / raw) To: b.a.t.m.a.n; +Cc: Marek Lindner Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch> --- v3: no change v2: new patch net/batman-adv/bat_iv_ogm.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/net/batman-adv/bat_iv_ogm.c b/net/batman-adv/bat_iv_ogm.c index 39fab03..154e36a 100644 --- a/net/batman-adv/bat_iv_ogm.c +++ b/net/batman-adv/bat_iv_ogm.c @@ -1379,6 +1379,7 @@ batadv_iv_ogm_process_per_outif(const struct sk_buff *skb, int ogm_offset, struct batadv_hard_iface *if_outgoing) { struct batadv_priv *bat_priv = netdev_priv(if_incoming->soft_iface); + struct batadv_hardif_neigh_node *hardif_neigh = NULL; struct batadv_neigh_node *router = NULL; struct batadv_neigh_node *router_router = NULL; struct batadv_orig_node *orig_neigh_node; @@ -1423,6 +1424,13 @@ batadv_iv_ogm_process_per_outif(const struct sk_buff *skb, int ogm_offset, goto out; } + if (is_single_hop_neigh) { + hardif_neigh = batadv_hardif_neigh_get(if_incoming, + ethhdr->h_source); + if (hardif_neigh) + hardif_neigh->last_seen = jiffies; + } + router = batadv_orig_router_get(orig_node, if_outgoing); if (router) { router_router = batadv_orig_router_get(router->orig_node, @@ -1557,6 +1565,8 @@ out: batadv_neigh_node_free_ref(router_router); if (orig_neigh_router) batadv_neigh_node_free_ref(orig_neigh_router); + if (hardif_neigh) + batadv_hardif_neigh_free_ref(hardif_neigh); kfree_skb(skb_priv); } -- 2.5.0 ^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCHv3 4/4] batman-adv: update last seen field of single hop originators 2015-08-04 13:09 ` [B.A.T.M.A.N.] [PATCHv3 4/4] batman-adv: update last seen field of single hop originators Marek Lindner @ 2015-08-06 13:01 ` Marek Lindner 0 siblings, 0 replies; 9+ messages in thread From: Marek Lindner @ 2015-08-06 13:01 UTC (permalink / raw) To: The list for a Better Approach To Mobile Ad-hoc Networking [-- Attachment #1: Type: text/plain, Size: 288 bytes --] On Tuesday, August 04, 2015 21:09:58 Marek Lindner wrote: > Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch> > --- > v3: no change > v2: new patch > > net/batman-adv/bat_iv_ogm.c | 10 ++++++++++ > 1 file changed, 10 insertions(+) Applied in revision 6d9f616. Regards, Marek [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 473 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [B.A.T.M.A.N.] [PATCHv3 1/4] batman-adv: add list of unique single hop neighbors per hard-interface 2015-08-04 13:09 [B.A.T.M.A.N.] [PATCHv3 1/4] batman-adv: add list of unique single hop neighbors per hard-interface Marek Lindner ` (2 preceding siblings ...) 2015-08-04 13:09 ` [B.A.T.M.A.N.] [PATCHv3 4/4] batman-adv: update last seen field of single hop originators Marek Lindner @ 2015-08-06 12:49 ` Marek Lindner 3 siblings, 0 replies; 9+ messages in thread From: Marek Lindner @ 2015-08-06 12:49 UTC (permalink / raw) To: The list for a Better Approach To Mobile Ad-hoc Networking [-- Attachment #1: Type: text/plain, Size: 528 bytes --] On Tuesday, August 04, 2015 21:09:55 Marek Lindner wrote: > Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch> > --- > v3: prevent inconsistencies when adding new neighbors > v2: last_seen added & checkpatch cleaner > > net/batman-adv/hard-interface.c | 3 + > net/batman-adv/originator.c | 156 > ++++++++++++++++++++++++++++++++++++++++ > net/batman-adv/originator.h | 7 ++ > net/batman-adv/types.h | 22 ++++++ > 4 files changed, 188 insertions(+) Applied in revision fed2826. Regards, Marek [-- Attachment #2: This is a digitally signed message part. --] [-- Type: application/pgp-signature, Size: 473 bytes --] ^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2015-08-06 13:01 UTC | newest] Thread overview: 9+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2015-08-04 13:09 [B.A.T.M.A.N.] [PATCHv3 1/4] batman-adv: add list of unique single hop neighbors per hard-interface Marek Lindner 2015-08-04 13:09 ` [B.A.T.M.A.N.] [PATCHv3 2/4] batman-adv: add bat_hardif_neigh_init algo ops call Marek Lindner 2015-08-06 12:55 ` Marek Lindner 2015-08-04 13:09 ` [B.A.T.M.A.N.] [PATCHv3 3/4] batman-adv: export singe hop neighbor list via debugfs Marek Lindner 2015-08-04 20:48 ` Sven Eckelmann 2015-08-06 12:58 ` Marek Lindner 2015-08-04 13:09 ` [B.A.T.M.A.N.] [PATCHv3 4/4] batman-adv: update last seen field of single hop originators Marek Lindner 2015-08-06 13:01 ` Marek Lindner 2015-08-06 12:49 ` [B.A.T.M.A.N.] [PATCHv3 1/4] batman-adv: add list of unique single hop neighbors per hard-interface Marek Lindner
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox