diff options
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/reassembly.c | 15 |
1 files changed, 8 insertions, 7 deletions
diff --git a/net/ipv6/reassembly.c b/net/ipv6/reassembly.c index b4baceed0d0d..beb6872a8fa5 100644 --- a/net/ipv6/reassembly.c +++ b/net/ipv6/reassembly.c | |||
@@ -141,19 +141,20 @@ void ip6_expire_frag_queue(struct net *net, struct frag_queue *fq, | |||
141 | if (!dev) | 141 | if (!dev) |
142 | goto out_rcu_unlock; | 142 | goto out_rcu_unlock; |
143 | 143 | ||
144 | if (!(fq->q.flags & INET_FRAG_EVICTED)) | ||
145 | IP6_INC_STATS_BH(net, __in6_dev_get(dev), | ||
146 | IPSTATS_MIB_REASMTIMEOUT); | ||
147 | IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMFAILS); | 144 | IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMFAILS); |
148 | 145 | ||
146 | if (fq->q.flags & INET_FRAG_EVICTED) | ||
147 | goto out_rcu_unlock; | ||
148 | |||
149 | IP6_INC_STATS_BH(net, __in6_dev_get(dev), IPSTATS_MIB_REASMTIMEOUT); | ||
150 | |||
149 | /* Don't send error if the first segment did not arrive. */ | 151 | /* Don't send error if the first segment did not arrive. */ |
150 | if (!(fq->q.flags & INET_FRAG_FIRST_IN) || !fq->q.fragments) | 152 | if (!(fq->q.flags & INET_FRAG_FIRST_IN) || !fq->q.fragments) |
151 | goto out_rcu_unlock; | 153 | goto out_rcu_unlock; |
152 | 154 | ||
153 | /* | 155 | /* But use as source device on which LAST ARRIVED |
154 | But use as source device on which LAST ARRIVED | 156 | * segment was received. And do not use fq->dev |
155 | segment was received. And do not use fq->dev | 157 | * pointer directly, device might already disappeared. |
156 | pointer directly, device might already disappeared. | ||
157 | */ | 158 | */ |
158 | fq->q.fragments->dev = dev; | 159 | fq->q.fragments->dev = dev; |
159 | icmpv6_send(fq->q.fragments, ICMPV6_TIME_EXCEED, ICMPV6_EXC_FRAGTIME, 0); | 160 | icmpv6_send(fq->q.fragments, ICMPV6_TIME_EXCEED, ICMPV6_EXC_FRAGTIME, 0); |