diff options
Diffstat (limited to 'net/ipv4/tcp_ipv4.c')
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 87b173b563b0..761bc492c5e3 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -692,6 +692,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb) | |||
692 | offsetof(struct inet_timewait_sock, tw_bound_dev_if)); | 692 | offsetof(struct inet_timewait_sock, tw_bound_dev_if)); |
693 | 693 | ||
694 | arg.tos = ip_hdr(skb)->tos; | 694 | arg.tos = ip_hdr(skb)->tos; |
695 | preempt_disable(); | ||
695 | ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk), | 696 | ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk), |
696 | skb, &TCP_SKB_CB(skb)->header.h4.opt, | 697 | skb, &TCP_SKB_CB(skb)->header.h4.opt, |
697 | ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, | 698 | ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, |
@@ -699,6 +700,7 @@ static void tcp_v4_send_reset(const struct sock *sk, struct sk_buff *skb) | |||
699 | 700 | ||
700 | __TCP_INC_STATS(net, TCP_MIB_OUTSEGS); | 701 | __TCP_INC_STATS(net, TCP_MIB_OUTSEGS); |
701 | __TCP_INC_STATS(net, TCP_MIB_OUTRSTS); | 702 | __TCP_INC_STATS(net, TCP_MIB_OUTRSTS); |
703 | preempt_enable(); | ||
702 | 704 | ||
703 | #ifdef CONFIG_TCP_MD5SIG | 705 | #ifdef CONFIG_TCP_MD5SIG |
704 | out: | 706 | out: |
@@ -774,12 +776,14 @@ static void tcp_v4_send_ack(struct net *net, | |||
774 | if (oif) | 776 | if (oif) |
775 | arg.bound_dev_if = oif; | 777 | arg.bound_dev_if = oif; |
776 | arg.tos = tos; | 778 | arg.tos = tos; |
779 | preempt_disable(); | ||
777 | ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk), | 780 | ip_send_unicast_reply(*this_cpu_ptr(net->ipv4.tcp_sk), |
778 | skb, &TCP_SKB_CB(skb)->header.h4.opt, | 781 | skb, &TCP_SKB_CB(skb)->header.h4.opt, |
779 | ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, | 782 | ip_hdr(skb)->saddr, ip_hdr(skb)->daddr, |
780 | &arg, arg.iov[0].iov_len); | 783 | &arg, arg.iov[0].iov_len); |
781 | 784 | ||
782 | __TCP_INC_STATS(net, TCP_MIB_OUTSEGS); | 785 | __TCP_INC_STATS(net, TCP_MIB_OUTSEGS); |
786 | preempt_enable(); | ||
783 | } | 787 | } |
784 | 788 | ||
785 | static void tcp_v4_timewait_ack(struct sock *sk, struct sk_buff *skb) | 789 | static void tcp_v4_timewait_ack(struct sock *sk, struct sk_buff *skb) |
@@ -1151,12 +1155,12 @@ static bool tcp_v4_inbound_md5_hash(const struct sock *sk, | |||
1151 | return false; | 1155 | return false; |
1152 | 1156 | ||
1153 | if (hash_expected && !hash_location) { | 1157 | if (hash_expected && !hash_location) { |
1154 | __NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPMD5NOTFOUND); | 1158 | NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPMD5NOTFOUND); |
1155 | return true; | 1159 | return true; |
1156 | } | 1160 | } |
1157 | 1161 | ||
1158 | if (!hash_expected && hash_location) { | 1162 | if (!hash_expected && hash_location) { |
1159 | __NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPMD5UNEXPECTED); | 1163 | NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPMD5UNEXPECTED); |
1160 | return true; | 1164 | return true; |
1161 | } | 1165 | } |
1162 | 1166 | ||
@@ -1342,7 +1346,7 @@ struct sock *tcp_v4_syn_recv_sock(const struct sock *sk, struct sk_buff *skb, | |||
1342 | return newsk; | 1346 | return newsk; |
1343 | 1347 | ||
1344 | exit_overflow: | 1348 | exit_overflow: |
1345 | __NET_INC_STATS(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS); | 1349 | NET_INC_STATS(sock_net(sk), LINUX_MIB_LISTENOVERFLOWS); |
1346 | exit_nonewsk: | 1350 | exit_nonewsk: |
1347 | dst_release(dst); | 1351 | dst_release(dst); |
1348 | exit: | 1352 | exit: |
@@ -1432,8 +1436,8 @@ discard: | |||
1432 | return 0; | 1436 | return 0; |
1433 | 1437 | ||
1434 | csum_err: | 1438 | csum_err: |
1435 | __TCP_INC_STATS(sock_net(sk), TCP_MIB_CSUMERRORS); | 1439 | TCP_INC_STATS(sock_net(sk), TCP_MIB_CSUMERRORS); |
1436 | __TCP_INC_STATS(sock_net(sk), TCP_MIB_INERRS); | 1440 | TCP_INC_STATS(sock_net(sk), TCP_MIB_INERRS); |
1437 | goto discard; | 1441 | goto discard; |
1438 | } | 1442 | } |
1439 | EXPORT_SYMBOL(tcp_v4_do_rcv); | 1443 | EXPORT_SYMBOL(tcp_v4_do_rcv); |