aboutsummaryrefslogtreecommitdiffstats
path: root/net/tipc
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2018-10-13 00:38:46 -0400
committerDavid S. Miller <davem@davemloft.net>2018-10-13 00:38:46 -0400
commitd864991b220b7c62e81d21209e1fd978fd67352c (patch)
treeb570a1ad6fc1b959c5bcda6ceca0b321319c01e0 /net/tipc
parenta688c53a0277d8ea21d86a5c56884892e3442c5e (diff)
parentbab5c80b211035739997ebd361a679fa85b39465 (diff)
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts were easy to resolve using immediate context mostly, except the cls_u32.c one where I simply too the entire HEAD chunk. Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/tipc')
-rw-r--r--net/tipc/link.c27
-rw-r--r--net/tipc/socket.c14
2 files changed, 32 insertions, 9 deletions
diff --git a/net/tipc/link.c b/net/tipc/link.c
index fb886b525d95..f6552e4f4b43 100644
--- a/net/tipc/link.c
+++ b/net/tipc/link.c
@@ -477,6 +477,8 @@ bool tipc_link_create(struct net *net, char *if_name, int bearer_id,
477 l->in_session = false; 477 l->in_session = false;
478 l->bearer_id = bearer_id; 478 l->bearer_id = bearer_id;
479 l->tolerance = tolerance; 479 l->tolerance = tolerance;
480 if (bc_rcvlink)
481 bc_rcvlink->tolerance = tolerance;
480 l->net_plane = net_plane; 482 l->net_plane = net_plane;
481 l->advertised_mtu = mtu; 483 l->advertised_mtu = mtu;
482 l->mtu = mtu; 484 l->mtu = mtu;
@@ -843,14 +845,21 @@ static void link_prepare_wakeup(struct tipc_link *l)
843 845
844void tipc_link_reset(struct tipc_link *l) 846void tipc_link_reset(struct tipc_link *l)
845{ 847{
848 struct sk_buff_head list;
849
850 __skb_queue_head_init(&list);
851
846 l->in_session = false; 852 l->in_session = false;
847 l->session++; 853 l->session++;
848 l->mtu = l->advertised_mtu; 854 l->mtu = l->advertised_mtu;
855
849 spin_lock_bh(&l->wakeupq.lock); 856 spin_lock_bh(&l->wakeupq.lock);
857 skb_queue_splice_init(&l->wakeupq, &list);
858 spin_unlock_bh(&l->wakeupq.lock);
859
850 spin_lock_bh(&l->inputq->lock); 860 spin_lock_bh(&l->inputq->lock);
851 skb_queue_splice_init(&l->wakeupq, l->inputq); 861 skb_queue_splice_init(&list, l->inputq);
852 spin_unlock_bh(&l->inputq->lock); 862 spin_unlock_bh(&l->inputq->lock);
853 spin_unlock_bh(&l->wakeupq.lock);
854 863
855 __skb_queue_purge(&l->transmq); 864 __skb_queue_purge(&l->transmq);
856 __skb_queue_purge(&l->deferdq); 865 __skb_queue_purge(&l->deferdq);
@@ -1031,7 +1040,7 @@ static int tipc_link_retrans(struct tipc_link *l, struct tipc_link *r,
1031 /* Detect repeated retransmit failures on same packet */ 1040 /* Detect repeated retransmit failures on same packet */
1032 if (r->last_retransm != buf_seqno(skb)) { 1041 if (r->last_retransm != buf_seqno(skb)) {
1033 r->last_retransm = buf_seqno(skb); 1042 r->last_retransm = buf_seqno(skb);
1034 r->stale_limit = jiffies + msecs_to_jiffies(l->tolerance); 1043 r->stale_limit = jiffies + msecs_to_jiffies(r->tolerance);
1035 } else if (++r->stale_cnt > 99 && time_after(jiffies, r->stale_limit)) { 1044 } else if (++r->stale_cnt > 99 && time_after(jiffies, r->stale_limit)) {
1036 link_retransmit_failure(l, skb); 1045 link_retransmit_failure(l, skb);
1037 if (link_is_bc_sndlink(l)) 1046 if (link_is_bc_sndlink(l))
@@ -1576,9 +1585,10 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
1576 strncpy(if_name, data, TIPC_MAX_IF_NAME); 1585 strncpy(if_name, data, TIPC_MAX_IF_NAME);
1577 1586
1578 /* Update own tolerance if peer indicates a non-zero value */ 1587 /* Update own tolerance if peer indicates a non-zero value */
1579 if (in_range(peers_tol, TIPC_MIN_LINK_TOL, TIPC_MAX_LINK_TOL)) 1588 if (in_range(peers_tol, TIPC_MIN_LINK_TOL, TIPC_MAX_LINK_TOL)) {
1580 l->tolerance = peers_tol; 1589 l->tolerance = peers_tol;
1581 1590 l->bc_rcvlink->tolerance = peers_tol;
1591 }
1582 /* Update own priority if peer's priority is higher */ 1592 /* Update own priority if peer's priority is higher */
1583 if (in_range(peers_prio, l->priority + 1, TIPC_MAX_LINK_PRI)) 1593 if (in_range(peers_prio, l->priority + 1, TIPC_MAX_LINK_PRI))
1584 l->priority = peers_prio; 1594 l->priority = peers_prio;
@@ -1604,9 +1614,10 @@ static int tipc_link_proto_rcv(struct tipc_link *l, struct sk_buff *skb,
1604 l->rcv_nxt_state = msg_seqno(hdr) + 1; 1614 l->rcv_nxt_state = msg_seqno(hdr) + 1;
1605 1615
1606 /* Update own tolerance if peer indicates a non-zero value */ 1616 /* Update own tolerance if peer indicates a non-zero value */
1607 if (in_range(peers_tol, TIPC_MIN_LINK_TOL, TIPC_MAX_LINK_TOL)) 1617 if (in_range(peers_tol, TIPC_MIN_LINK_TOL, TIPC_MAX_LINK_TOL)) {
1608 l->tolerance = peers_tol; 1618 l->tolerance = peers_tol;
1609 1619 l->bc_rcvlink->tolerance = peers_tol;
1620 }
1610 /* Update own prio if peer indicates a different value */ 1621 /* Update own prio if peer indicates a different value */
1611 if ((peers_prio != l->priority) && 1622 if ((peers_prio != l->priority) &&
1612 in_range(peers_prio, 1, TIPC_MAX_LINK_PRI)) { 1623 in_range(peers_prio, 1, TIPC_MAX_LINK_PRI)) {
@@ -2223,6 +2234,8 @@ void tipc_link_set_tolerance(struct tipc_link *l, u32 tol,
2223 struct sk_buff_head *xmitq) 2234 struct sk_buff_head *xmitq)
2224{ 2235{
2225 l->tolerance = tol; 2236 l->tolerance = tol;
2237 if (l->bc_rcvlink)
2238 l->bc_rcvlink->tolerance = tol;
2226 if (link_is_up(l)) 2239 if (link_is_up(l))
2227 tipc_link_build_proto_msg(l, STATE_MSG, 0, 0, 0, tol, 0, xmitq); 2240 tipc_link_build_proto_msg(l, STATE_MSG, 0, 0, 0, tol, 0, xmitq);
2228} 2241}
diff --git a/net/tipc/socket.c b/net/tipc/socket.c
index db148c4a916a..de09f514428c 100644
--- a/net/tipc/socket.c
+++ b/net/tipc/socket.c
@@ -1198,6 +1198,7 @@ void tipc_sk_mcast_rcv(struct net *net, struct sk_buff_head *arrvq,
1198 * @skb: pointer to message buffer. 1198 * @skb: pointer to message buffer.
1199 */ 1199 */
1200static void tipc_sk_conn_proto_rcv(struct tipc_sock *tsk, struct sk_buff *skb, 1200static void tipc_sk_conn_proto_rcv(struct tipc_sock *tsk, struct sk_buff *skb,
1201 struct sk_buff_head *inputq,
1201 struct sk_buff_head *xmitq) 1202 struct sk_buff_head *xmitq)
1202{ 1203{
1203 struct tipc_msg *hdr = buf_msg(skb); 1204 struct tipc_msg *hdr = buf_msg(skb);
@@ -1215,7 +1216,16 @@ static void tipc_sk_conn_proto_rcv(struct tipc_sock *tsk, struct sk_buff *skb,
1215 tipc_node_remove_conn(sock_net(sk), tsk_peer_node(tsk), 1216 tipc_node_remove_conn(sock_net(sk), tsk_peer_node(tsk),
1216 tsk_peer_port(tsk)); 1217 tsk_peer_port(tsk));
1217 sk->sk_state_change(sk); 1218 sk->sk_state_change(sk);
1218 goto exit; 1219
1220 /* State change is ignored if socket already awake,
1221 * - convert msg to abort msg and add to inqueue
1222 */
1223 msg_set_user(hdr, TIPC_CRITICAL_IMPORTANCE);
1224 msg_set_type(hdr, TIPC_CONN_MSG);
1225 msg_set_size(hdr, BASIC_H_SIZE);
1226 msg_set_hdr_sz(hdr, BASIC_H_SIZE);
1227 __skb_queue_tail(inputq, skb);
1228 return;
1219 } 1229 }
1220 1230
1221 tsk->probe_unacked = false; 1231 tsk->probe_unacked = false;
@@ -1943,7 +1953,7 @@ static void tipc_sk_proto_rcv(struct sock *sk,
1943 1953
1944 switch (msg_user(hdr)) { 1954 switch (msg_user(hdr)) {
1945 case CONN_MANAGER: 1955 case CONN_MANAGER:
1946 tipc_sk_conn_proto_rcv(tsk, skb, xmitq); 1956 tipc_sk_conn_proto_rcv(tsk, skb, inputq, xmitq);
1947 return; 1957 return;
1948 case SOCK_WAKEUP: 1958 case SOCK_WAKEUP:
1949 tipc_dest_del(&tsk->cong_links, msg_orignode(hdr), 0); 1959 tipc_dest_del(&tsk->cong_links, msg_orignode(hdr), 0);