Lines Matching refs:fq
37 static int lowpan_frag_reasm(struct lowpan_frag_queue *fq,
53 const struct lowpan_frag_queue *fq; in lowpan_hashfn() local
55 fq = container_of(q, struct lowpan_frag_queue, q); in lowpan_hashfn()
56 return lowpan_hash_frag(fq->tag, fq->d_size, &fq->saddr, &fq->daddr); in lowpan_hashfn()
61 const struct lowpan_frag_queue *fq; in lowpan_frag_match() local
64 fq = container_of(q, struct lowpan_frag_queue, q); in lowpan_frag_match()
65 return fq->tag == arg->tag && fq->d_size == arg->d_size && in lowpan_frag_match()
66 ieee802154_addr_equal(&fq->saddr, arg->src) && in lowpan_frag_match()
67 ieee802154_addr_equal(&fq->daddr, arg->dst); in lowpan_frag_match()
73 struct lowpan_frag_queue *fq; in lowpan_frag_init() local
75 fq = container_of(q, struct lowpan_frag_queue, q); in lowpan_frag_init()
77 fq->tag = arg->tag; in lowpan_frag_init()
78 fq->d_size = arg->d_size; in lowpan_frag_init()
79 fq->saddr = *arg->src; in lowpan_frag_init()
80 fq->daddr = *arg->dst; in lowpan_frag_init()
85 struct frag_queue *fq; in lowpan_frag_expire() local
88 fq = container_of((struct inet_frag_queue *)data, struct frag_queue, q); in lowpan_frag_expire()
89 net = container_of(fq->q.net, struct net, ieee802154_lowpan.frags); in lowpan_frag_expire()
91 spin_lock(&fq->q.lock); in lowpan_frag_expire()
93 if (fq->q.flags & INET_FRAG_COMPLETE) in lowpan_frag_expire()
96 inet_frag_kill(&fq->q, &lowpan_frags); in lowpan_frag_expire()
98 spin_unlock(&fq->q.lock); in lowpan_frag_expire()
99 inet_frag_put(&fq->q, &lowpan_frags); in lowpan_frag_expire()
129 static int lowpan_frag_queue(struct lowpan_frag_queue *fq, in lowpan_frag_queue() argument
136 if (fq->q.flags & INET_FRAG_COMPLETE) in lowpan_frag_queue()
147 if (end < fq->q.len || in lowpan_frag_queue()
148 ((fq->q.flags & INET_FRAG_LAST_IN) && end != fq->q.len)) in lowpan_frag_queue()
150 fq->q.flags |= INET_FRAG_LAST_IN; in lowpan_frag_queue()
151 fq->q.len = end; in lowpan_frag_queue()
153 if (end > fq->q.len) { in lowpan_frag_queue()
155 if (fq->q.flags & INET_FRAG_LAST_IN) in lowpan_frag_queue()
157 fq->q.len = end; in lowpan_frag_queue()
165 prev = fq->q.fragments_tail; in lowpan_frag_queue()
173 for (next = fq->q.fragments; next != NULL; next = next->next) { in lowpan_frag_queue()
184 fq->q.fragments_tail = skb; in lowpan_frag_queue()
188 fq->q.fragments = skb; in lowpan_frag_queue()
194 fq->q.stamp = skb->tstamp; in lowpan_frag_queue()
196 fq->q.flags |= INET_FRAG_FIRST_IN; in lowpan_frag_queue()
198 fq->q.meat += skb->len; in lowpan_frag_queue()
199 add_frag_mem_limit(fq->q.net, skb->truesize); in lowpan_frag_queue()
201 if (fq->q.flags == (INET_FRAG_FIRST_IN | INET_FRAG_LAST_IN) && in lowpan_frag_queue()
202 fq->q.meat == fq->q.len) { in lowpan_frag_queue()
207 res = lowpan_frag_reasm(fq, prev, ldev); in lowpan_frag_queue()
226 static int lowpan_frag_reasm(struct lowpan_frag_queue *fq, struct sk_buff *prev, in lowpan_frag_reasm() argument
229 struct sk_buff *fp, *head = fq->q.fragments; in lowpan_frag_reasm()
232 inet_frag_kill(&fq->q, &lowpan_frags); in lowpan_frag_reasm()
244 fq->q.fragments_tail = fp; in lowpan_frag_reasm()
247 skb_morph(head, fq->q.fragments); in lowpan_frag_reasm()
248 head->next = fq->q.fragments->next; in lowpan_frag_reasm()
250 consume_skb(fq->q.fragments); in lowpan_frag_reasm()
251 fq->q.fragments = head; in lowpan_frag_reasm()
279 add_frag_mem_limit(fq->q.net, clone->truesize); in lowpan_frag_reasm()
302 sub_frag_mem_limit(fq->q.net, sum_truesize); in lowpan_frag_reasm()
306 head->tstamp = fq->q.stamp; in lowpan_frag_reasm()
308 fq->q.fragments = NULL; in lowpan_frag_reasm()
309 fq->q.fragments_tail = NULL; in lowpan_frag_reasm()
408 struct lowpan_frag_queue *fq; in lowpan_frag_rcv() local
432 fq = fq_find(net, cb, &hdr.source, &hdr.dest); in lowpan_frag_rcv()
433 if (fq != NULL) { in lowpan_frag_rcv()
436 spin_lock(&fq->q.lock); in lowpan_frag_rcv()
437 ret = lowpan_frag_queue(fq, skb, frag_type); in lowpan_frag_rcv()
438 spin_unlock(&fq->q.lock); in lowpan_frag_rcv()
440 inet_frag_put(&fq->q, &lowpan_frags); in lowpan_frag_rcv()