Lines Matching refs:fq
79 static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev,
96 const struct frag_queue *fq; in ip6_hashfn() local
98 fq = container_of(q, struct frag_queue, q); in ip6_hashfn()
99 return inet6_hash_frag(fq->id, &fq->saddr, &fq->daddr); in ip6_hashfn()
104 const struct frag_queue *fq; in ip6_frag_match() local
107 fq = container_of(q, struct frag_queue, q); in ip6_frag_match()
108 return fq->id == arg->id && in ip6_frag_match()
109 fq->user == arg->user && in ip6_frag_match()
110 ipv6_addr_equal(&fq->saddr, arg->src) && in ip6_frag_match()
111 ipv6_addr_equal(&fq->daddr, arg->dst) && in ip6_frag_match()
112 (arg->iif == fq->iif || in ip6_frag_match()
120 struct frag_queue *fq = container_of(q, struct frag_queue, q); in ip6_frag_init() local
123 fq->id = arg->id; in ip6_frag_init()
124 fq->user = arg->user; in ip6_frag_init()
125 fq->saddr = *arg->src; in ip6_frag_init()
126 fq->daddr = *arg->dst; in ip6_frag_init()
127 fq->ecn = arg->ecn; in ip6_frag_init()
131 void ip6_expire_frag_queue(struct net *net, struct frag_queue *fq, in ip6_expire_frag_queue() argument
136 spin_lock(&fq->q.lock); in ip6_expire_frag_queue()
138 if (fq->q.flags & INET_FRAG_COMPLETE) in ip6_expire_frag_queue()
141 inet_frag_kill(&fq->q, frags); in ip6_expire_frag_queue()
144 dev = dev_get_by_index_rcu(net, fq->iif); in ip6_expire_frag_queue()
150 if (fq->q.flags & INET_FRAG_EVICTED) in ip6_expire_frag_queue()
156 if (!(fq->q.flags & INET_FRAG_FIRST_IN) || !fq->q.fragments) in ip6_expire_frag_queue()
163 fq->q.fragments->dev = dev; in ip6_expire_frag_queue()
164 icmpv6_send(fq->q.fragments, ICMPV6_TIME_EXCEED, ICMPV6_EXC_FRAGTIME, 0); in ip6_expire_frag_queue()
168 spin_unlock(&fq->q.lock); in ip6_expire_frag_queue()
169 inet_frag_put(&fq->q, frags); in ip6_expire_frag_queue()
175 struct frag_queue *fq; in ip6_frag_expire() local
178 fq = container_of((struct inet_frag_queue *)data, struct frag_queue, q); in ip6_frag_expire()
179 net = container_of(fq->q.net, struct net, ipv6.frags); in ip6_frag_expire()
181 ip6_expire_frag_queue(net, fq, &ip6_frags); in ip6_frag_expire()
209 static int ip6_frag_queue(struct frag_queue *fq, struct sk_buff *skb, in ip6_frag_queue() argument
218 if (fq->q.flags & INET_FRAG_COMPLETE) in ip6_frag_queue()
248 if (end < fq->q.len || in ip6_frag_queue()
249 ((fq->q.flags & INET_FRAG_LAST_IN) && end != fq->q.len)) in ip6_frag_queue()
251 fq->q.flags |= INET_FRAG_LAST_IN; in ip6_frag_queue()
252 fq->q.len = end; in ip6_frag_queue()
267 if (end > fq->q.len) { in ip6_frag_queue()
269 if (fq->q.flags & INET_FRAG_LAST_IN) in ip6_frag_queue()
271 fq->q.len = end; in ip6_frag_queue()
289 prev = fq->q.fragments_tail; in ip6_frag_queue()
295 for (next = fq->q.fragments; next != NULL; next = next->next) { in ip6_frag_queue()
323 fq->q.fragments_tail = skb; in ip6_frag_queue()
327 fq->q.fragments = skb; in ip6_frag_queue()
331 fq->iif = dev->ifindex; in ip6_frag_queue()
334 fq->q.stamp = skb->tstamp; in ip6_frag_queue()
335 fq->q.meat += skb->len; in ip6_frag_queue()
336 fq->ecn |= ecn; in ip6_frag_queue()
337 add_frag_mem_limit(&fq->q, skb->truesize); in ip6_frag_queue()
343 fq->nhoffset = nhoff; in ip6_frag_queue()
344 fq->q.flags |= INET_FRAG_FIRST_IN; in ip6_frag_queue()
347 if (fq->q.flags == (INET_FRAG_FIRST_IN | INET_FRAG_LAST_IN) && in ip6_frag_queue()
348 fq->q.meat == fq->q.len) { in ip6_frag_queue()
353 res = ip6_frag_reasm(fq, prev, dev); in ip6_frag_queue()
362 inet_frag_kill(&fq->q, &ip6_frags); in ip6_frag_queue()
379 static int ip6_frag_reasm(struct frag_queue *fq, struct sk_buff *prev, in ip6_frag_reasm() argument
382 struct net *net = container_of(fq->q.net, struct net, ipv6.frags); in ip6_frag_reasm()
383 struct sk_buff *fp, *head = fq->q.fragments; in ip6_frag_reasm()
389 inet_frag_kill(&fq->q, &ip6_frags); in ip6_frag_reasm()
391 ecn = ip_frag_ecn_table[fq->ecn]; in ip6_frag_reasm()
405 fq->q.fragments_tail = fp; in ip6_frag_reasm()
408 skb_morph(head, fq->q.fragments); in ip6_frag_reasm()
409 head->next = fq->q.fragments->next; in ip6_frag_reasm()
411 consume_skb(fq->q.fragments); in ip6_frag_reasm()
412 fq->q.fragments = head; in ip6_frag_reasm()
420 sizeof(struct ipv6hdr) + fq->q.len - in ip6_frag_reasm()
450 add_frag_mem_limit(&fq->q, clone->truesize); in ip6_frag_reasm()
455 nhoff = fq->nhoffset; in ip6_frag_reasm()
488 sub_frag_mem_limit(&fq->q, sum_truesize); in ip6_frag_reasm()
492 head->tstamp = fq->q.stamp; in ip6_frag_reasm()
507 fq->q.fragments = NULL; in ip6_frag_reasm()
508 fq->q.fragments_tail = NULL; in ip6_frag_reasm()
526 struct frag_queue *fq; in ipv6_frag_rcv() local
557 fq = fq_find(net, fhdr->identification, &hdr->saddr, &hdr->daddr, in ipv6_frag_rcv()
559 if (fq) { in ipv6_frag_rcv()
562 spin_lock(&fq->q.lock); in ipv6_frag_rcv()
564 ret = ip6_frag_queue(fq, skb, fhdr, IP6CB(skb)->nhoff); in ipv6_frag_rcv()
566 spin_unlock(&fq->q.lock); in ipv6_frag_rcv()
567 inet_frag_put(&fq->q, &ip6_frags); in ipv6_frag_rcv()