diff options
author | David S. Miller <davem@davemloft.net> | 2018-10-13 00:38:46 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2018-10-13 00:38:46 -0400 |
commit | d864991b220b7c62e81d21209e1fd978fd67352c (patch) | |
tree | b570a1ad6fc1b959c5bcda6ceca0b321319c01e0 /net/tipc | |
parent | a688c53a0277d8ea21d86a5c56884892e3442c5e (diff) | |
parent | bab5c80b211035739997ebd361a679fa85b39465 (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.c | 27 | ||||
-rw-r--r-- | net/tipc/socket.c | 14 |
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 | ||
844 | void tipc_link_reset(struct tipc_link *l) | 846 | void 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 | */ |
1200 | static void tipc_sk_conn_proto_rcv(struct tipc_sock *tsk, struct sk_buff *skb, | 1200 | static 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); |