Lines Matching refs:l_ptr
100 static void link_set_supervision_props(struct tipc_link *l_ptr, u32 tol);
101 static void link_state_event(struct tipc_link *l_ptr, u32 event);
102 static void link_reset_statistics(struct tipc_link *l_ptr);
103 static void link_print(struct tipc_link *l_ptr, const char *str);
122 static void tipc_link_get(struct tipc_link *l_ptr) in tipc_link_get() argument
124 kref_get(&l_ptr->ref); in tipc_link_get()
127 static void tipc_link_put(struct tipc_link *l_ptr) in tipc_link_put() argument
129 kref_put(&l_ptr->ref, tipc_link_release); in tipc_link_put()
142 int tipc_link_is_up(struct tipc_link *l_ptr) in tipc_link_is_up() argument
144 if (!l_ptr) in tipc_link_is_up()
146 return link_working_working(l_ptr) || link_working_unknown(l_ptr); in tipc_link_is_up()
149 int tipc_link_is_active(struct tipc_link *l_ptr) in tipc_link_is_active() argument
151 return (l_ptr->owner->active_links[0] == l_ptr) || in tipc_link_is_active()
152 (l_ptr->owner->active_links[1] == l_ptr); in tipc_link_is_active()
161 struct tipc_link *l_ptr = (struct tipc_link *)data; in link_timeout() local
164 tipc_node_lock(l_ptr->owner); in link_timeout()
167 l_ptr->stats.accu_queue_sz += skb_queue_len(&l_ptr->transmq); in link_timeout()
168 l_ptr->stats.queue_sz_counts++; in link_timeout()
170 skb = skb_peek(&l_ptr->transmq); in link_timeout()
180 l_ptr->stats.msg_lengths_total += length; in link_timeout()
181 l_ptr->stats.msg_length_counts++; in link_timeout()
183 l_ptr->stats.msg_length_profile[0]++; in link_timeout()
185 l_ptr->stats.msg_length_profile[1]++; in link_timeout()
187 l_ptr->stats.msg_length_profile[2]++; in link_timeout()
189 l_ptr->stats.msg_length_profile[3]++; in link_timeout()
191 l_ptr->stats.msg_length_profile[4]++; in link_timeout()
193 l_ptr->stats.msg_length_profile[5]++; in link_timeout()
195 l_ptr->stats.msg_length_profile[6]++; in link_timeout()
200 link_state_event(l_ptr, TIMEOUT_EVT); in link_timeout()
202 if (skb_queue_len(&l_ptr->backlogq)) in link_timeout()
203 tipc_link_push_packets(l_ptr); in link_timeout()
205 tipc_node_unlock(l_ptr->owner); in link_timeout()
206 tipc_link_put(l_ptr); in link_timeout()
228 struct tipc_link *l_ptr; in tipc_link_create() local
248 l_ptr = kzalloc(sizeof(*l_ptr), GFP_ATOMIC); in tipc_link_create()
249 if (!l_ptr) { in tipc_link_create()
253 kref_init(&l_ptr->ref); in tipc_link_create()
254 l_ptr->addr = peer; in tipc_link_create()
256 sprintf(l_ptr->name, "%u.%u.%u:%s-%u.%u.%u:unknown", in tipc_link_create()
262 memcpy(&l_ptr->media_addr, media_addr, sizeof(*media_addr)); in tipc_link_create()
263 l_ptr->owner = n_ptr; in tipc_link_create()
264 l_ptr->checkpoint = 1; in tipc_link_create()
265 l_ptr->peer_session = INVALID_SESSION; in tipc_link_create()
266 l_ptr->bearer_id = b_ptr->identity; in tipc_link_create()
267 link_set_supervision_props(l_ptr, b_ptr->tolerance); in tipc_link_create()
268 l_ptr->state = RESET_UNKNOWN; in tipc_link_create()
270 l_ptr->pmsg = (struct tipc_msg *)&l_ptr->proto_msg; in tipc_link_create()
271 msg = l_ptr->pmsg; in tipc_link_create()
273 l_ptr->addr); in tipc_link_create()
274 msg_set_size(msg, sizeof(l_ptr->proto_msg)); in tipc_link_create()
278 l_ptr->net_plane = b_ptr->net_plane; in tipc_link_create()
279 l_ptr->advertised_mtu = b_ptr->mtu; in tipc_link_create()
280 l_ptr->mtu = l_ptr->advertised_mtu; in tipc_link_create()
281 l_ptr->priority = b_ptr->priority; in tipc_link_create()
282 tipc_link_set_queue_limits(l_ptr, b_ptr->window); in tipc_link_create()
283 l_ptr->next_out_no = 1; in tipc_link_create()
284 __skb_queue_head_init(&l_ptr->transmq); in tipc_link_create()
285 __skb_queue_head_init(&l_ptr->backlogq); in tipc_link_create()
286 __skb_queue_head_init(&l_ptr->deferdq); in tipc_link_create()
287 skb_queue_head_init(&l_ptr->wakeupq); in tipc_link_create()
288 skb_queue_head_init(&l_ptr->inputq); in tipc_link_create()
289 skb_queue_head_init(&l_ptr->namedq); in tipc_link_create()
290 link_reset_statistics(l_ptr); in tipc_link_create()
291 tipc_node_attach_link(n_ptr, l_ptr); in tipc_link_create()
292 setup_timer(&l_ptr->timer, link_timeout, (unsigned long)l_ptr); in tipc_link_create()
293 link_state_event(l_ptr, STARTING_EVT); in tipc_link_create()
295 return l_ptr; in tipc_link_create()
401 void tipc_link_reset_fragments(struct tipc_link *l_ptr) in tipc_link_reset_fragments() argument
403 kfree_skb(l_ptr->reasm_buf); in tipc_link_reset_fragments()
404 l_ptr->reasm_buf = NULL; in tipc_link_reset_fragments()
421 void tipc_link_purge_queues(struct tipc_link *l_ptr) in tipc_link_purge_queues() argument
423 __skb_queue_purge(&l_ptr->deferdq); in tipc_link_purge_queues()
424 __skb_queue_purge(&l_ptr->transmq); in tipc_link_purge_queues()
425 tipc_link_purge_backlog(l_ptr); in tipc_link_purge_queues()
426 tipc_link_reset_fragments(l_ptr); in tipc_link_purge_queues()
429 void tipc_link_reset(struct tipc_link *l_ptr) in tipc_link_reset() argument
431 u32 prev_state = l_ptr->state; in tipc_link_reset()
432 int was_active_link = tipc_link_is_active(l_ptr); in tipc_link_reset()
433 struct tipc_node *owner = l_ptr->owner; in tipc_link_reset()
434 struct tipc_link *pl = tipc_parallel_link(l_ptr); in tipc_link_reset()
436 msg_set_session(l_ptr->pmsg, ((msg_session(l_ptr->pmsg) + 1) & 0xffff)); in tipc_link_reset()
439 l_ptr->peer_session = INVALID_SESSION; in tipc_link_reset()
442 l_ptr->mtu = l_ptr->advertised_mtu; in tipc_link_reset()
444 l_ptr->state = RESET_UNKNOWN; in tipc_link_reset()
449 tipc_node_link_down(l_ptr->owner, l_ptr); in tipc_link_reset()
450 tipc_bearer_remove_dest(owner->net, l_ptr->bearer_id, l_ptr->addr); in tipc_link_reset()
452 if (was_active_link && tipc_node_is_up(l_ptr->owner) && (pl != l_ptr)) { in tipc_link_reset()
453 l_ptr->flags |= LINK_FAILINGOVER; in tipc_link_reset()
454 l_ptr->failover_checkpt = l_ptr->next_in_no; in tipc_link_reset()
456 pl->failover_checkpt = l_ptr->next_in_no; in tipc_link_reset()
457 pl->failover_skb = l_ptr->reasm_buf; in tipc_link_reset()
459 kfree_skb(l_ptr->reasm_buf); in tipc_link_reset()
462 __skb_queue_purge(&l_ptr->transmq); in tipc_link_reset()
463 __skb_queue_purge(&l_ptr->deferdq); in tipc_link_reset()
465 owner->inputq = &l_ptr->inputq; in tipc_link_reset()
466 skb_queue_splice_init(&l_ptr->wakeupq, owner->inputq); in tipc_link_reset()
469 tipc_link_purge_backlog(l_ptr); in tipc_link_reset()
470 l_ptr->reasm_buf = NULL; in tipc_link_reset()
471 l_ptr->rcv_unacked = 0; in tipc_link_reset()
472 l_ptr->checkpoint = 1; in tipc_link_reset()
473 l_ptr->next_out_no = 1; in tipc_link_reset()
474 l_ptr->fsm_msg_cnt = 0; in tipc_link_reset()
475 l_ptr->stale_count = 0; in tipc_link_reset()
476 link_reset_statistics(l_ptr); in tipc_link_reset()
482 struct tipc_link *l_ptr; in tipc_link_reset_list() local
488 l_ptr = n_ptr->links[bearer_id]; in tipc_link_reset_list()
489 if (l_ptr) in tipc_link_reset_list()
490 tipc_link_reset(l_ptr); in tipc_link_reset_list()
511 static void link_state_event(struct tipc_link *l_ptr, unsigned int event) in link_state_event() argument
514 unsigned long cont_intv = l_ptr->cont_intv; in link_state_event()
516 if (l_ptr->flags & LINK_STOPPED) in link_state_event()
519 if (!(l_ptr->flags & LINK_STARTED) && (event != STARTING_EVT)) in link_state_event()
522 if (l_ptr->flags & LINK_FAILINGOVER) { in link_state_event()
524 link_set_timer(l_ptr, cont_intv); in link_state_event()
528 switch (l_ptr->state) { in link_state_event()
535 if (l_ptr->next_in_no != l_ptr->checkpoint) { in link_state_event()
536 l_ptr->checkpoint = l_ptr->next_in_no; in link_state_event()
537 if (tipc_bclink_acks_missing(l_ptr->owner)) { in link_state_event()
538 tipc_link_proto_xmit(l_ptr, STATE_MSG, in link_state_event()
540 l_ptr->fsm_msg_cnt++; in link_state_event()
542 link_set_timer(l_ptr, cont_intv); in link_state_event()
545 l_ptr->state = WORKING_UNKNOWN; in link_state_event()
546 l_ptr->fsm_msg_cnt = 0; in link_state_event()
547 tipc_link_proto_xmit(l_ptr, STATE_MSG, 1, 0, 0, 0); in link_state_event()
548 l_ptr->fsm_msg_cnt++; in link_state_event()
549 link_set_timer(l_ptr, cont_intv / 4); in link_state_event()
553 link_rst_msg, l_ptr->name); in link_state_event()
554 tipc_link_reset(l_ptr); in link_state_event()
555 l_ptr->state = RESET_RESET; in link_state_event()
556 l_ptr->fsm_msg_cnt = 0; in link_state_event()
557 tipc_link_proto_xmit(l_ptr, ACTIVATE_MSG, in link_state_event()
559 l_ptr->fsm_msg_cnt++; in link_state_event()
560 link_set_timer(l_ptr, cont_intv); in link_state_event()
570 l_ptr->state = WORKING_WORKING; in link_state_event()
571 l_ptr->fsm_msg_cnt = 0; in link_state_event()
572 link_set_timer(l_ptr, cont_intv); in link_state_event()
576 link_rst_msg, l_ptr->name); in link_state_event()
577 tipc_link_reset(l_ptr); in link_state_event()
578 l_ptr->state = RESET_RESET; in link_state_event()
579 l_ptr->fsm_msg_cnt = 0; in link_state_event()
580 tipc_link_proto_xmit(l_ptr, ACTIVATE_MSG, in link_state_event()
582 l_ptr->fsm_msg_cnt++; in link_state_event()
583 link_set_timer(l_ptr, cont_intv); in link_state_event()
586 if (l_ptr->next_in_no != l_ptr->checkpoint) { in link_state_event()
587 l_ptr->state = WORKING_WORKING; in link_state_event()
588 l_ptr->fsm_msg_cnt = 0; in link_state_event()
589 l_ptr->checkpoint = l_ptr->next_in_no; in link_state_event()
590 if (tipc_bclink_acks_missing(l_ptr->owner)) { in link_state_event()
591 tipc_link_proto_xmit(l_ptr, STATE_MSG, in link_state_event()
593 l_ptr->fsm_msg_cnt++; in link_state_event()
595 link_set_timer(l_ptr, cont_intv); in link_state_event()
596 } else if (l_ptr->fsm_msg_cnt < l_ptr->abort_limit) { in link_state_event()
597 tipc_link_proto_xmit(l_ptr, STATE_MSG, in link_state_event()
599 l_ptr->fsm_msg_cnt++; in link_state_event()
600 link_set_timer(l_ptr, cont_intv / 4); in link_state_event()
603 link_rst_msg, l_ptr->name); in link_state_event()
604 tipc_link_reset(l_ptr); in link_state_event()
605 l_ptr->state = RESET_UNKNOWN; in link_state_event()
606 l_ptr->fsm_msg_cnt = 0; in link_state_event()
607 tipc_link_proto_xmit(l_ptr, RESET_MSG, in link_state_event()
609 l_ptr->fsm_msg_cnt++; in link_state_event()
610 link_set_timer(l_ptr, cont_intv); in link_state_event()
622 other = l_ptr->owner->active_links[0]; in link_state_event()
625 l_ptr->state = WORKING_WORKING; in link_state_event()
626 l_ptr->fsm_msg_cnt = 0; in link_state_event()
627 link_activate(l_ptr); in link_state_event()
628 tipc_link_proto_xmit(l_ptr, STATE_MSG, 1, 0, 0, 0); in link_state_event()
629 l_ptr->fsm_msg_cnt++; in link_state_event()
630 if (l_ptr->owner->working_links == 1) in link_state_event()
631 tipc_link_sync_xmit(l_ptr); in link_state_event()
632 link_set_timer(l_ptr, cont_intv); in link_state_event()
635 l_ptr->state = RESET_RESET; in link_state_event()
636 l_ptr->fsm_msg_cnt = 0; in link_state_event()
637 tipc_link_proto_xmit(l_ptr, ACTIVATE_MSG, in link_state_event()
639 l_ptr->fsm_msg_cnt++; in link_state_event()
640 link_set_timer(l_ptr, cont_intv); in link_state_event()
643 l_ptr->flags |= LINK_STARTED; in link_state_event()
644 l_ptr->fsm_msg_cnt++; in link_state_event()
645 link_set_timer(l_ptr, cont_intv); in link_state_event()
648 tipc_link_proto_xmit(l_ptr, RESET_MSG, 0, 0, 0, 0); in link_state_event()
649 l_ptr->fsm_msg_cnt++; in link_state_event()
650 link_set_timer(l_ptr, cont_intv); in link_state_event()
660 other = l_ptr->owner->active_links[0]; in link_state_event()
663 l_ptr->state = WORKING_WORKING; in link_state_event()
664 l_ptr->fsm_msg_cnt = 0; in link_state_event()
665 link_activate(l_ptr); in link_state_event()
666 tipc_link_proto_xmit(l_ptr, STATE_MSG, 1, 0, 0, 0); in link_state_event()
667 l_ptr->fsm_msg_cnt++; in link_state_event()
668 if (l_ptr->owner->working_links == 1) in link_state_event()
669 tipc_link_sync_xmit(l_ptr); in link_state_event()
670 link_set_timer(l_ptr, cont_intv); in link_state_event()
675 tipc_link_proto_xmit(l_ptr, ACTIVATE_MSG, in link_state_event()
677 l_ptr->fsm_msg_cnt++; in link_state_event()
678 link_set_timer(l_ptr, cont_intv); in link_state_event()
685 pr_err("Unknown link state %u/%u\n", l_ptr->state, event); in link_state_event()
917 static void link_retransmit_failure(struct tipc_link *l_ptr, in link_retransmit_failure() argument
921 struct net *net = l_ptr->owner->net; in link_retransmit_failure()
923 pr_warn("Retransmission failure on link <%s>\n", l_ptr->name); in link_retransmit_failure()
925 if (l_ptr->addr) { in link_retransmit_failure()
927 link_print(l_ptr, "Resetting link\n"); in link_retransmit_failure()
928 tipc_link_reset(l_ptr); in link_retransmit_failure()
952 l_ptr->stale_count = 0; in link_retransmit_failure()
956 void tipc_link_retransmit(struct tipc_link *l_ptr, struct sk_buff *skb, in tipc_link_retransmit() argument
967 if (l_ptr->last_retransmitted == msg_seqno(msg)) { in tipc_link_retransmit()
968 if (++l_ptr->stale_count > 100) { in tipc_link_retransmit()
969 link_retransmit_failure(l_ptr, skb); in tipc_link_retransmit()
973 l_ptr->last_retransmitted = msg_seqno(msg); in tipc_link_retransmit()
974 l_ptr->stale_count = 1; in tipc_link_retransmit()
977 skb_queue_walk_from(&l_ptr->transmq, skb) { in tipc_link_retransmit()
981 msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); in tipc_link_retransmit()
982 msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); in tipc_link_retransmit()
983 tipc_bearer_send(l_ptr->owner->net, l_ptr->bearer_id, skb, in tipc_link_retransmit()
984 &l_ptr->media_addr); in tipc_link_retransmit()
986 l_ptr->stats.retransmitted++; in tipc_link_retransmit()
1043 struct tipc_link *l_ptr; in tipc_rcv() local
1079 l_ptr = n_ptr->links[b_ptr->identity]; in tipc_rcv()
1080 if (unlikely(!l_ptr)) in tipc_rcv()
1103 skb_queue_walk_safe(&l_ptr->transmq, skb1, tmp) { in tipc_rcv()
1106 __skb_unlink(skb1, &l_ptr->transmq); in tipc_rcv()
1112 if (unlikely(skb_queue_len(&l_ptr->backlogq))) in tipc_rcv()
1113 tipc_link_push_packets(l_ptr); in tipc_rcv()
1115 if (released && !skb_queue_empty(&l_ptr->wakeupq)) in tipc_rcv()
1116 link_prepare_wakeup(l_ptr); in tipc_rcv()
1119 if (unlikely(!link_working_working(l_ptr))) { in tipc_rcv()
1121 tipc_link_proto_rcv(l_ptr, skb); in tipc_rcv()
1122 link_retrieve_defq(l_ptr, &head); in tipc_rcv()
1128 link_state_event(l_ptr, TRAFFIC_MSG_EVT); in tipc_rcv()
1130 if (link_working_working(l_ptr)) { in tipc_rcv()
1140 if (unlikely(seq_no != mod(l_ptr->next_in_no))) { in tipc_rcv()
1141 link_handle_out_of_seq_msg(l_ptr, skb); in tipc_rcv()
1142 link_retrieve_defq(l_ptr, &head); in tipc_rcv()
1147 if (unlikely((l_ptr->flags & LINK_SYNCHING) && !msg_dup(msg))) { in tipc_rcv()
1148 if (!link_synch(l_ptr)) in tipc_rcv()
1151 l_ptr->next_in_no++; in tipc_rcv()
1152 if (unlikely(!skb_queue_empty(&l_ptr->deferdq))) in tipc_rcv()
1153 link_retrieve_defq(l_ptr, &head); in tipc_rcv()
1154 if (unlikely(++l_ptr->rcv_unacked >= TIPC_MIN_LINK_WIN)) { in tipc_rcv()
1155 l_ptr->stats.sent_acks++; in tipc_rcv()
1156 tipc_link_proto_xmit(l_ptr, STATE_MSG, 0, 0, 0, 0); in tipc_rcv()
1158 tipc_link_input(l_ptr, skb); in tipc_rcv()
1305 static void link_handle_out_of_seq_msg(struct tipc_link *l_ptr, in link_handle_out_of_seq_msg() argument
1311 tipc_link_proto_rcv(l_ptr, buf); in link_handle_out_of_seq_msg()
1316 l_ptr->checkpoint--; in link_handle_out_of_seq_msg()
1322 if (less(seq_no, mod(l_ptr->next_in_no))) { in link_handle_out_of_seq_msg()
1323 l_ptr->stats.duplicates++; in link_handle_out_of_seq_msg()
1328 if (tipc_link_defer_pkt(&l_ptr->deferdq, buf)) { in link_handle_out_of_seq_msg()
1329 l_ptr->stats.deferred_recv++; in link_handle_out_of_seq_msg()
1330 if ((skb_queue_len(&l_ptr->deferdq) % TIPC_MIN_LINK_WIN) == 1) in link_handle_out_of_seq_msg()
1331 tipc_link_proto_xmit(l_ptr, STATE_MSG, 0, 0, 0, 0); in link_handle_out_of_seq_msg()
1333 l_ptr->stats.duplicates++; in link_handle_out_of_seq_msg()
1340 void tipc_link_proto_xmit(struct tipc_link *l_ptr, u32 msg_typ, int probe_msg, in tipc_link_proto_xmit() argument
1344 struct tipc_msg *msg = l_ptr->pmsg; in tipc_link_proto_xmit()
1345 u32 msg_size = sizeof(l_ptr->proto_msg); in tipc_link_proto_xmit()
1349 if (l_ptr->flags & LINK_FAILINGOVER) in tipc_link_proto_xmit()
1353 if ((tipc_node_blocked(l_ptr->owner)) && (msg_typ != RESET_MSG)) in tipc_link_proto_xmit()
1358 msg_set_net_plane(msg, l_ptr->net_plane); in tipc_link_proto_xmit()
1359 msg_set_bcast_ack(msg, l_ptr->owner->bclink.last_in); in tipc_link_proto_xmit()
1360 msg_set_last_bcast(msg, tipc_bclink_get_last_sent(l_ptr->owner->net)); in tipc_link_proto_xmit()
1363 u32 next_sent = mod(l_ptr->next_out_no); in tipc_link_proto_xmit()
1365 if (!tipc_link_is_up(l_ptr)) in tipc_link_proto_xmit()
1367 if (skb_queue_len(&l_ptr->backlogq)) in tipc_link_proto_xmit()
1368 next_sent = buf_seqno(skb_peek(&l_ptr->backlogq)); in tipc_link_proto_xmit()
1370 if (!skb_queue_empty(&l_ptr->deferdq)) { in tipc_link_proto_xmit()
1371 u32 rec = buf_seqno(skb_peek(&l_ptr->deferdq)); in tipc_link_proto_xmit()
1372 gap = mod(rec - mod(l_ptr->next_in_no)); in tipc_link_proto_xmit()
1376 l_ptr->stats.sent_nacks++; in tipc_link_proto_xmit()
1379 msg_set_max_pkt(msg, l_ptr->mtu); in tipc_link_proto_xmit()
1380 msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); in tipc_link_proto_xmit()
1383 l_ptr->stats.sent_probes++; in tipc_link_proto_xmit()
1384 l_ptr->stats.sent_states++; in tipc_link_proto_xmit()
1386 msg_set_ack(msg, mod(l_ptr->failover_checkpt - 1)); in tipc_link_proto_xmit()
1390 msg_set_link_tolerance(msg, l_ptr->tolerance); in tipc_link_proto_xmit()
1391 msg_set_linkprio(msg, l_ptr->priority); in tipc_link_proto_xmit()
1392 msg_set_max_pkt(msg, l_ptr->advertised_mtu); in tipc_link_proto_xmit()
1395 r_flag = (l_ptr->owner->working_links > tipc_link_is_up(l_ptr)); in tipc_link_proto_xmit()
1397 msg_set_linkprio(msg, l_ptr->priority); in tipc_link_proto_xmit()
1400 msg_set_seqno(msg, mod(l_ptr->next_out_no + (0xffff/2))); in tipc_link_proto_xmit()
1406 skb_copy_to_linear_data(buf, msg, sizeof(l_ptr->proto_msg)); in tipc_link_proto_xmit()
1408 tipc_bearer_send(l_ptr->owner->net, l_ptr->bearer_id, buf, in tipc_link_proto_xmit()
1409 &l_ptr->media_addr); in tipc_link_proto_xmit()
1410 l_ptr->rcv_unacked = 0; in tipc_link_proto_xmit()
1419 static void tipc_link_proto_rcv(struct tipc_link *l_ptr, in tipc_link_proto_rcv() argument
1426 if (l_ptr->flags & LINK_FAILINGOVER) in tipc_link_proto_rcv()
1429 if (l_ptr->net_plane != msg_net_plane(msg)) in tipc_link_proto_rcv()
1430 if (link_own_addr(l_ptr) > msg_prevnode(msg)) in tipc_link_proto_rcv()
1431 l_ptr->net_plane = msg_net_plane(msg); in tipc_link_proto_rcv()
1436 if (!link_working_unknown(l_ptr) && in tipc_link_proto_rcv()
1437 (l_ptr->peer_session != INVALID_SESSION)) { in tipc_link_proto_rcv()
1438 if (less_eq(msg_session(msg), l_ptr->peer_session)) in tipc_link_proto_rcv()
1442 if (!msg_redundant_link(msg) && (link_working_working(l_ptr) || in tipc_link_proto_rcv()
1443 link_working_unknown(l_ptr))) { in tipc_link_proto_rcv()
1448 l_ptr->owner->action_flags |= TIPC_WAIT_OWN_LINKS_DOWN; in tipc_link_proto_rcv()
1451 link_state_event(l_ptr, RESET_MSG); in tipc_link_proto_rcv()
1456 strcpy((strrchr(l_ptr->name, ':') + 1), (char *)msg_data(msg)); in tipc_link_proto_rcv()
1459 if (msg_tol > l_ptr->tolerance) in tipc_link_proto_rcv()
1460 link_set_supervision_props(l_ptr, msg_tol); in tipc_link_proto_rcv()
1462 if (msg_linkprio(msg) > l_ptr->priority) in tipc_link_proto_rcv()
1463 l_ptr->priority = msg_linkprio(msg); in tipc_link_proto_rcv()
1465 if (l_ptr->mtu > msg_max_pkt(msg)) in tipc_link_proto_rcv()
1466 l_ptr->mtu = msg_max_pkt(msg); in tipc_link_proto_rcv()
1469 if (!tipc_node_is_up(l_ptr->owner)) { in tipc_link_proto_rcv()
1470 l_ptr->owner->bclink.last_sent = in tipc_link_proto_rcv()
1471 l_ptr->owner->bclink.last_in = in tipc_link_proto_rcv()
1473 l_ptr->owner->bclink.oos_state = 0; in tipc_link_proto_rcv()
1476 l_ptr->peer_session = msg_session(msg); in tipc_link_proto_rcv()
1477 l_ptr->peer_bearer_id = msg_bearer_id(msg); in tipc_link_proto_rcv()
1480 link_state_event(l_ptr, ACTIVATE_MSG); in tipc_link_proto_rcv()
1486 link_set_supervision_props(l_ptr, msg_tol); in tipc_link_proto_rcv()
1489 (msg_linkprio(msg) != l_ptr->priority)) { in tipc_link_proto_rcv()
1491 link_rst_msg, l_ptr->name, in tipc_link_proto_rcv()
1492 l_ptr->priority, msg_linkprio(msg)); in tipc_link_proto_rcv()
1493 l_ptr->priority = msg_linkprio(msg); in tipc_link_proto_rcv()
1494 tipc_link_reset(l_ptr); /* Enforce change to take effect */ in tipc_link_proto_rcv()
1499 l_ptr->checkpoint--; in tipc_link_proto_rcv()
1501 link_state_event(l_ptr, TRAFFIC_MSG_EVT); in tipc_link_proto_rcv()
1502 l_ptr->stats.recv_states++; in tipc_link_proto_rcv()
1503 if (link_reset_unknown(l_ptr)) in tipc_link_proto_rcv()
1506 if (less_eq(mod(l_ptr->next_in_no), msg_next_sent(msg))) { in tipc_link_proto_rcv()
1508 mod(l_ptr->next_in_no)); in tipc_link_proto_rcv()
1512 l_ptr->stats.recv_probes++; in tipc_link_proto_rcv()
1515 if (l_ptr->owner->bclink.recv_permitted) in tipc_link_proto_rcv()
1516 tipc_bclink_update_link_state(l_ptr->owner, in tipc_link_proto_rcv()
1520 tipc_link_proto_xmit(l_ptr, STATE_MSG, 0, in tipc_link_proto_rcv()
1524 l_ptr->stats.recv_nacks++; in tipc_link_proto_rcv()
1525 tipc_link_retransmit(l_ptr, skb_peek(&l_ptr->transmq), in tipc_link_proto_rcv()
1538 static void tipc_link_tunnel_xmit(struct tipc_link *l_ptr, in tipc_link_tunnel_xmit() argument
1547 tunnel = l_ptr->owner->active_links[selector & 1]; in tipc_link_tunnel_xmit()
1570 void tipc_link_failover_send_queue(struct tipc_link *l_ptr) in tipc_link_failover_send_queue() argument
1573 struct tipc_link *tunnel = l_ptr->owner->active_links[0]; in tipc_link_failover_send_queue()
1581 tipc_msg_init(link_own_addr(l_ptr), &tunnel_hdr, TUNNEL_PROTOCOL, in tipc_link_failover_send_queue()
1582 FAILOVER_MSG, INT_H_SIZE, l_ptr->addr); in tipc_link_failover_send_queue()
1583 skb_queue_splice_tail_init(&l_ptr->backlogq, &l_ptr->transmq); in tipc_link_failover_send_queue()
1584 tipc_link_purge_backlog(l_ptr); in tipc_link_failover_send_queue()
1585 msgcount = skb_queue_len(&l_ptr->transmq); in tipc_link_failover_send_queue()
1586 msg_set_bearer_id(&tunnel_hdr, l_ptr->peer_bearer_id); in tipc_link_failover_send_queue()
1589 if (skb_queue_empty(&l_ptr->transmq)) { in tipc_link_failover_send_queue()
1602 split_bundles = (l_ptr->owner->active_links[0] != in tipc_link_failover_send_queue()
1603 l_ptr->owner->active_links[1]); in tipc_link_failover_send_queue()
1605 skb_queue_walk(&l_ptr->transmq, skb) { in tipc_link_failover_send_queue()
1615 tipc_link_tunnel_xmit(l_ptr, &tunnel_hdr, m, in tipc_link_failover_send_queue()
1621 tipc_link_tunnel_xmit(l_ptr, &tunnel_hdr, msg, in tipc_link_failover_send_queue()
1737 static void link_set_supervision_props(struct tipc_link *l_ptr, u32 tol) in link_set_supervision_props() argument
1744 l_ptr->tolerance = tol; in link_set_supervision_props()
1745 l_ptr->cont_intv = msecs_to_jiffies(intv); in link_set_supervision_props()
1746 l_ptr->abort_limit = tol / (jiffies_to_msecs(l_ptr->cont_intv) / 4); in link_set_supervision_props()
1773 struct tipc_link *l_ptr; in tipc_link_find_owner() local
1783 l_ptr = n_ptr->links[i]; in tipc_link_find_owner()
1784 if (l_ptr && !strcmp(l_ptr->name, link_name)) { in tipc_link_find_owner()
1803 static void link_reset_statistics(struct tipc_link *l_ptr) in link_reset_statistics() argument
1805 memset(&l_ptr->stats, 0, sizeof(l_ptr->stats)); in link_reset_statistics()
1806 l_ptr->stats.sent_info = l_ptr->next_out_no; in link_reset_statistics()
1807 l_ptr->stats.recv_info = l_ptr->next_in_no; in link_reset_statistics()
1810 static void link_print(struct tipc_link *l_ptr, const char *str) in link_print() argument
1812 struct tipc_net *tn = net_generic(l_ptr->owner->net, tipc_net_id); in link_print()
1816 b_ptr = rcu_dereference_rtnl(tn->bearer_list[l_ptr->bearer_id]); in link_print()
1818 pr_info("%s Link %x<%s>:", str, l_ptr->addr, b_ptr->name); in link_print()
1821 if (link_working_unknown(l_ptr)) in link_print()
1823 else if (link_reset_reset(l_ptr)) in link_print()
1825 else if (link_reset_unknown(l_ptr)) in link_print()
1827 else if (link_working_working(l_ptr)) in link_print()