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);
273 for (i = 0; i < nr_node->count; i++) {
274 if (nr_node->routes[i].neighbour == nr_neigh) {
275 if (i < nr_node->which)
276 nr_node->which = i;
282 nr_node_unlock(nr_node);
283 nr_node_put(nr_node);
287 static inline void __nr_remove_node(struct nr_node *nr_node)
289 hlist_del_init(&nr_node->node_node);
290 nr_node_put(nr_node);
296 static void nr_remove_node(struct nr_node *nr_node)
299 __nr_remove_node(nr_node);
325 struct nr_node *nr_node;
329 nr_node = nr_node_get(callsign);
331 if (nr_node == NULL)
337 nr_node_put(nr_node);
341 nr_node_lock(nr_node);
342 for (i = 0; i < nr_node->count; i++) {
343 if (nr_node->routes[i].neighbour == nr_neigh) {
351 nr_node->count--;
353 if (nr_node->count == 0) {
354 nr_remove_node(nr_node);
358 nr_node->routes[0] = nr_node->routes[1];
361 nr_node->routes[1] = nr_node->routes[2];
365 nr_node_put(nr_node);
367 nr_node_unlock(nr_node);
373 nr_node_unlock(nr_node);
374 nr_node_put(nr_node);
456 struct nr_node *s;
513 struct nr_node *t;
710 struct nr_node *nr_node = NULL;
733 nr_node_for_each(nr_node, &nr_node_list) {
734 nr_node_lock(nr_node);
735 if (nr_node->which < nr_node->count &&
736 nr_node->routes[nr_node->which].neighbour == nr_neigh)
737 nr_node->which++;
738 nr_node_unlock(nr_node);
752 struct nr_node *nr_node;
788 nr_node = nr_node_get(nr_dest);
789 if (nr_node == NULL)
791 nr_node_lock(nr_node);
793 if (nr_node->which >= nr_node->count) {
794 nr_node_unlock(nr_node);
795 nr_node_put(nr_node);
799 nr_neigh = nr_node->routes[nr_node->which].neighbour;
802 nr_node_unlock(nr_node);
803 nr_node_put(nr_node);
811 nr_node_unlock(nr_node);
812 nr_node_put(nr_node);
833 nr_node_unlock(nr_node);
834 nr_node_put(nr_node);
868 struct nr_node *nr_node = hlist_entry(v, struct nr_node,
871 nr_node_lock(nr_node);
873 ax2asc(buf, &nr_node->callsign),
874 (nr_node->mnemonic[0] == '\0') ? "*" : nr_node->mnemonic,
875 nr_node->which + 1,
876 nr_node->count);
878 for (i = 0; i < nr_node->count; i++) {
880 nr_node->routes[i].quality,
881 nr_node->routes[i].obs_count,
882 nr_node->routes[i].neighbour->number);
884 nr_node_unlock(nr_node);
961 struct nr_node *t = NULL;