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()
91 struct nr_node *nr_node; in nr_add_node() local
102 nr_node = nr_node_get(nr); in nr_add_node()
113 struct nr_node *nr_nodet; in nr_add_node()
130 if (quality == 0 && nr_neigh != NULL && nr_node != NULL) { in nr_add_node()
132 nr_node_put(nr_node); in nr_add_node()
138 if (nr_node) in nr_add_node()
139 nr_node_put(nr_node); in nr_add_node()
160 if (nr_node) in nr_add_node()
161 nr_node_put(nr_node); in nr_add_node()
175 if (nr_node == NULL) { in nr_add_node()
176 if ((nr_node = kmalloc(sizeof(*nr_node), GFP_ATOMIC)) == NULL) { in nr_add_node()
182 nr_node->callsign = *nr; in nr_add_node()
183 strcpy(nr_node->mnemonic, mnemonic); in nr_add_node()
185 nr_node->which = 0; in nr_add_node()
186 nr_node->count = 1; in nr_add_node()
187 atomic_set(&nr_node->refcount, 1); in nr_add_node()
188 spin_lock_init(&nr_node->node_lock); in nr_add_node()
190 nr_node->routes[0].quality = quality; in nr_add_node()
191 nr_node->routes[0].obs_count = obs_count; in nr_add_node()
192 nr_node->routes[0].neighbour = nr_neigh; in nr_add_node()
198 hlist_add_head(&nr_node->node_node, &nr_node_list); in nr_add_node()
204 nr_node_lock(nr_node); in nr_add_node()
207 strcpy(nr_node->mnemonic, mnemonic); in nr_add_node()
209 for (found = 0, i = 0; i < nr_node->count; i++) { in nr_add_node()
210 if (nr_node->routes[i].neighbour == nr_neigh) { in nr_add_node()
211 nr_node->routes[i].quality = quality; in nr_add_node()
212 nr_node->routes[i].obs_count = obs_count; in nr_add_node()
220 if (nr_node->count < 3) { in nr_add_node()
221 nr_node->routes[2] = nr_node->routes[1]; in nr_add_node()
222 nr_node->routes[1] = nr_node->routes[0]; in nr_add_node()
224 nr_node->routes[0].quality = quality; in nr_add_node()
225 nr_node->routes[0].obs_count = obs_count; in nr_add_node()
226 nr_node->routes[0].neighbour = nr_neigh; in nr_add_node()
228 nr_node->which++; in nr_add_node()
229 nr_node->count++; in nr_add_node()
234 if (quality > nr_node->routes[2].quality) { in nr_add_node()
235 nr_node->routes[2].neighbour->count--; in nr_add_node()
236 nr_neigh_put(nr_node->routes[2].neighbour); in nr_add_node()
238 if (nr_node->routes[2].neighbour->count == 0 && !nr_node->routes[2].neighbour->locked) in nr_add_node()
239 nr_remove_neigh(nr_node->routes[2].neighbour); in nr_add_node()
241 nr_node->routes[2].quality = quality; in nr_add_node()
242 nr_node->routes[2].obs_count = obs_count; in nr_add_node()
243 nr_node->routes[2].neighbour = nr_neigh; in nr_add_node()
252 switch (nr_node->count) { in nr_add_node()
254 if (nr_node->routes[1].quality > nr_node->routes[0].quality) { in nr_add_node()
255 switch (nr_node->which) { in nr_add_node()
257 nr_node->which = 1; in nr_add_node()
260 nr_node->which = 0; in nr_add_node()
263 nr_route = nr_node->routes[0]; in nr_add_node()
264 nr_node->routes[0] = nr_node->routes[1]; in nr_add_node()
265 nr_node->routes[1] = nr_route; in nr_add_node()
267 if (nr_node->routes[2].quality > nr_node->routes[1].quality) { in nr_add_node()
268 switch (nr_node->which) { in nr_add_node()
269 case 1: nr_node->which = 2; in nr_add_node()
272 case 2: nr_node->which = 1; in nr_add_node()
278 nr_route = nr_node->routes[1]; in nr_add_node()
279 nr_node->routes[1] = nr_node->routes[2]; in nr_add_node()
280 nr_node->routes[2] = nr_route; in nr_add_node()
283 if (nr_node->routes[1].quality > nr_node->routes[0].quality) { in nr_add_node()
284 switch (nr_node->which) { in nr_add_node()
285 case 0: nr_node->which = 1; in nr_add_node()
288 case 1: nr_node->which = 0; in nr_add_node()
293 nr_route = nr_node->routes[0]; in nr_add_node()
294 nr_node->routes[0] = nr_node->routes[1]; in nr_add_node()
295 nr_node->routes[1] = nr_route; in nr_add_node()
301 for (i = 0; i < nr_node->count; i++) { in nr_add_node()
302 if (nr_node->routes[i].neighbour == nr_neigh) { in nr_add_node()
303 if (i < nr_node->which) in nr_add_node()
304 nr_node->which = i; in nr_add_node()
310 nr_node_unlock(nr_node); in nr_add_node()
311 nr_node_put(nr_node); in nr_add_node()
315 static inline void __nr_remove_node(struct nr_node *nr_node) in __nr_remove_node() argument
317 hlist_del_init(&nr_node->node_node); in __nr_remove_node()
318 nr_node_put(nr_node); in __nr_remove_node()
324 static void nr_remove_node(struct nr_node *nr_node) in nr_remove_node() argument
327 __nr_remove_node(nr_node); in nr_remove_node()
353 struct nr_node *nr_node; in nr_del_node() local
357 nr_node = nr_node_get(callsign); in nr_del_node()
359 if (nr_node == NULL) in nr_del_node()
365 nr_node_put(nr_node); in nr_del_node()
369 nr_node_lock(nr_node); in nr_del_node()
370 for (i = 0; i < nr_node->count; i++) { in nr_del_node()
371 if (nr_node->routes[i].neighbour == nr_neigh) { in nr_del_node()
379 nr_node->count--; in nr_del_node()
381 if (nr_node->count == 0) { in nr_del_node()
382 nr_remove_node(nr_node); in nr_del_node()
386 nr_node->routes[0] = nr_node->routes[1]; in nr_del_node()
388 nr_node->routes[1] = nr_node->routes[2]; in nr_del_node()
392 nr_node_put(nr_node); in nr_del_node()
394 nr_node_unlock(nr_node); in nr_del_node()
400 nr_node_unlock(nr_node); in nr_del_node()
401 nr_node_put(nr_node); in nr_del_node()
483 struct nr_node *s; in nr_dec_obs()
540 struct nr_node *t; in nr_rt_device_down()
736 struct nr_node *nr_node = NULL; in nr_link_failed() local
759 nr_node_for_each(nr_node, &nr_node_list) { in nr_link_failed()
760 nr_node_lock(nr_node); in nr_link_failed()
761 if (nr_node->which < nr_node->count && in nr_link_failed()
762 nr_node->routes[nr_node->which].neighbour == nr_neigh) in nr_link_failed()
763 nr_node->which++; in nr_link_failed()
764 nr_node_unlock(nr_node); in nr_link_failed()
778 struct nr_node *nr_node; in nr_route_frame() local
814 nr_node = nr_node_get(nr_dest); in nr_route_frame()
815 if (nr_node == NULL) in nr_route_frame()
817 nr_node_lock(nr_node); in nr_route_frame()
819 if (nr_node->which >= nr_node->count) { in nr_route_frame()
820 nr_node_unlock(nr_node); in nr_route_frame()
821 nr_node_put(nr_node); in nr_route_frame()
825 nr_neigh = nr_node->routes[nr_node->which].neighbour; in nr_route_frame()
828 nr_node_unlock(nr_node); in nr_route_frame()
829 nr_node_put(nr_node); in nr_route_frame()
837 nr_node_unlock(nr_node); in nr_route_frame()
838 nr_node_put(nr_node); in nr_route_frame()
859 nr_node_unlock(nr_node); in nr_route_frame()
860 nr_node_put(nr_node); in nr_route_frame()
892 struct nr_node *nr_node = hlist_entry(v, struct nr_node, in nr_node_show() local
895 nr_node_lock(nr_node); in nr_node_show()
897 ax2asc(buf, &nr_node->callsign), in nr_node_show()
898 (nr_node->mnemonic[0] == '\0') ? "*" : nr_node->mnemonic, in nr_node_show()
899 nr_node->which + 1, in nr_node_show()
900 nr_node->count); in nr_node_show()
902 for (i = 0; i < nr_node->count; i++) { in nr_node_show()
904 nr_node->routes[i].quality, in nr_node_show()
905 nr_node->routes[i].obs_count, in nr_node_show()
906 nr_node->routes[i].neighbour->number); in nr_node_show()
908 nr_node_unlock(nr_node); in nr_node_show()
1010 struct nr_node *t = NULL; in nr_rt_free()