Lines Matching refs:nr_node

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