Lines Matching refs:fq
72 static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev,
78 struct frag_queue *fq; in ip6_frag_expire() local
81 fq = container_of(frag, struct frag_queue, q); in ip6_frag_expire()
82 net = container_of(fq->q.net, struct net, ipv6.frags); in ip6_frag_expire()
84 ip6frag_expire_frag_queue(net, fq); in ip6_frag_expire()
110 static int ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb, in ip6_frag_queue() argument
120 if (fq->q.flags & INET_FRAG_COMPLETE) in ip6_frag_queue()
146 if (end < fq->q.len || in ip6_frag_queue()
147 ((fq->q.flags & INET_FRAG_LAST_IN) && end != fq->q.len)) in ip6_frag_queue()
149 fq->q.flags |= INET_FRAG_LAST_IN; in ip6_frag_queue()
150 fq->q.len = end; in ip6_frag_queue()
162 if (end > fq->q.len) { in ip6_frag_queue()
164 if (fq->q.flags & INET_FRAG_LAST_IN) in ip6_frag_queue()
166 fq->q.len = end; in ip6_frag_queue()
184 prev = fq->q.fragments_tail; in ip6_frag_queue()
190 for (next = fq->q.fragments; next != NULL; next = next->next) { in ip6_frag_queue()
216 fq->iif = dev->ifindex; in ip6_frag_queue()
224 fq->q.fragments_tail = skb; in ip6_frag_queue()
228 fq->q.fragments = skb; in ip6_frag_queue()
230 fq->q.stamp = skb->tstamp; in ip6_frag_queue()
231 fq->q.meat += skb->len; in ip6_frag_queue()
232 fq->ecn |= ecn; in ip6_frag_queue()
233 add_frag_mem_limit(fq->q.net, skb->truesize); in ip6_frag_queue()
236 if (fragsize > fq->q.max_size) in ip6_frag_queue()
237 fq->q.max_size = fragsize; in ip6_frag_queue()
243 fq->nhoffset = nhoff; in ip6_frag_queue()
244 fq->q.flags |= INET_FRAG_FIRST_IN; in ip6_frag_queue()
247 if (fq->q.flags == (INET_FRAG_FIRST_IN | INET_FRAG_LAST_IN) && in ip6_frag_queue()
248 fq->q.meat == fq->q.len) { in ip6_frag_queue()
253 res = ip6_frag_reasm(fq, prev, dev); in ip6_frag_queue()
262 inet_frag_kill(&fq->q); in ip6_frag_queue()
279 static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, in ip6_frag_reasm() argument
282 struct net *net = container_of(fq->q.net, struct net, ipv6.frags); in ip6_frag_reasm()
283 struct sk_buff *fp, *head = fq->q.fragments; in ip6_frag_reasm()
289 inet_frag_kill(&fq->q); in ip6_frag_reasm()
291 ecn = ip_frag_ecn_table[fq->ecn]; in ip6_frag_reasm()
305 fq->q.fragments_tail = fp; in ip6_frag_reasm()
308 skb_morph(head, fq->q.fragments); in ip6_frag_reasm()
309 head->next = fq->q.fragments->next; in ip6_frag_reasm()
311 consume_skb(fq->q.fragments); in ip6_frag_reasm()
312 fq->q.fragments = head; in ip6_frag_reasm()
320 sizeof(struct ipv6hdr) + fq->q.len - in ip6_frag_reasm()
350 add_frag_mem_limit(fq->q.net, clone->truesize); in ip6_frag_reasm()
355 nhoff = fq->nhoffset; in ip6_frag_reasm()
389 sub_frag_mem_limit(fq->q.net, sum_truesize); in ip6_frag_reasm()
393 head->tstamp = fq->q.stamp; in ip6_frag_reasm()
398 IP6CB(head)->frag_max_size = fq->q.max_size; in ip6_frag_reasm()
407 fq->q.fragments = NULL; in ip6_frag_reasm()
408 fq->q.rb_fragments = RB_ROOT; in ip6_frag_reasm()
409 fq->q.fragments_tail = NULL; in ip6_frag_reasm()
427 struct frag_queue *fq; in ipv6_frag_rcv() local
464 fq = fq_find(net, fhdr->identification, hdr, iif); in ipv6_frag_rcv()
465 if (fq) { in ipv6_frag_rcv()
469 spin_lock(&fq->q.lock); in ipv6_frag_rcv()
471 fq->iif = iif; in ipv6_frag_rcv()
472 ret = ip6_frag_queue(fq, skb, fhdr, IP6CB(skb)->nhoff, in ipv6_frag_rcv()
475 spin_unlock(&fq->q.lock); in ipv6_frag_rcv()
476 inet_frag_put(&fq->q); in ipv6_frag_rcv()