diff options
Diffstat (limited to 'net/ipv4/ip_input.c')
| -rw-r--r-- | net/ipv4/ip_input.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/net/ipv4/ip_input.c b/net/ipv4/ip_input.c index 3d4da2c16b6a..2db4c8773c1b 100644 --- a/net/ipv4/ip_input.c +++ b/net/ipv4/ip_input.c | |||
| @@ -187,7 +187,7 @@ bool ip_call_ra_chain(struct sk_buff *skb) | |||
| 187 | return false; | 187 | return false; |
| 188 | } | 188 | } |
| 189 | 189 | ||
| 190 | static int ip_local_deliver_finish(struct sk_buff *skb) | 190 | static int ip_local_deliver_finish(struct sock *sk, struct sk_buff *skb) |
| 191 | { | 191 | { |
| 192 | struct net *net = dev_net(skb->dev); | 192 | struct net *net = dev_net(skb->dev); |
| 193 | 193 | ||
| @@ -203,7 +203,7 @@ static int ip_local_deliver_finish(struct sk_buff *skb) | |||
| 203 | raw = raw_local_deliver(skb, protocol); | 203 | raw = raw_local_deliver(skb, protocol); |
| 204 | 204 | ||
| 205 | ipprot = rcu_dereference(inet_protos[protocol]); | 205 | ipprot = rcu_dereference(inet_protos[protocol]); |
| 206 | if (ipprot != NULL) { | 206 | if (ipprot) { |
| 207 | int ret; | 207 | int ret; |
| 208 | 208 | ||
| 209 | if (!ipprot->no_policy) { | 209 | if (!ipprot->no_policy) { |
| @@ -253,7 +253,8 @@ int ip_local_deliver(struct sk_buff *skb) | |||
| 253 | return 0; | 253 | return 0; |
| 254 | } | 254 | } |
| 255 | 255 | ||
| 256 | return NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_IN, skb, skb->dev, NULL, | 256 | return NF_HOOK(NFPROTO_IPV4, NF_INET_LOCAL_IN, NULL, skb, |
| 257 | skb->dev, NULL, | ||
| 257 | ip_local_deliver_finish); | 258 | ip_local_deliver_finish); |
| 258 | } | 259 | } |
| 259 | 260 | ||
| @@ -309,12 +310,12 @@ drop: | |||
| 309 | int sysctl_ip_early_demux __read_mostly = 1; | 310 | int sysctl_ip_early_demux __read_mostly = 1; |
| 310 | EXPORT_SYMBOL(sysctl_ip_early_demux); | 311 | EXPORT_SYMBOL(sysctl_ip_early_demux); |
| 311 | 312 | ||
| 312 | static int ip_rcv_finish(struct sk_buff *skb) | 313 | static int ip_rcv_finish(struct sock *sk, struct sk_buff *skb) |
| 313 | { | 314 | { |
| 314 | const struct iphdr *iph = ip_hdr(skb); | 315 | const struct iphdr *iph = ip_hdr(skb); |
| 315 | struct rtable *rt; | 316 | struct rtable *rt; |
| 316 | 317 | ||
| 317 | if (sysctl_ip_early_demux && !skb_dst(skb) && skb->sk == NULL) { | 318 | if (sysctl_ip_early_demux && !skb_dst(skb) && !skb->sk) { |
| 318 | const struct net_protocol *ipprot; | 319 | const struct net_protocol *ipprot; |
| 319 | int protocol = iph->protocol; | 320 | int protocol = iph->protocol; |
| 320 | 321 | ||
| @@ -387,7 +388,8 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, | |||
| 387 | 388 | ||
| 388 | IP_UPD_PO_STATS_BH(dev_net(dev), IPSTATS_MIB_IN, skb->len); | 389 | IP_UPD_PO_STATS_BH(dev_net(dev), IPSTATS_MIB_IN, skb->len); |
| 389 | 390 | ||
| 390 | if ((skb = skb_share_check(skb, GFP_ATOMIC)) == NULL) { | 391 | skb = skb_share_check(skb, GFP_ATOMIC); |
| 392 | if (!skb) { | ||
| 391 | IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_INDISCARDS); | 393 | IP_INC_STATS_BH(dev_net(dev), IPSTATS_MIB_INDISCARDS); |
| 392 | goto out; | 394 | goto out; |
| 393 | } | 395 | } |
| @@ -450,7 +452,8 @@ int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, | |||
| 450 | /* Must drop socket now because of tproxy. */ | 452 | /* Must drop socket now because of tproxy. */ |
| 451 | skb_orphan(skb); | 453 | skb_orphan(skb); |
| 452 | 454 | ||
| 453 | return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, skb, dev, NULL, | 455 | return NF_HOOK(NFPROTO_IPV4, NF_INET_PRE_ROUTING, NULL, skb, |
| 456 | dev, NULL, | ||
| 454 | ip_rcv_finish); | 457 | ip_rcv_finish); |
| 455 | 458 | ||
| 456 | csum_error: | 459 | csum_error: |
