aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorJon Paul Maloy <jon.maloy@ericsson.com>2015-04-02 09:33:02 -0400
committerDavid S. Miller <davem@davemloft.net>2015-04-02 16:27:12 -0400
commited193ece2649c194a87a9d8470195760d367c075 (patch)
tree1d01a4365c6cb35c01ef6a2ce36af019de1571be /net/tipc
parentdff29b1a88524fe6afe296d6c477c491d1e02af0 (diff)
tipc: simplify link mtu negotiation
When a link is being established, the two endpoints advertise their respective interface MTU in the transmitted RESET and ACTIVATE messages. If there is any difference, the lower of the two MTUs will be selected for use by both endpoints. However, as a remnant of earlier attempts to introduce TIPC level routing. there also exists an MTU discovery mechanism. If an intermediate node has a lower MTU than the two endpoints, they will discover this through a bisectional approach, and finally adopt this MTU for common use. Since there is no TIPC level routing, and probably never will be, this mechanism doesn't make any sense, and only serves to make the link level protocol unecessarily complex. In this commit, we eliminate the MTU discovery algorithm,and fall back to the simple MTU advertising approach. This change is fully backwards compatible. Reviewed-by: Ying Xue <ying.xue@windriver.com> Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/bcast.c4
-rw-r--r--net/tipc/link.c129
-rw-r--r--net/tipc/link.h12
-rw-r--r--net/tipc/node.c9
4 files changed, 43 insertions, 111 deletions
diff --git a/net/tipc/bcast.c b/net/tipc/bcast.c
index ae558dd7f8ee..c5cbdcb1f0b5 100644
--- a/net/tipc/bcast.c
+++ b/net/tipc/bcast.c
@@ -413,7 +413,7 @@ static void bclink_accept_pkt(struct tipc_node *node, u32 seqno)
413 */ 413 */
414 if (((seqno - tn->own_addr) % TIPC_MIN_LINK_WIN) == 0) { 414 if (((seqno - tn->own_addr) % TIPC_MIN_LINK_WIN) == 0) {
415 tipc_link_proto_xmit(node->active_links[node->addr & 1], 415 tipc_link_proto_xmit(node->active_links[node->addr & 1],
416 STATE_MSG, 0, 0, 0, 0, 0); 416 STATE_MSG, 0, 0, 0, 0);
417 tn->bcl->stats.sent_acks++; 417 tn->bcl->stats.sent_acks++;
418 } 418 }
419} 419}
@@ -899,7 +899,7 @@ int tipc_bclink_init(struct net *net)
899 skb_queue_head_init(&bclink->inputq); 899 skb_queue_head_init(&bclink->inputq);
900 bcl->owner = &bclink->node; 900 bcl->owner = &bclink->node;
901 bcl->owner->net = net; 901 bcl->owner->net = net;
902 bcl->max_pkt = MAX_PKT_DEFAULT_MCAST; 902 bcl->mtu = MAX_PKT_DEFAULT_MCAST;
903 tipc_link_set_queue_limits(bcl, BCLINK_WIN_DEFAULT); 903 tipc_link_set_queue_limits(bcl, BCLINK_WIN_DEFAULT);
904 bcl->bearer_id = MAX_BEARERS; 904 bcl->bearer_id = MAX_BEARERS;
905 rcu_assign_pointer(tn->bearer_list[MAX_BEARERS], &bcbearer->bearer); 905 rcu_assign_pointer(tn->bearer_list[MAX_BEARERS], &bcbearer->bearer);
diff --git a/net/tipc/link.c b/net/tipc/link.c
index b1e17953eeea..a6b30df6ec02 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -136,34 +136,6 @@ static struct tipc_link *tipc_parallel_link(struct tipc_link *l)
136 return l->owner->active_links[1]; 136 return l->owner->active_links[1];
137} 137}
138 138
139static void link_init_max_pkt(struct tipc_link *l_ptr)
140{
141 struct tipc_node *node = l_ptr->owner;
142 struct tipc_net *tn = net_generic(node->net, tipc_net_id);
143 struct tipc_bearer *b_ptr;
144 u32 max_pkt;
145
146 rcu_read_lock();
147 b_ptr = rcu_dereference_rtnl(tn->bearer_list[l_ptr->bearer_id]);
148 if (!b_ptr) {
149 rcu_read_unlock();
150 return;
151 }
152 max_pkt = (b_ptr->mtu & ~3);
153 rcu_read_unlock();
154
155 if (max_pkt > MAX_MSG_SIZE)
156 max_pkt = MAX_MSG_SIZE;
157
158 l_ptr->max_pkt_target = max_pkt;
159 if (l_ptr->max_pkt_target < MAX_PKT_DEFAULT)
160 l_ptr->max_pkt = l_ptr->max_pkt_target;
161 else
162 l_ptr->max_pkt = MAX_PKT_DEFAULT;
163
164 l_ptr->max_pkt_probes = 0;
165}
166
167/* 139/*
168 * Simple non-static link routines (i.e. referenced outside this file) 140 * Simple non-static link routines (i.e. referenced outside this file)
169 */ 141 */
@@ -304,7 +276,8 @@ struct tipc_link *tipc_link_create(struct tipc_node *n_ptr,
304 msg_set_bearer_id(msg, b_ptr->identity); 276 msg_set_bearer_id(msg, b_ptr->identity);
305 strcpy((char *)msg_data(msg), if_name); 277 strcpy((char *)msg_data(msg), if_name);
306 l_ptr->net_plane = b_ptr->net_plane; 278 l_ptr->net_plane = b_ptr->net_plane;
307 link_init_max_pkt(l_ptr); 279 l_ptr->advertised_mtu = b_ptr->mtu;
280 l_ptr->mtu = l_ptr->advertised_mtu;
308 l_ptr->priority = b_ptr->priority; 281 l_ptr->priority = b_ptr->priority;
309 tipc_link_set_queue_limits(l_ptr, b_ptr->window); 282 tipc_link_set_queue_limits(l_ptr, b_ptr->window);
310 l_ptr->next_out_no = 1; 283 l_ptr->next_out_no = 1;
@@ -465,8 +438,8 @@ void tipc_link_reset(struct tipc_link *l_ptr)
465 /* Link is down, accept any session */ 438 /* Link is down, accept any session */
466 l_ptr->peer_session = INVALID_SESSION; 439 l_ptr->peer_session = INVALID_SESSION;
467 440
468 /* Prepare for max packet size negotiation */ 441 /* Prepare for renewed mtu size negotiation */
469 link_init_max_pkt(l_ptr); 442 l_ptr->mtu = l_ptr->advertised_mtu;
470 443
471 l_ptr->state = RESET_UNKNOWN; 444 l_ptr->state = RESET_UNKNOWN;
472 445
@@ -563,11 +536,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event)
563 l_ptr->checkpoint = l_ptr->next_in_no; 536 l_ptr->checkpoint = l_ptr->next_in_no;
564 if (tipc_bclink_acks_missing(l_ptr->owner)) { 537 if (tipc_bclink_acks_missing(l_ptr->owner)) {
565 tipc_link_proto_xmit(l_ptr, STATE_MSG, 538 tipc_link_proto_xmit(l_ptr, STATE_MSG,
566 0, 0, 0, 0, 0); 539 0, 0, 0, 0);
567 l_ptr->fsm_msg_cnt++;
568 } else if (l_ptr->max_pkt < l_ptr->max_pkt_target) {
569 tipc_link_proto_xmit(l_ptr, STATE_MSG,
570 1, 0, 0, 0, 0);
571 l_ptr->fsm_msg_cnt++; 540 l_ptr->fsm_msg_cnt++;
572 } 541 }
573 link_set_timer(l_ptr, cont_intv); 542 link_set_timer(l_ptr, cont_intv);
@@ -575,7 +544,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event)
575 } 544 }
576 l_ptr->state = WORKING_UNKNOWN; 545 l_ptr->state = WORKING_UNKNOWN;
577 l_ptr->fsm_msg_cnt = 0; 546 l_ptr->fsm_msg_cnt = 0;
578 tipc_link_proto_xmit(l_ptr, STATE_MSG, 1, 0, 0, 0, 0); 547 tipc_link_proto_xmit(l_ptr, STATE_MSG, 1, 0, 0, 0);
579 l_ptr->fsm_msg_cnt++; 548 l_ptr->fsm_msg_cnt++;
580 link_set_timer(l_ptr, cont_intv / 4); 549 link_set_timer(l_ptr, cont_intv / 4);
581 break; 550 break;
@@ -586,7 +555,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event)
586 l_ptr->state = RESET_RESET; 555 l_ptr->state = RESET_RESET;
587 l_ptr->fsm_msg_cnt = 0; 556 l_ptr->fsm_msg_cnt = 0;
588 tipc_link_proto_xmit(l_ptr, ACTIVATE_MSG, 557 tipc_link_proto_xmit(l_ptr, ACTIVATE_MSG,
589 0, 0, 0, 0, 0); 558 0, 0, 0, 0);
590 l_ptr->fsm_msg_cnt++; 559 l_ptr->fsm_msg_cnt++;
591 link_set_timer(l_ptr, cont_intv); 560 link_set_timer(l_ptr, cont_intv);
592 break; 561 break;
@@ -609,7 +578,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event)
609 l_ptr->state = RESET_RESET; 578 l_ptr->state = RESET_RESET;
610 l_ptr->fsm_msg_cnt = 0; 579 l_ptr->fsm_msg_cnt = 0;
611 tipc_link_proto_xmit(l_ptr, ACTIVATE_MSG, 580 tipc_link_proto_xmit(l_ptr, ACTIVATE_MSG,
612 0, 0, 0, 0, 0); 581 0, 0, 0, 0);
613 l_ptr->fsm_msg_cnt++; 582 l_ptr->fsm_msg_cnt++;
614 link_set_timer(l_ptr, cont_intv); 583 link_set_timer(l_ptr, cont_intv);
615 break; 584 break;
@@ -620,13 +589,13 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event)
620 l_ptr->checkpoint = l_ptr->next_in_no; 589 l_ptr->checkpoint = l_ptr->next_in_no;
621 if (tipc_bclink_acks_missing(l_ptr->owner)) { 590 if (tipc_bclink_acks_missing(l_ptr->owner)) {
622 tipc_link_proto_xmit(l_ptr, STATE_MSG, 591 tipc_link_proto_xmit(l_ptr, STATE_MSG,
623 0, 0, 0, 0, 0); 592 0, 0, 0, 0);
624 l_ptr->fsm_msg_cnt++; 593 l_ptr->fsm_msg_cnt++;
625 } 594 }
626 link_set_timer(l_ptr, cont_intv); 595 link_set_timer(l_ptr, cont_intv);
627 } else if (l_ptr->fsm_msg_cnt < l_ptr->abort_limit) { 596 } else if (l_ptr->fsm_msg_cnt < l_ptr->abort_limit) {
628 tipc_link_proto_xmit(l_ptr, STATE_MSG, 597 tipc_link_proto_xmit(l_ptr, STATE_MSG,
629 1, 0, 0, 0, 0); 598 1, 0, 0, 0);
630 l_ptr->fsm_msg_cnt++; 599 l_ptr->fsm_msg_cnt++;
631 link_set_timer(l_ptr, cont_intv / 4); 600 link_set_timer(l_ptr, cont_intv / 4);
632 } else { /* Link has failed */ 601 } else { /* Link has failed */
@@ -636,7 +605,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event)
636 l_ptr->state = RESET_UNKNOWN; 605 l_ptr->state = RESET_UNKNOWN;
637 l_ptr->fsm_msg_cnt = 0; 606 l_ptr->fsm_msg_cnt = 0;
638 tipc_link_proto_xmit(l_ptr, RESET_MSG, 607 tipc_link_proto_xmit(l_ptr, RESET_MSG,
639 0, 0, 0, 0, 0); 608 0, 0, 0, 0);
640 l_ptr->fsm_msg_cnt++; 609 l_ptr->fsm_msg_cnt++;
641 link_set_timer(l_ptr, cont_intv); 610 link_set_timer(l_ptr, cont_intv);
642 } 611 }
@@ -656,7 +625,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event)
656 l_ptr->state = WORKING_WORKING; 625 l_ptr->state = WORKING_WORKING;
657 l_ptr->fsm_msg_cnt = 0; 626 l_ptr->fsm_msg_cnt = 0;
658 link_activate(l_ptr); 627 link_activate(l_ptr);
659 tipc_link_proto_xmit(l_ptr, STATE_MSG, 1, 0, 0, 0, 0); 628 tipc_link_proto_xmit(l_ptr, STATE_MSG, 1, 0, 0, 0);
660 l_ptr->fsm_msg_cnt++; 629 l_ptr->fsm_msg_cnt++;
661 if (l_ptr->owner->working_links == 1) 630 if (l_ptr->owner->working_links == 1)
662 tipc_link_sync_xmit(l_ptr); 631 tipc_link_sync_xmit(l_ptr);
@@ -666,7 +635,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event)
666 l_ptr->state = RESET_RESET; 635 l_ptr->state = RESET_RESET;
667 l_ptr->fsm_msg_cnt = 0; 636 l_ptr->fsm_msg_cnt = 0;
668 tipc_link_proto_xmit(l_ptr, ACTIVATE_MSG, 637 tipc_link_proto_xmit(l_ptr, ACTIVATE_MSG,
669 1, 0, 0, 0, 0); 638 1, 0, 0, 0);
670 l_ptr->fsm_msg_cnt++; 639 l_ptr->fsm_msg_cnt++;
671 link_set_timer(l_ptr, cont_intv); 640 link_set_timer(l_ptr, cont_intv);
672 break; 641 break;
@@ -676,7 +645,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event)
676 link_set_timer(l_ptr, cont_intv); 645 link_set_timer(l_ptr, cont_intv);
677 break; 646 break;
678 case TIMEOUT_EVT: 647 case TIMEOUT_EVT:
679 tipc_link_proto_xmit(l_ptr, RESET_MSG, 0, 0, 0, 0, 0); 648 tipc_link_proto_xmit(l_ptr, RESET_MSG, 0, 0, 0, 0);
680 l_ptr->fsm_msg_cnt++; 649 l_ptr->fsm_msg_cnt++;
681 link_set_timer(l_ptr, cont_intv); 650 link_set_timer(l_ptr, cont_intv);
682 break; 651 break;
@@ -694,7 +663,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event)
694 l_ptr->state = WORKING_WORKING; 663 l_ptr->state = WORKING_WORKING;
695 l_ptr->fsm_msg_cnt = 0; 664 l_ptr->fsm_msg_cnt = 0;
696 link_activate(l_ptr); 665 link_activate(l_ptr);
697 tipc_link_proto_xmit(l_ptr, STATE_MSG, 1, 0, 0, 0, 0); 666 tipc_link_proto_xmit(l_ptr, STATE_MSG, 1, 0, 0, 0);
698 l_ptr->fsm_msg_cnt++; 667 l_ptr->fsm_msg_cnt++;
699 if (l_ptr->owner->working_links == 1) 668 if (l_ptr->owner->working_links == 1)
700 tipc_link_sync_xmit(l_ptr); 669 tipc_link_sync_xmit(l_ptr);
@@ -704,7 +673,7 @@ static void link_state_event(struct tipc_link *l_ptr, unsigned int event)
704 break; 673 break;
705 case TIMEOUT_EVT: 674 case TIMEOUT_EVT:
706 tipc_link_proto_xmit(l_ptr, ACTIVATE_MSG, 675 tipc_link_proto_xmit(l_ptr, ACTIVATE_MSG,
707 0, 0, 0, 0, 0); 676 0, 0, 0, 0);
708 l_ptr->fsm_msg_cnt++; 677 l_ptr->fsm_msg_cnt++;
709 link_set_timer(l_ptr, cont_intv); 678 link_set_timer(l_ptr, cont_intv);
710 break; 679 break;
@@ -733,7 +702,7 @@ int __tipc_link_xmit(struct net *net, struct tipc_link *link,
733 struct tipc_msg *msg = buf_msg(skb_peek(list)); 702 struct tipc_msg *msg = buf_msg(skb_peek(list));
734 unsigned int maxwin = link->window; 703 unsigned int maxwin = link->window;
735 unsigned int imp = msg_importance(msg); 704 unsigned int imp = msg_importance(msg);
736 uint mtu = link->max_pkt; 705 uint mtu = link->mtu;
737 uint ack = mod(link->next_in_no - 1); 706 uint ack = mod(link->next_in_no - 1);
738 uint seqno = link->next_out_no; 707 uint seqno = link->next_out_no;
739 uint bc_last_in = link->owner->bclink.last_in; 708 uint bc_last_in = link->owner->bclink.last_in;
@@ -1187,7 +1156,7 @@ void tipc_rcv(struct net *net, struct sk_buff *skb, struct tipc_bearer *b_ptr)
1187 link_retrieve_defq(l_ptr, &head); 1156 link_retrieve_defq(l_ptr, &head);
1188 if (unlikely(++l_ptr->rcv_unacked >= TIPC_MIN_LINK_WIN)) { 1157 if (unlikely(++l_ptr->rcv_unacked >= TIPC_MIN_LINK_WIN)) {
1189 l_ptr->stats.sent_acks++; 1158 l_ptr->stats.sent_acks++;
1190 tipc_link_proto_xmit(l_ptr, STATE_MSG, 0, 0, 0, 0, 0); 1159 tipc_link_proto_xmit(l_ptr, STATE_MSG, 0, 0, 0, 0);
1191 } 1160 }
1192 tipc_link_input(l_ptr, skb); 1161 tipc_link_input(l_ptr, skb);
1193 skb = NULL; 1162 skb = NULL;
@@ -1362,7 +1331,7 @@ static void link_handle_out_of_seq_msg(struct tipc_link *l_ptr,
1362 if (tipc_link_defer_pkt(&l_ptr->deferdq, buf)) { 1331 if (tipc_link_defer_pkt(&l_ptr->deferdq, buf)) {
1363 l_ptr->stats.deferred_recv++; 1332 l_ptr->stats.deferred_recv++;
1364 if ((skb_queue_len(&l_ptr->deferdq) % TIPC_MIN_LINK_WIN) == 1) 1333 if ((skb_queue_len(&l_ptr->deferdq) % TIPC_MIN_LINK_WIN) == 1)
1365 tipc_link_proto_xmit(l_ptr, STATE_MSG, 0, 0, 0, 0, 0); 1334 tipc_link_proto_xmit(l_ptr, STATE_MSG, 0, 0, 0, 0);
1366 } else { 1335 } else {
1367 l_ptr->stats.duplicates++; 1336 l_ptr->stats.duplicates++;
1368 } 1337 }
@@ -1372,7 +1341,7 @@ static void link_handle_out_of_seq_msg(struct tipc_link *l_ptr,
1372 * Send protocol message to the other endpoint. 1341 * Send protocol message to the other endpoint.
1373 */ 1342 */
1374void tipc_link_proto_xmit(struct tipc_link *l_ptr, u32 msg_typ, int probe_msg, 1343void tipc_link_proto_xmit(struct tipc_link *l_ptr, u32 msg_typ, int probe_msg,
1375 u32 gap, u32 tolerance, u32 priority, u32 ack_mtu) 1344 u32 gap, u32 tolerance, u32 priority)
1376{ 1345{
1377 struct sk_buff *buf = NULL; 1346 struct sk_buff *buf = NULL;
1378 struct tipc_msg *msg = l_ptr->pmsg; 1347 struct tipc_msg *msg = l_ptr->pmsg;
@@ -1410,26 +1379,11 @@ void tipc_link_proto_xmit(struct tipc_link *l_ptr, u32 msg_typ, int probe_msg,
1410 l_ptr->stats.sent_nacks++; 1379 l_ptr->stats.sent_nacks++;
1411 msg_set_link_tolerance(msg, tolerance); 1380 msg_set_link_tolerance(msg, tolerance);
1412 msg_set_linkprio(msg, priority); 1381 msg_set_linkprio(msg, priority);
1413 msg_set_max_pkt(msg, ack_mtu); 1382 msg_set_max_pkt(msg, l_ptr->mtu);
1414 msg_set_ack(msg, mod(l_ptr->next_in_no - 1)); 1383 msg_set_ack(msg, mod(l_ptr->next_in_no - 1));
1415 msg_set_probe(msg, probe_msg != 0); 1384 msg_set_probe(msg, probe_msg != 0);
1416 if (probe_msg) { 1385 if (probe_msg)
1417 u32 mtu = l_ptr->max_pkt;
1418
1419 if ((mtu < l_ptr->max_pkt_target) &&
1420 link_working_working(l_ptr) &&
1421 l_ptr->fsm_msg_cnt) {
1422 msg_size = (mtu + (l_ptr->max_pkt_target - mtu)/2 + 2) & ~3;
1423 if (l_ptr->max_pkt_probes == 10) {
1424 l_ptr->max_pkt_target = (msg_size - 4);
1425 l_ptr->max_pkt_probes = 0;
1426 msg_size = (mtu + (l_ptr->max_pkt_target - mtu)/2 + 2) & ~3;
1427 }
1428 l_ptr->max_pkt_probes++;
1429 }
1430
1431 l_ptr->stats.sent_probes++; 1386 l_ptr->stats.sent_probes++;
1432 }
1433 l_ptr->stats.sent_states++; 1387 l_ptr->stats.sent_states++;
1434 } else { /* RESET_MSG or ACTIVATE_MSG */ 1388 } else { /* RESET_MSG or ACTIVATE_MSG */
1435 msg_set_ack(msg, mod(l_ptr->failover_checkpt - 1)); 1389 msg_set_ack(msg, mod(l_ptr->failover_checkpt - 1));
@@ -1438,7 +1392,7 @@ void tipc_link_proto_xmit(struct tipc_link *l_ptr, u32 msg_typ, int probe_msg,
1438 msg_set_probe(msg, 0); 1392 msg_set_probe(msg, 0);
1439 msg_set_link_tolerance(msg, l_ptr->tolerance); 1393 msg_set_link_tolerance(msg, l_ptr->tolerance);
1440 msg_set_linkprio(msg, l_ptr->priority); 1394 msg_set_linkprio(msg, l_ptr->priority);
1441 msg_set_max_pkt(msg, l_ptr->max_pkt_target); 1395 msg_set_max_pkt(msg, l_ptr->advertised_mtu);
1442 } 1396 }
1443 1397
1444 r_flag = (l_ptr->owner->working_links > tipc_link_is_up(l_ptr)); 1398 r_flag = (l_ptr->owner->working_links > tipc_link_is_up(l_ptr));
@@ -1469,8 +1423,6 @@ static void tipc_link_proto_rcv(struct tipc_link *l_ptr,
1469 struct sk_buff *buf) 1423 struct sk_buff *buf)
1470{ 1424{
1471 u32 rec_gap = 0; 1425 u32 rec_gap = 0;
1472 u32 max_pkt_info;
1473 u32 max_pkt_ack;
1474 u32 msg_tol; 1426 u32 msg_tol;
1475 struct tipc_msg *msg = buf_msg(buf); 1427 struct tipc_msg *msg = buf_msg(buf);
1476 1428
@@ -1513,15 +1465,8 @@ static void tipc_link_proto_rcv(struct tipc_link *l_ptr,
1513 if (msg_linkprio(msg) > l_ptr->priority) 1465 if (msg_linkprio(msg) > l_ptr->priority)
1514 l_ptr->priority = msg_linkprio(msg); 1466 l_ptr->priority = msg_linkprio(msg);
1515 1467
1516 max_pkt_info = msg_max_pkt(msg); 1468 if (l_ptr->mtu > msg_max_pkt(msg))
1517 if (max_pkt_info) { 1469 l_ptr->mtu = msg_max_pkt(msg);
1518 if (max_pkt_info < l_ptr->max_pkt_target)
1519 l_ptr->max_pkt_target = max_pkt_info;
1520 if (l_ptr->max_pkt > l_ptr->max_pkt_target)
1521 l_ptr->max_pkt = l_ptr->max_pkt_target;
1522 } else {
1523 l_ptr->max_pkt = l_ptr->max_pkt_target;
1524 }
1525 1470
1526 /* Synchronize broadcast link info, if not done previously */ 1471 /* Synchronize broadcast link info, if not done previously */
1527 if (!tipc_node_is_up(l_ptr->owner)) { 1472 if (!tipc_node_is_up(l_ptr->owner)) {
@@ -1566,18 +1511,8 @@ static void tipc_link_proto_rcv(struct tipc_link *l_ptr,
1566 mod(l_ptr->next_in_no)); 1511 mod(l_ptr->next_in_no));
1567 } 1512 }
1568 1513
1569 max_pkt_ack = msg_max_pkt(msg); 1514 if (msg_probe(msg))
1570 if (max_pkt_ack > l_ptr->max_pkt) {
1571 l_ptr->max_pkt = max_pkt_ack;
1572 l_ptr->max_pkt_probes = 0;
1573 }
1574
1575 max_pkt_ack = 0;
1576 if (msg_probe(msg)) {
1577 l_ptr->stats.recv_probes++; 1515 l_ptr->stats.recv_probes++;
1578 if (msg_size(msg) > sizeof(l_ptr->proto_msg))
1579 max_pkt_ack = msg_size(msg);
1580 }
1581 1516
1582 /* Protocol message before retransmits, reduce loss risk */ 1517 /* Protocol message before retransmits, reduce loss risk */
1583 if (l_ptr->owner->bclink.recv_permitted) 1518 if (l_ptr->owner->bclink.recv_permitted)
@@ -1585,8 +1520,8 @@ static void tipc_link_proto_rcv(struct tipc_link *l_ptr,
1585 msg_last_bcast(msg)); 1520 msg_last_bcast(msg));
1586 1521
1587 if (rec_gap || (msg_probe(msg))) { 1522 if (rec_gap || (msg_probe(msg))) {
1588 tipc_link_proto_xmit(l_ptr, STATE_MSG, 0, rec_gap, 0, 1523 tipc_link_proto_xmit(l_ptr, STATE_MSG, 0,
1589 0, max_pkt_ack); 1524 rec_gap, 0, 0);
1590 } 1525 }
1591 if (msg_seq_gap(msg)) { 1526 if (msg_seq_gap(msg)) {
1592 l_ptr->stats.recv_nacks++; 1527 l_ptr->stats.recv_nacks++;
@@ -1816,7 +1751,7 @@ static void link_set_supervision_props(struct tipc_link *l_ptr, u32 tol)
1816 1751
1817void tipc_link_set_queue_limits(struct tipc_link *l, u32 win) 1752void tipc_link_set_queue_limits(struct tipc_link *l, u32 win)
1818{ 1753{
1819 int max_bulk = TIPC_MAX_PUBLICATIONS / (l->max_pkt / ITEM_SIZE); 1754 int max_bulk = TIPC_MAX_PUBLICATIONS / (l->mtu / ITEM_SIZE);
1820 1755
1821 l->window = win; 1756 l->window = win;
1822 l->backlog[TIPC_LOW_IMPORTANCE].limit = win / 2; 1757 l->backlog[TIPC_LOW_IMPORTANCE].limit = win / 2;
@@ -1988,14 +1923,14 @@ int tipc_nl_link_set(struct sk_buff *skb, struct genl_info *info)
1988 1923
1989 tol = nla_get_u32(props[TIPC_NLA_PROP_TOL]); 1924 tol = nla_get_u32(props[TIPC_NLA_PROP_TOL]);
1990 link_set_supervision_props(link, tol); 1925 link_set_supervision_props(link, tol);
1991 tipc_link_proto_xmit(link, STATE_MSG, 0, 0, tol, 0, 0); 1926 tipc_link_proto_xmit(link, STATE_MSG, 0, 0, tol, 0);
1992 } 1927 }
1993 if (props[TIPC_NLA_PROP_PRIO]) { 1928 if (props[TIPC_NLA_PROP_PRIO]) {
1994 u32 prio; 1929 u32 prio;
1995 1930
1996 prio = nla_get_u32(props[TIPC_NLA_PROP_PRIO]); 1931 prio = nla_get_u32(props[TIPC_NLA_PROP_PRIO]);
1997 link->priority = prio; 1932 link->priority = prio;
1998 tipc_link_proto_xmit(link, STATE_MSG, 0, 0, 0, prio, 0); 1933 tipc_link_proto_xmit(link, STATE_MSG, 0, 0, 0, prio);
1999 } 1934 }
2000 if (props[TIPC_NLA_PROP_WIN]) { 1935 if (props[TIPC_NLA_PROP_WIN]) {
2001 u32 win; 1936 u32 win;
@@ -2100,7 +2035,7 @@ static int __tipc_nl_add_link(struct net *net, struct tipc_nl_msg *msg,
2100 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_DEST, 2035 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_DEST,
2101 tipc_cluster_mask(tn->own_addr))) 2036 tipc_cluster_mask(tn->own_addr)))
2102 goto attr_msg_full; 2037 goto attr_msg_full;
2103 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_MTU, link->max_pkt)) 2038 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_MTU, link->mtu))
2104 goto attr_msg_full; 2039 goto attr_msg_full;
2105 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_RX, link->next_in_no)) 2040 if (nla_put_u32(msg->skb, TIPC_NLA_LINK_RX, link->next_in_no))
2106 goto attr_msg_full; 2041 goto attr_msg_full;
diff --git a/net/tipc/link.h b/net/tipc/link.h
index 6e28f03c7905..b5b4e3554d4e 100644
--- a/net/tipc/link.h
+++ b/net/tipc/link.h
@@ -123,9 +123,8 @@ struct tipc_stats {
123 * @backlog_limit: backlog queue congestion thresholds (indexed by importance) 123 * @backlog_limit: backlog queue congestion thresholds (indexed by importance)
124 * @exp_msg_count: # of tunnelled messages expected during link changeover 124 * @exp_msg_count: # of tunnelled messages expected during link changeover
125 * @reset_checkpoint: seq # of last acknowledged message at time of link reset 125 * @reset_checkpoint: seq # of last acknowledged message at time of link reset
126 * @max_pkt: current maximum packet size for this link 126 * @mtu: current maximum packet size for this link
127 * @max_pkt_target: desired maximum packet size for this link 127 * @advertised_mtu: advertised own mtu when link is being established
128 * @max_pkt_probes: # of probes based on current (max_pkt, max_pkt_target)
129 * @transmitq: queue for sent, non-acked messages 128 * @transmitq: queue for sent, non-acked messages
130 * @backlogq: queue for messages waiting to be sent 129 * @backlogq: queue for messages waiting to be sent
131 * @next_out_no: next sequence number to use for outbound messages 130 * @next_out_no: next sequence number to use for outbound messages
@@ -176,9 +175,8 @@ struct tipc_link {
176 struct sk_buff *failover_skb; 175 struct sk_buff *failover_skb;
177 176
178 /* Max packet negotiation */ 177 /* Max packet negotiation */
179 u32 max_pkt; 178 u16 mtu;
180 u32 max_pkt_target; 179 u16 advertised_mtu;
181 u32 max_pkt_probes;
182 180
183 /* Sending */ 181 /* Sending */
184 struct sk_buff_head transmq; 182 struct sk_buff_head transmq;
@@ -233,7 +231,7 @@ int tipc_link_xmit(struct net *net, struct sk_buff_head *list, u32 dest,
233int __tipc_link_xmit(struct net *net, struct tipc_link *link, 231int __tipc_link_xmit(struct net *net, struct tipc_link *link,
234 struct sk_buff_head *list); 232 struct sk_buff_head *list);
235void tipc_link_proto_xmit(struct tipc_link *l_ptr, u32 msg_typ, int prob, 233void tipc_link_proto_xmit(struct tipc_link *l_ptr, u32 msg_typ, int prob,
236 u32 gap, u32 tolerance, u32 priority, u32 acked_mtu); 234 u32 gap, u32 tolerance, u32 priority);
237void tipc_link_push_packets(struct tipc_link *l_ptr); 235void tipc_link_push_packets(struct tipc_link *l_ptr);
238u32 tipc_link_defer_pkt(struct sk_buff_head *list, struct sk_buff *buf); 236u32 tipc_link_defer_pkt(struct sk_buff_head *list, struct sk_buff *buf);
239void tipc_link_set_queue_limits(struct tipc_link *l_ptr, u32 window); 237void tipc_link_set_queue_limits(struct tipc_link *l_ptr, u32 window);
diff --git a/net/tipc/node.c b/net/tipc/node.c
index f3d522c2881a..22c059ad2999 100644
--- a/net/tipc/node.c
+++ b/net/tipc/node.c
@@ -254,8 +254,8 @@ void tipc_node_link_up(struct tipc_node *n_ptr, struct tipc_link *l_ptr)
254 active[0] = active[1] = l_ptr; 254 active[0] = active[1] = l_ptr;
255exit: 255exit:
256 /* Leave room for changeover header when returning 'mtu' to users: */ 256 /* Leave room for changeover header when returning 'mtu' to users: */
257 n_ptr->act_mtus[0] = active[0]->max_pkt - INT_H_SIZE; 257 n_ptr->act_mtus[0] = active[0]->mtu - INT_H_SIZE;
258 n_ptr->act_mtus[1] = active[1]->max_pkt - INT_H_SIZE; 258 n_ptr->act_mtus[1] = active[1]->mtu - INT_H_SIZE;
259} 259}
260 260
261/** 261/**
@@ -319,11 +319,10 @@ void tipc_node_link_down(struct tipc_node *n_ptr, struct tipc_link *l_ptr)
319 319
320 /* Leave room for changeover header when returning 'mtu' to users: */ 320 /* Leave room for changeover header when returning 'mtu' to users: */
321 if (active[0]) { 321 if (active[0]) {
322 n_ptr->act_mtus[0] = active[0]->max_pkt - INT_H_SIZE; 322 n_ptr->act_mtus[0] = active[0]->mtu - INT_H_SIZE;
323 n_ptr->act_mtus[1] = active[1]->max_pkt - INT_H_SIZE; 323 n_ptr->act_mtus[1] = active[1]->mtu - INT_H_SIZE;
324 return; 324 return;
325 } 325 }
326
327 /* Loopback link went down? No fragmentation needed from now on. */ 326 /* Loopback link went down? No fragmentation needed from now on. */
328 if (n_ptr->addr == tn->own_addr) { 327 if (n_ptr->addr == tn->own_addr) {
329 n_ptr->act_mtus[0] = MAX_MSG_SIZE; 328 n_ptr->act_mtus[0] = MAX_MSG_SIZE;