Lines Matching refs:fq
68 static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *skb,
74 struct frag_queue *fq; in ip6_frag_expire() local
76 fq = container_of(frag, struct frag_queue, q); in ip6_frag_expire()
78 ip6frag_expire_frag_queue(fq->q.fqdir->net, fq); in ip6_frag_expire()
104 static int ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb, in ip6_frag_queue() argument
115 if (fq->q.flags & INET_FRAG_COMPLETE) in ip6_frag_queue()
145 if (end < fq->q.len || in ip6_frag_queue()
146 ((fq->q.flags & INET_FRAG_LAST_IN) && end != fq->q.len)) in ip6_frag_queue()
148 fq->q.flags |= INET_FRAG_LAST_IN; in ip6_frag_queue()
149 fq->q.len = end; in ip6_frag_queue()
161 if (end > fq->q.len) { in ip6_frag_queue()
163 if (fq->q.flags & INET_FRAG_LAST_IN) in ip6_frag_queue()
165 fq->q.len = end; in ip6_frag_queue()
186 prev_tail = fq->q.fragments_tail; in ip6_frag_queue()
187 err = inet_frag_queue_insert(&fq->q, skb, offset, end); in ip6_frag_queue()
192 fq->iif = dev->ifindex; in ip6_frag_queue()
194 fq->q.stamp = skb->tstamp; in ip6_frag_queue()
195 fq->q.meat += skb->len; in ip6_frag_queue()
196 fq->ecn |= ecn; in ip6_frag_queue()
197 add_frag_mem_limit(fq->q.fqdir, skb->truesize); in ip6_frag_queue()
200 if (fragsize > fq->q.max_size) in ip6_frag_queue()
201 fq->q.max_size = fragsize; in ip6_frag_queue()
207 fq->nhoffset = nhoff; in ip6_frag_queue()
208 fq->q.flags |= INET_FRAG_FIRST_IN; in ip6_frag_queue()
211 if (fq->q.flags == (INET_FRAG_FIRST_IN | INET_FRAG_LAST_IN) && in ip6_frag_queue()
212 fq->q.meat == fq->q.len) { in ip6_frag_queue()
216 err = ip6_frag_reasm(fq, skb, prev_tail, dev); in ip6_frag_queue()
233 inet_frag_kill(&fq->q); in ip6_frag_queue()
248 static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *skb, in ip6_frag_reasm() argument
251 struct net *net = fq->q.fqdir->net; in ip6_frag_reasm()
257 inet_frag_kill(&fq->q); in ip6_frag_reasm()
259 ecn = ip_frag_ecn_table[fq->ecn]; in ip6_frag_reasm()
263 reasm_data = inet_frag_reasm_prepare(&fq->q, skb, prev_tail); in ip6_frag_reasm()
268 sizeof(struct ipv6hdr) + fq->q.len - in ip6_frag_reasm()
275 nhoff = fq->nhoffset; in ip6_frag_reasm()
285 inet_frag_reasm_finish(&fq->q, skb, reasm_data, true); in ip6_frag_reasm()
292 IP6CB(skb)->frag_max_size = fq->q.max_size; in ip6_frag_reasm()
301 fq->q.rb_fragments = RB_ROOT; in ip6_frag_reasm()
302 fq->q.fragments_tail = NULL; in ip6_frag_reasm()
303 fq->q.last_run_head = NULL; in ip6_frag_reasm()
315 inet_frag_kill(&fq->q); in ip6_frag_reasm()
322 struct frag_queue *fq; in ipv6_frag_rcv() local
355 fq = fq_find(net, fhdr->identification, hdr, iif); in ipv6_frag_rcv()
356 if (fq) { in ipv6_frag_rcv()
360 spin_lock(&fq->q.lock); in ipv6_frag_rcv()
362 fq->iif = iif; in ipv6_frag_rcv()
363 ret = ip6_frag_queue(fq, skb, fhdr, IP6CB(skb)->nhoff, in ipv6_frag_rcv()
366 spin_unlock(&fq->q.lock); in ipv6_frag_rcv()
367 inet_frag_put(&fq->q); in ipv6_frag_rcv()