• Home
  • Raw
  • Download

Lines Matching refs:nr_node

44 static struct nr_node *nr_node_get(ax25_address *callsign)  in nr_node_get()
46 struct nr_node *found = NULL; in nr_node_get()
47 struct nr_node *nr_node; in nr_node_get() local
50 nr_node_for_each(nr_node, &nr_node_list) in nr_node_get()
51 if (ax25cmp(callsign, &nr_node->callsign) == 0) { in nr_node_get()
52 nr_node_hold(nr_node); in nr_node_get()
53 found = nr_node; in nr_node_get()
81 static void re_sort_routes(struct nr_node *nr_node, int x, int y) in re_sort_routes() argument
83 if (nr_node->routes[y].quality > nr_node->routes[x].quality) { in re_sort_routes()
84 if (nr_node->which == x) in re_sort_routes()
85 nr_node->which = y; in re_sort_routes()
86 else if (nr_node->which == y) in re_sort_routes()
87 nr_node->which = x; in re_sort_routes()
89 swap(nr_node->routes[x], nr_node->routes[y]); in re_sort_routes()
101 struct nr_node *nr_node; in nr_add_node() local
111 nr_node = nr_node_get(nr); in nr_add_node()
122 struct nr_node *nr_nodet; in nr_add_node()
139 if (quality == 0 && nr_neigh != NULL && nr_node != NULL) { in nr_add_node()
141 nr_node_put(nr_node); in nr_add_node()
147 if (nr_node) in nr_add_node()
148 nr_node_put(nr_node); in nr_add_node()
169 if (nr_node) in nr_add_node()
170 nr_node_put(nr_node); in nr_add_node()
184 if (nr_node == NULL) { in nr_add_node()
185 if ((nr_node = kmalloc(sizeof(*nr_node), GFP_ATOMIC)) == NULL) { in nr_add_node()
191 nr_node->callsign = *nr; in nr_add_node()
192 strcpy(nr_node->mnemonic, mnemonic); in nr_add_node()
194 nr_node->which = 0; in nr_add_node()
195 nr_node->count = 1; in nr_add_node()
196 refcount_set(&nr_node->refcount, 1); in nr_add_node()
197 spin_lock_init(&nr_node->node_lock); in nr_add_node()
199 nr_node->routes[0].quality = quality; in nr_add_node()
200 nr_node->routes[0].obs_count = obs_count; in nr_add_node()
201 nr_node->routes[0].neighbour = nr_neigh; in nr_add_node()
207 hlist_add_head(&nr_node->node_node, &nr_node_list); in nr_add_node()
214 nr_node_lock(nr_node); in nr_add_node()
217 strcpy(nr_node->mnemonic, mnemonic); in nr_add_node()
219 for (found = 0, i = 0; i < nr_node->count; i++) { in nr_add_node()
220 if (nr_node->routes[i].neighbour == nr_neigh) { in nr_add_node()
221 nr_node->routes[i].quality = quality; in nr_add_node()
222 nr_node->routes[i].obs_count = obs_count; in nr_add_node()
230 if (nr_node->count < 3) { in nr_add_node()
231 nr_node->routes[2] = nr_node->routes[1]; in nr_add_node()
232 nr_node->routes[1] = nr_node->routes[0]; in nr_add_node()
234 nr_node->routes[0].quality = quality; in nr_add_node()
235 nr_node->routes[0].obs_count = obs_count; in nr_add_node()
236 nr_node->routes[0].neighbour = nr_neigh; in nr_add_node()
238 nr_node->which++; in nr_add_node()
239 nr_node->count++; in nr_add_node()
244 if (quality > nr_node->routes[2].quality) { in nr_add_node()
245 nr_node->routes[2].neighbour->count--; in nr_add_node()
246 nr_neigh_put(nr_node->routes[2].neighbour); in nr_add_node()
248 if (nr_node->routes[2].neighbour->count == 0 && !nr_node->routes[2].neighbour->locked) in nr_add_node()
249 nr_remove_neigh(nr_node->routes[2].neighbour); in nr_add_node()
251 nr_node->routes[2].quality = quality; in nr_add_node()
252 nr_node->routes[2].obs_count = obs_count; in nr_add_node()
253 nr_node->routes[2].neighbour = nr_neigh; in nr_add_node()
262 switch (nr_node->count) { in nr_add_node()
264 re_sort_routes(nr_node, 0, 1); in nr_add_node()
265 re_sort_routes(nr_node, 1, 2); in nr_add_node()
268 re_sort_routes(nr_node, 0, 1); in nr_add_node()
274 for (i = 0; i < nr_node->count; i++) { in nr_add_node()
275 if (nr_node->routes[i].neighbour == nr_neigh) { in nr_add_node()
276 if (i < nr_node->which) in nr_add_node()
277 nr_node->which = i; in nr_add_node()
283 nr_node_unlock(nr_node); in nr_add_node()
284 nr_node_put(nr_node); in nr_add_node()
288 static inline void __nr_remove_node(struct nr_node *nr_node) in __nr_remove_node() argument
290 hlist_del_init(&nr_node->node_node); in __nr_remove_node()
291 nr_node_put(nr_node); in __nr_remove_node()
297 static void nr_remove_node(struct nr_node *nr_node) in nr_remove_node() argument
300 __nr_remove_node(nr_node); in nr_remove_node()
326 struct nr_node *nr_node; in nr_del_node() local
330 nr_node = nr_node_get(callsign); in nr_del_node()
332 if (nr_node == NULL) in nr_del_node()
338 nr_node_put(nr_node); in nr_del_node()
342 nr_node_lock(nr_node); in nr_del_node()
343 for (i = 0; i < nr_node->count; i++) { in nr_del_node()
344 if (nr_node->routes[i].neighbour == nr_neigh) { in nr_del_node()
352 nr_node->count--; in nr_del_node()
354 if (nr_node->count == 0) { in nr_del_node()
355 nr_remove_node(nr_node); in nr_del_node()
359 nr_node->routes[0] = nr_node->routes[1]; in nr_del_node()
362 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()
516 struct nr_node *t; in nr_rt_device_down()
713 struct nr_node *nr_node = NULL; in nr_link_failed() local
736 nr_node_for_each(nr_node, &nr_node_list) { in nr_link_failed()
737 nr_node_lock(nr_node); in nr_link_failed()
738 if (nr_node->which < nr_node->count && in nr_link_failed()
739 nr_node->routes[nr_node->which].neighbour == nr_neigh) in nr_link_failed()
740 nr_node->which++; in nr_link_failed()
741 nr_node_unlock(nr_node); in nr_link_failed()
755 struct nr_node *nr_node; in nr_route_frame() local
791 nr_node = nr_node_get(nr_dest); in nr_route_frame()
792 if (nr_node == NULL) in nr_route_frame()
794 nr_node_lock(nr_node); in nr_route_frame()
796 if (nr_node->which >= nr_node->count) { in nr_route_frame()
797 nr_node_unlock(nr_node); in nr_route_frame()
798 nr_node_put(nr_node); in nr_route_frame()
802 nr_neigh = nr_node->routes[nr_node->which].neighbour; in nr_route_frame()
805 nr_node_unlock(nr_node); in nr_route_frame()
806 nr_node_put(nr_node); in nr_route_frame()
814 nr_node_unlock(nr_node); in nr_route_frame()
815 nr_node_put(nr_node); in nr_route_frame()
836 nr_node_unlock(nr_node); in nr_route_frame()
837 nr_node_put(nr_node); in nr_route_frame()
871 struct nr_node *nr_node = hlist_entry(v, struct nr_node, in nr_node_show() local
874 nr_node_lock(nr_node); in nr_node_show()
876 ax2asc(buf, &nr_node->callsign), in nr_node_show()
877 (nr_node->mnemonic[0] == '\0') ? "*" : nr_node->mnemonic, in nr_node_show()
878 nr_node->which + 1, in nr_node_show()
879 nr_node->count); in nr_node_show()
881 for (i = 0; i < nr_node->count; i++) { in nr_node_show()
883 nr_node->routes[i].quality, in nr_node_show()
884 nr_node->routes[i].obs_count, in nr_node_show()
885 nr_node->routes[i].neighbour->number); in nr_node_show()
887 nr_node_unlock(nr_node); in nr_node_show()
964 struct nr_node *t = NULL; in nr_rt_free()