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()
213 nr_node_lock(nr_node); in nr_add_node()
216 strcpy(nr_node->mnemonic, mnemonic); in nr_add_node()
218 for (found = 0, i = 0; i < nr_node->count; i++) { in nr_add_node()
219 if (nr_node->routes[i].neighbour == nr_neigh) { in nr_add_node()
220 nr_node->routes[i].quality = quality; in nr_add_node()
221 nr_node->routes[i].obs_count = obs_count; in nr_add_node()
229 if (nr_node->count < 3) { in nr_add_node()
230 nr_node->routes[2] = nr_node->routes[1]; in nr_add_node()
231 nr_node->routes[1] = nr_node->routes[0]; in nr_add_node()
233 nr_node->routes[0].quality = quality; in nr_add_node()
234 nr_node->routes[0].obs_count = obs_count; in nr_add_node()
235 nr_node->routes[0].neighbour = nr_neigh; in nr_add_node()
237 nr_node->which++; in nr_add_node()
238 nr_node->count++; in nr_add_node()
243 if (quality > nr_node->routes[2].quality) { in nr_add_node()
244 nr_node->routes[2].neighbour->count--; in nr_add_node()
245 nr_neigh_put(nr_node->routes[2].neighbour); in nr_add_node()
247 if (nr_node->routes[2].neighbour->count == 0 && !nr_node->routes[2].neighbour->locked) in nr_add_node()
248 nr_remove_neigh(nr_node->routes[2].neighbour); in nr_add_node()
250 nr_node->routes[2].quality = quality; in nr_add_node()
251 nr_node->routes[2].obs_count = obs_count; in nr_add_node()
252 nr_node->routes[2].neighbour = nr_neigh; in nr_add_node()
261 switch (nr_node->count) { in nr_add_node()
263 re_sort_routes(nr_node, 0, 1); in nr_add_node()
264 re_sort_routes(nr_node, 1, 2); in nr_add_node()
267 re_sort_routes(nr_node, 0, 1); in nr_add_node()
272 for (i = 0; i < nr_node->count; i++) { in nr_add_node()
273 if (nr_node->routes[i].neighbour == nr_neigh) { in nr_add_node()
274 if (i < nr_node->which) in nr_add_node()
275 nr_node->which = i; in nr_add_node()
281 nr_node_unlock(nr_node); in nr_add_node()
282 nr_node_put(nr_node); in nr_add_node()
286 static inline void __nr_remove_node(struct nr_node *nr_node) in __nr_remove_node() argument
288 hlist_del_init(&nr_node->node_node); in __nr_remove_node()
289 nr_node_put(nr_node); in __nr_remove_node()
295 static void nr_remove_node(struct nr_node *nr_node) in nr_remove_node() argument
298 __nr_remove_node(nr_node); in nr_remove_node()
324 struct nr_node *nr_node; in nr_del_node() local
328 nr_node = nr_node_get(callsign); in nr_del_node()
330 if (nr_node == NULL) in nr_del_node()
336 nr_node_put(nr_node); in nr_del_node()
340 nr_node_lock(nr_node); in nr_del_node()
341 for (i = 0; i < nr_node->count; i++) { in nr_del_node()
342 if (nr_node->routes[i].neighbour == nr_neigh) { in nr_del_node()
350 nr_node->count--; in nr_del_node()
352 if (nr_node->count == 0) { in nr_del_node()
353 nr_remove_node(nr_node); in nr_del_node()
357 nr_node->routes[0] = nr_node->routes[1]; in nr_del_node()
360 nr_node->routes[1] = nr_node->routes[2]; in nr_del_node()
364 nr_node_put(nr_node); in nr_del_node()
366 nr_node_unlock(nr_node); in nr_del_node()
372 nr_node_unlock(nr_node); in nr_del_node()
373 nr_node_put(nr_node); in nr_del_node()
455 struct nr_node *s; in nr_dec_obs()
512 struct nr_node *t; in nr_rt_device_down()
709 struct nr_node *nr_node = NULL; in nr_link_failed() local
732 nr_node_for_each(nr_node, &nr_node_list) { in nr_link_failed()
733 nr_node_lock(nr_node); in nr_link_failed()
734 if (nr_node->which < nr_node->count && in nr_link_failed()
735 nr_node->routes[nr_node->which].neighbour == nr_neigh) in nr_link_failed()
736 nr_node->which++; in nr_link_failed()
737 nr_node_unlock(nr_node); in nr_link_failed()
751 struct nr_node *nr_node; in nr_route_frame() local
787 nr_node = nr_node_get(nr_dest); in nr_route_frame()
788 if (nr_node == NULL) in nr_route_frame()
790 nr_node_lock(nr_node); in nr_route_frame()
792 if (nr_node->which >= nr_node->count) { in nr_route_frame()
793 nr_node_unlock(nr_node); in nr_route_frame()
794 nr_node_put(nr_node); in nr_route_frame()
798 nr_neigh = nr_node->routes[nr_node->which].neighbour; in nr_route_frame()
801 nr_node_unlock(nr_node); in nr_route_frame()
802 nr_node_put(nr_node); in nr_route_frame()
810 nr_node_unlock(nr_node); in nr_route_frame()
811 nr_node_put(nr_node); in nr_route_frame()
832 nr_node_unlock(nr_node); in nr_route_frame()
833 nr_node_put(nr_node); in nr_route_frame()
865 struct nr_node *nr_node = hlist_entry(v, struct nr_node, in nr_node_show() local
868 nr_node_lock(nr_node); in nr_node_show()
870 ax2asc(buf, &nr_node->callsign), in nr_node_show()
871 (nr_node->mnemonic[0] == '\0') ? "*" : nr_node->mnemonic, in nr_node_show()
872 nr_node->which + 1, in nr_node_show()
873 nr_node->count); in nr_node_show()
875 for (i = 0; i < nr_node->count; i++) { in nr_node_show()
877 nr_node->routes[i].quality, in nr_node_show()
878 nr_node->routes[i].obs_count, in nr_node_show()
879 nr_node->routes[i].neighbour->number); in nr_node_show()
881 nr_node_unlock(nr_node); in nr_node_show()
956 struct nr_node *t = NULL; in nr_rt_free()