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 void nr_remove_node_locked(struct nr_node *nr_node)
292 hlist_del_init(&nr_node->node_node);
293 nr_node_put(nr_node);
318 struct nr_node *nr_node;
322 nr_node = nr_node_get(callsign);
324 if (nr_node == NULL)
330 nr_node_put(nr_node);
335 nr_node_lock(nr_node);
336 for (i = 0; i < nr_node->count; i++) {
337 if (nr_node->routes[i].neighbour == nr_neigh) {
345 nr_node->count--;
347 if (nr_node->count == 0) {
348 nr_remove_node_locked(nr_node);
352 nr_node->routes[0] = nr_node->routes[1];
355 nr_node->routes[1] = nr_node->routes[2];
360 nr_node_put(nr_node);
362 nr_node_unlock(nr_node);
369 nr_node_unlock(nr_node);
371 nr_node_put(nr_node);
453 struct nr_node *s;
511 struct nr_node *t;
708 struct nr_node *nr_node = NULL;
731 nr_node_for_each(nr_node, &nr_node_list) {
732 nr_node_lock(nr_node);
733 if (nr_node->which < nr_node->count &&
734 nr_node->routes[nr_node->which].neighbour == nr_neigh)
735 nr_node->which++;
736 nr_node_unlock(nr_node);
750 struct nr_node *nr_node;
786 nr_node = nr_node_get(nr_dest);
787 if (nr_node == NULL)
789 nr_node_lock(nr_node);
791 if (nr_node->which >= nr_node->count) {
792 nr_node_unlock(nr_node);
793 nr_node_put(nr_node);
797 nr_neigh = nr_node->routes[nr_node->which].neighbour;
800 nr_node_unlock(nr_node);
801 nr_node_put(nr_node);
809 nr_node_unlock(nr_node);
810 nr_node_put(nr_node);
831 nr_node_unlock(nr_node);
832 nr_node_put(nr_node);
866 struct nr_node *nr_node = hlist_entry(v, struct nr_node,
869 nr_node_lock(nr_node);
871 ax2asc(buf, &nr_node->callsign),
872 (nr_node->mnemonic[0] == '\0') ? "*" : nr_node->mnemonic,
873 nr_node->which + 1,
874 nr_node->count);
876 for (i = 0; i < nr_node->count; i++) {
878 nr_node->routes[i].quality,
879 nr_node->routes[i].obs_count,
880 nr_node->routes[i].neighbour->number);
882 nr_node_unlock(nr_node);
959 struct nr_node *t = NULL;