diff options
author | Antonio Quartulli <antonio@open-mesh.com> | 2016-01-16 03:40:17 -0500 |
---|---|---|
committer | Antonio Quartulli <a@unstable.cc> | 2016-02-29 03:25:07 -0500 |
commit | 9786906022eba35763b17c54a35913ca65151a78 (patch) | |
tree | d56cfd2459a6e91de5ae269e16c848c05b5ce19b /net/batman-adv/bat_v.c | |
parent | 8d2d499e08145d9851097e1241ef15aad8c9170a (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.c | 38 |
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 | ||
30 | static int batadv_v_iface_enable(struct batadv_hard_iface *hard_iface) | 33 | static 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 | ||
84 | static 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 | |||
100 | static 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 | |||
81 | static struct batadv_algo_ops batadv_batman_v __read_mostly = { | 117 | static 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 | /** |