Lines Matching refs:nr_node

47 static struct nr_node *nr_node_get(ax25_address *callsign)  in nr_node_get()
49 struct nr_node *found = NULL; in nr_node_get()
50 struct nr_node *nr_node; in nr_node_get() local
53 nr_node_for_each(nr_node, &nr_node_list) in nr_node_get()
54 if (ax25cmp(callsign, &nr_node->callsign) == 0) { in nr_node_get()
55 nr_node_hold(nr_node); in nr_node_get()
56 found = nr_node; in nr_node_get()
84 static void re_sort_routes(struct nr_node *nr_node, int x, int y) in re_sort_routes() argument
86 if (nr_node->routes[y].quality > nr_node->routes[x].quality) { in re_sort_routes()
87 if (nr_node->which == x) in re_sort_routes()
88 nr_node->which = y; in re_sort_routes()
89 else if (nr_node->which == y) in re_sort_routes()
90 nr_node->which = x; in re_sort_routes()
92 swap(nr_node->routes[x], nr_node->routes[y]); in re_sort_routes()
104 struct nr_node *nr_node; in nr_add_node() local
114 nr_node = nr_node_get(nr); in nr_add_node()
125 struct nr_node *nr_nodet; in nr_add_node()
142 if (quality == 0 && nr_neigh != NULL && nr_node != NULL) { in nr_add_node()
144 nr_node_put(nr_node); in nr_add_node()
150 if (nr_node) in nr_add_node()
151 nr_node_put(nr_node); in nr_add_node()
172 if (nr_node) in nr_add_node()
173 nr_node_put(nr_node); in nr_add_node()
187 if (nr_node == NULL) { in nr_add_node()
188 if ((nr_node = kmalloc(sizeof(*nr_node), GFP_ATOMIC)) == NULL) { in nr_add_node()
194 nr_node->callsign = *nr; in nr_add_node()
195 strcpy(nr_node->mnemonic, mnemonic); in nr_add_node()
197 nr_node->which = 0; in nr_add_node()
198 nr_node->count = 1; in nr_add_node()
199 refcount_set(&nr_node->refcount, 1); in nr_add_node()
200 spin_lock_init(&nr_node->node_lock); in nr_add_node()
202 nr_node->routes[0].quality = quality; in nr_add_node()
203 nr_node->routes[0].obs_count = obs_count; in nr_add_node()
204 nr_node->routes[0].neighbour = nr_neigh; in nr_add_node()
210 hlist_add_head(&nr_node->node_node, &nr_node_list); in nr_add_node()
216 nr_node_lock(nr_node); in nr_add_node()
219 strcpy(nr_node->mnemonic, mnemonic); in nr_add_node()
221 for (found = 0, i = 0; i < nr_node->count; i++) { in nr_add_node()
222 if (nr_node->routes[i].neighbour == nr_neigh) { in nr_add_node()
223 nr_node->routes[i].quality = quality; in nr_add_node()
224 nr_node->routes[i].obs_count = obs_count; in nr_add_node()
232 if (nr_node->count < 3) { in nr_add_node()
233 nr_node->routes[2] = nr_node->routes[1]; in nr_add_node()
234 nr_node->routes[1] = nr_node->routes[0]; in nr_add_node()
236 nr_node->routes[0].quality = quality; in nr_add_node()
237 nr_node->routes[0].obs_count = obs_count; in nr_add_node()
238 nr_node->routes[0].neighbour = nr_neigh; in nr_add_node()
240 nr_node->which++; in nr_add_node()
241 nr_node->count++; in nr_add_node()
246 if (quality > nr_node->routes[2].quality) { in nr_add_node()
247 nr_node->routes[2].neighbour->count--; in nr_add_node()
248 nr_neigh_put(nr_node->routes[2].neighbour); in nr_add_node()
250 if (nr_node->routes[2].neighbour->count == 0 && !nr_node->routes[2].neighbour->locked) in nr_add_node()
251 nr_remove_neigh(nr_node->routes[2].neighbour); in nr_add_node()
253 nr_node->routes[2].quality = quality; in nr_add_node()
254 nr_node->routes[2].obs_count = obs_count; in nr_add_node()
255 nr_node->routes[2].neighbour = nr_neigh; in nr_add_node()
264 switch (nr_node->count) { in nr_add_node()
266 re_sort_routes(nr_node, 0, 1); in nr_add_node()
267 re_sort_routes(nr_node, 1, 2); in nr_add_node()
270 re_sort_routes(nr_node, 0, 1); in nr_add_node()
275 for (i = 0; i < nr_node->count; i++) { in nr_add_node()
276 if (nr_node->routes[i].neighbour == nr_neigh) { in nr_add_node()
277 if (i < nr_node->which) in nr_add_node()
278 nr_node->which = i; in nr_add_node()
284 nr_node_unlock(nr_node); in nr_add_node()
285 nr_node_put(nr_node); in nr_add_node()
289 static inline void __nr_remove_node(struct nr_node *nr_node) in __nr_remove_node() argument
291 hlist_del_init(&nr_node->node_node); in __nr_remove_node()
292 nr_node_put(nr_node); in __nr_remove_node()
298 static void nr_remove_node(struct nr_node *nr_node) in nr_remove_node() argument
301 __nr_remove_node(nr_node); in nr_remove_node()
327 struct nr_node *nr_node; in nr_del_node() local
331 nr_node = nr_node_get(callsign); in nr_del_node()
333 if (nr_node == NULL) in nr_del_node()
339 nr_node_put(nr_node); in nr_del_node()
343 nr_node_lock(nr_node); in nr_del_node()
344 for (i = 0; i < nr_node->count; i++) { in nr_del_node()
345 if (nr_node->routes[i].neighbour == nr_neigh) { in nr_del_node()
353 nr_node->count--; in nr_del_node()
355 if (nr_node->count == 0) { in nr_del_node()
356 nr_remove_node(nr_node); in nr_del_node()
360 nr_node->routes[0] = nr_node->routes[1]; in nr_del_node()
363 nr_node->routes[1] = nr_node->routes[2]; in nr_del_node()
367 nr_node_put(nr_node); in nr_del_node()
369 nr_node_unlock(nr_node); in nr_del_node()
375 nr_node_unlock(nr_node); in nr_del_node()
376 nr_node_put(nr_node); in nr_del_node()
458 struct nr_node *s; in nr_dec_obs()
515 struct nr_node *t; in nr_rt_device_down()
712 struct nr_node *nr_node = NULL; in nr_link_failed() local
735 nr_node_for_each(nr_node, &nr_node_list) { in nr_link_failed()
736 nr_node_lock(nr_node); in nr_link_failed()
737 if (nr_node->which < nr_node->count && in nr_link_failed()
738 nr_node->routes[nr_node->which].neighbour == nr_neigh) in nr_link_failed()
739 nr_node->which++; in nr_link_failed()
740 nr_node_unlock(nr_node); in nr_link_failed()
754 struct nr_node *nr_node; in nr_route_frame() local
790 nr_node = nr_node_get(nr_dest); in nr_route_frame()
791 if (nr_node == NULL) in nr_route_frame()
793 nr_node_lock(nr_node); in nr_route_frame()
795 if (nr_node->which >= nr_node->count) { in nr_route_frame()
796 nr_node_unlock(nr_node); in nr_route_frame()
797 nr_node_put(nr_node); in nr_route_frame()
801 nr_neigh = nr_node->routes[nr_node->which].neighbour; in nr_route_frame()
804 nr_node_unlock(nr_node); in nr_route_frame()
805 nr_node_put(nr_node); in nr_route_frame()
813 nr_node_unlock(nr_node); in nr_route_frame()
814 nr_node_put(nr_node); in nr_route_frame()
835 nr_node_unlock(nr_node); in nr_route_frame()
836 nr_node_put(nr_node); in nr_route_frame()
868 struct nr_node *nr_node = hlist_entry(v, struct nr_node, in nr_node_show() local
871 nr_node_lock(nr_node); in nr_node_show()
873 ax2asc(buf, &nr_node->callsign), in nr_node_show()
874 (nr_node->mnemonic[0] == '\0') ? "*" : nr_node->mnemonic, in nr_node_show()
875 nr_node->which + 1, in nr_node_show()
876 nr_node->count); in nr_node_show()
878 for (i = 0; i < nr_node->count; i++) { in nr_node_show()
880 nr_node->routes[i].quality, in nr_node_show()
881 nr_node->routes[i].obs_count, in nr_node_show()
882 nr_node->routes[i].neighbour->number); in nr_node_show()
884 nr_node_unlock(nr_node); in nr_node_show()
959 struct nr_node *t = NULL; in nr_rt_free()