diff options
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/af_inet.c | 112 | ||||
-rw-r--r-- | net/ipv4/arp.c | 8 | ||||
-rw-r--r-- | net/ipv4/fib_trie.c | 95 | ||||
-rw-r--r-- | net/ipv4/inet_timewait_sock.c | 2 | ||||
-rw-r--r-- | net/ipv4/ip_gre.c | 4 | ||||
-rw-r--r-- | net/ipv4/ip_output.c | 2 | ||||
-rw-r--r-- | net/ipv4/ipip.c | 2 | ||||
-rw-r--r-- | net/ipv4/ipmr.c | 2 | ||||
-rw-r--r-- | net/ipv4/protocol.c | 19 | ||||
-rw-r--r-- | net/ipv4/raw.c | 9 | ||||
-rw-r--r-- | net/ipv4/route.c | 20 | ||||
-rw-r--r-- | net/ipv4/tcp.c | 16 | ||||
-rw-r--r-- | net/ipv4/tcp_input.c | 5 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 66 | ||||
-rw-r--r-- | net/ipv4/tcp_minisocks.c | 25 | ||||
-rw-r--r-- | net/ipv4/tcp_output.c | 5 | ||||
-rw-r--r-- | net/ipv4/tcp_timer.c | 16 | ||||
-rw-r--r-- | net/ipv4/udp.c | 12 |
18 files changed, 192 insertions, 228 deletions
diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c index 197d024b2536..6c30a73f03f5 100644 --- a/net/ipv4/af_inet.c +++ b/net/ipv4/af_inet.c | |||
@@ -124,7 +124,6 @@ static struct list_head inetsw[SOCK_MAX]; | |||
124 | static DEFINE_SPINLOCK(inetsw_lock); | 124 | static DEFINE_SPINLOCK(inetsw_lock); |
125 | 125 | ||
126 | struct ipv4_config ipv4_config; | 126 | struct ipv4_config ipv4_config; |
127 | |||
128 | EXPORT_SYMBOL(ipv4_config); | 127 | EXPORT_SYMBOL(ipv4_config); |
129 | 128 | ||
130 | /* New destruction routine */ | 129 | /* New destruction routine */ |
@@ -139,12 +138,12 @@ void inet_sock_destruct(struct sock *sk) | |||
139 | sk_mem_reclaim(sk); | 138 | sk_mem_reclaim(sk); |
140 | 139 | ||
141 | if (sk->sk_type == SOCK_STREAM && sk->sk_state != TCP_CLOSE) { | 140 | if (sk->sk_type == SOCK_STREAM && sk->sk_state != TCP_CLOSE) { |
142 | printk("Attempt to release TCP socket in state %d %p\n", | 141 | pr_err("Attempt to release TCP socket in state %d %p\n", |
143 | sk->sk_state, sk); | 142 | sk->sk_state, sk); |
144 | return; | 143 | return; |
145 | } | 144 | } |
146 | if (!sock_flag(sk, SOCK_DEAD)) { | 145 | if (!sock_flag(sk, SOCK_DEAD)) { |
147 | printk("Attempt to release alive inet socket %p\n", sk); | 146 | pr_err("Attempt to release alive inet socket %p\n", sk); |
148 | return; | 147 | return; |
149 | } | 148 | } |
150 | 149 | ||
@@ -157,6 +156,7 @@ void inet_sock_destruct(struct sock *sk) | |||
157 | dst_release(sk->sk_dst_cache); | 156 | dst_release(sk->sk_dst_cache); |
158 | sk_refcnt_debug_dec(sk); | 157 | sk_refcnt_debug_dec(sk); |
159 | } | 158 | } |
159 | EXPORT_SYMBOL(inet_sock_destruct); | ||
160 | 160 | ||
161 | /* | 161 | /* |
162 | * The routines beyond this point handle the behaviour of an AF_INET | 162 | * The routines beyond this point handle the behaviour of an AF_INET |
@@ -219,6 +219,7 @@ out: | |||
219 | release_sock(sk); | 219 | release_sock(sk); |
220 | return err; | 220 | return err; |
221 | } | 221 | } |
222 | EXPORT_SYMBOL(inet_listen); | ||
222 | 223 | ||
223 | u32 inet_ehash_secret __read_mostly; | 224 | u32 inet_ehash_secret __read_mostly; |
224 | EXPORT_SYMBOL(inet_ehash_secret); | 225 | EXPORT_SYMBOL(inet_ehash_secret); |
@@ -435,9 +436,11 @@ int inet_release(struct socket *sock) | |||
435 | } | 436 | } |
436 | return 0; | 437 | return 0; |
437 | } | 438 | } |
439 | EXPORT_SYMBOL(inet_release); | ||
438 | 440 | ||
439 | /* It is off by default, see below. */ | 441 | /* It is off by default, see below. */ |
440 | int sysctl_ip_nonlocal_bind __read_mostly; | 442 | int sysctl_ip_nonlocal_bind __read_mostly; |
443 | EXPORT_SYMBOL(sysctl_ip_nonlocal_bind); | ||
441 | 444 | ||
442 | int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) | 445 | int inet_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len) |
443 | { | 446 | { |
@@ -519,6 +522,7 @@ out_release_sock: | |||
519 | out: | 522 | out: |
520 | return err; | 523 | return err; |
521 | } | 524 | } |
525 | EXPORT_SYMBOL(inet_bind); | ||
522 | 526 | ||
523 | int inet_dgram_connect(struct socket *sock, struct sockaddr * uaddr, | 527 | int inet_dgram_connect(struct socket *sock, struct sockaddr * uaddr, |
524 | int addr_len, int flags) | 528 | int addr_len, int flags) |
@@ -532,6 +536,7 @@ int inet_dgram_connect(struct socket *sock, struct sockaddr * uaddr, | |||
532 | return -EAGAIN; | 536 | return -EAGAIN; |
533 | return sk->sk_prot->connect(sk, (struct sockaddr *)uaddr, addr_len); | 537 | return sk->sk_prot->connect(sk, (struct sockaddr *)uaddr, addr_len); |
534 | } | 538 | } |
539 | EXPORT_SYMBOL(inet_dgram_connect); | ||
535 | 540 | ||
536 | static long inet_wait_for_connect(struct sock *sk, long timeo) | 541 | static long inet_wait_for_connect(struct sock *sk, long timeo) |
537 | { | 542 | { |
@@ -641,6 +646,7 @@ sock_error: | |||
641 | sock->state = SS_DISCONNECTING; | 646 | sock->state = SS_DISCONNECTING; |
642 | goto out; | 647 | goto out; |
643 | } | 648 | } |
649 | EXPORT_SYMBOL(inet_stream_connect); | ||
644 | 650 | ||
645 | /* | 651 | /* |
646 | * Accept a pending connection. The TCP layer now gives BSD semantics. | 652 | * Accept a pending connection. The TCP layer now gives BSD semantics. |
@@ -668,6 +674,7 @@ int inet_accept(struct socket *sock, struct socket *newsock, int flags) | |||
668 | do_err: | 674 | do_err: |
669 | return err; | 675 | return err; |
670 | } | 676 | } |
677 | EXPORT_SYMBOL(inet_accept); | ||
671 | 678 | ||
672 | 679 | ||
673 | /* | 680 | /* |
@@ -699,6 +706,7 @@ int inet_getname(struct socket *sock, struct sockaddr *uaddr, | |||
699 | *uaddr_len = sizeof(*sin); | 706 | *uaddr_len = sizeof(*sin); |
700 | return 0; | 707 | return 0; |
701 | } | 708 | } |
709 | EXPORT_SYMBOL(inet_getname); | ||
702 | 710 | ||
703 | int inet_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, | 711 | int inet_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, |
704 | size_t size) | 712 | size_t size) |
@@ -711,9 +719,11 @@ int inet_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg, | |||
711 | 719 | ||
712 | return sk->sk_prot->sendmsg(iocb, sk, msg, size); | 720 | return sk->sk_prot->sendmsg(iocb, sk, msg, size); |
713 | } | 721 | } |
722 | EXPORT_SYMBOL(inet_sendmsg); | ||
714 | 723 | ||
715 | 724 | ||
716 | static ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset, size_t size, int flags) | 725 | static ssize_t inet_sendpage(struct socket *sock, struct page *page, int offset, |
726 | size_t size, int flags) | ||
717 | { | 727 | { |
718 | struct sock *sk = sock->sk; | 728 | struct sock *sk = sock->sk; |
719 | 729 | ||
@@ -780,6 +790,7 @@ int inet_shutdown(struct socket *sock, int how) | |||
780 | release_sock(sk); | 790 | release_sock(sk); |
781 | return err; | 791 | return err; |
782 | } | 792 | } |
793 | EXPORT_SYMBOL(inet_shutdown); | ||
783 | 794 | ||
784 | /* | 795 | /* |
785 | * ioctl() calls you can issue on an INET socket. Most of these are | 796 | * ioctl() calls you can issue on an INET socket. Most of these are |
@@ -798,44 +809,45 @@ int inet_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg) | |||
798 | struct net *net = sock_net(sk); | 809 | struct net *net = sock_net(sk); |
799 | 810 | ||
800 | switch (cmd) { | 811 | switch (cmd) { |
801 | case SIOCGSTAMP: | 812 | case SIOCGSTAMP: |
802 | err = sock_get_timestamp(sk, (struct timeval __user *)arg); | 813 | err = sock_get_timestamp(sk, (struct timeval __user *)arg); |
803 | break; | 814 | break; |
804 | case SIOCGSTAMPNS: | 815 | case SIOCGSTAMPNS: |
805 | err = sock_get_timestampns(sk, (struct timespec __user *)arg); | 816 | err = sock_get_timestampns(sk, (struct timespec __user *)arg); |
806 | break; | 817 | break; |
807 | case SIOCADDRT: | 818 | case SIOCADDRT: |
808 | case SIOCDELRT: | 819 | case SIOCDELRT: |
809 | case SIOCRTMSG: | 820 | case SIOCRTMSG: |
810 | err = ip_rt_ioctl(net, cmd, (void __user *)arg); | 821 | err = ip_rt_ioctl(net, cmd, (void __user *)arg); |
811 | break; | 822 | break; |
812 | case SIOCDARP: | 823 | case SIOCDARP: |
813 | case SIOCGARP: | 824 | case SIOCGARP: |
814 | case SIOCSARP: | 825 | case SIOCSARP: |
815 | err = arp_ioctl(net, cmd, (void __user *)arg); | 826 | err = arp_ioctl(net, cmd, (void __user *)arg); |
816 | break; | 827 | break; |
817 | case SIOCGIFADDR: | 828 | case SIOCGIFADDR: |
818 | case SIOCSIFADDR: | 829 | case SIOCSIFADDR: |
819 | case SIOCGIFBRDADDR: | 830 | case SIOCGIFBRDADDR: |
820 | case SIOCSIFBRDADDR: | 831 | case SIOCSIFBRDADDR: |
821 | case SIOCGIFNETMASK: | 832 | case SIOCGIFNETMASK: |
822 | case SIOCSIFNETMASK: | 833 | case SIOCSIFNETMASK: |
823 | case SIOCGIFDSTADDR: | 834 | case SIOCGIFDSTADDR: |
824 | case SIOCSIFDSTADDR: | 835 | case SIOCSIFDSTADDR: |
825 | case SIOCSIFPFLAGS: | 836 | case SIOCSIFPFLAGS: |
826 | case SIOCGIFPFLAGS: | 837 | case SIOCGIFPFLAGS: |
827 | case SIOCSIFFLAGS: | 838 | case SIOCSIFFLAGS: |
828 | err = devinet_ioctl(net, cmd, (void __user *)arg); | 839 | err = devinet_ioctl(net, cmd, (void __user *)arg); |
829 | break; | 840 | break; |
830 | default: | 841 | default: |
831 | if (sk->sk_prot->ioctl) | 842 | if (sk->sk_prot->ioctl) |
832 | err = sk->sk_prot->ioctl(sk, cmd, arg); | 843 | err = sk->sk_prot->ioctl(sk, cmd, arg); |
833 | else | 844 | else |
834 | err = -ENOIOCTLCMD; | 845 | err = -ENOIOCTLCMD; |
835 | break; | 846 | break; |
836 | } | 847 | } |
837 | return err; | 848 | return err; |
838 | } | 849 | } |
850 | EXPORT_SYMBOL(inet_ioctl); | ||
839 | 851 | ||
840 | const struct proto_ops inet_stream_ops = { | 852 | const struct proto_ops inet_stream_ops = { |
841 | .family = PF_INET, | 853 | .family = PF_INET, |
@@ -862,6 +874,7 @@ const struct proto_ops inet_stream_ops = { | |||
862 | .compat_getsockopt = compat_sock_common_getsockopt, | 874 | .compat_getsockopt = compat_sock_common_getsockopt, |
863 | #endif | 875 | #endif |
864 | }; | 876 | }; |
877 | EXPORT_SYMBOL(inet_stream_ops); | ||
865 | 878 | ||
866 | const struct proto_ops inet_dgram_ops = { | 879 | const struct proto_ops inet_dgram_ops = { |
867 | .family = PF_INET, | 880 | .family = PF_INET, |
@@ -887,6 +900,7 @@ const struct proto_ops inet_dgram_ops = { | |||
887 | .compat_getsockopt = compat_sock_common_getsockopt, | 900 | .compat_getsockopt = compat_sock_common_getsockopt, |
888 | #endif | 901 | #endif |
889 | }; | 902 | }; |
903 | EXPORT_SYMBOL(inet_dgram_ops); | ||
890 | 904 | ||
891 | /* | 905 | /* |
892 | * For SOCK_RAW sockets; should be the same as inet_dgram_ops but without | 906 | * For SOCK_RAW sockets; should be the same as inet_dgram_ops but without |
@@ -1016,6 +1030,7 @@ out_illegal: | |||
1016 | p->type); | 1030 | p->type); |
1017 | goto out; | 1031 | goto out; |
1018 | } | 1032 | } |
1033 | EXPORT_SYMBOL(inet_register_protosw); | ||
1019 | 1034 | ||
1020 | void inet_unregister_protosw(struct inet_protosw *p) | 1035 | void inet_unregister_protosw(struct inet_protosw *p) |
1021 | { | 1036 | { |
@@ -1031,6 +1046,7 @@ void inet_unregister_protosw(struct inet_protosw *p) | |||
1031 | synchronize_net(); | 1046 | synchronize_net(); |
1032 | } | 1047 | } |
1033 | } | 1048 | } |
1049 | EXPORT_SYMBOL(inet_unregister_protosw); | ||
1034 | 1050 | ||
1035 | /* | 1051 | /* |
1036 | * Shall we try to damage output packets if routing dev changes? | 1052 | * Shall we try to damage output packets if routing dev changes? |
@@ -1141,7 +1157,6 @@ int inet_sk_rebuild_header(struct sock *sk) | |||
1141 | 1157 | ||
1142 | return err; | 1158 | return err; |
1143 | } | 1159 | } |
1144 | |||
1145 | EXPORT_SYMBOL(inet_sk_rebuild_header); | 1160 | EXPORT_SYMBOL(inet_sk_rebuild_header); |
1146 | 1161 | ||
1147 | static int inet_gso_send_check(struct sk_buff *skb) | 1162 | static int inet_gso_send_check(struct sk_buff *skb) |
@@ -1369,7 +1384,6 @@ int inet_ctl_sock_create(struct sock **sk, unsigned short family, | |||
1369 | } | 1384 | } |
1370 | return rc; | 1385 | return rc; |
1371 | } | 1386 | } |
1372 | |||
1373 | EXPORT_SYMBOL_GPL(inet_ctl_sock_create); | 1387 | EXPORT_SYMBOL_GPL(inet_ctl_sock_create); |
1374 | 1388 | ||
1375 | unsigned long snmp_fold_field(void *mib[], int offt) | 1389 | unsigned long snmp_fold_field(void *mib[], int offt) |
@@ -1676,19 +1690,3 @@ static int __init ipv4_proc_init(void) | |||
1676 | 1690 | ||
1677 | MODULE_ALIAS_NETPROTO(PF_INET); | 1691 | MODULE_ALIAS_NETPROTO(PF_INET); |
1678 | 1692 | ||
1679 | EXPORT_SYMBOL(inet_accept); | ||
1680 | EXPORT_SYMBOL(inet_bind); | ||
1681 | EXPORT_SYMBOL(inet_dgram_connect); | ||
1682 | EXPORT_SYMBOL(inet_dgram_ops); | ||
1683 | EXPORT_SYMBOL(inet_getname); | ||
1684 | EXPORT_SYMBOL(inet_ioctl); | ||
1685 | EXPORT_SYMBOL(inet_listen); | ||
1686 | EXPORT_SYMBOL(inet_register_protosw); | ||
1687 | EXPORT_SYMBOL(inet_release); | ||
1688 | EXPORT_SYMBOL(inet_sendmsg); | ||
1689 | EXPORT_SYMBOL(inet_shutdown); | ||
1690 | EXPORT_SYMBOL(inet_sock_destruct); | ||
1691 | EXPORT_SYMBOL(inet_stream_connect); | ||
1692 | EXPORT_SYMBOL(inet_stream_ops); | ||
1693 | EXPORT_SYMBOL(inet_unregister_protosw); | ||
1694 | EXPORT_SYMBOL(sysctl_ip_nonlocal_bind); | ||
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index 090e9991ac2a..4e80f336c0cf 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
@@ -130,7 +130,7 @@ static void arp_solicit(struct neighbour *neigh, struct sk_buff *skb); | |||
130 | static void arp_error_report(struct neighbour *neigh, struct sk_buff *skb); | 130 | static void arp_error_report(struct neighbour *neigh, struct sk_buff *skb); |
131 | static void parp_redo(struct sk_buff *skb); | 131 | static void parp_redo(struct sk_buff *skb); |
132 | 132 | ||
133 | static struct neigh_ops arp_generic_ops = { | 133 | static const struct neigh_ops arp_generic_ops = { |
134 | .family = AF_INET, | 134 | .family = AF_INET, |
135 | .solicit = arp_solicit, | 135 | .solicit = arp_solicit, |
136 | .error_report = arp_error_report, | 136 | .error_report = arp_error_report, |
@@ -140,7 +140,7 @@ static struct neigh_ops arp_generic_ops = { | |||
140 | .queue_xmit = dev_queue_xmit, | 140 | .queue_xmit = dev_queue_xmit, |
141 | }; | 141 | }; |
142 | 142 | ||
143 | static struct neigh_ops arp_hh_ops = { | 143 | static const struct neigh_ops arp_hh_ops = { |
144 | .family = AF_INET, | 144 | .family = AF_INET, |
145 | .solicit = arp_solicit, | 145 | .solicit = arp_solicit, |
146 | .error_report = arp_error_report, | 146 | .error_report = arp_error_report, |
@@ -150,7 +150,7 @@ static struct neigh_ops arp_hh_ops = { | |||
150 | .queue_xmit = dev_queue_xmit, | 150 | .queue_xmit = dev_queue_xmit, |
151 | }; | 151 | }; |
152 | 152 | ||
153 | static struct neigh_ops arp_direct_ops = { | 153 | static const struct neigh_ops arp_direct_ops = { |
154 | .family = AF_INET, | 154 | .family = AF_INET, |
155 | .output = dev_queue_xmit, | 155 | .output = dev_queue_xmit, |
156 | .connected_output = dev_queue_xmit, | 156 | .connected_output = dev_queue_xmit, |
@@ -158,7 +158,7 @@ static struct neigh_ops arp_direct_ops = { | |||
158 | .queue_xmit = dev_queue_xmit, | 158 | .queue_xmit = dev_queue_xmit, |
159 | }; | 159 | }; |
160 | 160 | ||
161 | struct neigh_ops arp_broken_ops = { | 161 | const struct neigh_ops arp_broken_ops = { |
162 | .family = AF_INET, | 162 | .family = AF_INET, |
163 | .solicit = arp_solicit, | 163 | .solicit = arp_solicit, |
164 | .error_report = arp_error_report, | 164 | .error_report = arp_error_report, |
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c index fe3c846b99a6..291bdf50a21f 100644 --- a/net/ipv4/fib_trie.c +++ b/net/ipv4/fib_trie.c | |||
@@ -48,7 +48,7 @@ | |||
48 | * Patrick McHardy <kaber@trash.net> | 48 | * Patrick McHardy <kaber@trash.net> |
49 | */ | 49 | */ |
50 | 50 | ||
51 | #define VERSION "0.408" | 51 | #define VERSION "0.409" |
52 | 52 | ||
53 | #include <asm/uaccess.h> | 53 | #include <asm/uaccess.h> |
54 | #include <asm/system.h> | 54 | #include <asm/system.h> |
@@ -325,10 +325,7 @@ static inline void check_tnode(const struct tnode *tn) | |||
325 | static const int halve_threshold = 25; | 325 | static const int halve_threshold = 25; |
326 | static const int inflate_threshold = 50; | 326 | static const int inflate_threshold = 50; |
327 | static const int halve_threshold_root = 15; | 327 | static const int halve_threshold_root = 15; |
328 | static const int inflate_threshold_root = 25; | 328 | static const int inflate_threshold_root = 30; |
329 | |||
330 | static int inflate_threshold_root_fix; | ||
331 | #define INFLATE_FIX_MAX 10 /* a comment in resize() */ | ||
332 | 329 | ||
333 | static void __alias_free_mem(struct rcu_head *head) | 330 | static void __alias_free_mem(struct rcu_head *head) |
334 | { | 331 | { |
@@ -516,14 +513,14 @@ static void tnode_put_child_reorg(struct tnode *tn, int i, struct node *n, | |||
516 | rcu_assign_pointer(tn->child[i], n); | 513 | rcu_assign_pointer(tn->child[i], n); |
517 | } | 514 | } |
518 | 515 | ||
516 | #define MAX_WORK 10 | ||
519 | static struct node *resize(struct trie *t, struct tnode *tn) | 517 | static struct node *resize(struct trie *t, struct tnode *tn) |
520 | { | 518 | { |
521 | int i; | 519 | int i; |
522 | int err = 0; | ||
523 | struct tnode *old_tn; | 520 | struct tnode *old_tn; |
524 | int inflate_threshold_use; | 521 | int inflate_threshold_use; |
525 | int halve_threshold_use; | 522 | int halve_threshold_use; |
526 | int max_resize; | 523 | int max_work; |
527 | 524 | ||
528 | if (!tn) | 525 | if (!tn) |
529 | return NULL; | 526 | return NULL; |
@@ -538,18 +535,7 @@ static struct node *resize(struct trie *t, struct tnode *tn) | |||
538 | } | 535 | } |
539 | /* One child */ | 536 | /* One child */ |
540 | if (tn->empty_children == tnode_child_length(tn) - 1) | 537 | if (tn->empty_children == tnode_child_length(tn) - 1) |
541 | for (i = 0; i < tnode_child_length(tn); i++) { | 538 | goto one_child; |
542 | struct node *n; | ||
543 | |||
544 | n = tn->child[i]; | ||
545 | if (!n) | ||
546 | continue; | ||
547 | |||
548 | /* compress one level */ | ||
549 | node_set_parent(n, NULL); | ||
550 | tnode_free_safe(tn); | ||
551 | return n; | ||
552 | } | ||
553 | /* | 539 | /* |
554 | * Double as long as the resulting node has a number of | 540 | * Double as long as the resulting node has a number of |
555 | * nonempty nodes that are above the threshold. | 541 | * nonempty nodes that are above the threshold. |
@@ -618,15 +604,17 @@ static struct node *resize(struct trie *t, struct tnode *tn) | |||
618 | 604 | ||
619 | /* Keep root node larger */ | 605 | /* Keep root node larger */ |
620 | 606 | ||
621 | if (!tn->parent) | 607 | if (!node_parent((struct node*) tn)) { |
622 | inflate_threshold_use = inflate_threshold_root + | 608 | inflate_threshold_use = inflate_threshold_root; |
623 | inflate_threshold_root_fix; | 609 | halve_threshold_use = halve_threshold_root; |
624 | else | 610 | } |
611 | else { | ||
625 | inflate_threshold_use = inflate_threshold; | 612 | inflate_threshold_use = inflate_threshold; |
613 | halve_threshold_use = halve_threshold; | ||
614 | } | ||
626 | 615 | ||
627 | err = 0; | 616 | max_work = MAX_WORK; |
628 | max_resize = 10; | 617 | while ((tn->full_children > 0 && max_work-- && |
629 | while ((tn->full_children > 0 && max_resize-- && | ||
630 | 50 * (tn->full_children + tnode_child_length(tn) | 618 | 50 * (tn->full_children + tnode_child_length(tn) |
631 | - tn->empty_children) | 619 | - tn->empty_children) |
632 | >= inflate_threshold_use * tnode_child_length(tn))) { | 620 | >= inflate_threshold_use * tnode_child_length(tn))) { |
@@ -643,47 +631,19 @@ static struct node *resize(struct trie *t, struct tnode *tn) | |||
643 | } | 631 | } |
644 | } | 632 | } |
645 | 633 | ||
646 | if (max_resize < 0) { | ||
647 | if (!tn->parent) { | ||
648 | /* | ||
649 | * It was observed that during large updates even | ||
650 | * inflate_threshold_root = 35 might be needed to avoid | ||
651 | * this warning; but it should be temporary, so let's | ||
652 | * try to handle this automatically. | ||
653 | */ | ||
654 | if (inflate_threshold_root_fix < INFLATE_FIX_MAX) | ||
655 | inflate_threshold_root_fix++; | ||
656 | else | ||
657 | pr_warning("Fix inflate_threshold_root." | ||
658 | " Now=%d size=%d bits fix=%d\n", | ||
659 | inflate_threshold_root, tn->bits, | ||
660 | inflate_threshold_root_fix); | ||
661 | } else { | ||
662 | pr_warning("Fix inflate_threshold." | ||
663 | " Now=%d size=%d bits\n", | ||
664 | inflate_threshold, tn->bits); | ||
665 | } | ||
666 | } else if (max_resize > 3 && !tn->parent && inflate_threshold_root_fix) | ||
667 | inflate_threshold_root_fix--; | ||
668 | |||
669 | check_tnode(tn); | 634 | check_tnode(tn); |
670 | 635 | ||
636 | /* Return if at least one inflate is run */ | ||
637 | if( max_work != MAX_WORK) | ||
638 | return (struct node *) tn; | ||
639 | |||
671 | /* | 640 | /* |
672 | * Halve as long as the number of empty children in this | 641 | * Halve as long as the number of empty children in this |
673 | * node is above threshold. | 642 | * node is above threshold. |
674 | */ | 643 | */ |
675 | 644 | ||
676 | 645 | max_work = MAX_WORK; | |
677 | /* Keep root node larger */ | 646 | while (tn->bits > 1 && max_work-- && |
678 | |||
679 | if (!tn->parent) | ||
680 | halve_threshold_use = halve_threshold_root; | ||
681 | else | ||
682 | halve_threshold_use = halve_threshold; | ||
683 | |||
684 | err = 0; | ||
685 | max_resize = 10; | ||
686 | while (tn->bits > 1 && max_resize-- && | ||
687 | 100 * (tnode_child_length(tn) - tn->empty_children) < | 647 | 100 * (tnode_child_length(tn) - tn->empty_children) < |
688 | halve_threshold_use * tnode_child_length(tn)) { | 648 | halve_threshold_use * tnode_child_length(tn)) { |
689 | 649 | ||
@@ -698,19 +658,10 @@ static struct node *resize(struct trie *t, struct tnode *tn) | |||
698 | } | 658 | } |
699 | } | 659 | } |
700 | 660 | ||
701 | if (max_resize < 0) { | ||
702 | if (!tn->parent) | ||
703 | pr_warning("Fix halve_threshold_root." | ||
704 | " Now=%d size=%d bits\n", | ||
705 | halve_threshold_root, tn->bits); | ||
706 | else | ||
707 | pr_warning("Fix halve_threshold." | ||
708 | " Now=%d size=%d bits\n", | ||
709 | halve_threshold, tn->bits); | ||
710 | } | ||
711 | 661 | ||
712 | /* Only one child remains */ | 662 | /* Only one child remains */ |
713 | if (tn->empty_children == tnode_child_length(tn) - 1) | 663 | if (tn->empty_children == tnode_child_length(tn) - 1) { |
664 | one_child: | ||
714 | for (i = 0; i < tnode_child_length(tn); i++) { | 665 | for (i = 0; i < tnode_child_length(tn); i++) { |
715 | struct node *n; | 666 | struct node *n; |
716 | 667 | ||
@@ -724,7 +675,7 @@ static struct node *resize(struct trie *t, struct tnode *tn) | |||
724 | tnode_free_safe(tn); | 675 | tnode_free_safe(tn); |
725 | return n; | 676 | return n; |
726 | } | 677 | } |
727 | 678 | } | |
728 | return (struct node *) tn; | 679 | return (struct node *) tn; |
729 | } | 680 | } |
730 | 681 | ||
diff --git a/net/ipv4/inet_timewait_sock.c b/net/ipv4/inet_timewait_sock.c index 61283f928825..13f0781f35cd 100644 --- a/net/ipv4/inet_timewait_sock.c +++ b/net/ipv4/inet_timewait_sock.c | |||
@@ -218,8 +218,8 @@ void inet_twdr_hangman(unsigned long data) | |||
218 | /* We purged the entire slot, anything left? */ | 218 | /* We purged the entire slot, anything left? */ |
219 | if (twdr->tw_count) | 219 | if (twdr->tw_count) |
220 | need_timer = 1; | 220 | need_timer = 1; |
221 | twdr->slot = ((twdr->slot + 1) & (INET_TWDR_TWKILL_SLOTS - 1)); | ||
221 | } | 222 | } |
222 | twdr->slot = ((twdr->slot + 1) & (INET_TWDR_TWKILL_SLOTS - 1)); | ||
223 | if (need_timer) | 223 | if (need_timer) |
224 | mod_timer(&twdr->tw_timer, jiffies + twdr->period); | 224 | mod_timer(&twdr->tw_timer, jiffies + twdr->period); |
225 | out: | 225 | out: |
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c index b902ef55be7f..533afaadefd4 100644 --- a/net/ipv4/ip_gre.c +++ b/net/ipv4/ip_gre.c | |||
@@ -662,7 +662,7 @@ drop_nolock: | |||
662 | return(0); | 662 | return(0); |
663 | } | 663 | } |
664 | 664 | ||
665 | static int ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | 665 | static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) |
666 | { | 666 | { |
667 | struct ip_tunnel *tunnel = netdev_priv(dev); | 667 | struct ip_tunnel *tunnel = netdev_priv(dev); |
668 | struct net_device_stats *stats = &tunnel->dev->stats; | 668 | struct net_device_stats *stats = &tunnel->dev->stats; |
@@ -951,7 +951,7 @@ static int ipgre_tunnel_bind_dev(struct net_device *dev) | |||
951 | addend += 4; | 951 | addend += 4; |
952 | } | 952 | } |
953 | dev->needed_headroom = addend + hlen; | 953 | dev->needed_headroom = addend + hlen; |
954 | mtu -= dev->hard_header_len - addend; | 954 | mtu -= dev->hard_header_len + addend; |
955 | 955 | ||
956 | if (mtu < 68) | 956 | if (mtu < 68) |
957 | mtu = 68; | 957 | mtu = 68; |
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c index 7d0821054729..afae0cbabbf9 100644 --- a/net/ipv4/ip_output.c +++ b/net/ipv4/ip_output.c | |||
@@ -1302,7 +1302,7 @@ int ip_push_pending_frames(struct sock *sk) | |||
1302 | err = ip_local_out(skb); | 1302 | err = ip_local_out(skb); |
1303 | if (err) { | 1303 | if (err) { |
1304 | if (err > 0) | 1304 | if (err > 0) |
1305 | err = inet->recverr ? net_xmit_errno(err) : 0; | 1305 | err = net_xmit_errno(err); |
1306 | if (err) | 1306 | if (err) |
1307 | goto error; | 1307 | goto error; |
1308 | } | 1308 | } |
diff --git a/net/ipv4/ipip.c b/net/ipv4/ipip.c index 98075b6d619c..62548cb0923c 100644 --- a/net/ipv4/ipip.c +++ b/net/ipv4/ipip.c | |||
@@ -387,7 +387,7 @@ static int ipip_rcv(struct sk_buff *skb) | |||
387 | * and that skb is filled properly by that function. | 387 | * and that skb is filled properly by that function. |
388 | */ | 388 | */ |
389 | 389 | ||
390 | static int ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) | 390 | static netdev_tx_t ipip_tunnel_xmit(struct sk_buff *skb, struct net_device *dev) |
391 | { | 391 | { |
392 | struct ip_tunnel *tunnel = netdev_priv(dev); | 392 | struct ip_tunnel *tunnel = netdev_priv(dev); |
393 | struct net_device_stats *stats = &tunnel->dev->stats; | 393 | struct net_device_stats *stats = &tunnel->dev->stats; |
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 06c33fb6b321..65d421cf5bc7 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
@@ -201,7 +201,7 @@ failure: | |||
201 | 201 | ||
202 | #ifdef CONFIG_IP_PIMSM | 202 | #ifdef CONFIG_IP_PIMSM |
203 | 203 | ||
204 | static int reg_vif_xmit(struct sk_buff *skb, struct net_device *dev) | 204 | static netdev_tx_t reg_vif_xmit(struct sk_buff *skb, struct net_device *dev) |
205 | { | 205 | { |
206 | struct net *net = dev_net(dev); | 206 | struct net *net = dev_net(dev); |
207 | 207 | ||
diff --git a/net/ipv4/protocol.c b/net/ipv4/protocol.c index ea50da0649fd..a2e5fc0a15e1 100644 --- a/net/ipv4/protocol.c +++ b/net/ipv4/protocol.c | |||
@@ -22,26 +22,11 @@ | |||
22 | * as published by the Free Software Foundation; either version | 22 | * as published by the Free Software Foundation; either version |
23 | * 2 of the License, or (at your option) any later version. | 23 | * 2 of the License, or (at your option) any later version. |
24 | */ | 24 | */ |
25 | 25 | #include <linux/cache.h> | |
26 | #include <asm/uaccess.h> | ||
27 | #include <asm/system.h> | ||
28 | #include <linux/module.h> | 26 | #include <linux/module.h> |
29 | #include <linux/types.h> | ||
30 | #include <linux/kernel.h> | ||
31 | #include <linux/string.h> | ||
32 | #include <linux/socket.h> | ||
33 | #include <linux/in.h> | ||
34 | #include <linux/inet.h> | ||
35 | #include <linux/netdevice.h> | 27 | #include <linux/netdevice.h> |
36 | #include <linux/timer.h> | 28 | #include <linux/spinlock.h> |
37 | #include <net/ip.h> | ||
38 | #include <net/protocol.h> | 29 | #include <net/protocol.h> |
39 | #include <linux/skbuff.h> | ||
40 | #include <net/sock.h> | ||
41 | #include <net/icmp.h> | ||
42 | #include <net/udp.h> | ||
43 | #include <net/ipip.h> | ||
44 | #include <linux/igmp.h> | ||
45 | 30 | ||
46 | struct net_protocol *inet_protos[MAX_INET_PROTOS] ____cacheline_aligned_in_smp; | 31 | struct net_protocol *inet_protos[MAX_INET_PROTOS] ____cacheline_aligned_in_smp; |
47 | static DEFINE_SPINLOCK(inet_proto_lock); | 32 | static DEFINE_SPINLOCK(inet_proto_lock); |
diff --git a/net/ipv4/raw.c b/net/ipv4/raw.c index 2979f14bb188..ebb1e5848bc6 100644 --- a/net/ipv4/raw.c +++ b/net/ipv4/raw.c | |||
@@ -375,7 +375,7 @@ static int raw_send_hdrinc(struct sock *sk, void *from, size_t length, | |||
375 | err = NF_HOOK(PF_INET, NF_INET_LOCAL_OUT, skb, NULL, rt->u.dst.dev, | 375 | err = NF_HOOK(PF_INET, NF_INET_LOCAL_OUT, skb, NULL, rt->u.dst.dev, |
376 | dst_output); | 376 | dst_output); |
377 | if (err > 0) | 377 | if (err > 0) |
378 | err = inet->recverr ? net_xmit_errno(err) : 0; | 378 | err = net_xmit_errno(err); |
379 | if (err) | 379 | if (err) |
380 | goto error; | 380 | goto error; |
381 | out: | 381 | out: |
@@ -386,6 +386,8 @@ error_fault: | |||
386 | kfree_skb(skb); | 386 | kfree_skb(skb); |
387 | error: | 387 | error: |
388 | IP_INC_STATS(net, IPSTATS_MIB_OUTDISCARDS); | 388 | IP_INC_STATS(net, IPSTATS_MIB_OUTDISCARDS); |
389 | if (err == -ENOBUFS && !inet->recverr) | ||
390 | err = 0; | ||
389 | return err; | 391 | return err; |
390 | } | 392 | } |
391 | 393 | ||
@@ -576,8 +578,11 @@ back_from_confirm: | |||
576 | &ipc, &rt, msg->msg_flags); | 578 | &ipc, &rt, msg->msg_flags); |
577 | if (err) | 579 | if (err) |
578 | ip_flush_pending_frames(sk); | 580 | ip_flush_pending_frames(sk); |
579 | else if (!(msg->msg_flags & MSG_MORE)) | 581 | else if (!(msg->msg_flags & MSG_MORE)) { |
580 | err = ip_push_pending_frames(sk); | 582 | err = ip_push_pending_frames(sk); |
583 | if (err == -ENOBUFS && !inet->recverr) | ||
584 | err = 0; | ||
585 | } | ||
581 | release_sock(sk); | 586 | release_sock(sk); |
582 | } | 587 | } |
583 | done: | 588 | done: |
diff --git a/net/ipv4/route.c b/net/ipv4/route.c index fafbe163e2b5..91867d3e6328 100644 --- a/net/ipv4/route.c +++ b/net/ipv4/route.c | |||
@@ -1514,13 +1514,17 @@ static struct dst_entry *ipv4_negative_advice(struct dst_entry *dst) | |||
1514 | void ip_rt_send_redirect(struct sk_buff *skb) | 1514 | void ip_rt_send_redirect(struct sk_buff *skb) |
1515 | { | 1515 | { |
1516 | struct rtable *rt = skb_rtable(skb); | 1516 | struct rtable *rt = skb_rtable(skb); |
1517 | struct in_device *in_dev = in_dev_get(rt->u.dst.dev); | 1517 | struct in_device *in_dev; |
1518 | int log_martians; | ||
1518 | 1519 | ||
1519 | if (!in_dev) | 1520 | rcu_read_lock(); |
1521 | in_dev = __in_dev_get_rcu(rt->u.dst.dev); | ||
1522 | if (!in_dev || !IN_DEV_TX_REDIRECTS(in_dev)) { | ||
1523 | rcu_read_unlock(); | ||
1520 | return; | 1524 | return; |
1521 | 1525 | } | |
1522 | if (!IN_DEV_TX_REDIRECTS(in_dev)) | 1526 | log_martians = IN_DEV_LOG_MARTIANS(in_dev); |
1523 | goto out; | 1527 | rcu_read_unlock(); |
1524 | 1528 | ||
1525 | /* No redirected packets during ip_rt_redirect_silence; | 1529 | /* No redirected packets during ip_rt_redirect_silence; |
1526 | * reset the algorithm. | 1530 | * reset the algorithm. |
@@ -1533,7 +1537,7 @@ void ip_rt_send_redirect(struct sk_buff *skb) | |||
1533 | */ | 1537 | */ |
1534 | if (rt->u.dst.rate_tokens >= ip_rt_redirect_number) { | 1538 | if (rt->u.dst.rate_tokens >= ip_rt_redirect_number) { |
1535 | rt->u.dst.rate_last = jiffies; | 1539 | rt->u.dst.rate_last = jiffies; |
1536 | goto out; | 1540 | return; |
1537 | } | 1541 | } |
1538 | 1542 | ||
1539 | /* Check for load limit; set rate_last to the latest sent | 1543 | /* Check for load limit; set rate_last to the latest sent |
@@ -1547,7 +1551,7 @@ void ip_rt_send_redirect(struct sk_buff *skb) | |||
1547 | rt->u.dst.rate_last = jiffies; | 1551 | rt->u.dst.rate_last = jiffies; |
1548 | ++rt->u.dst.rate_tokens; | 1552 | ++rt->u.dst.rate_tokens; |
1549 | #ifdef CONFIG_IP_ROUTE_VERBOSE | 1553 | #ifdef CONFIG_IP_ROUTE_VERBOSE |
1550 | if (IN_DEV_LOG_MARTIANS(in_dev) && | 1554 | if (log_martians && |
1551 | rt->u.dst.rate_tokens == ip_rt_redirect_number && | 1555 | rt->u.dst.rate_tokens == ip_rt_redirect_number && |
1552 | net_ratelimit()) | 1556 | net_ratelimit()) |
1553 | printk(KERN_WARNING "host %pI4/if%d ignores redirects for %pI4 to %pI4.\n", | 1557 | printk(KERN_WARNING "host %pI4/if%d ignores redirects for %pI4 to %pI4.\n", |
@@ -1555,8 +1559,6 @@ void ip_rt_send_redirect(struct sk_buff *skb) | |||
1555 | &rt->rt_dst, &rt->rt_gateway); | 1559 | &rt->rt_dst, &rt->rt_gateway); |
1556 | #endif | 1560 | #endif |
1557 | } | 1561 | } |
1558 | out: | ||
1559 | in_dev_put(in_dev); | ||
1560 | } | 1562 | } |
1561 | 1563 | ||
1562 | static int ip_error(struct sk_buff *skb) | 1564 | static int ip_error(struct sk_buff *skb) |
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index 91145244ea63..edeea060db44 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -1839,7 +1839,7 @@ void tcp_close(struct sock *sk, long timeout) | |||
1839 | /* Unread data was tossed, zap the connection. */ | 1839 | /* Unread data was tossed, zap the connection. */ |
1840 | NET_INC_STATS_USER(sock_net(sk), LINUX_MIB_TCPABORTONCLOSE); | 1840 | NET_INC_STATS_USER(sock_net(sk), LINUX_MIB_TCPABORTONCLOSE); |
1841 | tcp_set_state(sk, TCP_CLOSE); | 1841 | tcp_set_state(sk, TCP_CLOSE); |
1842 | tcp_send_active_reset(sk, GFP_KERNEL); | 1842 | tcp_send_active_reset(sk, sk->sk_allocation); |
1843 | } else if (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime) { | 1843 | } else if (sock_flag(sk, SOCK_LINGER) && !sk->sk_lingertime) { |
1844 | /* Check zero linger _after_ checking for unread data. */ | 1844 | /* Check zero linger _after_ checking for unread data. */ |
1845 | sk->sk_prot->disconnect(sk, 0); | 1845 | sk->sk_prot->disconnect(sk, 0); |
@@ -2336,13 +2336,13 @@ static int do_tcp_getsockopt(struct sock *sk, int level, | |||
2336 | val = !!(tp->nonagle&TCP_NAGLE_CORK); | 2336 | val = !!(tp->nonagle&TCP_NAGLE_CORK); |
2337 | break; | 2337 | break; |
2338 | case TCP_KEEPIDLE: | 2338 | case TCP_KEEPIDLE: |
2339 | val = (tp->keepalive_time ? : sysctl_tcp_keepalive_time) / HZ; | 2339 | val = keepalive_time_when(tp) / HZ; |
2340 | break; | 2340 | break; |
2341 | case TCP_KEEPINTVL: | 2341 | case TCP_KEEPINTVL: |
2342 | val = (tp->keepalive_intvl ? : sysctl_tcp_keepalive_intvl) / HZ; | 2342 | val = keepalive_intvl_when(tp) / HZ; |
2343 | break; | 2343 | break; |
2344 | case TCP_KEEPCNT: | 2344 | case TCP_KEEPCNT: |
2345 | val = tp->keepalive_probes ? : sysctl_tcp_keepalive_probes; | 2345 | val = keepalive_probes(tp); |
2346 | break; | 2346 | break; |
2347 | case TCP_SYNCNT: | 2347 | case TCP_SYNCNT: |
2348 | val = icsk->icsk_syn_retries ? : sysctl_tcp_syn_retries; | 2348 | val = icsk->icsk_syn_retries ? : sysctl_tcp_syn_retries; |
@@ -2658,7 +2658,7 @@ void tcp_free_md5sig_pool(void) | |||
2658 | 2658 | ||
2659 | EXPORT_SYMBOL(tcp_free_md5sig_pool); | 2659 | EXPORT_SYMBOL(tcp_free_md5sig_pool); |
2660 | 2660 | ||
2661 | static struct tcp_md5sig_pool **__tcp_alloc_md5sig_pool(void) | 2661 | static struct tcp_md5sig_pool **__tcp_alloc_md5sig_pool(struct sock *sk) |
2662 | { | 2662 | { |
2663 | int cpu; | 2663 | int cpu; |
2664 | struct tcp_md5sig_pool **pool; | 2664 | struct tcp_md5sig_pool **pool; |
@@ -2671,7 +2671,7 @@ static struct tcp_md5sig_pool **__tcp_alloc_md5sig_pool(void) | |||
2671 | struct tcp_md5sig_pool *p; | 2671 | struct tcp_md5sig_pool *p; |
2672 | struct crypto_hash *hash; | 2672 | struct crypto_hash *hash; |
2673 | 2673 | ||
2674 | p = kzalloc(sizeof(*p), GFP_KERNEL); | 2674 | p = kzalloc(sizeof(*p), sk->sk_allocation); |
2675 | if (!p) | 2675 | if (!p) |
2676 | goto out_free; | 2676 | goto out_free; |
2677 | *per_cpu_ptr(pool, cpu) = p; | 2677 | *per_cpu_ptr(pool, cpu) = p; |
@@ -2688,7 +2688,7 @@ out_free: | |||
2688 | return NULL; | 2688 | return NULL; |
2689 | } | 2689 | } |
2690 | 2690 | ||
2691 | struct tcp_md5sig_pool **tcp_alloc_md5sig_pool(void) | 2691 | struct tcp_md5sig_pool **tcp_alloc_md5sig_pool(struct sock *sk) |
2692 | { | 2692 | { |
2693 | struct tcp_md5sig_pool **pool; | 2693 | struct tcp_md5sig_pool **pool; |
2694 | int alloc = 0; | 2694 | int alloc = 0; |
@@ -2709,7 +2709,7 @@ retry: | |||
2709 | 2709 | ||
2710 | if (alloc) { | 2710 | if (alloc) { |
2711 | /* we cannot hold spinlock here because this may sleep. */ | 2711 | /* we cannot hold spinlock here because this may sleep. */ |
2712 | struct tcp_md5sig_pool **p = __tcp_alloc_md5sig_pool(); | 2712 | struct tcp_md5sig_pool **p = __tcp_alloc_md5sig_pool(sk); |
2713 | spin_lock_bh(&tcp_md5sig_pool_lock); | 2713 | spin_lock_bh(&tcp_md5sig_pool_lock); |
2714 | if (!p) { | 2714 | if (!p) { |
2715 | tcp_md5sig_users--; | 2715 | tcp_md5sig_users--; |
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 2bdb0da237e6..af6d6fa00db1 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -685,7 +685,7 @@ static inline void tcp_set_rto(struct sock *sk) | |||
685 | * is invisible. Actually, Linux-2.4 also generates erratic | 685 | * is invisible. Actually, Linux-2.4 also generates erratic |
686 | * ACKs in some circumstances. | 686 | * ACKs in some circumstances. |
687 | */ | 687 | */ |
688 | inet_csk(sk)->icsk_rto = (tp->srtt >> 3) + tp->rttvar; | 688 | inet_csk(sk)->icsk_rto = __tcp_set_rto(tp); |
689 | 689 | ||
690 | /* 2. Fixups made earlier cannot be right. | 690 | /* 2. Fixups made earlier cannot be right. |
691 | * If we do not estimate RTO correctly without them, | 691 | * If we do not estimate RTO correctly without them, |
@@ -696,8 +696,7 @@ static inline void tcp_set_rto(struct sock *sk) | |||
696 | /* NOTE: clamping at TCP_RTO_MIN is not required, current algo | 696 | /* NOTE: clamping at TCP_RTO_MIN is not required, current algo |
697 | * guarantees that rto is higher. | 697 | * guarantees that rto is higher. |
698 | */ | 698 | */ |
699 | if (inet_csk(sk)->icsk_rto > TCP_RTO_MAX) | 699 | tcp_bound_rto(sk); |
700 | inet_csk(sk)->icsk_rto = TCP_RTO_MAX; | ||
701 | } | 700 | } |
702 | 701 | ||
703 | /* Save metrics learned by this TCP session. | 702 | /* Save metrics learned by this TCP session. |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index 6d88219c5e22..0543561da999 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -328,26 +328,29 @@ static void do_pmtu_discovery(struct sock *sk, struct iphdr *iph, u32 mtu) | |||
328 | * | 328 | * |
329 | */ | 329 | */ |
330 | 330 | ||
331 | void tcp_v4_err(struct sk_buff *skb, u32 info) | 331 | void tcp_v4_err(struct sk_buff *icmp_skb, u32 info) |
332 | { | 332 | { |
333 | struct iphdr *iph = (struct iphdr *)skb->data; | 333 | struct iphdr *iph = (struct iphdr *)icmp_skb->data; |
334 | struct tcphdr *th = (struct tcphdr *)(skb->data + (iph->ihl << 2)); | 334 | struct tcphdr *th = (struct tcphdr *)(icmp_skb->data + (iph->ihl << 2)); |
335 | struct inet_connection_sock *icsk; | ||
335 | struct tcp_sock *tp; | 336 | struct tcp_sock *tp; |
336 | struct inet_sock *inet; | 337 | struct inet_sock *inet; |
337 | const int type = icmp_hdr(skb)->type; | 338 | const int type = icmp_hdr(icmp_skb)->type; |
338 | const int code = icmp_hdr(skb)->code; | 339 | const int code = icmp_hdr(icmp_skb)->code; |
339 | struct sock *sk; | 340 | struct sock *sk; |
341 | struct sk_buff *skb; | ||
340 | __u32 seq; | 342 | __u32 seq; |
343 | __u32 remaining; | ||
341 | int err; | 344 | int err; |
342 | struct net *net = dev_net(skb->dev); | 345 | struct net *net = dev_net(icmp_skb->dev); |
343 | 346 | ||
344 | if (skb->len < (iph->ihl << 2) + 8) { | 347 | if (icmp_skb->len < (iph->ihl << 2) + 8) { |
345 | ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS); | 348 | ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS); |
346 | return; | 349 | return; |
347 | } | 350 | } |
348 | 351 | ||
349 | sk = inet_lookup(net, &tcp_hashinfo, iph->daddr, th->dest, | 352 | sk = inet_lookup(net, &tcp_hashinfo, iph->daddr, th->dest, |
350 | iph->saddr, th->source, inet_iif(skb)); | 353 | iph->saddr, th->source, inet_iif(icmp_skb)); |
351 | if (!sk) { | 354 | if (!sk) { |
352 | ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS); | 355 | ICMP_INC_STATS_BH(net, ICMP_MIB_INERRORS); |
353 | return; | 356 | return; |
@@ -367,6 +370,7 @@ void tcp_v4_err(struct sk_buff *skb, u32 info) | |||
367 | if (sk->sk_state == TCP_CLOSE) | 370 | if (sk->sk_state == TCP_CLOSE) |
368 | goto out; | 371 | goto out; |
369 | 372 | ||
373 | icsk = inet_csk(sk); | ||
370 | tp = tcp_sk(sk); | 374 | tp = tcp_sk(sk); |
371 | seq = ntohl(th->seq); | 375 | seq = ntohl(th->seq); |
372 | if (sk->sk_state != TCP_LISTEN && | 376 | if (sk->sk_state != TCP_LISTEN && |
@@ -393,6 +397,39 @@ void tcp_v4_err(struct sk_buff *skb, u32 info) | |||
393 | } | 397 | } |
394 | 398 | ||
395 | err = icmp_err_convert[code].errno; | 399 | err = icmp_err_convert[code].errno; |
400 | /* check if icmp_skb allows revert of backoff | ||
401 | * (see draft-zimmermann-tcp-lcd) */ | ||
402 | if (code != ICMP_NET_UNREACH && code != ICMP_HOST_UNREACH) | ||
403 | break; | ||
404 | if (seq != tp->snd_una || !icsk->icsk_retransmits || | ||
405 | !icsk->icsk_backoff) | ||
406 | break; | ||
407 | |||
408 | icsk->icsk_backoff--; | ||
409 | inet_csk(sk)->icsk_rto = __tcp_set_rto(tp) << | ||
410 | icsk->icsk_backoff; | ||
411 | tcp_bound_rto(sk); | ||
412 | |||
413 | skb = tcp_write_queue_head(sk); | ||
414 | BUG_ON(!skb); | ||
415 | |||
416 | remaining = icsk->icsk_rto - min(icsk->icsk_rto, | ||
417 | tcp_time_stamp - TCP_SKB_CB(skb)->when); | ||
418 | |||
419 | if (remaining) { | ||
420 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, | ||
421 | remaining, TCP_RTO_MAX); | ||
422 | } else if (sock_owned_by_user(sk)) { | ||
423 | /* RTO revert clocked out retransmission, | ||
424 | * but socket is locked. Will defer. */ | ||
425 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, | ||
426 | HZ/20, TCP_RTO_MAX); | ||
427 | } else { | ||
428 | /* RTO revert clocked out retransmission. | ||
429 | * Will retransmit now */ | ||
430 | tcp_retransmit_timer(sk); | ||
431 | } | ||
432 | |||
396 | break; | 433 | break; |
397 | case ICMP_TIME_EXCEEDED: | 434 | case ICMP_TIME_EXCEEDED: |
398 | err = EHOSTUNREACH; | 435 | err = EHOSTUNREACH; |
@@ -849,7 +886,7 @@ int tcp_v4_md5_do_add(struct sock *sk, __be32 addr, | |||
849 | } | 886 | } |
850 | sk->sk_route_caps &= ~NETIF_F_GSO_MASK; | 887 | sk->sk_route_caps &= ~NETIF_F_GSO_MASK; |
851 | } | 888 | } |
852 | if (tcp_alloc_md5sig_pool() == NULL) { | 889 | if (tcp_alloc_md5sig_pool(sk) == NULL) { |
853 | kfree(newkey); | 890 | kfree(newkey); |
854 | return -ENOMEM; | 891 | return -ENOMEM; |
855 | } | 892 | } |
@@ -970,8 +1007,9 @@ static int tcp_v4_parse_md5_keys(struct sock *sk, char __user *optval, | |||
970 | 1007 | ||
971 | if (!tcp_sk(sk)->md5sig_info) { | 1008 | if (!tcp_sk(sk)->md5sig_info) { |
972 | struct tcp_sock *tp = tcp_sk(sk); | 1009 | struct tcp_sock *tp = tcp_sk(sk); |
973 | struct tcp_md5sig_info *p = kzalloc(sizeof(*p), GFP_KERNEL); | 1010 | struct tcp_md5sig_info *p; |
974 | 1011 | ||
1012 | p = kzalloc(sizeof(*p), sk->sk_allocation); | ||
975 | if (!p) | 1013 | if (!p) |
976 | return -EINVAL; | 1014 | return -EINVAL; |
977 | 1015 | ||
@@ -979,7 +1017,7 @@ static int tcp_v4_parse_md5_keys(struct sock *sk, char __user *optval, | |||
979 | sk->sk_route_caps &= ~NETIF_F_GSO_MASK; | 1017 | sk->sk_route_caps &= ~NETIF_F_GSO_MASK; |
980 | } | 1018 | } |
981 | 1019 | ||
982 | newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL); | 1020 | newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, sk->sk_allocation); |
983 | if (!newkey) | 1021 | if (!newkey) |
984 | return -ENOMEM; | 1022 | return -ENOMEM; |
985 | return tcp_v4_md5_do_add(sk, sin->sin_addr.s_addr, | 1023 | return tcp_v4_md5_do_add(sk, sin->sin_addr.s_addr, |
@@ -1158,7 +1196,7 @@ struct request_sock_ops tcp_request_sock_ops __read_mostly = { | |||
1158 | }; | 1196 | }; |
1159 | 1197 | ||
1160 | #ifdef CONFIG_TCP_MD5SIG | 1198 | #ifdef CONFIG_TCP_MD5SIG |
1161 | static struct tcp_request_sock_ops tcp_request_sock_ipv4_ops = { | 1199 | static const struct tcp_request_sock_ops tcp_request_sock_ipv4_ops = { |
1162 | .md5_lookup = tcp_v4_reqsk_md5_lookup, | 1200 | .md5_lookup = tcp_v4_reqsk_md5_lookup, |
1163 | .calc_md5_hash = tcp_v4_md5_hash_skb, | 1201 | .calc_md5_hash = tcp_v4_md5_hash_skb, |
1164 | }; | 1202 | }; |
@@ -1717,7 +1755,7 @@ int tcp_v4_tw_remember_stamp(struct inet_timewait_sock *tw) | |||
1717 | return 0; | 1755 | return 0; |
1718 | } | 1756 | } |
1719 | 1757 | ||
1720 | struct inet_connection_sock_af_ops ipv4_specific = { | 1758 | const struct inet_connection_sock_af_ops ipv4_specific = { |
1721 | .queue_xmit = ip_queue_xmit, | 1759 | .queue_xmit = ip_queue_xmit, |
1722 | .send_check = tcp_v4_send_check, | 1760 | .send_check = tcp_v4_send_check, |
1723 | .rebuild_header = inet_sk_rebuild_header, | 1761 | .rebuild_header = inet_sk_rebuild_header, |
@@ -1737,7 +1775,7 @@ struct inet_connection_sock_af_ops ipv4_specific = { | |||
1737 | }; | 1775 | }; |
1738 | 1776 | ||
1739 | #ifdef CONFIG_TCP_MD5SIG | 1777 | #ifdef CONFIG_TCP_MD5SIG |
1740 | static struct tcp_sock_af_ops tcp_sock_ipv4_specific = { | 1778 | static const struct tcp_sock_af_ops tcp_sock_ipv4_specific = { |
1741 | .md5_lookup = tcp_v4_md5_lookup, | 1779 | .md5_lookup = tcp_v4_md5_lookup, |
1742 | .calc_md5_hash = tcp_v4_md5_hash_skb, | 1780 | .calc_md5_hash = tcp_v4_md5_hash_skb, |
1743 | .md5_add = tcp_v4_md5_add_func, | 1781 | .md5_add = tcp_v4_md5_add_func, |
diff --git a/net/ipv4/tcp_minisocks.c b/net/ipv4/tcp_minisocks.c index f8d67ccc64f3..e48c37d74d77 100644 --- a/net/ipv4/tcp_minisocks.c +++ b/net/ipv4/tcp_minisocks.c | |||
@@ -322,7 +322,7 @@ void tcp_time_wait(struct sock *sk, int state, int timeo) | |||
322 | if (key != NULL) { | 322 | if (key != NULL) { |
323 | memcpy(&tcptw->tw_md5_key, key->key, key->keylen); | 323 | memcpy(&tcptw->tw_md5_key, key->key, key->keylen); |
324 | tcptw->tw_md5_keylen = key->keylen; | 324 | tcptw->tw_md5_keylen = key->keylen; |
325 | if (tcp_alloc_md5sig_pool() == NULL) | 325 | if (tcp_alloc_md5sig_pool(sk) == NULL) |
326 | BUG(); | 326 | BUG(); |
327 | } | 327 | } |
328 | } while (0); | 328 | } while (0); |
@@ -657,29 +657,6 @@ struct sock *tcp_check_req(struct sock *sk, struct sk_buff *skb, | |||
657 | child = inet_csk(sk)->icsk_af_ops->syn_recv_sock(sk, skb, req, NULL); | 657 | child = inet_csk(sk)->icsk_af_ops->syn_recv_sock(sk, skb, req, NULL); |
658 | if (child == NULL) | 658 | if (child == NULL) |
659 | goto listen_overflow; | 659 | goto listen_overflow; |
660 | #ifdef CONFIG_TCP_MD5SIG | ||
661 | else { | ||
662 | /* Copy over the MD5 key from the original socket */ | ||
663 | struct tcp_md5sig_key *key; | ||
664 | struct tcp_sock *tp = tcp_sk(sk); | ||
665 | key = tp->af_specific->md5_lookup(sk, child); | ||
666 | if (key != NULL) { | ||
667 | /* | ||
668 | * We're using one, so create a matching key on the | ||
669 | * newsk structure. If we fail to get memory then we | ||
670 | * end up not copying the key across. Shucks. | ||
671 | */ | ||
672 | char *newkey = kmemdup(key->key, key->keylen, | ||
673 | GFP_ATOMIC); | ||
674 | if (newkey) { | ||
675 | if (!tcp_alloc_md5sig_pool()) | ||
676 | BUG(); | ||
677 | tp->af_specific->md5_add(child, child, newkey, | ||
678 | key->keylen); | ||
679 | } | ||
680 | } | ||
681 | } | ||
682 | #endif | ||
683 | 660 | ||
684 | inet_csk_reqsk_queue_unlink(sk, req, prev); | 661 | inet_csk_reqsk_queue_unlink(sk, req, prev); |
685 | inet_csk_reqsk_queue_removed(sk, req); | 662 | inet_csk_reqsk_queue_removed(sk, req); |
diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index 4e004424d400..5200aab0ca97 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c | |||
@@ -2135,7 +2135,8 @@ void tcp_send_fin(struct sock *sk) | |||
2135 | } else { | 2135 | } else { |
2136 | /* Socket is locked, keep trying until memory is available. */ | 2136 | /* Socket is locked, keep trying until memory is available. */ |
2137 | for (;;) { | 2137 | for (;;) { |
2138 | skb = alloc_skb_fclone(MAX_TCP_HEADER, GFP_KERNEL); | 2138 | skb = alloc_skb_fclone(MAX_TCP_HEADER, |
2139 | sk->sk_allocation); | ||
2139 | if (skb) | 2140 | if (skb) |
2140 | break; | 2141 | break; |
2141 | yield(); | 2142 | yield(); |
@@ -2388,7 +2389,7 @@ int tcp_connect(struct sock *sk) | |||
2388 | sk->sk_wmem_queued += buff->truesize; | 2389 | sk->sk_wmem_queued += buff->truesize; |
2389 | sk_mem_charge(sk, buff->truesize); | 2390 | sk_mem_charge(sk, buff->truesize); |
2390 | tp->packets_out += tcp_skb_pcount(buff); | 2391 | tp->packets_out += tcp_skb_pcount(buff); |
2391 | tcp_transmit_skb(sk, buff, 1, GFP_KERNEL); | 2392 | tcp_transmit_skb(sk, buff, 1, sk->sk_allocation); |
2392 | 2393 | ||
2393 | /* We change tp->snd_nxt after the tcp_transmit_skb() call | 2394 | /* We change tp->snd_nxt after the tcp_transmit_skb() call |
2394 | * in order to make this packet get counted in tcpOutSegs. | 2395 | * in order to make this packet get counted in tcpOutSegs. |
diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c index b144a26359bc..cdb2ca7684d4 100644 --- a/net/ipv4/tcp_timer.c +++ b/net/ipv4/tcp_timer.c | |||
@@ -137,13 +137,14 @@ static int tcp_write_timeout(struct sock *sk) | |||
137 | { | 137 | { |
138 | struct inet_connection_sock *icsk = inet_csk(sk); | 138 | struct inet_connection_sock *icsk = inet_csk(sk); |
139 | int retry_until; | 139 | int retry_until; |
140 | bool do_reset; | ||
140 | 141 | ||
141 | if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { | 142 | if ((1 << sk->sk_state) & (TCPF_SYN_SENT | TCPF_SYN_RECV)) { |
142 | if (icsk->icsk_retransmits) | 143 | if (icsk->icsk_retransmits) |
143 | dst_negative_advice(&sk->sk_dst_cache); | 144 | dst_negative_advice(&sk->sk_dst_cache); |
144 | retry_until = icsk->icsk_syn_retries ? : sysctl_tcp_syn_retries; | 145 | retry_until = icsk->icsk_syn_retries ? : sysctl_tcp_syn_retries; |
145 | } else { | 146 | } else { |
146 | if (icsk->icsk_retransmits >= sysctl_tcp_retries1) { | 147 | if (retransmits_timed_out(sk, sysctl_tcp_retries1)) { |
147 | /* Black hole detection */ | 148 | /* Black hole detection */ |
148 | tcp_mtu_probing(icsk, sk); | 149 | tcp_mtu_probing(icsk, sk); |
149 | 150 | ||
@@ -155,13 +156,15 @@ static int tcp_write_timeout(struct sock *sk) | |||
155 | const int alive = (icsk->icsk_rto < TCP_RTO_MAX); | 156 | const int alive = (icsk->icsk_rto < TCP_RTO_MAX); |
156 | 157 | ||
157 | retry_until = tcp_orphan_retries(sk, alive); | 158 | retry_until = tcp_orphan_retries(sk, alive); |
159 | do_reset = alive || | ||
160 | !retransmits_timed_out(sk, retry_until); | ||
158 | 161 | ||
159 | if (tcp_out_of_resources(sk, alive || icsk->icsk_retransmits < retry_until)) | 162 | if (tcp_out_of_resources(sk, do_reset)) |
160 | return 1; | 163 | return 1; |
161 | } | 164 | } |
162 | } | 165 | } |
163 | 166 | ||
164 | if (icsk->icsk_retransmits >= retry_until) { | 167 | if (retransmits_timed_out(sk, retry_until)) { |
165 | /* Has it gone just too far? */ | 168 | /* Has it gone just too far? */ |
166 | tcp_write_err(sk); | 169 | tcp_write_err(sk); |
167 | return 1; | 170 | return 1; |
@@ -279,7 +282,7 @@ static void tcp_probe_timer(struct sock *sk) | |||
279 | * The TCP retransmit timer. | 282 | * The TCP retransmit timer. |
280 | */ | 283 | */ |
281 | 284 | ||
282 | static void tcp_retransmit_timer(struct sock *sk) | 285 | void tcp_retransmit_timer(struct sock *sk) |
283 | { | 286 | { |
284 | struct tcp_sock *tp = tcp_sk(sk); | 287 | struct tcp_sock *tp = tcp_sk(sk); |
285 | struct inet_connection_sock *icsk = inet_csk(sk); | 288 | struct inet_connection_sock *icsk = inet_csk(sk); |
@@ -385,7 +388,7 @@ static void tcp_retransmit_timer(struct sock *sk) | |||
385 | out_reset_timer: | 388 | out_reset_timer: |
386 | icsk->icsk_rto = min(icsk->icsk_rto << 1, TCP_RTO_MAX); | 389 | icsk->icsk_rto = min(icsk->icsk_rto << 1, TCP_RTO_MAX); |
387 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, icsk->icsk_rto, TCP_RTO_MAX); | 390 | inet_csk_reset_xmit_timer(sk, ICSK_TIME_RETRANS, icsk->icsk_rto, TCP_RTO_MAX); |
388 | if (icsk->icsk_retransmits > sysctl_tcp_retries1) | 391 | if (retransmits_timed_out(sk, sysctl_tcp_retries1 + 1)) |
389 | __sk_dst_reset(sk); | 392 | __sk_dst_reset(sk); |
390 | 393 | ||
391 | out:; | 394 | out:; |
@@ -499,8 +502,7 @@ static void tcp_keepalive_timer (unsigned long data) | |||
499 | elapsed = tcp_time_stamp - tp->rcv_tstamp; | 502 | elapsed = tcp_time_stamp - tp->rcv_tstamp; |
500 | 503 | ||
501 | if (elapsed >= keepalive_time_when(tp)) { | 504 | if (elapsed >= keepalive_time_when(tp)) { |
502 | if ((!tp->keepalive_probes && icsk->icsk_probes_out >= sysctl_tcp_keepalive_probes) || | 505 | if (icsk->icsk_probes_out >= keepalive_probes(tp)) { |
503 | (tp->keepalive_probes && icsk->icsk_probes_out >= tp->keepalive_probes)) { | ||
504 | tcp_send_active_reset(sk, GFP_ATOMIC); | 506 | tcp_send_active_reset(sk, GFP_ATOMIC); |
505 | tcp_write_err(sk); | 507 | tcp_write_err(sk); |
506 | goto out; | 508 | goto out; |
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 29ebb0d27a1e..ebaaa7f973d7 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c | |||
@@ -561,12 +561,18 @@ static int udp_push_pending_frames(struct sock *sk) | |||
561 | 561 | ||
562 | send: | 562 | send: |
563 | err = ip_push_pending_frames(sk); | 563 | err = ip_push_pending_frames(sk); |
564 | if (err) { | ||
565 | if (err == -ENOBUFS && !inet->recverr) { | ||
566 | UDP_INC_STATS_USER(sock_net(sk), | ||
567 | UDP_MIB_SNDBUFERRORS, is_udplite); | ||
568 | err = 0; | ||
569 | } | ||
570 | } else | ||
571 | UDP_INC_STATS_USER(sock_net(sk), | ||
572 | UDP_MIB_OUTDATAGRAMS, is_udplite); | ||
564 | out: | 573 | out: |
565 | up->len = 0; | 574 | up->len = 0; |
566 | up->pending = 0; | 575 | up->pending = 0; |
567 | if (!err) | ||
568 | UDP_INC_STATS_USER(sock_net(sk), | ||
569 | UDP_MIB_OUTDATAGRAMS, is_udplite); | ||
570 | return err; | 576 | return err; |
571 | } | 577 | } |
572 | 578 | ||