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 = READ_ONCE(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++;
275 if (nr_node->routes[i].neighbour == nr_neigh) {
282 nr_neigh_put(nr_neigh);
304 static inline void __nr_remove_neigh(struct nr_neigh *nr_neigh)
306 hlist_del_init(&nr_neigh->neigh_node);
307 nr_neigh_put(nr_neigh);
313 static void nr_remove_neigh(struct nr_neigh *nr_neigh)
316 __nr_remove_neigh(nr_neigh);
327 struct nr_neigh *nr_neigh;
335 nr_neigh = nr_neigh_get_dev(neighbour, dev);
337 if (nr_neigh == NULL) {
344 if (nr_node->routes[i].neighbour == nr_neigh) {
345 nr_neigh->count--;
346 nr_neigh_put(nr_neigh);
348 if (nr_neigh->count == 0 && !nr_neigh->locked)
349 nr_remove_neigh(nr_neigh);
350 nr_neigh_put(nr_neigh);
374 nr_neigh_put(nr_neigh);
387 struct nr_neigh *nr_neigh;
389 nr_neigh = nr_neigh_get_dev(callsign, dev);
390 if (nr_neigh) {
391 nr_neigh->quality = quality;
392 nr_neigh->locked = 1;
393 nr_neigh_put(nr_neigh);
397 if ((nr_neigh = kmalloc(sizeof(*nr_neigh), GFP_ATOMIC)) == NULL)
400 nr_neigh->callsign = *callsign;
401 nr_neigh->digipeat = NULL;
402 nr_neigh->ax25 = NULL;
403 nr_neigh->dev = dev;
404 nr_neigh->quality = quality;
405 nr_neigh->locked = 1;
406 nr_neigh->count = 0;
407 nr_neigh->number = nr_neigh_no++;
408 nr_neigh->failed = 0;
409 refcount_set(&nr_neigh->refcount, 1);
412 nr_neigh->digipeat = kmemdup(ax25_digi, sizeof(*ax25_digi),
414 if (nr_neigh->digipeat == NULL) {
415 kfree(nr_neigh);
421 hlist_add_head(&nr_neigh->neigh_node, &nr_neigh_list);
434 struct nr_neigh *nr_neigh;
436 nr_neigh = nr_neigh_get_dev(callsign, dev);
438 if (nr_neigh == NULL) return -EINVAL;
440 nr_neigh->quality = quality;
441 nr_neigh->locked = 0;
443 if (nr_neigh->count == 0)
444 nr_remove_neigh(nr_neigh);
445 nr_neigh_put(nr_neigh);
457 struct nr_neigh *nr_neigh;
471 nr_neigh = s->routes[i].neighbour;
473 nr_neigh->count--;
474 nr_neigh_put(nr_neigh);
476 if (nr_neigh->count == 0 && !nr_neigh->locked)
477 nr_remove_neigh(nr_neigh);
514 struct nr_neigh *s;
712 struct nr_neigh *s, *nr_neigh = NULL;
719 nr_neigh = s;
725 if (nr_neigh == NULL)
728 nr_neigh->ax25 = NULL;
731 if (++nr_neigh->failed < READ_ONCE(sysctl_netrom_link_fails_count)) {
732 nr_neigh_put(nr_neigh);
739 nr_node->routes[nr_node->which].neighbour == nr_neigh)
744 nr_neigh_put(nr_neigh);
754 struct nr_neigh *nr_neigh;
802 nr_neigh = nr_node->routes[nr_node->which].neighbour;
826 ax25s = nr_neigh->ax25;
827 nr_neigh->ax25 = ax25_send_frame(skb, 256,
829 &nr_neigh->callsign,
830 nr_neigh->digipeat, nr_neigh->dev);
835 ret = (nr_neigh->ax25 != NULL);
927 struct nr_neigh *nr_neigh;
929 nr_neigh = hlist_entry(v, struct nr_neigh, neigh_node);
931 nr_neigh->number,
932 ax2asc(buf, &nr_neigh->callsign),
933 nr_neigh->dev ? nr_neigh->dev->name : "???",
934 nr_neigh->quality,
935 nr_neigh->locked,
936 nr_neigh->count,
937 nr_neigh->failed);
939 if (nr_neigh->digipeat != NULL) {
940 for (i = 0; i < nr_neigh->digipeat->ndigi; i++)
942 ax2asc(buf, &nr_neigh->digipeat->calls[i]));
963 struct nr_neigh *s = NULL;