Lines Matching refs:n
174 static void __tipc_node_link_down(struct tipc_node *n, int *bearer_id,
177 static void tipc_node_link_down(struct tipc_node *n, int bearer_id,
179 static void node_lost_contact(struct tipc_node *n, struct sk_buff_head *inputq);
182 static void tipc_node_fsm_evt(struct tipc_node *n, int evt);
185 static bool node_is_up(struct tipc_node *n);
195 static struct tipc_link *node_active_link(struct tipc_node *n, int sel) in node_active_link() argument
197 int bearer_id = n->active_links[sel & 1]; in node_active_link()
202 return n->links[bearer_id].link; in node_active_link()
207 struct tipc_node *n; in tipc_node_get_mtu() local
211 n = tipc_node_find(net, addr); in tipc_node_get_mtu()
212 if (unlikely(!n)) in tipc_node_get_mtu()
218 if (n->peer_net && connected) { in tipc_node_get_mtu()
219 tipc_node_put(n); in tipc_node_get_mtu()
223 bearer_id = n->active_links[sel & 1]; in tipc_node_get_mtu()
225 mtu = n->links[bearer_id].mtu; in tipc_node_get_mtu()
226 tipc_node_put(n); in tipc_node_get_mtu()
233 struct tipc_node *n; in tipc_node_get_id() local
242 n = tipc_node_find(net, addr); in tipc_node_get_id()
243 if (!n) in tipc_node_get_id()
246 memcpy(id, &n->peer_id, TIPC_NODEID_LEN); in tipc_node_get_id()
247 tipc_node_put(n); in tipc_node_get_id()
253 struct tipc_node *n; in tipc_node_get_capabilities() local
256 n = tipc_node_find(net, addr); in tipc_node_get_capabilities()
257 if (unlikely(!n)) in tipc_node_get_capabilities()
259 caps = n->capabilities; in tipc_node_get_capabilities()
260 tipc_node_put(n); in tipc_node_get_capabilities()
292 struct tipc_node *n; in tipc_node_crypto_rx_by_addr() local
294 n = tipc_node_find(net, addr); in tipc_node_crypto_rx_by_addr()
295 return (n) ? n->crypto_rx : NULL; in tipc_node_crypto_rx_by_addr()
301 struct tipc_node *n = container_of(rp, struct tipc_node, rcu); in tipc_node_free() local
304 tipc_crypto_stop(&n->crypto_rx); in tipc_node_free()
306 kfree(n); in tipc_node_free()
311 struct tipc_node *n = container_of(kref, struct tipc_node, kref); in tipc_node_kref_release() local
313 kfree(n->bc_entry.link); in tipc_node_kref_release()
314 call_rcu(&n->rcu, tipc_node_free); in tipc_node_kref_release()
355 struct tipc_node *n; in tipc_node_find_by_id() local
359 list_for_each_entry_rcu(n, &tn->node_list, list) { in tipc_node_find_by_id()
360 read_lock_bh(&n->lock); in tipc_node_find_by_id()
361 if (!memcmp(id, n->peer_id, 16) && in tipc_node_find_by_id()
362 kref_get_unless_zero(&n->kref)) in tipc_node_find_by_id()
364 read_unlock_bh(&n->lock); in tipc_node_find_by_id()
369 return found ? n : NULL; in tipc_node_find_by_id()
372 static void tipc_node_read_lock(struct tipc_node *n) in tipc_node_read_lock() argument
373 __acquires(n->lock) in tipc_node_read_lock()
375 read_lock_bh(&n->lock); in tipc_node_read_lock()
378 static void tipc_node_read_unlock(struct tipc_node *n) in tipc_node_read_unlock() argument
379 __releases(n->lock) in tipc_node_read_unlock()
381 read_unlock_bh(&n->lock); in tipc_node_read_unlock()
384 static void tipc_node_write_lock(struct tipc_node *n) in tipc_node_write_lock() argument
385 __acquires(n->lock) in tipc_node_write_lock()
387 write_lock_bh(&n->lock); in tipc_node_write_lock()
390 static void tipc_node_write_unlock_fast(struct tipc_node *n) in tipc_node_write_unlock_fast() argument
391 __releases(n->lock) in tipc_node_write_unlock_fast()
393 write_unlock_bh(&n->lock); in tipc_node_write_unlock_fast()
396 static void tipc_node_write_unlock(struct tipc_node *n) in tipc_node_write_unlock() argument
397 __releases(n->lock) in tipc_node_write_unlock()
400 struct net *net = n->net; in tipc_node_write_unlock()
401 u32 flags = n->action_flags; in tipc_node_write_unlock()
407 write_unlock_bh(&n->lock); in tipc_node_write_unlock()
412 TIPC_LINK_STATE, n->addr, n->addr); in tipc_node_write_unlock()
413 sk.ref = n->link_id; in tipc_node_write_unlock()
415 node = n->addr; in tipc_node_write_unlock()
416 bearer_id = n->link_id & 0xffff; in tipc_node_write_unlock()
417 publ_list = &n->publ_list; in tipc_node_write_unlock()
419 n->action_flags &= ~(TIPC_NOTIFY_NODE_DOWN | TIPC_NOTIFY_NODE_UP | in tipc_node_write_unlock()
422 write_unlock_bh(&n->lock); in tipc_node_write_unlock()
425 tipc_publ_notify(net, publ_list, node, n->capabilities); in tipc_node_write_unlock()
428 tipc_named_node_up(net, node, n->capabilities); in tipc_node_write_unlock()
440 static void tipc_node_assign_peer_net(struct tipc_node *n, u32 hash_mixes) in tipc_node_assign_peer_net() argument
442 int net_id = tipc_netid(n->net); in tipc_node_assign_peer_net()
447 if (n->peer_net) in tipc_node_assign_peer_net()
457 if (memcmp(n->peer_id, tn_peer->node_id, NODE_ID_LEN)) in tipc_node_assign_peer_net()
462 n->peer_net = tmp; in tipc_node_assign_peer_net()
463 n->peer_hash_mix = hash_mixes; in tipc_node_assign_peer_net()
474 struct tipc_node *n, *temp_node; in tipc_node_create() local
480 n = tipc_node_find(net, addr) ?: in tipc_node_create()
482 if (n) { in tipc_node_create()
483 if (!n->preliminary) in tipc_node_create()
488 tipc_node_write_lock(n); in tipc_node_create()
491 n->capabilities, &n->bc_entry.inputq1, in tipc_node_create()
492 &n->bc_entry.namedq, snd_l, &n->bc_entry.link)) { in tipc_node_create()
494 tipc_node_write_unlock_fast(n); in tipc_node_create()
495 tipc_node_put(n); in tipc_node_create()
496 n = NULL; in tipc_node_create()
499 n->preliminary = false; in tipc_node_create()
500 n->addr = addr; in tipc_node_create()
501 hlist_del_rcu(&n->hash); in tipc_node_create()
502 hlist_add_head_rcu(&n->hash, in tipc_node_create()
504 list_del_rcu(&n->list); in tipc_node_create()
506 if (n->addr < temp_node->addr) in tipc_node_create()
509 list_add_tail_rcu(&n->list, &temp_node->list); in tipc_node_create()
510 tipc_node_write_unlock_fast(n); in tipc_node_create()
513 if (n->peer_hash_mix ^ hash_mixes) in tipc_node_create()
514 tipc_node_assign_peer_net(n, hash_mixes); in tipc_node_create()
515 if (n->capabilities == capabilities) in tipc_node_create()
518 tipc_node_write_lock(n); in tipc_node_create()
519 n->capabilities = capabilities; in tipc_node_create()
521 l = n->links[bearer_id].link; in tipc_node_create()
525 tipc_node_write_unlock_fast(n); in tipc_node_create()
538 n = kzalloc(sizeof(*n), GFP_ATOMIC); in tipc_node_create()
539 if (!n) { in tipc_node_create()
543 tipc_nodeid2string(n->peer_id_string, peer_id); in tipc_node_create()
545 if (unlikely(tipc_crypto_start(&n->crypto_rx, net, n))) { in tipc_node_create()
546 pr_warn("Failed to start crypto RX(%s)!\n", n->peer_id_string); in tipc_node_create()
547 kfree(n); in tipc_node_create()
548 n = NULL; in tipc_node_create()
552 n->addr = addr; in tipc_node_create()
553 n->preliminary = preliminary; in tipc_node_create()
554 memcpy(&n->peer_id, peer_id, 16); in tipc_node_create()
555 n->net = net; in tipc_node_create()
556 n->peer_net = NULL; in tipc_node_create()
557 n->peer_hash_mix = 0; in tipc_node_create()
559 tipc_node_assign_peer_net(n, hash_mixes); in tipc_node_create()
560 n->capabilities = capabilities; in tipc_node_create()
561 kref_init(&n->kref); in tipc_node_create()
562 rwlock_init(&n->lock); in tipc_node_create()
563 INIT_HLIST_NODE(&n->hash); in tipc_node_create()
564 INIT_LIST_HEAD(&n->list); in tipc_node_create()
565 INIT_LIST_HEAD(&n->publ_list); in tipc_node_create()
566 INIT_LIST_HEAD(&n->conn_sks); in tipc_node_create()
567 skb_queue_head_init(&n->bc_entry.namedq); in tipc_node_create()
568 skb_queue_head_init(&n->bc_entry.inputq1); in tipc_node_create()
569 __skb_queue_head_init(&n->bc_entry.arrvq); in tipc_node_create()
570 skb_queue_head_init(&n->bc_entry.inputq2); in tipc_node_create()
572 spin_lock_init(&n->links[i].lock); in tipc_node_create()
573 n->state = SELF_DOWN_PEER_LEAVING; in tipc_node_create()
574 n->delete_at = jiffies + msecs_to_jiffies(NODE_CLEANUP_AFTER); in tipc_node_create()
575 n->signature = INVALID_NODE_SIG; in tipc_node_create()
576 n->active_links[0] = INVALID_BEARER_ID; in tipc_node_create()
577 n->active_links[1] = INVALID_BEARER_ID; in tipc_node_create()
581 n->capabilities, &n->bc_entry.inputq1, in tipc_node_create()
582 &n->bc_entry.namedq, snd_l, &n->bc_entry.link)) { in tipc_node_create()
584 tipc_node_put(n); in tipc_node_create()
585 n = NULL; in tipc_node_create()
588 tipc_node_get(n); in tipc_node_create()
589 timer_setup(&n->timer, tipc_node_timeout, 0); in tipc_node_create()
591 n->keepalive_intv = 10000; in tipc_node_create()
592 intv = jiffies + msecs_to_jiffies(n->keepalive_intv); in tipc_node_create()
593 if (!mod_timer(&n->timer, intv)) in tipc_node_create()
594 tipc_node_get(n); in tipc_node_create()
595 hlist_add_head_rcu(&n->hash, &tn->node_htable[tipc_hashfn(addr)]); in tipc_node_create()
597 if (n->addr < temp_node->addr) in tipc_node_create()
600 list_add_tail_rcu(&n->list, &temp_node->list); in tipc_node_create()
607 trace_tipc_node_create(n, true, " "); in tipc_node_create()
610 return n; in tipc_node_create()
613 static void tipc_node_calculate_timer(struct tipc_node *n, struct tipc_link *l) in tipc_node_calculate_timer() argument
619 if (intv < n->keepalive_intv) in tipc_node_calculate_timer()
620 n->keepalive_intv = intv; in tipc_node_calculate_timer()
623 tipc_link_set_abort_limit(l, tol / n->keepalive_intv); in tipc_node_calculate_timer()
658 struct tipc_node *n; in tipc_node_subscribe() local
663 n = tipc_node_find(net, addr); in tipc_node_subscribe()
664 if (!n) { in tipc_node_subscribe()
668 tipc_node_write_lock(n); in tipc_node_subscribe()
669 list_add_tail(subscr, &n->publ_list); in tipc_node_subscribe()
670 tipc_node_write_unlock_fast(n); in tipc_node_subscribe()
671 tipc_node_put(n); in tipc_node_subscribe()
676 struct tipc_node *n; in tipc_node_unsubscribe() local
681 n = tipc_node_find(net, addr); in tipc_node_unsubscribe()
682 if (!n) { in tipc_node_unsubscribe()
686 tipc_node_write_lock(n); in tipc_node_unsubscribe()
688 tipc_node_write_unlock_fast(n); in tipc_node_unsubscribe()
689 tipc_node_put(n); in tipc_node_unsubscribe()
803 struct tipc_node *n = timer_container_of(n, t, timer); in tipc_node_timeout() local
806 int remains = n->link_cnt; in tipc_node_timeout()
810 trace_tipc_node_timeout(n, false, " "); in tipc_node_timeout()
811 if (!node_is_up(n) && tipc_node_cleanup(n)) { in tipc_node_timeout()
813 tipc_node_put(n); in tipc_node_timeout()
819 tipc_crypto_timeout(n->crypto_rx); in tipc_node_timeout()
826 tipc_node_read_lock(n); in tipc_node_timeout()
827 n->keepalive_intv = 10000; in tipc_node_timeout()
828 tipc_node_read_unlock(n); in tipc_node_timeout()
830 tipc_node_read_lock(n); in tipc_node_timeout()
831 le = &n->links[bearer_id]; in tipc_node_timeout()
835 tipc_node_calculate_timer(n, le->link); in tipc_node_timeout()
840 tipc_node_read_unlock(n); in tipc_node_timeout()
841 tipc_bearer_xmit(n->net, bearer_id, &xmitq, &le->maddr, n); in tipc_node_timeout()
843 tipc_node_link_down(n, bearer_id, false); in tipc_node_timeout()
845 mod_timer(&n->timer, jiffies + msecs_to_jiffies(n->keepalive_intv)); in tipc_node_timeout()
856 static void __tipc_node_link_up(struct tipc_node *n, int bearer_id, in __tipc_node_link_up() argument
859 int *slot0 = &n->active_links[0]; in __tipc_node_link_up()
860 int *slot1 = &n->active_links[1]; in __tipc_node_link_up()
861 struct tipc_link *ol = node_active_link(n, 0); in __tipc_node_link_up()
862 struct tipc_link *nl = n->links[bearer_id].link; in __tipc_node_link_up()
871 n->working_links++; in __tipc_node_link_up()
872 n->action_flags |= TIPC_NOTIFY_LINK_UP; in __tipc_node_link_up()
873 n->link_id = tipc_link_id(nl); in __tipc_node_link_up()
876 n->links[bearer_id].mtu = tipc_link_mss(nl); in __tipc_node_link_up()
878 tipc_bearer_add_dest(n->net, bearer_id, n->addr); in __tipc_node_link_up()
879 tipc_bcast_inc_bearer_dst_cnt(n->net, bearer_id); in __tipc_node_link_up()
883 trace_tipc_node_link_up(n, true, " "); in __tipc_node_link_up()
892 tipc_node_fsm_evt(n, SELF_ESTABL_CONTACT_EVT); in __tipc_node_link_up()
893 n->action_flags |= TIPC_NOTIFY_NODE_UP; in __tipc_node_link_up()
895 tipc_bcast_add_peer(n->net, nl, xmitq); in __tipc_node_link_up()
925 static void tipc_node_link_up(struct tipc_node *n, int bearer_id, in tipc_node_link_up() argument
930 tipc_node_write_lock(n); in tipc_node_link_up()
931 __tipc_node_link_up(n, bearer_id, xmitq); in tipc_node_link_up()
932 maddr = &n->links[bearer_id].maddr; in tipc_node_link_up()
933 tipc_bearer_xmit(n->net, bearer_id, xmitq, maddr, n); in tipc_node_link_up()
934 tipc_node_write_unlock(n); in tipc_node_link_up()
958 static void tipc_node_link_failover(struct tipc_node *n, struct tipc_link *l, in tipc_node_link_failover() argument
971 tipc_node_fsm_evt(n, NODE_SYNCH_END_EVT); in tipc_node_link_failover()
973 n->sync_point = tipc_link_rcv_nxt(tnl) + (U16_MAX / 2 - 1); in tipc_node_link_failover()
978 tipc_node_fsm_evt(n, NODE_FAILOVER_BEGIN_EVT); in tipc_node_link_failover()
988 static void __tipc_node_link_down(struct tipc_node *n, int *bearer_id, in __tipc_node_link_down() argument
992 struct tipc_link_entry *le = &n->links[*bearer_id]; in __tipc_node_link_down()
993 int *slot0 = &n->active_links[0]; in __tipc_node_link_down()
994 int *slot1 = &n->active_links[1]; in __tipc_node_link_down()
998 l = n->links[*bearer_id].link; in __tipc_node_link_down()
1002 n->working_links--; in __tipc_node_link_down()
1003 n->action_flags |= TIPC_NOTIFY_LINK_DOWN; in __tipc_node_link_down()
1004 n->link_id = tipc_link_id(l); in __tipc_node_link_down()
1006 tipc_bearer_remove_dest(n->net, *bearer_id, n->addr); in __tipc_node_link_down()
1015 _l = n->links[i].link; in __tipc_node_link_down()
1032 if (!node_is_up(n)) { in __tipc_node_link_down()
1034 tipc_node_fsm_evt(n, PEER_LOST_CONTACT_EVT); in __tipc_node_link_down()
1035 tipc_node_fsm_evt(n, SELF_LOST_CONTACT_EVT); in __tipc_node_link_down()
1040 *maddr = &n->links[*bearer_id].maddr; in __tipc_node_link_down()
1041 node_lost_contact(n, &le->inputq); in __tipc_node_link_down()
1042 tipc_bcast_dec_bearer_dst_cnt(n->net, *bearer_id); in __tipc_node_link_down()
1045 tipc_bcast_dec_bearer_dst_cnt(n->net, *bearer_id); in __tipc_node_link_down()
1048 *bearer_id = n->active_links[0]; in __tipc_node_link_down()
1049 tnl = n->links[*bearer_id].link; in __tipc_node_link_down()
1051 tipc_node_fsm_evt(n, NODE_SYNCH_END_EVT); in __tipc_node_link_down()
1052 n->sync_point = tipc_link_rcv_nxt(tnl) + (U16_MAX / 2 - 1); in __tipc_node_link_down()
1058 tipc_node_fsm_evt(n, NODE_FAILOVER_BEGIN_EVT); in __tipc_node_link_down()
1059 *maddr = &n->links[*bearer_id].maddr; in __tipc_node_link_down()
1062 static void tipc_node_link_down(struct tipc_node *n, int bearer_id, bool delete) in tipc_node_link_down() argument
1064 struct tipc_link_entry *le = &n->links[bearer_id]; in tipc_node_link_down()
1075 tipc_node_write_lock(n); in tipc_node_link_down()
1077 __tipc_node_link_down(n, &bearer_id, &xmitq, &maddr); in tipc_node_link_down()
1086 n->link_cnt--; in tipc_node_link_down()
1088 trace_tipc_node_link_down(n, true, "node link down or deleted!"); in tipc_node_link_down()
1089 tipc_node_write_unlock(n); in tipc_node_link_down()
1091 tipc_mon_remove_peer(n->net, n->addr, old_bearer_id); in tipc_node_link_down()
1093 tipc_bearer_xmit(n->net, bearer_id, &xmitq, maddr, n); in tipc_node_link_down()
1094 tipc_sk_rcv(n->net, &le->inputq); in tipc_node_link_down()
1097 static bool node_is_up(struct tipc_node *n) in node_is_up() argument
1099 return n->active_links[0] != INVALID_BEARER_ID; in node_is_up()
1104 struct tipc_node *n; in tipc_node_is_up() local
1110 n = tipc_node_find(net, addr); in tipc_node_is_up()
1111 if (!n) in tipc_node_is_up()
1113 retval = node_is_up(n); in tipc_node_is_up()
1114 tipc_node_put(n); in tipc_node_is_up()
1120 struct tipc_node *n; in tipc_node_suggest_addr() local
1123 while ((n = tipc_node_find(net, addr))) { in tipc_node_suggest_addr()
1124 tipc_node_put(n); in tipc_node_suggest_addr()
1136 struct tipc_node *n; in tipc_node_try_addr() local
1141 n = tipc_node_find(net, addr); in tipc_node_try_addr()
1142 if (n) { in tipc_node_try_addr()
1143 if (!memcmp(n->peer_id, id, NODE_ID_LEN)) in tipc_node_try_addr()
1145 tipc_node_put(n); in tipc_node_try_addr()
1152 n = tipc_node_find_by_id(net, id); in tipc_node_try_addr()
1153 if (n) { in tipc_node_try_addr()
1154 sugg_addr = n->addr; in tipc_node_try_addr()
1155 preliminary = n->preliminary; in tipc_node_try_addr()
1156 tipc_node_put(n); in tipc_node_try_addr()
1174 struct tipc_node *n; in tipc_node_check_dest() local
1190 n = tipc_node_create(net, addr, peer_id, capabilities, hash_mixes, in tipc_node_check_dest()
1192 if (!n) in tipc_node_check_dest()
1195 tipc_node_write_lock(n); in tipc_node_check_dest()
1197 le = &n->links[b->identity]; in tipc_node_check_dest()
1204 sign_match = (signature == n->signature); in tipc_node_check_dest()
1211 if (!n->peer_hash_mix) in tipc_node_check_dest()
1212 n->peer_hash_mix = hash_mixes; in tipc_node_check_dest()
1247 n->signature = signature; in tipc_node_check_dest()
1252 n->signature = signature; in tipc_node_check_dest()
1263 n->signature = signature; in tipc_node_check_dest()
1274 if (n->link_cnt == 2) in tipc_node_check_dest()
1283 n->capabilities, in tipc_node_check_dest()
1284 tipc_bc_sndlink(n->net), n->bc_entry.link, in tipc_node_check_dest()
1286 &n->bc_entry.namedq, &l)) { in tipc_node_check_dest()
1293 if (n->state == NODE_FAILINGOVER) in tipc_node_check_dest()
1297 n->link_cnt++; in tipc_node_check_dest()
1298 tipc_node_calculate_timer(n, l); in tipc_node_check_dest()
1299 if (n->link_cnt == 1) { in tipc_node_check_dest()
1300 intv = jiffies + msecs_to_jiffies(n->keepalive_intv); in tipc_node_check_dest()
1301 if (!mod_timer(&n->timer, intv)) in tipc_node_check_dest()
1302 tipc_node_get(n); in tipc_node_check_dest()
1307 tipc_node_write_unlock(n); in tipc_node_check_dest()
1309 tipc_node_link_down(n, b->identity, false); in tipc_node_check_dest()
1310 tipc_node_put(n); in tipc_node_check_dest()
1316 struct tipc_node *n; in tipc_node_delete_links() local
1319 list_for_each_entry_rcu(n, &tn->node_list, list) { in tipc_node_delete_links()
1320 tipc_node_link_down(n, bearer_id, true); in tipc_node_delete_links()
1325 static void tipc_node_reset_links(struct tipc_node *n) in tipc_node_reset_links() argument
1329 pr_warn("Resetting all links to %x\n", n->addr); in tipc_node_reset_links()
1331 trace_tipc_node_reset_links(n, true, " "); in tipc_node_reset_links()
1333 tipc_node_link_down(n, i, false); in tipc_node_reset_links()
1340 static void tipc_node_fsm_evt(struct tipc_node *n, int evt) in tipc_node_fsm_evt() argument
1342 int state = n->state; in tipc_node_fsm_evt()
1507 trace_tipc_node_fsm(n->peer_id, n->state, state, evt); in tipc_node_fsm_evt()
1508 n->state = state; in tipc_node_fsm_evt()
1513 trace_tipc_node_fsm(n->peer_id, n->state, state, evt); in tipc_node_fsm_evt()
1516 static void node_lost_contact(struct tipc_node *n, in node_lost_contact() argument
1521 struct list_head *conns = &n->conn_sks; in node_lost_contact()
1525 pr_debug("Lost contact with %x\n", n->addr); in node_lost_contact()
1526 n->delete_at = jiffies + msecs_to_jiffies(NODE_CLEANUP_AFTER); in node_lost_contact()
1527 trace_tipc_node_lost_contact(n, true, " "); in node_lost_contact()
1530 tipc_bcast_remove_peer(n->net, n->bc_entry.link); in node_lost_contact()
1531 skb_queue_purge(&n->bc_entry.namedq); in node_lost_contact()
1535 l = n->links[i].link; in node_lost_contact()
1541 n->action_flags |= TIPC_NOTIFY_NODE_DOWN; in node_lost_contact()
1542 n->peer_net = NULL; in node_lost_contact()
1543 n->peer_hash_mix = 0; in node_lost_contact()
1547 SHORT_H_SIZE, 0, tipc_own_addr(n->net), in node_lost_contact()
1691 struct tipc_node *n; in tipc_node_xmit() local
1705 n = tipc_node_find(net, dnode); in tipc_node_xmit()
1706 if (unlikely(!n)) { in tipc_node_xmit()
1712 tipc_node_read_lock(n); in tipc_node_xmit()
1713 node_up = node_is_up(n); in tipc_node_xmit()
1714 peer_net = n->peer_net; in tipc_node_xmit()
1715 tipc_node_read_unlock(n); in tipc_node_xmit()
1721 tipc_node_put(n); in tipc_node_xmit()
1727 tipc_node_read_lock(n); in tipc_node_xmit()
1728 bearer_id = n->active_links[selector & 1]; in tipc_node_xmit()
1730 tipc_node_read_unlock(n); in tipc_node_xmit()
1731 tipc_node_put(n); in tipc_node_xmit()
1737 le = &n->links[bearer_id]; in tipc_node_xmit()
1741 tipc_node_read_unlock(n); in tipc_node_xmit()
1744 tipc_node_link_down(n, bearer_id, false); in tipc_node_xmit()
1746 tipc_bearer_xmit(net, bearer_id, &xmitq, &le->maddr, n); in tipc_node_xmit()
1748 tipc_node_put(n); in tipc_node_xmit()
1790 struct tipc_node *n; in tipc_node_broadcast() local
1804 list_for_each_entry_rcu(n, tipc_nodes(net), list) { in tipc_node_broadcast()
1805 dst = n->addr; in tipc_node_broadcast()
1808 if (!node_is_up(n)) in tipc_node_broadcast()
1820 static void tipc_node_mcast_rcv(struct tipc_node *n) in tipc_node_mcast_rcv() argument
1822 struct tipc_bclink_entry *be = &n->bc_entry; in tipc_node_mcast_rcv()
1830 tipc_sk_mcast_rcv(n->net, &be->arrvq, &be->inputq2); in tipc_node_mcast_rcv()
1833 static void tipc_node_bc_sync_rcv(struct tipc_node *n, struct tipc_msg *hdr, in tipc_node_bc_sync_rcv() argument
1839 rc = tipc_bcast_sync_rcv(n->net, n->bc_entry.link, hdr, xmitq); in tipc_node_bc_sync_rcv()
1842 tipc_node_reset_links(n); in tipc_node_bc_sync_rcv()
1854 tipc_node_read_lock(n); in tipc_node_bc_sync_rcv()
1855 ucl = n->links[bearer_id].link; in tipc_node_bc_sync_rcv()
1858 tipc_node_read_unlock(n); in tipc_node_bc_sync_rcv()
1878 struct tipc_node *n; in tipc_node_bc_rcv() local
1884 n = tipc_node_find(net, dnode); in tipc_node_bc_rcv()
1886 n = tipc_node_find(net, msg_prevnode(hdr)); in tipc_node_bc_rcv()
1887 if (!n) { in tipc_node_bc_rcv()
1891 be = &n->bc_entry; in tipc_node_bc_rcv()
1892 le = &n->links[bearer_id]; in tipc_node_bc_rcv()
1898 tipc_node_read_lock(n); in tipc_node_bc_rcv()
1900 tipc_node_read_unlock(n); in tipc_node_bc_rcv()
1904 tipc_bearer_xmit(net, bearer_id, &xmitq, &le->maddr, n); in tipc_node_bc_rcv()
1907 tipc_node_mcast_rcv(n); in tipc_node_bc_rcv()
1910 if (!skb_queue_empty(&n->bc_entry.namedq)) in tipc_node_bc_rcv()
1911 tipc_named_rcv(net, &n->bc_entry.namedq, in tipc_node_bc_rcv()
1912 &n->bc_entry.named_rcv_nxt, in tipc_node_bc_rcv()
1913 &n->bc_entry.named_open); in tipc_node_bc_rcv()
1917 tipc_node_reset_links(n); in tipc_node_bc_rcv()
1919 tipc_node_put(n); in tipc_node_bc_rcv()
1930 static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb, in tipc_node_check_state() argument
1939 int state = n->state; in tipc_node_check_state()
1946 trace_tipc_node_check_state(n, true, " "); in tipc_node_check_state()
1948 l = n->links[bearer_id].link; in tipc_node_check_state()
1959 if ((pb_id != bearer_id) && n->links[pb_id].link) { in tipc_node_check_state()
1960 pl = n->links[pb_id].link; in tipc_node_check_state()
1977 tipc_node_fsm_evt(n, PEER_ESTABL_CONTACT_EVT); in tipc_node_check_state()
1983 tipc_node_fsm_evt(n, PEER_LOST_CONTACT_EVT); in tipc_node_check_state()
1998 __tipc_node_link_down(n, &pb_id, xmitq, &maddr); in tipc_node_check_state()
1999 trace_tipc_node_link_down(n, true, in tipc_node_check_state()
2011 if (n->state != NODE_FAILINGOVER) in tipc_node_check_state()
2012 tipc_node_link_failover(n, pl, l, xmitq); in tipc_node_check_state()
2015 if (less(syncpt, n->sync_point)) in tipc_node_check_state()
2016 n->sync_point = syncpt; in tipc_node_check_state()
2020 if ((n->state == NODE_FAILINGOVER) && tipc_link_is_up(l)) { in tipc_node_check_state()
2021 if (!more(rcv_nxt, n->sync_point)) in tipc_node_check_state()
2023 tipc_node_fsm_evt(n, NODE_FAILOVER_END_EVT); in tipc_node_check_state()
2035 if (n->capabilities & TIPC_TUNNEL_ENHANCED) in tipc_node_check_state()
2040 __tipc_node_link_up(n, bearer_id, xmitq); in tipc_node_check_state()
2041 if (n->state == SELF_UP_PEER_UP) { in tipc_node_check_state()
2042 n->sync_point = syncpt; in tipc_node_check_state()
2044 tipc_node_fsm_evt(n, NODE_SYNCH_BEGIN_EVT); in tipc_node_check_state()
2049 if (n->state == NODE_SYNCHING) { in tipc_node_check_state()
2058 if (more(dlv_nxt, n->sync_point)) { in tipc_node_check_state()
2060 tipc_node_fsm_evt(n, NODE_SYNCH_END_EVT); in tipc_node_check_state()
2088 struct tipc_node *n; in tipc_rcv() local
2102 n = tipc_node_find(net, ntohl(ehdr->addr)); in tipc_rcv()
2103 if (unlikely(!n)) in tipc_rcv()
2106 n = tipc_node_find_by_id(net, ehdr->id); in tipc_rcv()
2109 tipc_crypto_rcv(net, (n) ? n->crypto_rx : NULL, &skb, b); in tipc_rcv()
2136 n = tipc_node_find(net, msg_prevnode(hdr)); in tipc_rcv()
2137 if (unlikely(!n)) in tipc_rcv()
2139 le = &n->links[bearer_id]; in tipc_rcv()
2144 tipc_node_put(n); in tipc_rcv()
2148 tipc_node_bc_sync_rcv(n, hdr, bearer_id, &xmitq); in tipc_rcv()
2149 } else if (unlikely(tipc_link_acked(n->bc_entry.link) != bc_ack)) { in tipc_rcv()
2150 tipc_bcast_ack_rcv(net, n->bc_entry.link, hdr); in tipc_rcv()
2154 tipc_node_read_lock(n); in tipc_rcv()
2155 if (likely((n->state == SELF_UP_PEER_UP) && (usr != TUNNEL_PROTOCOL))) { in tipc_rcv()
2163 tipc_node_read_unlock(n); in tipc_rcv()
2169 tipc_node_write_lock(n); in tipc_rcv()
2170 if (tipc_node_check_state(n, skb, bearer_id, &xmitq)) { in tipc_rcv()
2176 tipc_node_write_unlock(n); in tipc_rcv()
2180 tipc_node_link_up(n, bearer_id, &xmitq); in tipc_rcv()
2183 tipc_node_link_down(n, bearer_id, false); in tipc_rcv()
2185 if (unlikely(!skb_queue_empty(&n->bc_entry.namedq))) in tipc_rcv()
2186 tipc_named_rcv(net, &n->bc_entry.namedq, in tipc_rcv()
2187 &n->bc_entry.named_rcv_nxt, in tipc_rcv()
2188 &n->bc_entry.named_open); in tipc_rcv()
2190 if (unlikely(!skb_queue_empty(&n->bc_entry.inputq1))) in tipc_rcv()
2191 tipc_node_mcast_rcv(n); in tipc_rcv()
2197 tipc_bearer_xmit(net, bearer_id, &xmitq, &le->maddr, n); in tipc_rcv()
2200 tipc_node_put(n); in tipc_rcv()
2212 struct tipc_node *n; in tipc_node_apply_property() local
2218 list_for_each_entry_rcu(n, &tn->node_list, list) { in tipc_node_apply_property()
2219 tipc_node_write_lock(n); in tipc_node_apply_property()
2220 e = &n->links[bearer_id]; in tipc_node_apply_property()
2232 tipc_node_write_unlock(n); in tipc_node_apply_property()
2391 struct tipc_node *n; in tipc_node_find_by_name() local
2397 list_for_each_entry_rcu(n, &tn->node_list, list) { in tipc_node_find_by_name()
2398 tipc_node_read_lock(n); in tipc_node_find_by_name()
2400 l = n->links[i].link; in tipc_node_find_by_name()
2403 found_node = n; in tipc_node_find_by_name()
2407 tipc_node_read_unlock(n); in tipc_node_find_by_name()
2965 struct tipc_node *n = NULL; in __tipc_nl_node_set_key() local
3010 n = tipc_node_find_by_id(net, id) ?: in __tipc_nl_node_set_key()
3012 if (unlikely(!n)) in __tipc_nl_node_set_key()
3014 c = n->crypto_rx; in __tipc_nl_node_set_key()
3023 if (n) in __tipc_nl_node_set_key()
3024 tipc_node_put(n); in __tipc_nl_node_set_key()
3057 struct tipc_node *n; in __tipc_nl_node_flush_key() local
3061 list_for_each_entry_rcu(n, &tn->node_list, list) in __tipc_nl_node_flush_key()
3062 tipc_crypto_key_flush(n->crypto_rx); in __tipc_nl_node_flush_key()
3088 int tipc_node_dump(struct tipc_node *n, bool more, char *buf) in tipc_node_dump() argument
3093 if (!n) { in tipc_node_dump()
3098 i += scnprintf(buf, sz, "node data: %x", n->addr); in tipc_node_dump()
3099 i += scnprintf(buf + i, sz - i, " %x", n->state); in tipc_node_dump()
3100 i += scnprintf(buf + i, sz - i, " %d", n->active_links[0]); in tipc_node_dump()
3101 i += scnprintf(buf + i, sz - i, " %d", n->active_links[1]); in tipc_node_dump()
3102 i += scnprintf(buf + i, sz - i, " %x", n->action_flags); in tipc_node_dump()
3103 i += scnprintf(buf + i, sz - i, " %u", n->failover_sent); in tipc_node_dump()
3104 i += scnprintf(buf + i, sz - i, " %u", n->sync_point); in tipc_node_dump()
3105 i += scnprintf(buf + i, sz - i, " %d", n->link_cnt); in tipc_node_dump()
3106 i += scnprintf(buf + i, sz - i, " %u", n->working_links); in tipc_node_dump()
3107 i += scnprintf(buf + i, sz - i, " %x", n->capabilities); in tipc_node_dump()
3108 i += scnprintf(buf + i, sz - i, " %lu\n", n->keepalive_intv); in tipc_node_dump()
3114 i += scnprintf(buf + i, sz - i, " mtu: %u\n", n->links[0].mtu); in tipc_node_dump()
3116 i += tipc_media_addr_printf(buf + i, sz - i, &n->links[0].maddr); in tipc_node_dump()
3118 i += tipc_link_dump(n->links[0].link, TIPC_DUMP_NONE, buf + i); in tipc_node_dump()
3120 i += tipc_list_dump(&n->links[0].inputq, false, buf + i); in tipc_node_dump()
3123 i += scnprintf(buf + i, sz - i, " mtu: %u\n", n->links[1].mtu); in tipc_node_dump()
3125 i += tipc_media_addr_printf(buf + i, sz - i, &n->links[1].maddr); in tipc_node_dump()
3127 i += tipc_link_dump(n->links[1].link, TIPC_DUMP_NONE, buf + i); in tipc_node_dump()
3129 i += tipc_list_dump(&n->links[1].inputq, false, buf + i); in tipc_node_dump()
3132 i += tipc_link_dump(n->bc_entry.link, TIPC_DUMP_NONE, buf + i); in tipc_node_dump()
3139 struct tipc_node *n; in tipc_node_pre_cleanup_net() local
3151 list_for_each_entry_rcu(n, &tn->node_list, list) { in tipc_node_pre_cleanup_net()
3152 if (!n->peer_net) in tipc_node_pre_cleanup_net()
3154 if (n->peer_net != exit_net) in tipc_node_pre_cleanup_net()
3156 tipc_node_write_lock(n); in tipc_node_pre_cleanup_net()
3157 n->peer_net = NULL; in tipc_node_pre_cleanup_net()
3158 n->peer_hash_mix = 0; in tipc_node_pre_cleanup_net()
3159 tipc_node_write_unlock_fast(n); in tipc_node_pre_cleanup_net()