diff options
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/inet_connection_sock.c | 14 | ||||
-rw-r--r-- | net/ipv4/netfilter/ip_conntrack_helper_pptp.c | 4 | ||||
-rw-r--r-- | net/ipv4/netfilter/ip_conntrack_netlink.c | 19 | ||||
-rw-r--r-- | net/ipv4/netfilter/ip_nat_core.c | 6 | ||||
-rw-r--r-- | net/ipv4/netfilter/ip_nat_helper_pptp.c | 2 | ||||
-rw-r--r-- | net/ipv4/netfilter/ip_nat_proto_gre.c | 4 | ||||
-rw-r--r-- | net/ipv4/netfilter/ip_nat_proto_unknown.c | 2 | ||||
-rw-r--r-- | net/ipv4/netfilter/ipt_CONNMARK.c | 1 | ||||
-rw-r--r-- | net/ipv4/tcp.c | 1 | ||||
-rw-r--r-- | net/ipv4/tcp_ipv4.c | 2 |
10 files changed, 18 insertions, 37 deletions
diff --git a/net/ipv4/inet_connection_sock.c b/net/ipv4/inet_connection_sock.c index 94468a76c5b4..3fe021f1a566 100644 --- a/net/ipv4/inet_connection_sock.c +++ b/net/ipv4/inet_connection_sock.c | |||
@@ -78,17 +78,9 @@ int inet_csk_get_port(struct inet_hashinfo *hashinfo, | |||
78 | int low = sysctl_local_port_range[0]; | 78 | int low = sysctl_local_port_range[0]; |
79 | int high = sysctl_local_port_range[1]; | 79 | int high = sysctl_local_port_range[1]; |
80 | int remaining = (high - low) + 1; | 80 | int remaining = (high - low) + 1; |
81 | int rover; | 81 | int rover = net_random() % (high - low) + low; |
82 | 82 | ||
83 | spin_lock(&hashinfo->portalloc_lock); | ||
84 | if (hashinfo->port_rover < low) | ||
85 | rover = low; | ||
86 | else | ||
87 | rover = hashinfo->port_rover; | ||
88 | do { | 83 | do { |
89 | rover++; | ||
90 | if (rover > high) | ||
91 | rover = low; | ||
92 | head = &hashinfo->bhash[inet_bhashfn(rover, hashinfo->bhash_size)]; | 84 | head = &hashinfo->bhash[inet_bhashfn(rover, hashinfo->bhash_size)]; |
93 | spin_lock(&head->lock); | 85 | spin_lock(&head->lock); |
94 | inet_bind_bucket_for_each(tb, node, &head->chain) | 86 | inet_bind_bucket_for_each(tb, node, &head->chain) |
@@ -97,9 +89,9 @@ int inet_csk_get_port(struct inet_hashinfo *hashinfo, | |||
97 | break; | 89 | break; |
98 | next: | 90 | next: |
99 | spin_unlock(&head->lock); | 91 | spin_unlock(&head->lock); |
92 | if (++rover > high) | ||
93 | rover = low; | ||
100 | } while (--remaining > 0); | 94 | } while (--remaining > 0); |
101 | hashinfo->port_rover = rover; | ||
102 | spin_unlock(&hashinfo->portalloc_lock); | ||
103 | 95 | ||
104 | /* Exhausted local port range during search? It is not | 96 | /* Exhausted local port range during search? It is not |
105 | * possible for us to be holding one of the bind hash | 97 | * possible for us to be holding one of the bind hash |
diff --git a/net/ipv4/netfilter/ip_conntrack_helper_pptp.c b/net/ipv4/netfilter/ip_conntrack_helper_pptp.c index 926a6684643d..4108a5e12b3c 100644 --- a/net/ipv4/netfilter/ip_conntrack_helper_pptp.c +++ b/net/ipv4/netfilter/ip_conntrack_helper_pptp.c | |||
@@ -270,14 +270,10 @@ exp_gre(struct ip_conntrack *master, | |||
270 | exp_orig->expectfn = pptp_expectfn; | 270 | exp_orig->expectfn = pptp_expectfn; |
271 | exp_orig->flags = 0; | 271 | exp_orig->flags = 0; |
272 | 272 | ||
273 | exp_orig->dir = IP_CT_DIR_ORIGINAL; | ||
274 | |||
275 | /* both expectations are identical apart from tuple */ | 273 | /* both expectations are identical apart from tuple */ |
276 | memcpy(exp_reply, exp_orig, sizeof(*exp_reply)); | 274 | memcpy(exp_reply, exp_orig, sizeof(*exp_reply)); |
277 | memcpy(&exp_reply->tuple, &exp_tuples[1], sizeof(exp_reply->tuple)); | 275 | memcpy(&exp_reply->tuple, &exp_tuples[1], sizeof(exp_reply->tuple)); |
278 | 276 | ||
279 | exp_reply->dir = !exp_orig->dir; | ||
280 | |||
281 | if (ip_nat_pptp_hook_exp_gre) | 277 | if (ip_nat_pptp_hook_exp_gre) |
282 | ret = ip_nat_pptp_hook_exp_gre(exp_orig, exp_reply); | 278 | ret = ip_nat_pptp_hook_exp_gre(exp_orig, exp_reply); |
283 | else { | 279 | else { |
diff --git a/net/ipv4/netfilter/ip_conntrack_netlink.c b/net/ipv4/netfilter/ip_conntrack_netlink.c index 166e6069f121..82a65043a8ef 100644 --- a/net/ipv4/netfilter/ip_conntrack_netlink.c +++ b/net/ipv4/netfilter/ip_conntrack_netlink.c | |||
@@ -815,7 +815,7 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb, | |||
815 | IPCTNL_MSG_CT_NEW, 1, ct); | 815 | IPCTNL_MSG_CT_NEW, 1, ct); |
816 | ip_conntrack_put(ct); | 816 | ip_conntrack_put(ct); |
817 | if (err <= 0) | 817 | if (err <= 0) |
818 | goto out; | 818 | goto free; |
819 | 819 | ||
820 | err = netlink_unicast(ctnl, skb2, NETLINK_CB(skb).pid, MSG_DONTWAIT); | 820 | err = netlink_unicast(ctnl, skb2, NETLINK_CB(skb).pid, MSG_DONTWAIT); |
821 | if (err < 0) | 821 | if (err < 0) |
@@ -824,9 +824,9 @@ ctnetlink_get_conntrack(struct sock *ctnl, struct sk_buff *skb, | |||
824 | DEBUGP("leaving\n"); | 824 | DEBUGP("leaving\n"); |
825 | return 0; | 825 | return 0; |
826 | 826 | ||
827 | free: | ||
828 | kfree_skb(skb2); | ||
827 | out: | 829 | out: |
828 | if (skb2) | ||
829 | kfree_skb(skb2); | ||
830 | return -1; | 830 | return -1; |
831 | } | 831 | } |
832 | 832 | ||
@@ -1322,21 +1322,16 @@ ctnetlink_get_expect(struct sock *ctnl, struct sk_buff *skb, | |||
1322 | nlh->nlmsg_seq, IPCTNL_MSG_EXP_NEW, | 1322 | nlh->nlmsg_seq, IPCTNL_MSG_EXP_NEW, |
1323 | 1, exp); | 1323 | 1, exp); |
1324 | if (err <= 0) | 1324 | if (err <= 0) |
1325 | goto out; | 1325 | goto free; |
1326 | 1326 | ||
1327 | ip_conntrack_expect_put(exp); | 1327 | ip_conntrack_expect_put(exp); |
1328 | 1328 | ||
1329 | err = netlink_unicast(ctnl, skb2, NETLINK_CB(skb).pid, MSG_DONTWAIT); | 1329 | return netlink_unicast(ctnl, skb2, NETLINK_CB(skb).pid, MSG_DONTWAIT); |
1330 | if (err < 0) | ||
1331 | goto free; | ||
1332 | |||
1333 | return err; | ||
1334 | 1330 | ||
1331 | free: | ||
1332 | kfree_skb(skb2); | ||
1335 | out: | 1333 | out: |
1336 | ip_conntrack_expect_put(exp); | 1334 | ip_conntrack_expect_put(exp); |
1337 | free: | ||
1338 | if (skb2) | ||
1339 | kfree_skb(skb2); | ||
1340 | return err; | 1335 | return err; |
1341 | } | 1336 | } |
1342 | 1337 | ||
diff --git a/net/ipv4/netfilter/ip_nat_core.c b/net/ipv4/netfilter/ip_nat_core.c index c5e3abd24672..762f4d93936b 100644 --- a/net/ipv4/netfilter/ip_nat_core.c +++ b/net/ipv4/netfilter/ip_nat_core.c | |||
@@ -66,10 +66,8 @@ ip_nat_proto_find_get(u_int8_t protonum) | |||
66 | * removed until we've grabbed the reference */ | 66 | * removed until we've grabbed the reference */ |
67 | preempt_disable(); | 67 | preempt_disable(); |
68 | p = __ip_nat_proto_find(protonum); | 68 | p = __ip_nat_proto_find(protonum); |
69 | if (p) { | 69 | if (!try_module_get(p->me)) |
70 | if (!try_module_get(p->me)) | 70 | p = &ip_nat_unknown_protocol; |
71 | p = &ip_nat_unknown_protocol; | ||
72 | } | ||
73 | preempt_enable(); | 71 | preempt_enable(); |
74 | 72 | ||
75 | return p; | 73 | return p; |
diff --git a/net/ipv4/netfilter/ip_nat_helper_pptp.c b/net/ipv4/netfilter/ip_nat_helper_pptp.c index 3cdd0684d30d..ee6ab74ad3a9 100644 --- a/net/ipv4/netfilter/ip_nat_helper_pptp.c +++ b/net/ipv4/netfilter/ip_nat_helper_pptp.c | |||
@@ -216,6 +216,7 @@ pptp_exp_gre(struct ip_conntrack_expect *expect_orig, | |||
216 | expect_orig->saved_proto.gre.key = htons(nat_pptp_info->pac_call_id); | 216 | expect_orig->saved_proto.gre.key = htons(nat_pptp_info->pac_call_id); |
217 | expect_orig->tuple.src.u.gre.key = htons(nat_pptp_info->pns_call_id); | 217 | expect_orig->tuple.src.u.gre.key = htons(nat_pptp_info->pns_call_id); |
218 | expect_orig->tuple.dst.u.gre.key = htons(ct_pptp_info->pac_call_id); | 218 | expect_orig->tuple.dst.u.gre.key = htons(ct_pptp_info->pac_call_id); |
219 | expect_orig->dir = IP_CT_DIR_ORIGINAL; | ||
219 | inv_t.src.ip = reply_t->src.ip; | 220 | inv_t.src.ip = reply_t->src.ip; |
220 | inv_t.dst.ip = reply_t->dst.ip; | 221 | inv_t.dst.ip = reply_t->dst.ip; |
221 | inv_t.src.u.gre.key = htons(nat_pptp_info->pac_call_id); | 222 | inv_t.src.u.gre.key = htons(nat_pptp_info->pac_call_id); |
@@ -233,6 +234,7 @@ pptp_exp_gre(struct ip_conntrack_expect *expect_orig, | |||
233 | expect_reply->saved_proto.gre.key = htons(nat_pptp_info->pns_call_id); | 234 | expect_reply->saved_proto.gre.key = htons(nat_pptp_info->pns_call_id); |
234 | expect_reply->tuple.src.u.gre.key = htons(nat_pptp_info->pac_call_id); | 235 | expect_reply->tuple.src.u.gre.key = htons(nat_pptp_info->pac_call_id); |
235 | expect_reply->tuple.dst.u.gre.key = htons(ct_pptp_info->pns_call_id); | 236 | expect_reply->tuple.dst.u.gre.key = htons(ct_pptp_info->pns_call_id); |
237 | expect_reply->dir = IP_CT_DIR_REPLY; | ||
236 | inv_t.src.ip = orig_t->src.ip; | 238 | inv_t.src.ip = orig_t->src.ip; |
237 | inv_t.dst.ip = orig_t->dst.ip; | 239 | inv_t.dst.ip = orig_t->dst.ip; |
238 | inv_t.src.u.gre.key = htons(nat_pptp_info->pns_call_id); | 240 | inv_t.src.u.gre.key = htons(nat_pptp_info->pns_call_id); |
diff --git a/net/ipv4/netfilter/ip_nat_proto_gre.c b/net/ipv4/netfilter/ip_nat_proto_gre.c index 7c1285401672..f7cad7cf1aec 100644 --- a/net/ipv4/netfilter/ip_nat_proto_gre.c +++ b/net/ipv4/netfilter/ip_nat_proto_gre.c | |||
@@ -139,8 +139,8 @@ gre_manip_pkt(struct sk_buff **pskb, | |||
139 | break; | 139 | break; |
140 | case GRE_VERSION_PPTP: | 140 | case GRE_VERSION_PPTP: |
141 | DEBUGP("call_id -> 0x%04x\n", | 141 | DEBUGP("call_id -> 0x%04x\n", |
142 | ntohl(tuple->dst.u.gre.key)); | 142 | ntohs(tuple->dst.u.gre.key)); |
143 | pgreh->call_id = htons(ntohl(tuple->dst.u.gre.key)); | 143 | pgreh->call_id = tuple->dst.u.gre.key; |
144 | break; | 144 | break; |
145 | default: | 145 | default: |
146 | DEBUGP("can't nat unknown GRE version\n"); | 146 | DEBUGP("can't nat unknown GRE version\n"); |
diff --git a/net/ipv4/netfilter/ip_nat_proto_unknown.c b/net/ipv4/netfilter/ip_nat_proto_unknown.c index 99bbef56f84e..f0099a646a0b 100644 --- a/net/ipv4/netfilter/ip_nat_proto_unknown.c +++ b/net/ipv4/netfilter/ip_nat_proto_unknown.c | |||
@@ -62,7 +62,7 @@ unknown_print_range(char *buffer, const struct ip_nat_range *range) | |||
62 | 62 | ||
63 | struct ip_nat_protocol ip_nat_unknown_protocol = { | 63 | struct ip_nat_protocol ip_nat_unknown_protocol = { |
64 | .name = "unknown", | 64 | .name = "unknown", |
65 | .me = THIS_MODULE, | 65 | /* .me isn't set: getting a ref to this cannot fail. */ |
66 | .manip_pkt = unknown_manip_pkt, | 66 | .manip_pkt = unknown_manip_pkt, |
67 | .in_range = unknown_in_range, | 67 | .in_range = unknown_in_range, |
68 | .unique_tuple = unknown_unique_tuple, | 68 | .unique_tuple = unknown_unique_tuple, |
diff --git a/net/ipv4/netfilter/ipt_CONNMARK.c b/net/ipv4/netfilter/ipt_CONNMARK.c index 134638021339..05d66ab59424 100644 --- a/net/ipv4/netfilter/ipt_CONNMARK.c +++ b/net/ipv4/netfilter/ipt_CONNMARK.c | |||
@@ -109,6 +109,7 @@ static struct ipt_target ipt_connmark_reg = { | |||
109 | 109 | ||
110 | static int __init init(void) | 110 | static int __init init(void) |
111 | { | 111 | { |
112 | need_ip_conntrack(); | ||
112 | return ipt_register_target(&ipt_connmark_reg); | 113 | return ipt_register_target(&ipt_connmark_reg); |
113 | } | 114 | } |
114 | 115 | ||
diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c index f3f0013a9580..72b7c22e1ea5 100644 --- a/net/ipv4/tcp.c +++ b/net/ipv4/tcp.c | |||
@@ -2112,7 +2112,6 @@ void __init tcp_init(void) | |||
2112 | sysctl_tcp_max_orphans >>= (3 - order); | 2112 | sysctl_tcp_max_orphans >>= (3 - order); |
2113 | sysctl_max_syn_backlog = 128; | 2113 | sysctl_max_syn_backlog = 128; |
2114 | } | 2114 | } |
2115 | tcp_hashinfo.port_rover = sysctl_local_port_range[0] - 1; | ||
2116 | 2115 | ||
2117 | sysctl_tcp_mem[0] = 768 << order; | 2116 | sysctl_tcp_mem[0] = 768 << order; |
2118 | sysctl_tcp_mem[1] = 1024 << order; | 2117 | sysctl_tcp_mem[1] = 1024 << order; |
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c index c85819d8474b..49d67cd75edd 100644 --- a/net/ipv4/tcp_ipv4.c +++ b/net/ipv4/tcp_ipv4.c | |||
@@ -93,8 +93,6 @@ struct inet_hashinfo __cacheline_aligned tcp_hashinfo = { | |||
93 | .lhash_lock = RW_LOCK_UNLOCKED, | 93 | .lhash_lock = RW_LOCK_UNLOCKED, |
94 | .lhash_users = ATOMIC_INIT(0), | 94 | .lhash_users = ATOMIC_INIT(0), |
95 | .lhash_wait = __WAIT_QUEUE_HEAD_INITIALIZER(tcp_hashinfo.lhash_wait), | 95 | .lhash_wait = __WAIT_QUEUE_HEAD_INITIALIZER(tcp_hashinfo.lhash_wait), |
96 | .portalloc_lock = SPIN_LOCK_UNLOCKED, | ||
97 | .port_rover = 1024 - 1, | ||
98 | }; | 96 | }; |
99 | 97 | ||
100 | static int tcp_v4_get_port(struct sock *sk, unsigned short snum) | 98 | static int tcp_v4_get_port(struct sock *sk, unsigned short snum) |