diff options
Diffstat (limited to 'net/ipv4')
-rw-r--r-- | net/ipv4/arp.c | 2 | ||||
-rw-r--r-- | net/ipv4/inet_timewait_sock.c | 5 | ||||
-rw-r--r-- | net/ipv4/netfilter/arp_tables.c | 2 | ||||
-rw-r--r-- | net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | 25 | ||||
-rw-r--r-- | net/ipv4/netfilter/nf_conntrack_proto_icmp.c | 57 | ||||
-rw-r--r-- | net/ipv4/tcp_input.c | 4 | ||||
-rw-r--r-- | net/ipv4/tcp_probe.c | 1 |
7 files changed, 36 insertions, 60 deletions
diff --git a/net/ipv4/arp.c b/net/ipv4/arp.c index e00767e8ebd9..9ab9d534fbac 100644 --- a/net/ipv4/arp.c +++ b/net/ipv4/arp.c | |||
@@ -885,7 +885,7 @@ static int arp_process(struct sk_buff *skb) | |||
885 | if (n == NULL && | 885 | if (n == NULL && |
886 | arp->ar_op == htons(ARPOP_REPLY) && | 886 | arp->ar_op == htons(ARPOP_REPLY) && |
887 | inet_addr_type(sip) == RTN_UNICAST) | 887 | inet_addr_type(sip) == RTN_UNICAST) |
888 | n = __neigh_lookup(&arp_tbl, &sip, dev, -1); | 888 | n = __neigh_lookup(&arp_tbl, &sip, dev, 1); |
889 | } | 889 | } |
890 | 890 | ||
891 | if (n) { | 891 | if (n) { |
diff --git a/net/ipv4/inet_timewait_sock.c b/net/ipv4/inet_timewait_sock.c index a73cf93cee36..2586df09b9b6 100644 --- a/net/ipv4/inet_timewait_sock.c +++ b/net/ipv4/inet_timewait_sock.c | |||
@@ -14,7 +14,8 @@ | |||
14 | #include <net/ip.h> | 14 | #include <net/ip.h> |
15 | 15 | ||
16 | /* Must be called with locally disabled BHs. */ | 16 | /* Must be called with locally disabled BHs. */ |
17 | void __inet_twsk_kill(struct inet_timewait_sock *tw, struct inet_hashinfo *hashinfo) | 17 | static void __inet_twsk_kill(struct inet_timewait_sock *tw, |
18 | struct inet_hashinfo *hashinfo) | ||
18 | { | 19 | { |
19 | struct inet_bind_hashbucket *bhead; | 20 | struct inet_bind_hashbucket *bhead; |
20 | struct inet_bind_bucket *tb; | 21 | struct inet_bind_bucket *tb; |
@@ -47,8 +48,6 @@ void __inet_twsk_kill(struct inet_timewait_sock *tw, struct inet_hashinfo *hashi | |||
47 | inet_twsk_put(tw); | 48 | inet_twsk_put(tw); |
48 | } | 49 | } |
49 | 50 | ||
50 | EXPORT_SYMBOL_GPL(__inet_twsk_kill); | ||
51 | |||
52 | /* | 51 | /* |
53 | * Enter the time wait state. This is called with locally disabled BH. | 52 | * Enter the time wait state. This is called with locally disabled BH. |
54 | * Essentially we whip up a timewait bucket, copy the relevant info into it | 53 | * Essentially we whip up a timewait bucket, copy the relevant info into it |
diff --git a/net/ipv4/netfilter/arp_tables.c b/net/ipv4/netfilter/arp_tables.c index e981232942a1..d1149aba9351 100644 --- a/net/ipv4/netfilter/arp_tables.c +++ b/net/ipv4/netfilter/arp_tables.c | |||
@@ -1184,7 +1184,7 @@ static int __init arp_tables_init(void) | |||
1184 | if (ret < 0) | 1184 | if (ret < 0) |
1185 | goto err4; | 1185 | goto err4; |
1186 | 1186 | ||
1187 | printk("arp_tables: (C) 2002 David S. Miller\n"); | 1187 | printk(KERN_INFO "arp_tables: (C) 2002 David S. Miller\n"); |
1188 | return 0; | 1188 | return 0; |
1189 | 1189 | ||
1190 | err4: | 1190 | err4: |
diff --git a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c index 3c5629938487..64552afd01cb 100644 --- a/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c +++ b/net/ipv4/netfilter/nf_conntrack_l3proto_ipv4.c | |||
@@ -78,21 +78,26 @@ nf_ct_ipv4_gather_frags(struct sk_buff *skb, u_int32_t user) | |||
78 | return skb; | 78 | return skb; |
79 | } | 79 | } |
80 | 80 | ||
81 | static int | 81 | static int ipv4_get_l4proto(const struct sk_buff *skb, unsigned int nhoff, |
82 | ipv4_prepare(struct sk_buff **pskb, unsigned int hooknum, unsigned int *dataoff, | 82 | unsigned int *dataoff, u_int8_t *protonum) |
83 | u_int8_t *protonum) | ||
84 | { | 83 | { |
84 | struct iphdr _iph, *iph; | ||
85 | |||
86 | iph = skb_header_pointer(skb, nhoff, sizeof(_iph), &_iph); | ||
87 | if (iph == NULL) | ||
88 | return -NF_DROP; | ||
89 | |||
85 | /* Never happen */ | 90 | /* Never happen */ |
86 | if (ip_hdr(*pskb)->frag_off & htons(IP_OFFSET)) { | 91 | if (iph->frag_off & htons(IP_OFFSET)) { |
87 | if (net_ratelimit()) { | 92 | if (net_ratelimit()) { |
88 | printk(KERN_ERR "ipv4_prepare: Frag of proto %u (hook=%u)\n", | 93 | printk(KERN_ERR "ipv4_get_l4proto: Frag of proto %u\n", |
89 | ip_hdr(*pskb)->protocol, hooknum); | 94 | iph->protocol); |
90 | } | 95 | } |
91 | return -NF_DROP; | 96 | return -NF_DROP; |
92 | } | 97 | } |
93 | 98 | ||
94 | *dataoff = skb_network_offset(*pskb) + ip_hdrlen(*pskb); | 99 | *dataoff = nhoff + (iph->ihl << 2); |
95 | *protonum = ip_hdr(*pskb)->protocol; | 100 | *protonum = iph->protocol; |
96 | 101 | ||
97 | return NF_ACCEPT; | 102 | return NF_ACCEPT; |
98 | } | 103 | } |
@@ -400,14 +405,14 @@ static struct nf_sockopt_ops so_getorigdst = { | |||
400 | .get = &getorigdst, | 405 | .get = &getorigdst, |
401 | }; | 406 | }; |
402 | 407 | ||
403 | struct nf_conntrack_l3proto nf_conntrack_l3proto_ipv4 = { | 408 | struct nf_conntrack_l3proto nf_conntrack_l3proto_ipv4 __read_mostly = { |
404 | .l3proto = PF_INET, | 409 | .l3proto = PF_INET, |
405 | .name = "ipv4", | 410 | .name = "ipv4", |
406 | .pkt_to_tuple = ipv4_pkt_to_tuple, | 411 | .pkt_to_tuple = ipv4_pkt_to_tuple, |
407 | .invert_tuple = ipv4_invert_tuple, | 412 | .invert_tuple = ipv4_invert_tuple, |
408 | .print_tuple = ipv4_print_tuple, | 413 | .print_tuple = ipv4_print_tuple, |
409 | .print_conntrack = ipv4_print_conntrack, | 414 | .print_conntrack = ipv4_print_conntrack, |
410 | .prepare = ipv4_prepare, | 415 | .get_l4proto = ipv4_get_l4proto, |
411 | #if defined(CONFIG_NF_CT_NETLINK) || defined(CONFIG_NF_CT_NETLINK_MODULE) | 416 | #if defined(CONFIG_NF_CT_NETLINK) || defined(CONFIG_NF_CT_NETLINK_MODULE) |
412 | .tuple_to_nfattr = ipv4_tuple_to_nfattr, | 417 | .tuple_to_nfattr = ipv4_tuple_to_nfattr, |
413 | .nfattr_to_tuple = ipv4_nfattr_to_tuple, | 418 | .nfattr_to_tuple = ipv4_nfattr_to_tuple, |
diff --git a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c index 0fe8fb0466ef..6593fd2c5b10 100644 --- a/net/ipv4/netfilter/nf_conntrack_proto_icmp.c +++ b/net/ipv4/netfilter/nf_conntrack_proto_icmp.c | |||
@@ -136,40 +136,22 @@ icmp_error_message(struct sk_buff *skb, | |||
136 | unsigned int hooknum) | 136 | unsigned int hooknum) |
137 | { | 137 | { |
138 | struct nf_conntrack_tuple innertuple, origtuple; | 138 | struct nf_conntrack_tuple innertuple, origtuple; |
139 | struct { | ||
140 | struct icmphdr icmp; | ||
141 | struct iphdr ip; | ||
142 | } _in, *inside; | ||
143 | struct nf_conntrack_l4proto *innerproto; | 139 | struct nf_conntrack_l4proto *innerproto; |
144 | struct nf_conntrack_tuple_hash *h; | 140 | struct nf_conntrack_tuple_hash *h; |
145 | int dataoff; | ||
146 | 141 | ||
147 | NF_CT_ASSERT(skb->nfct == NULL); | 142 | NF_CT_ASSERT(skb->nfct == NULL); |
148 | 143 | ||
149 | /* Not enough header? */ | 144 | /* Are they talking about one of our connections? */ |
150 | inside = skb_header_pointer(skb, ip_hdrlen(skb), sizeof(_in), &_in); | 145 | if (!nf_ct_get_tuplepr(skb, |
151 | if (inside == NULL) | 146 | skb_network_offset(skb) + ip_hdrlen(skb) |
152 | return -NF_ACCEPT; | 147 | + sizeof(struct icmphdr), |
153 | 148 | PF_INET, &origtuple)) { | |
154 | /* Ignore ICMP's containing fragments (shouldn't happen) */ | 149 | pr_debug("icmp_error_message: failed to get tuple\n"); |
155 | if (inside->ip.frag_off & htons(IP_OFFSET)) { | ||
156 | pr_debug("icmp_error_message: fragment of proto %u\n", | ||
157 | inside->ip.protocol); | ||
158 | return -NF_ACCEPT; | 150 | return -NF_ACCEPT; |
159 | } | 151 | } |
160 | 152 | ||
161 | /* rcu_read_lock()ed by nf_hook_slow */ | 153 | /* rcu_read_lock()ed by nf_hook_slow */ |
162 | innerproto = __nf_ct_l4proto_find(PF_INET, inside->ip.protocol); | 154 | innerproto = __nf_ct_l4proto_find(PF_INET, origtuple.dst.protonum); |
163 | |||
164 | dataoff = ip_hdrlen(skb) + sizeof(inside->icmp); | ||
165 | /* Are they talking about one of our connections? */ | ||
166 | if (!nf_ct_get_tuple(skb, dataoff, dataoff + inside->ip.ihl*4, PF_INET, | ||
167 | inside->ip.protocol, &origtuple, | ||
168 | &nf_conntrack_l3proto_ipv4, innerproto)) { | ||
169 | pr_debug("icmp_error_message: ! get_tuple p=%u", | ||
170 | inside->ip.protocol); | ||
171 | return -NF_ACCEPT; | ||
172 | } | ||
173 | 155 | ||
174 | /* Ordinarily, we'd expect the inverted tupleproto, but it's | 156 | /* Ordinarily, we'd expect the inverted tupleproto, but it's |
175 | been preserved inside the ICMP. */ | 157 | been preserved inside the ICMP. */ |
@@ -183,25 +165,13 @@ icmp_error_message(struct sk_buff *skb, | |||
183 | 165 | ||
184 | h = nf_conntrack_find_get(&innertuple); | 166 | h = nf_conntrack_find_get(&innertuple); |
185 | if (!h) { | 167 | if (!h) { |
186 | /* Locally generated ICMPs will match inverted if they | 168 | pr_debug("icmp_error_message: no match\n"); |
187 | haven't been SNAT'ed yet */ | 169 | return -NF_ACCEPT; |
188 | /* FIXME: NAT code has to handle half-done double NAT --RR */ | ||
189 | if (hooknum == NF_IP_LOCAL_OUT) | ||
190 | h = nf_conntrack_find_get(&origtuple); | ||
191 | |||
192 | if (!h) { | ||
193 | pr_debug("icmp_error_message: no match\n"); | ||
194 | return -NF_ACCEPT; | ||
195 | } | ||
196 | |||
197 | /* Reverse direction from that found */ | ||
198 | if (NF_CT_DIRECTION(h) == IP_CT_DIR_REPLY) | ||
199 | *ctinfo += IP_CT_IS_REPLY; | ||
200 | } else { | ||
201 | if (NF_CT_DIRECTION(h) == IP_CT_DIR_REPLY) | ||
202 | *ctinfo += IP_CT_IS_REPLY; | ||
203 | } | 170 | } |
204 | 171 | ||
172 | if (NF_CT_DIRECTION(h) == IP_CT_DIR_REPLY) | ||
173 | *ctinfo += IP_CT_IS_REPLY; | ||
174 | |||
205 | /* Update skb to refer to this connection */ | 175 | /* Update skb to refer to this connection */ |
206 | skb->nfct = &nf_ct_tuplehash_to_ctrack(h)->ct_general; | 176 | skb->nfct = &nf_ct_tuplehash_to_ctrack(h)->ct_general; |
207 | skb->nfctinfo = *ctinfo; | 177 | skb->nfctinfo = *ctinfo; |
@@ -342,7 +312,7 @@ static struct ctl_table icmp_compat_sysctl_table[] = { | |||
342 | #endif /* CONFIG_NF_CONNTRACK_PROC_COMPAT */ | 312 | #endif /* CONFIG_NF_CONNTRACK_PROC_COMPAT */ |
343 | #endif /* CONFIG_SYSCTL */ | 313 | #endif /* CONFIG_SYSCTL */ |
344 | 314 | ||
345 | struct nf_conntrack_l4proto nf_conntrack_l4proto_icmp = | 315 | struct nf_conntrack_l4proto nf_conntrack_l4proto_icmp __read_mostly = |
346 | { | 316 | { |
347 | .l3proto = PF_INET, | 317 | .l3proto = PF_INET, |
348 | .l4proto = IPPROTO_ICMP, | 318 | .l4proto = IPPROTO_ICMP, |
@@ -368,4 +338,3 @@ struct nf_conntrack_l4proto nf_conntrack_l4proto_icmp = | |||
368 | #endif | 338 | #endif |
369 | #endif | 339 | #endif |
370 | }; | 340 | }; |
371 | EXPORT_SYMBOL_GPL(nf_conntrack_l4proto_icmp); | ||
diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 69f9f1ef3ef6..4e5884ac8f29 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c | |||
@@ -1398,7 +1398,9 @@ static void tcp_enter_frto_loss(struct sock *sk, int allowed_segments, int flag) | |||
1398 | * waiting for the first ACK and did not get it)... | 1398 | * waiting for the first ACK and did not get it)... |
1399 | */ | 1399 | */ |
1400 | if ((tp->frto_counter == 1) && !(flag&FLAG_DATA_ACKED)) { | 1400 | if ((tp->frto_counter == 1) && !(flag&FLAG_DATA_ACKED)) { |
1401 | tp->retrans_out += tcp_skb_pcount(skb); | 1401 | /* For some reason this R-bit might get cleared? */ |
1402 | if (TCP_SKB_CB(skb)->sacked & TCPCB_SACKED_RETRANS) | ||
1403 | tp->retrans_out += tcp_skb_pcount(skb); | ||
1402 | /* ...enter this if branch just for the first segment */ | 1404 | /* ...enter this if branch just for the first segment */ |
1403 | flag |= FLAG_DATA_ACKED; | 1405 | flag |= FLAG_DATA_ACKED; |
1404 | } else { | 1406 | } else { |
diff --git a/net/ipv4/tcp_probe.c b/net/ipv4/tcp_probe.c index 86624fabc4bf..f37d5928921a 100644 --- a/net/ipv4/tcp_probe.c +++ b/net/ipv4/tcp_probe.c | |||
@@ -111,6 +111,7 @@ static int jtcp_rcv_established(struct sock *sk, struct sk_buff *skb, | |||
111 | p->snd_una = tp->snd_una; | 111 | p->snd_una = tp->snd_una; |
112 | p->snd_cwnd = tp->snd_cwnd; | 112 | p->snd_cwnd = tp->snd_cwnd; |
113 | p->snd_wnd = tp->snd_wnd; | 113 | p->snd_wnd = tp->snd_wnd; |
114 | p->ssthresh = tcp_current_ssthresh(sk); | ||
114 | p->srtt = tp->srtt >> 3; | 115 | p->srtt = tp->srtt >> 3; |
115 | 116 | ||
116 | tcp_probe.head = (tcp_probe.head + 1) % bufsize; | 117 | tcp_probe.head = (tcp_probe.head + 1) % bufsize; |