Lines Matching refs:link

96 static void link_handle_out_of_seq_msg(struct tipc_link *link,
98 static void tipc_link_proto_rcv(struct tipc_link *link,
209 static void link_set_timer(struct tipc_link *link, unsigned long time) in link_set_timer() argument
211 if (!mod_timer(&link->timer, jiffies + time)) in link_set_timer()
212 tipc_link_get(link); in link_set_timer()
318 struct tipc_link *link; in tipc_link_delete_list() local
324 link = node->links[bearer_id]; in tipc_link_delete_list()
325 if (link) in tipc_link_delete_list()
326 tipc_link_delete(link); in tipc_link_delete_list()
339 static int link_schedule_user(struct tipc_link *link, struct sk_buff_head *list) in link_schedule_user() argument
344 u32 addr = link_own_addr(link); in link_schedule_user()
349 pr_warn("%s<%s>, send queue full", link_rst_msg, link->name); in link_schedule_user()
350 tipc_link_reset(link); in link_schedule_user()
364 skb_queue_tail(&link->wakeupq, skb); in link_schedule_user()
365 link->stats.link_congs++; in link_schedule_user()
496 static void link_activate(struct tipc_link *link) in link_activate() argument
498 struct tipc_node *node = link->owner; in link_activate()
500 link->next_in_no = 1; in link_activate()
501 link->stats.recv_info = 1; in link_activate()
502 tipc_node_link_up(node, link); in link_activate()
503 tipc_bearer_add_dest(node->net, link->bearer_id, link->addr); in link_activate()
699 int __tipc_link_xmit(struct net *net, struct tipc_link *link, in __tipc_link_xmit() argument
703 unsigned int maxwin = link->window; in __tipc_link_xmit()
705 uint mtu = link->mtu; in __tipc_link_xmit()
706 uint ack = mod(link->next_in_no - 1); in __tipc_link_xmit()
707 uint seqno = link->next_out_no; in __tipc_link_xmit()
708 uint bc_last_in = link->owner->bclink.last_in; in __tipc_link_xmit()
709 struct tipc_media_addr *addr = &link->media_addr; in __tipc_link_xmit()
710 struct sk_buff_head *transmq = &link->transmq; in __tipc_link_xmit()
711 struct sk_buff_head *backlogq = &link->backlogq; in __tipc_link_xmit()
715 if (unlikely(link->backlog[imp].len >= link->backlog[imp].limit)) in __tipc_link_xmit()
716 return link_schedule_user(link, list); in __tipc_link_xmit()
732 tipc_bearer_send(net, link->bearer_id, skb, addr); in __tipc_link_xmit()
733 link->rcv_unacked = 0; in __tipc_link_xmit()
738 link->stats.sent_bundled++; in __tipc_link_xmit()
741 if (tipc_msg_make_bundle(&skb, mtu, link->addr)) { in __tipc_link_xmit()
742 link->stats.sent_bundled++; in __tipc_link_xmit()
743 link->stats.sent_bundles++; in __tipc_link_xmit()
747 link->backlog[imp].len++; in __tipc_link_xmit()
750 link->next_out_no = seqno; in __tipc_link_xmit()
760 static int __tipc_link_xmit_skb(struct tipc_link *link, struct sk_buff *skb) in __tipc_link_xmit_skb() argument
765 return __tipc_link_xmit(link->owner->net, link, &head); in __tipc_link_xmit_skb()
802 struct tipc_link *link = NULL; in tipc_link_xmit() local
809 link = node->active_links[selector & 1]; in tipc_link_xmit()
810 if (link) in tipc_link_xmit()
811 rc = __tipc_link_xmit(net, link, list); in tipc_link_xmit()
815 if (link) in tipc_link_xmit()
835 static void tipc_link_sync_xmit(struct tipc_link *link) in tipc_link_sync_xmit() argument
845 tipc_msg_init(link_own_addr(link), msg, BCAST_PROTOCOL, STATE_MSG, in tipc_link_sync_xmit()
846 INT_H_SIZE, link->addr); in tipc_link_sync_xmit()
847 msg_set_last_bcast(msg, link->owner->bclink.acked); in tipc_link_sync_xmit()
848 __tipc_link_xmit_skb(link, skb); in tipc_link_sync_xmit()
876 void tipc_link_push_packets(struct tipc_link *link) in tipc_link_push_packets() argument
880 unsigned int ack = mod(link->next_in_no - 1); in tipc_link_push_packets()
882 while (skb_queue_len(&link->transmq) < link->window) { in tipc_link_push_packets()
883 skb = __skb_dequeue(&link->backlogq); in tipc_link_push_packets()
887 link->backlog[msg_importance(msg)].len--; in tipc_link_push_packets()
889 msg_set_bcast_ack(msg, link->owner->bclink.last_in); in tipc_link_push_packets()
890 link->rcv_unacked = 0; in tipc_link_push_packets()
891 __skb_queue_tail(&link->transmq, skb); in tipc_link_push_packets()
892 tipc_bearer_send(link->owner->net, link->bearer_id, in tipc_link_push_packets()
893 skb, &link->media_addr); in tipc_link_push_packets()
1016 static void link_retrieve_defq(struct tipc_link *link, in link_retrieve_defq() argument
1021 if (skb_queue_empty(&link->deferdq)) in link_retrieve_defq()
1024 seq_no = buf_seqno(skb_peek(&link->deferdq)); in link_retrieve_defq()
1025 if (seq_no == mod(link->next_in_no)) in link_retrieve_defq()
1026 skb_queue_splice_tail_init(&link->deferdq, list); in link_retrieve_defq()
1174 static bool tipc_data_input(struct tipc_link *link, struct sk_buff *skb) in tipc_data_input() argument
1176 struct tipc_node *node = link->owner; in tipc_data_input()
1186 if (tipc_skb_queue_tail(&link->inputq, skb, dport)) { in tipc_data_input()
1187 node->inputq = &link->inputq; in tipc_data_input()
1193 node->namedq = &link->namedq; in tipc_data_input()
1194 skb_queue_tail(&link->namedq, skb); in tipc_data_input()
1195 if (skb_queue_len(&link->namedq) == 1) in tipc_data_input()
1215 static void tipc_link_input(struct tipc_link *link, struct sk_buff *skb) in tipc_link_input() argument
1217 struct tipc_node *node = link->owner; in tipc_link_input()
1222 if (likely(tipc_data_input(link, skb))) in tipc_link_input()
1228 link->flags |= LINK_SYNCHING; in tipc_link_input()
1229 link->synch_point = msg_seqno(msg_get_wrapped(msg)); in tipc_link_input()
1233 if (!tipc_link_failover_rcv(link, &skb)) in tipc_link_input()
1236 tipc_data_input(link, skb); in tipc_link_input()
1240 link->stats.recv_bundles++; in tipc_link_input()
1241 link->stats.recv_bundled += msg_msgcnt(msg); in tipc_link_input()
1244 tipc_data_input(link, iskb); in tipc_link_input()
1247 link->stats.recv_fragments++; in tipc_link_input()
1248 if (tipc_buf_append(&link->reasm_buf, &skb)) { in tipc_link_input()
1249 link->stats.recv_fragmented++; in tipc_link_input()
1250 tipc_data_input(link, skb); in tipc_link_input()
1251 } else if (!link->reasm_buf) { in tipc_link_input()
1252 tipc_link_reset(link); in tipc_link_input()
1636 void tipc_link_dup_queue_xmit(struct tipc_link *link, in tipc_link_dup_queue_xmit() argument
1641 struct sk_buff_head *queue = &link->transmq; in tipc_link_dup_queue_xmit()
1644 tipc_msg_init(link_own_addr(link), &tnl_hdr, TUNNEL_PROTOCOL, in tipc_link_dup_queue_xmit()
1645 SYNCH_MSG, INT_H_SIZE, link->addr); in tipc_link_dup_queue_xmit()
1646 mcnt = skb_queue_len(&link->transmq) + skb_queue_len(&link->backlogq); in tipc_link_dup_queue_xmit()
1648 msg_set_bearer_id(&tnl_hdr, link->peer_bearer_id); in tipc_link_dup_queue_xmit()
1656 msg_set_ack(msg, mod(link->next_in_no - 1)); in tipc_link_dup_queue_xmit()
1657 msg_set_bcast_ack(msg, link->owner->bclink.last_in); in tipc_link_dup_queue_xmit()
1669 if (!tipc_link_is_up(link)) in tipc_link_dup_queue_xmit()
1672 if (queue == &link->backlogq) in tipc_link_dup_queue_xmit()
1674 queue = &link->backlogq; in tipc_link_dup_queue_xmit()
1681 static bool tipc_link_failover_rcv(struct tipc_link *link, in tipc_link_failover_rcv() argument
1697 if (bearer_id == link->bearer_id) in tipc_link_failover_rcv()
1700 pl = link->owner->links[bearer_id]; in tipc_link_failover_rcv()
1704 if (link->failover_pkts == FIRST_FAILOVER) in tipc_link_failover_rcv()
1705 link->failover_pkts = msg_msgcnt(msg); in tipc_link_failover_rcv()
1708 if (!link->failover_pkts) in tipc_link_failover_rcv()
1716 link->failover_pkts--; in tipc_link_failover_rcv()
1720 if (less(buf_seqno(iskb), link->failover_checkpt)) { in tipc_link_failover_rcv()
1726 link->stats.recv_fragments++; in tipc_link_failover_rcv()
1727 tipc_buf_append(&link->failover_skb, &iskb); in tipc_link_failover_rcv()
1730 if (!link->failover_pkts && pl) in tipc_link_failover_rcv()
1877 struct tipc_link *link; in tipc_nl_link_set() local
1902 link = node->links[bearer_id]; in tipc_nl_link_set()
1903 if (!link) { in tipc_nl_link_set()
1922 link_set_supervision_props(link, tol); in tipc_nl_link_set()
1923 tipc_link_proto_xmit(link, STATE_MSG, 0, 0, tol, 0); in tipc_nl_link_set()
1929 link->priority = prio; in tipc_nl_link_set()
1930 tipc_link_proto_xmit(link, STATE_MSG, 0, 0, 0, prio); in tipc_nl_link_set()
1936 tipc_link_set_queue_limits(link, win); in tipc_nl_link_set()
2013 struct tipc_link *link, int nlflags) in __tipc_nl_add_link() argument
2030 if (nla_put_string(msg->skb, TIPC_NLA_LINK_NAME, link->name)) in __tipc_nl_add_link()
2035 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_MTU, link->mtu)) in __tipc_nl_add_link()
2037 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_RX, link->next_in_no)) in __tipc_nl_add_link()
2039 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_TX, link->next_out_no)) in __tipc_nl_add_link()
2042 if (tipc_link_is_up(link)) in __tipc_nl_add_link()
2045 if (tipc_link_is_active(link)) in __tipc_nl_add_link()
2052 if (nla_put_u32(msg->skb, TIPC_NLA_PROP_PRIO, link->priority)) in __tipc_nl_add_link()
2054 if (nla_put_u32(msg->skb, TIPC_NLA_PROP_TOL, link->tolerance)) in __tipc_nl_add_link()
2057 link->window)) in __tipc_nl_add_link()
2059 if (nla_put_u32(msg->skb, TIPC_NLA_PROP_PRIO, link->priority)) in __tipc_nl_add_link()
2063 err = __tipc_nl_add_stats(msg->skb, &link->stats); in __tipc_nl_add_link()
2180 struct tipc_link *link; in tipc_nl_link_get() local
2203 link = node->links[bearer_id]; in tipc_nl_link_get()
2204 if (!link) { in tipc_nl_link_get()
2209 err = __tipc_nl_add_link(net, &msg, link, 0); in tipc_nl_link_get()
2229 struct tipc_link *link; in tipc_nl_link_reset_stats() local
2261 link = node->links[bearer_id]; in tipc_nl_link_reset_stats()
2262 if (!link) { in tipc_nl_link_reset_stats()
2267 link_reset_statistics(link); in tipc_nl_link_reset_stats()