aboutsummaryrefslogtreecommitdiffstats
path: root/net/batman-adv/bat_v.c
diff options
context:
space:
mode:
authorAntonio Quartulli <antonio@open-mesh.com>2016-01-16 03:40:17 -0500
committerAntonio Quartulli <a@unstable.cc>2016-02-29 03:25:07 -0500
commit9786906022eba35763b17c54a35913ca65151a78 (patch)
treed56cfd2459a6e91de5ae269e16c848c05b5ce19b /net/batman-adv/bat_v.c
parent8d2d499e08145d9851097e1241ef15aad8c9170a (diff)
batman-adv: B.A.T.M.A.N. V - implement neighbor comparison API calls
Signed-off-by: Antonio Quartulli <antonio@open-mesh.com> Signed-off-by: Marek Lindner <mareklindner@neomailbox.ch>
Diffstat (limited to 'net/batman-adv/bat_v.c')
-rw-r--r--net/batman-adv/bat_v.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/net/batman-adv/bat_v.c b/net/batman-adv/bat_v.c
index ff31f2af9cfe..953c0d150231 100644
--- a/net/batman-adv/bat_v.c
+++ b/net/batman-adv/bat_v.c
@@ -19,12 +19,15 @@
19#include "main.h" 19#include "main.h"
20 20
21#include <linux/atomic.h> 21#include <linux/atomic.h>
22#include <linux/bug.h>
22#include <linux/cache.h> 23#include <linux/cache.h>
23#include <linux/init.h> 24#include <linux/init.h>
25#include <linux/types.h>
24#include <linux/workqueue.h> 26#include <linux/workqueue.h>
25 27
26#include "bat_v_elp.h" 28#include "bat_v_elp.h"
27#include "bat_v_ogm.h" 29#include "bat_v_ogm.h"
30#include "originator.h"
28#include "packet.h" 31#include "packet.h"
29 32
30static int batadv_v_iface_enable(struct batadv_hard_iface *hard_iface) 33static int batadv_v_iface_enable(struct batadv_hard_iface *hard_iface)
@@ -78,6 +81,39 @@ static void batadv_v_ogm_emit(struct batadv_forw_packet *forw_packet)
78{ 81{
79} 82}
80 83
84static int batadv_v_neigh_cmp(struct batadv_neigh_node *neigh1,
85 struct batadv_hard_iface *if_outgoing1,
86 struct batadv_neigh_node *neigh2,
87 struct batadv_hard_iface *if_outgoing2)
88{
89 struct batadv_neigh_ifinfo *ifinfo1, *ifinfo2;
90
91 ifinfo1 = batadv_neigh_ifinfo_get(neigh1, if_outgoing1);
92 ifinfo2 = batadv_neigh_ifinfo_get(neigh2, if_outgoing2);
93
94 if (WARN_ON(!ifinfo1 || !ifinfo2))
95 return 0;
96
97 return ifinfo1->bat_v.throughput - ifinfo2->bat_v.throughput;
98}
99
100static bool batadv_v_neigh_is_sob(struct batadv_neigh_node *neigh1,
101 struct batadv_hard_iface *if_outgoing1,
102 struct batadv_neigh_node *neigh2,
103 struct batadv_hard_iface *if_outgoing2)
104{
105 struct batadv_neigh_ifinfo *ifinfo1, *ifinfo2;
106 u32 threshold;
107
108 ifinfo1 = batadv_neigh_ifinfo_get(neigh1, if_outgoing1);
109 ifinfo2 = batadv_neigh_ifinfo_get(neigh2, if_outgoing2);
110
111 threshold = ifinfo1->bat_v.throughput / 4;
112 threshold = ifinfo1->bat_v.throughput - threshold;
113
114 return ifinfo2->bat_v.throughput > threshold;
115}
116
81static struct batadv_algo_ops batadv_batman_v __read_mostly = { 117static struct batadv_algo_ops batadv_batman_v __read_mostly = {
82 .name = "BATMAN_V", 118 .name = "BATMAN_V",
83 .bat_iface_enable = batadv_v_iface_enable, 119 .bat_iface_enable = batadv_v_iface_enable,
@@ -87,6 +123,8 @@ static struct batadv_algo_ops batadv_batman_v __read_mostly = {
87 .bat_hardif_neigh_init = batadv_v_hardif_neigh_init, 123 .bat_hardif_neigh_init = batadv_v_hardif_neigh_init,
88 .bat_ogm_emit = batadv_v_ogm_emit, 124 .bat_ogm_emit = batadv_v_ogm_emit,
89 .bat_ogm_schedule = batadv_v_ogm_schedule, 125 .bat_ogm_schedule = batadv_v_ogm_schedule,
126 .bat_neigh_cmp = batadv_v_neigh_cmp,
127 .bat_neigh_is_similar_or_better = batadv_v_neigh_is_sob,
90}; 128};
91 129
92/** 130/**