Lines Matching refs:l
110 static int link_is_up(struct tipc_link *l) in link_is_up() argument
112 return l->state & (LINK_ESTABLISHED | LINK_SYNCHING); in link_is_up()
115 static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
117 static void tipc_link_build_proto_msg(struct tipc_link *l, int mtyp, bool probe,
122 static void tipc_link_build_nack_msg(struct tipc_link *l,
124 static void tipc_link_build_bc_init_msg(struct tipc_link *l,
126 static bool tipc_link_release_pkts(struct tipc_link *l, u16 to);
131 bool tipc_link_is_up(struct tipc_link *l) in tipc_link_is_up() argument
133 return link_is_up(l); in tipc_link_is_up()
136 bool tipc_link_peer_is_down(struct tipc_link *l) in tipc_link_peer_is_down() argument
138 return l->state == LINK_PEER_RESET; in tipc_link_peer_is_down()
141 bool tipc_link_is_reset(struct tipc_link *l) in tipc_link_is_reset() argument
143 return l->state & (LINK_RESET | LINK_FAILINGOVER | LINK_ESTABLISHING); in tipc_link_is_reset()
146 bool tipc_link_is_establishing(struct tipc_link *l) in tipc_link_is_establishing() argument
148 return l->state == LINK_ESTABLISHING; in tipc_link_is_establishing()
151 bool tipc_link_is_synching(struct tipc_link *l) in tipc_link_is_synching() argument
153 return l->state == LINK_SYNCHING; in tipc_link_is_synching()
156 bool tipc_link_is_failingover(struct tipc_link *l) in tipc_link_is_failingover() argument
158 return l->state == LINK_FAILINGOVER; in tipc_link_is_failingover()
161 bool tipc_link_is_blocked(struct tipc_link *l) in tipc_link_is_blocked() argument
163 return l->state & (LINK_RESETTING | LINK_PEER_RESET | LINK_FAILINGOVER); in tipc_link_is_blocked()
166 static bool link_is_bc_sndlink(struct tipc_link *l) in link_is_bc_sndlink() argument
168 return !l->bc_sndlink; in link_is_bc_sndlink()
171 static bool link_is_bc_rcvlink(struct tipc_link *l) in link_is_bc_rcvlink() argument
173 return ((l->bc_rcvlink == l) && !link_is_bc_sndlink(l)); in link_is_bc_rcvlink()
176 int tipc_link_is_active(struct tipc_link *l) in tipc_link_is_active() argument
178 return l->active; in tipc_link_is_active()
181 void tipc_link_set_active(struct tipc_link *l, bool active) in tipc_link_set_active() argument
183 l->active = active; in tipc_link_set_active()
215 int tipc_link_bc_peers(struct tipc_link *l) in tipc_link_bc_peers() argument
217 return l->ackers; in tipc_link_bc_peers()
220 void tipc_link_set_mtu(struct tipc_link *l, int mtu) in tipc_link_set_mtu() argument
222 l->mtu = mtu; in tipc_link_set_mtu()
225 int tipc_link_mtu(struct tipc_link *l) in tipc_link_mtu() argument
227 return l->mtu; in tipc_link_mtu()
230 static u32 link_own_addr(struct tipc_link *l) in link_own_addr() argument
232 return msg_prevnode(l->pmsg); in link_own_addr()
267 struct tipc_link *l; in tipc_link_create() local
270 l = kzalloc(sizeof(*l), GFP_ATOMIC); in tipc_link_create()
271 if (!l) in tipc_link_create()
273 *link = l; in tipc_link_create()
274 l->pmsg = (struct tipc_msg *)&l->proto_msg; in tipc_link_create()
275 hdr = l->pmsg; in tipc_link_create()
277 msg_set_size(hdr, sizeof(l->proto_msg)); in tipc_link_create()
279 msg_set_bearer_id(hdr, l->bearer_id); in tipc_link_create()
282 sprintf(l->name, "%u.%u.%u:%s-%u.%u.%u:unknown", in tipc_link_create()
287 l->addr = peer; in tipc_link_create()
288 l->peer_caps = peer_caps; in tipc_link_create()
289 l->net = net; in tipc_link_create()
290 l->peer_session = WILDCARD_SESSION; in tipc_link_create()
291 l->bearer_id = bearer_id; in tipc_link_create()
292 l->tolerance = tolerance; in tipc_link_create()
293 l->net_plane = net_plane; in tipc_link_create()
294 l->advertised_mtu = mtu; in tipc_link_create()
295 l->mtu = mtu; in tipc_link_create()
296 l->priority = priority; in tipc_link_create()
297 tipc_link_set_queue_limits(l, window); in tipc_link_create()
298 l->ackers = 1; in tipc_link_create()
299 l->bc_sndlink = bc_sndlink; in tipc_link_create()
300 l->bc_rcvlink = bc_rcvlink; in tipc_link_create()
301 l->inputq = inputq; in tipc_link_create()
302 l->namedq = namedq; in tipc_link_create()
303 l->state = LINK_RESETTING; in tipc_link_create()
304 __skb_queue_head_init(&l->transmq); in tipc_link_create()
305 __skb_queue_head_init(&l->backlogq); in tipc_link_create()
306 __skb_queue_head_init(&l->deferdq); in tipc_link_create()
307 skb_queue_head_init(&l->wakeupq); in tipc_link_create()
308 skb_queue_head_init(l->inputq); in tipc_link_create()
330 struct tipc_link *l; in tipc_link_bc_create() local
337 l = *link; in tipc_link_bc_create()
338 strcpy(l->name, tipc_bclink_name); in tipc_link_bc_create()
339 tipc_link_reset(l); in tipc_link_bc_create()
340 l->state = LINK_RESET; in tipc_link_bc_create()
341 l->ackers = 0; in tipc_link_bc_create()
342 l->bc_rcvlink = l; in tipc_link_bc_create()
345 if (link_is_bc_sndlink(l)) in tipc_link_bc_create()
346 l->state = LINK_ESTABLISHED; in tipc_link_bc_create()
356 int tipc_link_fsm_evt(struct tipc_link *l, int evt) in tipc_link_fsm_evt() argument
360 switch (l->state) { in tipc_link_fsm_evt()
364 l->state = LINK_PEER_RESET; in tipc_link_fsm_evt()
367 l->state = LINK_RESET; in tipc_link_fsm_evt()
382 l->state = LINK_ESTABLISHING; in tipc_link_fsm_evt()
385 l->state = LINK_FAILINGOVER; in tipc_link_fsm_evt()
400 l->state = LINK_ESTABLISHING; in tipc_link_fsm_evt()
417 l->state = LINK_RESET; in tipc_link_fsm_evt()
434 l->state = LINK_ESTABLISHED; in tipc_link_fsm_evt()
437 l->state = LINK_FAILINGOVER; in tipc_link_fsm_evt()
440 l->state = LINK_RESET; in tipc_link_fsm_evt()
455 l->state = LINK_PEER_RESET; in tipc_link_fsm_evt()
459 l->state = LINK_RESETTING; in tipc_link_fsm_evt()
463 l->state = LINK_RESET; in tipc_link_fsm_evt()
469 l->state = LINK_SYNCHING; in tipc_link_fsm_evt()
480 l->state = LINK_PEER_RESET; in tipc_link_fsm_evt()
484 l->state = LINK_RESETTING; in tipc_link_fsm_evt()
488 l->state = LINK_RESET; in tipc_link_fsm_evt()
494 l->state = LINK_ESTABLISHED; in tipc_link_fsm_evt()
503 pr_err("Unknown FSM state %x in %s\n", l->state, l->name); in tipc_link_fsm_evt()
508 evt, l->state, l->name); in tipc_link_fsm_evt()
514 static void link_profile_stats(struct tipc_link *l) in link_profile_stats() argument
521 l->stats.accu_queue_sz += skb_queue_len(&l->transmq); in link_profile_stats()
522 l->stats.queue_sz_counts++; in link_profile_stats()
524 skb = skb_peek(&l->transmq); in link_profile_stats()
535 l->stats.msg_lengths_total += length; in link_profile_stats()
536 l->stats.msg_length_counts++; in link_profile_stats()
538 l->stats.msg_length_profile[0]++; in link_profile_stats()
540 l->stats.msg_length_profile[1]++; in link_profile_stats()
542 l->stats.msg_length_profile[2]++; in link_profile_stats()
544 l->stats.msg_length_profile[3]++; in link_profile_stats()
546 l->stats.msg_length_profile[4]++; in link_profile_stats()
548 l->stats.msg_length_profile[5]++; in link_profile_stats()
550 l->stats.msg_length_profile[6]++; in link_profile_stats()
557 int tipc_link_timeout(struct tipc_link *l, struct sk_buff_head *xmitq) in tipc_link_timeout() argument
563 u16 bc_snt = l->bc_sndlink->snd_nxt - 1; in tipc_link_timeout()
564 u16 bc_acked = l->bc_rcvlink->acked; in tipc_link_timeout()
565 bool bc_up = link_is_up(l->bc_rcvlink); in tipc_link_timeout()
567 link_profile_stats(l); in tipc_link_timeout()
569 switch (l->state) { in tipc_link_timeout()
572 if (!l->silent_intv_cnt) { in tipc_link_timeout()
575 } else if (l->silent_intv_cnt <= l->abort_limit) { in tipc_link_timeout()
579 rc |= tipc_link_fsm_evt(l, LINK_FAILURE_EVT); in tipc_link_timeout()
581 l->silent_intv_cnt++; in tipc_link_timeout()
600 tipc_link_build_proto_msg(l, mtyp, prb, 0, 0, 0, xmitq); in tipc_link_timeout()
647 void link_prepare_wakeup(struct tipc_link *l) in link_prepare_wakeup() argument
653 skb_queue_walk_safe(&l->wakeupq, skb, tmp) { in link_prepare_wakeup()
655 lim = l->window + l->backlog[imp].limit; in link_prepare_wakeup()
657 if ((pnd[imp] + l->backlog[imp].len) >= lim) in link_prepare_wakeup()
659 skb_unlink(skb, &l->wakeupq); in link_prepare_wakeup()
660 skb_queue_tail(l->inputq, skb); in link_prepare_wakeup()
664 void tipc_link_reset(struct tipc_link *l) in tipc_link_reset() argument
667 l->peer_session = WILDCARD_SESSION; in tipc_link_reset()
670 msg_set_session(l->pmsg, msg_session(l->pmsg) + 1); in tipc_link_reset()
673 l->mtu = l->advertised_mtu; in tipc_link_reset()
676 __skb_queue_purge(&l->transmq); in tipc_link_reset()
677 __skb_queue_purge(&l->deferdq); in tipc_link_reset()
678 skb_queue_splice_init(&l->wakeupq, l->inputq); in tipc_link_reset()
679 __skb_queue_purge(&l->backlogq); in tipc_link_reset()
680 l->backlog[TIPC_LOW_IMPORTANCE].len = 0; in tipc_link_reset()
681 l->backlog[TIPC_MEDIUM_IMPORTANCE].len = 0; in tipc_link_reset()
682 l->backlog[TIPC_HIGH_IMPORTANCE].len = 0; in tipc_link_reset()
683 l->backlog[TIPC_CRITICAL_IMPORTANCE].len = 0; in tipc_link_reset()
684 l->backlog[TIPC_SYSTEM_IMPORTANCE].len = 0; in tipc_link_reset()
685 kfree_skb(l->reasm_buf); in tipc_link_reset()
686 kfree_skb(l->failover_reasm_skb); in tipc_link_reset()
687 l->reasm_buf = NULL; in tipc_link_reset()
688 l->failover_reasm_skb = NULL; in tipc_link_reset()
689 l->rcv_unacked = 0; in tipc_link_reset()
690 l->snd_nxt = 1; in tipc_link_reset()
691 l->rcv_nxt = 1; in tipc_link_reset()
692 l->acked = 0; in tipc_link_reset()
693 l->silent_intv_cnt = 0; in tipc_link_reset()
694 l->stats.recv_info = 0; in tipc_link_reset()
695 l->stale_count = 0; in tipc_link_reset()
696 l->bc_peer_is_up = false; in tipc_link_reset()
697 link_reset_statistics(l); in tipc_link_reset()
711 int tipc_link_xmit(struct tipc_link *l, struct sk_buff_head *list, in tipc_link_xmit() argument
715 unsigned int maxwin = l->window; in tipc_link_xmit()
717 unsigned int mtu = l->mtu; in tipc_link_xmit()
718 u16 ack = l->rcv_nxt - 1; in tipc_link_xmit()
719 u16 seqno = l->snd_nxt; in tipc_link_xmit()
720 u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1; in tipc_link_xmit()
721 struct sk_buff_head *transmq = &l->transmq; in tipc_link_xmit()
722 struct sk_buff_head *backlogq = &l->backlogq; in tipc_link_xmit()
727 if (unlikely(l->backlog[i].len >= l->backlog[i].limit)) in tipc_link_xmit()
728 return link_schedule_user(l, list); in tipc_link_xmit()
748 TIPC_SKB_CB(skb)->ackers = l->ackers; in tipc_link_xmit()
749 l->rcv_unacked = 0; in tipc_link_xmit()
755 l->stats.sent_bundled++; in tipc_link_xmit()
758 if (tipc_msg_make_bundle(&bskb, hdr, mtu, l->addr)) { in tipc_link_xmit()
761 l->backlog[msg_importance(buf_msg(bskb))].len++; in tipc_link_xmit()
762 l->stats.sent_bundled++; in tipc_link_xmit()
763 l->stats.sent_bundles++; in tipc_link_xmit()
766 l->backlog[imp].len += skb_queue_len(list); in tipc_link_xmit()
769 l->snd_nxt = seqno; in tipc_link_xmit()
773 void tipc_link_advance_backlog(struct tipc_link *l, struct sk_buff_head *xmitq) in tipc_link_advance_backlog() argument
777 u16 seqno = l->snd_nxt; in tipc_link_advance_backlog()
778 u16 ack = l->rcv_nxt - 1; in tipc_link_advance_backlog()
779 u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1; in tipc_link_advance_backlog()
781 while (skb_queue_len(&l->transmq) < l->window) { in tipc_link_advance_backlog()
782 skb = skb_peek(&l->backlogq); in tipc_link_advance_backlog()
788 __skb_dequeue(&l->backlogq); in tipc_link_advance_backlog()
790 l->backlog[msg_importance(hdr)].len--; in tipc_link_advance_backlog()
791 __skb_queue_tail(&l->transmq, skb); in tipc_link_advance_backlog()
793 TIPC_SKB_CB(skb)->ackers = l->ackers; in tipc_link_advance_backlog()
797 l->rcv_unacked = 0; in tipc_link_advance_backlog()
800 l->snd_nxt = seqno; in tipc_link_advance_backlog()
803 static void link_retransmit_failure(struct tipc_link *l, struct sk_buff *skb) in link_retransmit_failure() argument
807 pr_warn("Retransmission failure on link <%s>\n", l->name); in link_retransmit_failure()
808 link_print(l, "Resetting link "); in link_retransmit_failure()
815 int tipc_link_retrans(struct tipc_link *l, u16 from, u16 to, in tipc_link_retrans() argument
818 struct sk_buff *_skb, *skb = skb_peek(&l->transmq); in tipc_link_retrans()
820 u16 ack = l->rcv_nxt - 1; in tipc_link_retrans()
821 u16 bc_ack = l->bc_rcvlink->rcv_nxt - 1; in tipc_link_retrans()
827 if (likely(l->last_retransm != buf_seqno(skb))) { in tipc_link_retrans()
828 l->last_retransm = buf_seqno(skb); in tipc_link_retrans()
829 l->stale_count = 1; in tipc_link_retrans()
830 } else if (++l->stale_count > 100) { in tipc_link_retrans()
831 link_retransmit_failure(l, skb); in tipc_link_retrans()
832 return tipc_link_fsm_evt(l, LINK_FAILURE_EVT); in tipc_link_retrans()
836 skb_queue_walk(&l->transmq, skb) { in tipc_link_retrans()
841 skb_queue_walk_from(&l->transmq, skb) { in tipc_link_retrans()
853 l->stats.retransmitted++; in tipc_link_retrans()
863 static bool tipc_data_input(struct tipc_link *l, struct sk_buff *skb, in tipc_data_input() argument
875 l->bc_rcvlink->state = LINK_ESTABLISHED; in tipc_data_input()
876 skb_queue_tail(l->namedq, skb); in tipc_data_input()
894 static int tipc_link_input(struct tipc_link *l, struct sk_buff *skb, in tipc_link_input() argument
898 struct sk_buff **reasm_skb = &l->reasm_buf; in tipc_link_input()
908 __skb_queue_purge(&l->deferdq); in tipc_link_input()
916 if (less(msg_seqno(hdr), l->drop_point)) in tipc_link_input()
918 if (tipc_data_input(l, skb, inputq)) in tipc_link_input()
921 reasm_skb = &l->failover_reasm_skb; in tipc_link_input()
926 l->stats.recv_bundles++; in tipc_link_input()
927 l->stats.recv_bundled += msg_msgcnt(hdr); in tipc_link_input()
929 tipc_data_input(l, iskb, &tmpq); in tipc_link_input()
933 l->stats.recv_fragments++; in tipc_link_input()
935 l->stats.recv_fragmented++; in tipc_link_input()
936 tipc_data_input(l, skb, inputq); in tipc_link_input()
937 } else if (!*reasm_skb && !link_is_bc_rcvlink(l)) { in tipc_link_input()
939 return tipc_link_fsm_evt(l, LINK_FAILURE_EVT); in tipc_link_input()
943 tipc_bcast_lock(l->net); in tipc_link_input()
944 tipc_link_bc_init_rcv(l->bc_rcvlink, hdr); in tipc_link_input()
945 tipc_bcast_unlock(l->net); in tipc_link_input()
952 static bool tipc_link_release_pkts(struct tipc_link *l, u16 acked) in tipc_link_release_pkts() argument
957 skb_queue_walk_safe(&l->transmq, skb, tmp) { in tipc_link_release_pkts()
960 __skb_unlink(skb, &l->transmq); in tipc_link_release_pkts()
972 int tipc_link_build_ack_msg(struct tipc_link *l, struct sk_buff_head *xmitq) in tipc_link_build_ack_msg() argument
974 if (!l) in tipc_link_build_ack_msg()
978 if (link_is_bc_rcvlink(l)) { in tipc_link_build_ack_msg()
979 if (((l->rcv_nxt ^ link_own_addr(l)) & 0xf) != 0xf) in tipc_link_build_ack_msg()
981 l->rcv_unacked = 0; in tipc_link_build_ack_msg()
986 l->rcv_unacked = 0; in tipc_link_build_ack_msg()
987 l->stats.sent_acks++; in tipc_link_build_ack_msg()
988 tipc_link_build_proto_msg(l, STATE_MSG, 0, 0, 0, 0, xmitq); in tipc_link_build_ack_msg()
994 void tipc_link_build_reset_msg(struct tipc_link *l, struct sk_buff_head *xmitq) in tipc_link_build_reset_msg() argument
998 if (l->state == LINK_ESTABLISHING) in tipc_link_build_reset_msg()
1001 tipc_link_build_proto_msg(l, mtyp, 0, 0, 0, 0, xmitq); in tipc_link_build_reset_msg()
1006 static void tipc_link_build_nack_msg(struct tipc_link *l, in tipc_link_build_nack_msg() argument
1009 u32 def_cnt = ++l->stats.deferred_recv; in tipc_link_build_nack_msg()
1011 if (link_is_bc_rcvlink(l)) in tipc_link_build_nack_msg()
1014 if ((skb_queue_len(&l->deferdq) == 1) || !(def_cnt % TIPC_NACK_INTV)) in tipc_link_build_nack_msg()
1015 tipc_link_build_proto_msg(l, STATE_MSG, 0, 0, 0, 0, xmitq); in tipc_link_build_nack_msg()
1023 int tipc_link_rcv(struct tipc_link *l, struct sk_buff *skb, in tipc_link_rcv() argument
1026 struct sk_buff_head *defq = &l->deferdq; in tipc_link_rcv()
1034 rcv_nxt = l->rcv_nxt; in tipc_link_rcv()
1039 return tipc_link_proto_rcv(l, skb, xmitq); in tipc_link_rcv()
1041 if (unlikely(!link_is_up(l))) { in tipc_link_rcv()
1042 if (l->state == LINK_ESTABLISHING) in tipc_link_rcv()
1048 l->silent_intv_cnt = 0; in tipc_link_rcv()
1052 l->stats.duplicates++; in tipc_link_rcv()
1057 if (likely(tipc_link_release_pkts(l, msg_ack(hdr)))) { in tipc_link_rcv()
1058 tipc_link_advance_backlog(l, xmitq); in tipc_link_rcv()
1059 if (unlikely(!skb_queue_empty(&l->wakeupq))) in tipc_link_rcv()
1060 link_prepare_wakeup(l); in tipc_link_rcv()
1066 tipc_link_build_nack_msg(l, xmitq); in tipc_link_rcv()
1071 l->rcv_nxt++; in tipc_link_rcv()
1072 l->stats.recv_info++; in tipc_link_rcv()
1073 if (!tipc_data_input(l, skb, l->inputq)) in tipc_link_rcv()
1074 rc |= tipc_link_input(l, skb, l->inputq); in tipc_link_rcv()
1075 if (unlikely(++l->rcv_unacked >= TIPC_MIN_LINK_WIN)) in tipc_link_rcv()
1076 rc |= tipc_link_build_ack_msg(l, xmitq); in tipc_link_rcv()
1090 void tipc_link_proto_xmit(struct tipc_link *l, u32 msg_typ, int probe_msg, in tipc_link_proto_xmit() argument
1097 tipc_link_build_proto_msg(l, msg_typ, probe_msg, gap, in tipc_link_proto_xmit()
1102 tipc_bearer_xmit_skb(l->net, l->bearer_id, skb, l->media_addr); in tipc_link_proto_xmit()
1103 l->rcv_unacked = 0; in tipc_link_proto_xmit()
1106 static void tipc_link_build_proto_msg(struct tipc_link *l, int mtyp, bool probe, in tipc_link_build_proto_msg() argument
1111 struct tipc_msg *hdr = l->pmsg; in tipc_link_build_proto_msg()
1112 bool node_up = link_is_up(l->bc_rcvlink); in tipc_link_build_proto_msg()
1115 if (tipc_link_is_blocked(l)) in tipc_link_build_proto_msg()
1119 msg_set_net_plane(hdr, l->net_plane); in tipc_link_build_proto_msg()
1120 msg_set_next_sent(hdr, l->snd_nxt); in tipc_link_build_proto_msg()
1121 msg_set_ack(hdr, l->rcv_nxt - 1); in tipc_link_build_proto_msg()
1122 msg_set_bcast_ack(hdr, l->bc_rcvlink->rcv_nxt - 1); in tipc_link_build_proto_msg()
1123 msg_set_last_bcast(hdr, l->bc_sndlink->snd_nxt - 1); in tipc_link_build_proto_msg()
1130 msg_set_seqno(hdr, l->snd_nxt + U16_MAX / 2); in tipc_link_build_proto_msg()
1133 if (!tipc_link_is_up(l)) in tipc_link_build_proto_msg()
1137 if (!skb_queue_empty(&l->deferdq)) in tipc_link_build_proto_msg()
1138 rcvgap = buf_seqno(skb_peek(&l->deferdq)) - l->rcv_nxt; in tipc_link_build_proto_msg()
1141 l->stats.sent_nacks++; in tipc_link_build_proto_msg()
1145 l->stats.sent_probes++; in tipc_link_build_proto_msg()
1146 l->stats.sent_states++; in tipc_link_build_proto_msg()
1147 l->rcv_unacked = 0; in tipc_link_build_proto_msg()
1150 msg_set_max_pkt(hdr, l->advertised_mtu); in tipc_link_build_proto_msg()
1151 msg_set_ack(hdr, l->rcv_nxt - 1); in tipc_link_build_proto_msg()
1165 void tipc_link_tnl_prepare(struct tipc_link *l, struct tipc_link *tnl, in tipc_link_tnl_prepare() argument
1170 struct sk_buff_head *queue = &l->transmq; in tipc_link_tnl_prepare()
1172 u16 pktlen, pktcnt, seqno = l->snd_nxt; in tipc_link_tnl_prepare()
1182 BASIC_H_SIZE, 0, l->addr, link_own_addr(l), in tipc_link_tnl_prepare()
1189 tipc_link_xmit(l, &tnlq, &tmpxq); in tipc_link_tnl_prepare()
1193 tipc_msg_init(link_own_addr(l), &tnlhdr, TUNNEL_PROTOCOL, in tipc_link_tnl_prepare()
1194 mtyp, INT_H_SIZE, l->addr); in tipc_link_tnl_prepare()
1195 pktcnt = skb_queue_len(&l->transmq) + skb_queue_len(&l->backlogq); in tipc_link_tnl_prepare()
1197 msg_set_bearer_id(&tnlhdr, l->peer_bearer_id); in tipc_link_tnl_prepare()
1202 if (queue == &l->backlogq) in tipc_link_tnl_prepare()
1215 if (queue != &l->backlogq) { in tipc_link_tnl_prepare()
1216 queue = &l->backlogq; in tipc_link_tnl_prepare()
1223 tnl->drop_point = l->rcv_nxt; in tipc_link_tnl_prepare()
1224 tnl->failover_reasm_skb = l->reasm_buf; in tipc_link_tnl_prepare()
1225 l->reasm_buf = NULL; in tipc_link_tnl_prepare()
1234 static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb, in tipc_link_proto_rcv() argument
1244 u16 rcv_nxt = l->rcv_nxt; in tipc_link_proto_rcv()
1249 if (tipc_link_is_blocked(l) || !xmitq) in tipc_link_proto_rcv()
1252 if (link_own_addr(l) > msg_prevnode(hdr)) in tipc_link_proto_rcv()
1253 l->net_plane = msg_net_plane(hdr); in tipc_link_proto_rcv()
1259 if ((less_eq(msg_session(hdr), l->peer_session)) && in tipc_link_proto_rcv()
1260 (l->peer_session != WILDCARD_SESSION)) in tipc_link_proto_rcv()
1267 if_name = strrchr(l->name, ':') + 1; in tipc_link_proto_rcv()
1268 if (sizeof(l->name) - (if_name - l->name) <= TIPC_MAX_IF_NAME) in tipc_link_proto_rcv()
1276 l->tolerance = peers_tol; in tipc_link_proto_rcv()
1279 if (in_range(peers_prio, l->priority + 1, TIPC_MAX_LINK_PRI)) in tipc_link_proto_rcv()
1280 l->priority = peers_prio; in tipc_link_proto_rcv()
1283 if ((mtyp == RESET_MSG) || !link_is_up(l)) in tipc_link_proto_rcv()
1284 rc = tipc_link_fsm_evt(l, LINK_PEER_RESET_EVT); in tipc_link_proto_rcv()
1287 if ((mtyp == ACTIVATE_MSG) && (l->state == LINK_ESTABLISHING)) in tipc_link_proto_rcv()
1290 l->peer_session = msg_session(hdr); in tipc_link_proto_rcv()
1291 l->peer_bearer_id = msg_bearer_id(hdr); in tipc_link_proto_rcv()
1292 if (l->mtu > msg_max_pkt(hdr)) in tipc_link_proto_rcv()
1293 l->mtu = msg_max_pkt(hdr); in tipc_link_proto_rcv()
1300 l->tolerance = peers_tol; in tipc_link_proto_rcv()
1302 l->silent_intv_cnt = 0; in tipc_link_proto_rcv()
1303 l->stats.recv_states++; in tipc_link_proto_rcv()
1305 l->stats.recv_probes++; in tipc_link_proto_rcv()
1307 if (!link_is_up(l)) { in tipc_link_proto_rcv()
1308 if (l->state == LINK_ESTABLISHING) in tipc_link_proto_rcv()
1314 if (more(peers_snd_nxt, rcv_nxt) && !tipc_link_is_synching(l)) in tipc_link_proto_rcv()
1315 rcvgap = peers_snd_nxt - l->rcv_nxt; in tipc_link_proto_rcv()
1317 tipc_link_build_proto_msg(l, STATE_MSG, 0, rcvgap, in tipc_link_proto_rcv()
1319 tipc_link_release_pkts(l, ack); in tipc_link_proto_rcv()
1323 rc = tipc_link_retrans(l, ack + 1, ack + gap, xmitq); in tipc_link_proto_rcv()
1324 l->stats.recv_nacks++; in tipc_link_proto_rcv()
1327 tipc_link_advance_backlog(l, xmitq); in tipc_link_proto_rcv()
1328 if (unlikely(!skb_queue_empty(&l->wakeupq))) in tipc_link_proto_rcv()
1329 link_prepare_wakeup(l); in tipc_link_proto_rcv()
1338 static bool tipc_link_build_bc_proto_msg(struct tipc_link *l, bool bcast, in tipc_link_build_bc_proto_msg() argument
1344 struct sk_buff *dfrd_skb = skb_peek(&l->deferdq); in tipc_link_build_bc_proto_msg()
1345 u16 ack = l->rcv_nxt - 1; in tipc_link_build_bc_proto_msg()
1349 0, l->addr, link_own_addr(l), 0, 0, 0); in tipc_link_build_bc_proto_msg()
1353 msg_set_last_bcast(hdr, l->bc_sndlink->snd_nxt - 1); in tipc_link_build_bc_proto_msg()
1369 static void tipc_link_build_bc_init_msg(struct tipc_link *l, in tipc_link_build_bc_init_msg() argument
1375 if (!tipc_link_build_bc_proto_msg(l->bc_rcvlink, false, 0, &list)) in tipc_link_build_bc_init_msg()
1377 tipc_link_xmit(l, &list, xmitq); in tipc_link_build_bc_init_msg()
1382 void tipc_link_bc_init_rcv(struct tipc_link *l, struct tipc_msg *hdr) in tipc_link_bc_init_rcv() argument
1387 if (link_is_up(l)) in tipc_link_bc_init_rcv()
1391 l->rcv_nxt = peers_snd_nxt; in tipc_link_bc_init_rcv()
1392 l->state = LINK_ESTABLISHED; in tipc_link_bc_init_rcv()
1396 if (l->peer_caps & TIPC_BCAST_SYNCH) in tipc_link_bc_init_rcv()
1404 l->rcv_nxt = peers_snd_nxt; in tipc_link_bc_init_rcv()
1409 void tipc_link_bc_sync_rcv(struct tipc_link *l, struct tipc_msg *hdr, in tipc_link_bc_sync_rcv() argument
1414 if (!link_is_up(l)) in tipc_link_bc_sync_rcv()
1420 l->bc_peer_is_up = true; in tipc_link_bc_sync_rcv()
1423 if (more(peers_snd_nxt, l->rcv_nxt + l->window)) in tipc_link_bc_sync_rcv()
1426 if (!more(peers_snd_nxt, l->rcv_nxt)) { in tipc_link_bc_sync_rcv()
1427 l->nack_state = BC_NACK_SND_CONDITIONAL; in tipc_link_bc_sync_rcv()
1432 if (l->nack_state == BC_NACK_SND_SUPPRESS) { in tipc_link_bc_sync_rcv()
1433 l->nack_state = BC_NACK_SND_UNCONDITIONAL; in tipc_link_bc_sync_rcv()
1438 if (l->nack_state == BC_NACK_SND_CONDITIONAL) { in tipc_link_bc_sync_rcv()
1439 l->nack_state = BC_NACK_SND_UNCONDITIONAL; in tipc_link_bc_sync_rcv()
1440 if ((peers_snd_nxt - l->rcv_nxt) < TIPC_MIN_LINK_WIN) in tipc_link_bc_sync_rcv()
1445 tipc_link_build_bc_proto_msg(l, true, peers_snd_nxt, xmitq); in tipc_link_bc_sync_rcv()
1446 l->nack_state = BC_NACK_SND_SUPPRESS; in tipc_link_bc_sync_rcv()
1449 void tipc_link_bc_ack_rcv(struct tipc_link *l, u16 acked, in tipc_link_bc_ack_rcv() argument
1453 struct tipc_link *snd_l = l->bc_sndlink; in tipc_link_bc_ack_rcv()
1455 if (!link_is_up(l) || !l->bc_peer_is_up) in tipc_link_bc_ack_rcv()
1458 if (!more(acked, l->acked)) in tipc_link_bc_ack_rcv()
1463 if (more(buf_seqno(skb), l->acked)) in tipc_link_bc_ack_rcv()
1476 l->acked = acked; in tipc_link_bc_ack_rcv()
1484 int tipc_link_bc_nack_rcv(struct tipc_link *l, struct sk_buff *skb, in tipc_link_bc_nack_rcv() argument
1498 if (!tipc_link_is_up(l) || !l->bc_peer_is_up) in tipc_link_bc_nack_rcv()
1504 if (dnode == link_own_addr(l)) { in tipc_link_bc_nack_rcv()
1505 tipc_link_bc_ack_rcv(l, acked, xmitq); in tipc_link_bc_nack_rcv()
1506 rc = tipc_link_retrans(l->bc_sndlink, from, to, xmitq); in tipc_link_bc_nack_rcv()
1507 l->stats.recv_nacks++; in tipc_link_bc_nack_rcv()
1512 if (more(peers_snd_nxt, l->rcv_nxt) && !less(l->rcv_nxt, from)) in tipc_link_bc_nack_rcv()
1513 l->nack_state = BC_NACK_SND_SUPPRESS; in tipc_link_bc_nack_rcv()
1518 void tipc_link_set_queue_limits(struct tipc_link *l, u32 win) in tipc_link_set_queue_limits() argument
1520 int max_bulk = TIPC_MAX_PUBLICATIONS / (l->mtu / ITEM_SIZE); in tipc_link_set_queue_limits()
1522 l->window = win; in tipc_link_set_queue_limits()
1523 l->backlog[TIPC_LOW_IMPORTANCE].limit = win / 2; in tipc_link_set_queue_limits()
1524 l->backlog[TIPC_MEDIUM_IMPORTANCE].limit = win; in tipc_link_set_queue_limits()
1525 l->backlog[TIPC_HIGH_IMPORTANCE].limit = win / 2 * 3; in tipc_link_set_queue_limits()
1526 l->backlog[TIPC_CRITICAL_IMPORTANCE].limit = win * 2; in tipc_link_set_queue_limits()
1527 l->backlog[TIPC_SYSTEM_IMPORTANCE].limit = max_bulk; in tipc_link_set_queue_limits()
1579 static void link_print(struct tipc_link *l, const char *str) in link_print() argument
1581 struct sk_buff *hskb = skb_peek(&l->transmq); in link_print()
1582 u16 head = hskb ? msg_seqno(buf_msg(hskb)) : l->snd_nxt - 1; in link_print()
1583 u16 tail = l->snd_nxt - 1; in link_print()
1585 pr_info("%s Link <%s> state %x\n", str, l->name, l->state); in link_print()
1587 skb_queue_len(&l->transmq), head, tail, in link_print()
1588 skb_queue_len(&l->backlogq), l->snd_nxt, l->rcv_nxt); in link_print()