Lines Matching refs:n
69 static void __tipc_node_link_down(struct tipc_node *n, int *bearer_id,
72 static void tipc_node_link_down(struct tipc_node *n, int bearer_id,
74 static void node_lost_contact(struct tipc_node *n, struct sk_buff_head *inputq);
77 static void tipc_node_fsm_evt(struct tipc_node *n, int evt);
201 static void tipc_node_calculate_timer(struct tipc_node *n, struct tipc_link *l) in tipc_node_calculate_timer() argument
208 if (keepalive_intv < n->keepalive_intv) in tipc_node_calculate_timer()
209 n->keepalive_intv = keepalive_intv; in tipc_node_calculate_timer()
212 l->abort_limit = l->tolerance / jiffies_to_msecs(n->keepalive_intv); in tipc_node_calculate_timer()
295 struct tipc_node *n = (struct tipc_node *)data; in tipc_node_timeout() local
304 tipc_node_lock(n); in tipc_node_timeout()
305 le = &n->links[bearer_id]; in tipc_node_timeout()
308 tipc_node_calculate_timer(n, le->link); in tipc_node_timeout()
311 tipc_node_unlock(n); in tipc_node_timeout()
312 tipc_bearer_xmit(n->net, bearer_id, &xmitq, &le->maddr); in tipc_node_timeout()
314 tipc_node_link_down(n, bearer_id, false); in tipc_node_timeout()
316 if (!mod_timer(&n->timer, jiffies + n->keepalive_intv)) in tipc_node_timeout()
317 tipc_node_get(n); in tipc_node_timeout()
318 tipc_node_put(n); in tipc_node_timeout()
326 static void __tipc_node_link_up(struct tipc_node *n, int bearer_id, in __tipc_node_link_up() argument
329 int *slot0 = &n->active_links[0]; in __tipc_node_link_up()
330 int *slot1 = &n->active_links[1]; in __tipc_node_link_up()
331 struct tipc_link *ol = node_active_link(n, 0); in __tipc_node_link_up()
332 struct tipc_link *nl = n->links[bearer_id].link; in __tipc_node_link_up()
341 n->working_links++; in __tipc_node_link_up()
342 n->action_flags |= TIPC_NOTIFY_LINK_UP; in __tipc_node_link_up()
343 n->link_id = nl->peer_bearer_id << 16 | bearer_id; in __tipc_node_link_up()
346 n->links[bearer_id].mtu = nl->mtu - INT_H_SIZE; in __tipc_node_link_up()
348 tipc_bearer_add_dest(n->net, bearer_id, n->addr); in __tipc_node_link_up()
349 tipc_bcast_inc_bearer_dst_cnt(n->net, bearer_id); in __tipc_node_link_up()
358 tipc_node_fsm_evt(n, SELF_ESTABL_CONTACT_EVT); in __tipc_node_link_up()
359 n->action_flags |= TIPC_NOTIFY_NODE_UP; in __tipc_node_link_up()
360 tipc_bcast_add_peer(n->net, nl, xmitq); in __tipc_node_link_up()
387 static void tipc_node_link_up(struct tipc_node *n, int bearer_id, in tipc_node_link_up() argument
390 tipc_node_lock(n); in tipc_node_link_up()
391 __tipc_node_link_up(n, bearer_id, xmitq); in tipc_node_link_up()
392 tipc_node_unlock(n); in tipc_node_link_up()
398 static void __tipc_node_link_down(struct tipc_node *n, int *bearer_id, in __tipc_node_link_down() argument
402 struct tipc_link_entry *le = &n->links[*bearer_id]; in __tipc_node_link_down()
403 int *slot0 = &n->active_links[0]; in __tipc_node_link_down()
404 int *slot1 = &n->active_links[1]; in __tipc_node_link_down()
408 l = n->links[*bearer_id].link; in __tipc_node_link_down()
412 n->working_links--; in __tipc_node_link_down()
413 n->action_flags |= TIPC_NOTIFY_LINK_DOWN; in __tipc_node_link_down()
414 n->link_id = l->peer_bearer_id << 16 | *bearer_id; in __tipc_node_link_down()
416 tipc_bearer_remove_dest(n->net, *bearer_id, n->addr); in __tipc_node_link_down()
425 _l = n->links[i].link; in __tipc_node_link_down()
441 if (!tipc_node_is_up(n)) { in __tipc_node_link_down()
443 tipc_node_fsm_evt(n, PEER_LOST_CONTACT_EVT); in __tipc_node_link_down()
444 tipc_node_fsm_evt(n, SELF_LOST_CONTACT_EVT); in __tipc_node_link_down()
448 *maddr = &n->links[*bearer_id].maddr; in __tipc_node_link_down()
449 node_lost_contact(n, &le->inputq); in __tipc_node_link_down()
450 tipc_bcast_dec_bearer_dst_cnt(n->net, *bearer_id); in __tipc_node_link_down()
453 tipc_bcast_dec_bearer_dst_cnt(n->net, *bearer_id); in __tipc_node_link_down()
456 tnl = node_active_link(n, 0); in __tipc_node_link_down()
458 tipc_node_fsm_evt(n, NODE_SYNCH_END_EVT); in __tipc_node_link_down()
459 n->sync_point = tnl->rcv_nxt + (U16_MAX / 2 - 1); in __tipc_node_link_down()
464 tipc_node_fsm_evt(n, NODE_FAILOVER_BEGIN_EVT); in __tipc_node_link_down()
465 *maddr = &n->links[tnl->bearer_id].maddr; in __tipc_node_link_down()
469 static void tipc_node_link_down(struct tipc_node *n, int bearer_id, bool delete) in tipc_node_link_down() argument
471 struct tipc_link_entry *le = &n->links[bearer_id]; in tipc_node_link_down()
481 tipc_node_lock(n); in tipc_node_link_down()
483 __tipc_node_link_down(n, &bearer_id, &xmitq, &maddr); in tipc_node_link_down()
487 n->link_cnt--; in tipc_node_link_down()
493 tipc_node_unlock(n); in tipc_node_link_down()
494 tipc_bearer_xmit(n->net, bearer_id, &xmitq, maddr); in tipc_node_link_down()
495 tipc_sk_rcv(n->net, &le->inputq); in tipc_node_link_down()
498 bool tipc_node_is_up(struct tipc_node *n) in tipc_node_is_up() argument
500 return n->active_links[0] != INVALID_BEARER_ID; in tipc_node_is_up()
509 struct tipc_node *n; in tipc_node_check_dest() local
522 n = tipc_node_create(net, onode, capabilities); in tipc_node_check_dest()
523 if (!n) in tipc_node_check_dest()
526 tipc_node_lock(n); in tipc_node_check_dest()
528 le = &n->links[b->identity]; in tipc_node_check_dest()
534 sign_match = (signature == n->signature); in tipc_node_check_dest()
574 n->signature = signature; in tipc_node_check_dest()
579 n->signature = signature; in tipc_node_check_dest()
590 n->signature = signature; in tipc_node_check_dest()
600 if (n->link_cnt == 2) { in tipc_node_check_dest()
601 pr_warn("Cannot establish 3rd link to %x\n", n->addr); in tipc_node_check_dest()
609 n->capabilities, in tipc_node_check_dest()
610 tipc_bc_sndlink(n->net), n->bc_entry.link, in tipc_node_check_dest()
612 &n->bc_entry.namedq, &l)) { in tipc_node_check_dest()
618 if (n->state == NODE_FAILINGOVER) in tipc_node_check_dest()
621 n->link_cnt++; in tipc_node_check_dest()
622 tipc_node_calculate_timer(n, l); in tipc_node_check_dest()
623 if (n->link_cnt == 1) in tipc_node_check_dest()
624 if (!mod_timer(&n->timer, jiffies + n->keepalive_intv)) in tipc_node_check_dest()
625 tipc_node_get(n); in tipc_node_check_dest()
629 tipc_node_unlock(n); in tipc_node_check_dest()
631 tipc_node_link_down(n, b->identity, false); in tipc_node_check_dest()
632 tipc_node_put(n); in tipc_node_check_dest()
638 struct tipc_node *n; in tipc_node_delete_links() local
641 list_for_each_entry_rcu(n, &tn->node_list, list) { in tipc_node_delete_links()
642 tipc_node_link_down(n, bearer_id, true); in tipc_node_delete_links()
647 static void tipc_node_reset_links(struct tipc_node *n) in tipc_node_reset_links() argument
653 tipc_addr_string_fill(addr_string, n->addr)); in tipc_node_reset_links()
656 tipc_node_link_down(n, i, false); in tipc_node_reset_links()
663 static void tipc_node_fsm_evt(struct tipc_node *n, int evt) in tipc_node_fsm_evt() argument
665 int state = n->state; in tipc_node_fsm_evt()
830 n->state = state; in tipc_node_fsm_evt()
837 bool tipc_node_filter_pkt(struct tipc_node *n, struct tipc_msg *hdr) in tipc_node_filter_pkt() argument
839 int state = n->state; in tipc_node_filter_pkt()
855 static void node_lost_contact(struct tipc_node *n, in node_lost_contact() argument
861 struct list_head *conns = &n->conn_sks; in node_lost_contact()
866 tipc_addr_string_fill(addr_string, n->addr)); in node_lost_contact()
869 tipc_bcast_remove_peer(n->net, n->bc_entry.link); in node_lost_contact()
873 l = n->links[i].link; in node_lost_contact()
879 n->action_flags |= TIPC_NOTIFY_NODE_DOWN; in node_lost_contact()
884 SHORT_H_SIZE, 0, tipc_own_addr(n->net), in node_lost_contact()
1000 static struct tipc_link *tipc_node_select_link(struct tipc_node *n, int sel, in tipc_node_select_link() argument
1004 int id = n->active_links[sel & 1]; in tipc_node_select_link()
1010 *maddr = &n->links[id].maddr; in tipc_node_select_link()
1011 return n->links[id].link; in tipc_node_select_link()
1027 struct tipc_node *n; in tipc_node_xmit() local
1034 n = tipc_node_find(net, dnode); in tipc_node_xmit()
1035 if (likely(n)) { in tipc_node_xmit()
1036 tipc_node_lock(n); in tipc_node_xmit()
1037 l = tipc_node_select_link(n, selector, &bearer_id, &maddr); in tipc_node_xmit()
1040 tipc_node_unlock(n); in tipc_node_xmit()
1042 tipc_node_link_down(n, bearer_id, false); in tipc_node_xmit()
1043 tipc_node_put(n); in tipc_node_xmit()
1095 struct tipc_node *n; in tipc_node_bc_rcv() local
1101 n = tipc_node_find(net, dnode); in tipc_node_bc_rcv()
1103 n = tipc_node_find(net, msg_prevnode(hdr)); in tipc_node_bc_rcv()
1104 if (!n) { in tipc_node_bc_rcv()
1108 be = &n->bc_entry; in tipc_node_bc_rcv()
1109 le = &n->links[bearer_id]; in tipc_node_bc_rcv()
1115 tipc_node_reset_links(n); in tipc_node_bc_rcv()
1119 tipc_node_lock(n); in tipc_node_bc_rcv()
1121 tipc_node_unlock(n); in tipc_node_bc_rcv()
1136 tipc_node_put(n); in tipc_node_bc_rcv()
1145 static bool tipc_node_check_state(struct tipc_node *n, struct sk_buff *skb, in tipc_node_check_state() argument
1155 int state = n->state; in tipc_node_check_state()
1160 l = n->links[bearer_id].link; in tipc_node_check_state()
1171 if ((i != bearer_id) && n->links[i].link) { in tipc_node_check_state()
1172 pl = n->links[i].link; in tipc_node_check_state()
1183 tipc_node_fsm_evt(n, PEER_ESTABL_CONTACT_EVT); in tipc_node_check_state()
1189 tipc_node_fsm_evt(n, PEER_LOST_CONTACT_EVT); in tipc_node_check_state()
1201 __tipc_node_link_down(n, &pb_id, xmitq, &maddr); in tipc_node_check_state()
1205 if (less(syncpt, n->sync_point)) in tipc_node_check_state()
1206 n->sync_point = syncpt; in tipc_node_check_state()
1210 if ((n->state == NODE_FAILINGOVER) && tipc_link_is_up(l)) { in tipc_node_check_state()
1211 if (!more(rcv_nxt, n->sync_point)) in tipc_node_check_state()
1213 tipc_node_fsm_evt(n, NODE_FAILOVER_END_EVT); in tipc_node_check_state()
1228 __tipc_node_link_up(n, bearer_id, xmitq); in tipc_node_check_state()
1230 if (n->state == SELF_UP_PEER_UP) { in tipc_node_check_state()
1231 n->sync_point = syncpt; in tipc_node_check_state()
1233 tipc_node_fsm_evt(n, NODE_SYNCH_BEGIN_EVT); in tipc_node_check_state()
1235 if (less(syncpt, n->sync_point)) in tipc_node_check_state()
1236 n->sync_point = syncpt; in tipc_node_check_state()
1240 if ((n->state == NODE_SYNCHING) && tipc_link_is_synching(l)) { in tipc_node_check_state()
1248 if (more(dlv_nxt, n->sync_point)) { in tipc_node_check_state()
1250 tipc_node_fsm_evt(n, NODE_SYNCH_END_EVT); in tipc_node_check_state()
1276 struct tipc_node *n; in tipc_rcv() local
1299 n = tipc_node_find(net, msg_prevnode(hdr)); in tipc_rcv()
1300 if (unlikely(!n)) in tipc_rcv()
1302 le = &n->links[bearer_id]; in tipc_rcv()
1306 tipc_bcast_sync_rcv(net, n->bc_entry.link, hdr); in tipc_rcv()
1307 else if (unlikely(n->bc_entry.link->acked != bc_ack)) in tipc_rcv()
1308 tipc_bcast_ack_rcv(net, n->bc_entry.link, bc_ack); in tipc_rcv()
1310 tipc_node_lock(n); in tipc_rcv()
1313 if (!tipc_node_filter_pkt(n, hdr)) in tipc_rcv()
1317 if (likely(tipc_node_check_state(n, skb, bearer_id, &xmitq))) { in tipc_rcv()
1322 tipc_node_unlock(n); in tipc_rcv()
1325 tipc_node_link_up(n, bearer_id, &xmitq); in tipc_rcv()
1328 tipc_node_link_down(n, bearer_id, false); in tipc_rcv()
1330 if (unlikely(!skb_queue_empty(&n->bc_entry.namedq))) in tipc_rcv()
1331 tipc_named_rcv(net, &n->bc_entry.namedq); in tipc_rcv()
1339 tipc_node_put(n); in tipc_rcv()