Lines Matching refs:nr_neigh

60 static struct nr_neigh *nr_neigh_get_dev(ax25_address *callsign,
63 struct nr_neigh *found = NULL;
64 struct nr_neigh *nr_neigh;
67 nr_neigh_for_each(nr_neigh, &nr_neigh_list)
68 if (ax25cmp(callsign, &nr_neigh->callsign) == 0 &&
69 nr_neigh->dev == dev) {
70 nr_neigh_hold(nr_neigh);
71 found = nr_neigh;
78 static void nr_remove_neigh(struct nr_neigh *);
102 struct nr_neigh *nr_neigh;
113 nr_neigh = nr_neigh_get_dev(ax25, dev);
121 if (nr_neigh != NULL && nr_neigh->failed != 0 && quality == 0) {
128 if (nr_nodet->routes[i].neighbour == nr_neigh)
136 if (nr_neigh != NULL)
137 nr_neigh->failed = 0;
139 if (quality == 0 && nr_neigh != NULL && nr_node != NULL) {
140 nr_neigh_put(nr_neigh);
145 if (nr_neigh == NULL) {
146 if ((nr_neigh = kmalloc(sizeof(*nr_neigh), GFP_ATOMIC)) == NULL) {
152 nr_neigh->callsign = *ax25;
153 nr_neigh->digipeat = NULL;
154 nr_neigh->ax25 = NULL;
155 nr_neigh->dev = dev;
156 nr_neigh->quality = sysctl_netrom_default_path_quality;
157 nr_neigh->locked = 0;
158 nr_neigh->count = 0;
159 nr_neigh->number = nr_neigh_no++;
160 nr_neigh->failed = 0;
161 refcount_set(&nr_neigh->refcount, 1);
164 nr_neigh->digipeat = kmemdup(ax25_digi,
167 if (nr_neigh->digipeat == NULL) {
168 kfree(nr_neigh);
176 hlist_add_head(&nr_neigh->neigh_node, &nr_neigh_list);
177 nr_neigh_hold(nr_neigh);
181 if (quality != 0 && ax25cmp(nr, ax25) == 0 && !nr_neigh->locked)
182 nr_neigh->quality = quality;
186 if (nr_neigh)
187 nr_neigh_put(nr_neigh);
201 nr_node->routes[0].neighbour = nr_neigh;
203 nr_neigh_hold(nr_neigh);
204 nr_neigh->count++;
211 nr_neigh_put(nr_neigh);
220 if (nr_node->routes[i].neighbour == nr_neigh) {
236 nr_node->routes[0].neighbour = nr_neigh;
240 nr_neigh_hold(nr_neigh);
241 nr_neigh->count++;
253 nr_node->routes[2].neighbour = nr_neigh;
255 nr_neigh_hold(nr_neigh);
256 nr_neigh->count++;
274 if (nr_node->routes[i].neighbour == nr_neigh) {
281 nr_neigh_put(nr_neigh);
303 static inline void __nr_remove_neigh(struct nr_neigh *nr_neigh)
305 hlist_del_init(&nr_neigh->neigh_node);
306 nr_neigh_put(nr_neigh);
312 static void nr_remove_neigh(struct nr_neigh *nr_neigh)
315 __nr_remove_neigh(nr_neigh);
326 struct nr_neigh *nr_neigh;
334 nr_neigh = nr_neigh_get_dev(neighbour, dev);
336 if (nr_neigh == NULL) {
343 if (nr_node->routes[i].neighbour == nr_neigh) {
344 nr_neigh->count--;
345 nr_neigh_put(nr_neigh);
347 if (nr_neigh->count == 0 && !nr_neigh->locked)
348 nr_remove_neigh(nr_neigh);
349 nr_neigh_put(nr_neigh);
372 nr_neigh_put(nr_neigh);
385 struct nr_neigh *nr_neigh;
387 nr_neigh = nr_neigh_get_dev(callsign, dev);
388 if (nr_neigh) {
389 nr_neigh->quality = quality;
390 nr_neigh->locked = 1;
391 nr_neigh_put(nr_neigh);
395 if ((nr_neigh = kmalloc(sizeof(*nr_neigh), GFP_ATOMIC)) == NULL)
398 nr_neigh->callsign = *callsign;
399 nr_neigh->digipeat = NULL;
400 nr_neigh->ax25 = NULL;
401 nr_neigh->dev = dev;
402 nr_neigh->quality = quality;
403 nr_neigh->locked = 1;
404 nr_neigh->count = 0;
405 nr_neigh->number = nr_neigh_no++;
406 nr_neigh->failed = 0;
407 refcount_set(&nr_neigh->refcount, 1);
410 nr_neigh->digipeat = kmemdup(ax25_digi, sizeof(*ax25_digi),
412 if (nr_neigh->digipeat == NULL) {
413 kfree(nr_neigh);
419 hlist_add_head(&nr_neigh->neigh_node, &nr_neigh_list);
432 struct nr_neigh *nr_neigh;
434 nr_neigh = nr_neigh_get_dev(callsign, dev);
436 if (nr_neigh == NULL) return -EINVAL;
438 nr_neigh->quality = quality;
439 nr_neigh->locked = 0;
441 if (nr_neigh->count == 0)
442 nr_remove_neigh(nr_neigh);
443 nr_neigh_put(nr_neigh);
455 struct nr_neigh *nr_neigh;
469 nr_neigh = s->routes[i].neighbour;
471 nr_neigh->count--;
472 nr_neigh_put(nr_neigh);
474 if (nr_neigh->count == 0 && !nr_neigh->locked)
475 nr_remove_neigh(nr_neigh);
511 struct nr_neigh *s;
709 struct nr_neigh *s, *nr_neigh = NULL;
716 nr_neigh = s;
722 if (nr_neigh == NULL)
725 nr_neigh->ax25 = NULL;
728 if (++nr_neigh->failed < sysctl_netrom_link_fails_count) {
729 nr_neigh_put(nr_neigh);
736 nr_node->routes[nr_node->which].neighbour == nr_neigh)
741 nr_neigh_put(nr_neigh);
751 struct nr_neigh *nr_neigh;
799 nr_neigh = nr_node->routes[nr_node->which].neighbour;
823 ax25s = nr_neigh->ax25;
824 nr_neigh->ax25 = ax25_send_frame(skb, 256,
826 &nr_neigh->callsign,
827 nr_neigh->digipeat, nr_neigh->dev);
832 ret = (nr_neigh->ax25 != NULL);
924 struct nr_neigh *nr_neigh;
926 nr_neigh = hlist_entry(v, struct nr_neigh, neigh_node);
928 nr_neigh->number,
929 ax2asc(buf, &nr_neigh->callsign),
930 nr_neigh->dev ? nr_neigh->dev->name : "???",
931 nr_neigh->quality,
932 nr_neigh->locked,
933 nr_neigh->count,
934 nr_neigh->failed);
936 if (nr_neigh->digipeat != NULL) {
937 for (i = 0; i < nr_neigh->digipeat->ndigi; i++)
939 ax2asc(buf, &nr_neigh->digipeat->calls[i]));
960 struct nr_neigh *s = NULL;