Lines Matching refs:frag

215 	struct pf_fragment	*frag;  in pf_purge_expired_fragments()  local
219 while ((frag = TAILQ_LAST(&pf_fragqueue, pf_fragqueue)) != NULL) { in pf_purge_expired_fragments()
220 KASSERT(BUFFER_FRAGMENTS(frag)); in pf_purge_expired_fragments()
221 if (frag->fr_timeout > expire) in pf_purge_expired_fragments()
224 DPFPRINTF(("expiring %d(%p)\n", frag->fr_id, frag)); in pf_purge_expired_fragments()
225 pf_free_fragment(frag); in pf_purge_expired_fragments()
228 while ((frag = TAILQ_LAST(&pf_cachequeue, pf_cachequeue)) != NULL) { in pf_purge_expired_fragments()
229 KASSERT(!BUFFER_FRAGMENTS(frag)); in pf_purge_expired_fragments()
230 if (frag->fr_timeout > expire) in pf_purge_expired_fragments()
233 DPFPRINTF(("expiring %d(%p)\n", frag->fr_id, frag)); in pf_purge_expired_fragments()
234 pf_free_fragment(frag); in pf_purge_expired_fragments()
236 TAILQ_LAST(&pf_cachequeue, pf_cachequeue) != frag); in pf_purge_expired_fragments()
247 struct pf_fragment *frag; in pf_flush_fragments() local
254 frag = TAILQ_LAST(&pf_fragqueue, pf_fragqueue); in pf_flush_fragments()
255 if (frag == NULL) in pf_flush_fragments()
257 pf_free_fragment(frag); in pf_flush_fragments()
265 frag = TAILQ_LAST(&pf_cachequeue, pf_cachequeue); in pf_flush_fragments()
266 if (frag == NULL) in pf_flush_fragments()
268 pf_free_fragment(frag); in pf_flush_fragments()
275 pf_free_fragment(struct pf_fragment *frag) in pf_free_fragment() argument
281 if (BUFFER_FRAGMENTS(frag)) { in pf_free_fragment()
282 for (frent = LIST_FIRST(&frag->fr_queue); frent; in pf_free_fragment()
283 frent = LIST_FIRST(&frag->fr_queue)) { in pf_free_fragment()
291 for (frcache = LIST_FIRST(&frag->fr_cache); frcache; in pf_free_fragment()
292 frcache = LIST_FIRST(&frag->fr_cache)) { in pf_free_fragment()
295 KASSERT(LIST_EMPTY(&frag->fr_cache) || in pf_free_fragment()
296 LIST_FIRST(&frag->fr_cache)->fr_off > in pf_free_fragment()
304 pf_remove_fragment(frag); in pf_free_fragment()
320 struct pf_fragment *frag; in pf_find_fragment() local
324 frag = RB_FIND(pf_frag_tree, tree, &key); in pf_find_fragment()
325 if (frag != NULL) { in pf_find_fragment()
327 frag->fr_timeout = time_second; in pf_find_fragment()
328 if (BUFFER_FRAGMENTS(frag)) { in pf_find_fragment()
329 TAILQ_REMOVE(&pf_fragqueue, frag, frag_next); in pf_find_fragment()
330 TAILQ_INSERT_HEAD(&pf_fragqueue, frag, frag_next); in pf_find_fragment()
332 TAILQ_REMOVE(&pf_cachequeue, frag, frag_next); in pf_find_fragment()
333 TAILQ_INSERT_HEAD(&pf_cachequeue, frag, frag_next); in pf_find_fragment()
337 return (frag); in pf_find_fragment()
343 pf_remove_fragment(struct pf_fragment *frag) in pf_remove_fragment() argument
345 if (BUFFER_FRAGMENTS(frag)) { in pf_remove_fragment()
346 RB_REMOVE(pf_frag_tree, &pf_frag_tree, frag); in pf_remove_fragment()
347 TAILQ_REMOVE(&pf_fragqueue, frag, frag_next); in pf_remove_fragment()
348 pool_put(&pf_frag_pl, frag); in pf_remove_fragment()
350 RB_REMOVE(pf_frag_tree, &pf_cache_tree, frag); in pf_remove_fragment()
351 TAILQ_REMOVE(&pf_cachequeue, frag, frag_next); in pf_remove_fragment()
352 pool_put(&pf_cache_pl, frag); in pf_remove_fragment()
358 pf_reassemble(struct mbuf **m0, struct pf_fragment **frag, in pf_reassemble() argument
370 KASSERT(*frag == NULL || BUFFER_FRAGMENTS(*frag)); in pf_reassemble()
377 if (*frag == NULL) { in pf_reassemble()
378 *frag = pool_get(&pf_frag_pl, PR_NOWAIT); in pf_reassemble()
379 if (*frag == NULL) { in pf_reassemble()
381 *frag = pool_get(&pf_frag_pl, PR_NOWAIT); in pf_reassemble()
382 if (*frag == NULL) in pf_reassemble()
386 (*frag)->fr_flags = 0; in pf_reassemble()
387 (*frag)->fr_max = 0; in pf_reassemble()
388 (*frag)->fr_src = frent->fr_ip->ip_src; in pf_reassemble()
389 (*frag)->fr_dst = frent->fr_ip->ip_dst; in pf_reassemble()
390 (*frag)->fr_p = frent->fr_ip->ip_p; in pf_reassemble()
391 (*frag)->fr_id = frent->fr_ip->ip_id; in pf_reassemble()
392 (*frag)->fr_timeout = time_second; in pf_reassemble()
393 LIST_INIT(&(*frag)->fr_queue); in pf_reassemble()
395 RB_INSERT(pf_frag_tree, &pf_frag_tree, *frag); in pf_reassemble()
396 TAILQ_INSERT_HEAD(&pf_fragqueue, *frag, frag_next); in pf_reassemble()
407 LIST_FOREACH(frea, &(*frag)->fr_queue, fr_next) { in pf_reassemble()
462 if ((*frag)->fr_max < frmax) in pf_reassemble()
463 (*frag)->fr_max = frmax; in pf_reassemble()
466 (*frag)->fr_flags |= PFFRAG_SEENLAST; in pf_reassemble()
469 LIST_INSERT_HEAD(&(*frag)->fr_queue, frent, fr_next); in pf_reassemble()
474 if (!((*frag)->fr_flags & PFFRAG_SEENLAST)) in pf_reassemble()
479 for (frep = LIST_FIRST(&(*frag)->fr_queue); frep; frep = next) { in pf_reassemble()
483 if (off < (*frag)->fr_max && in pf_reassemble()
488 (*frag)->fr_max)); in pf_reassemble()
492 DPFPRINTF(("%d < %d?\n", off, (*frag)->fr_max)); in pf_reassemble()
493 if (off < (*frag)->fr_max) in pf_reassemble()
497 frent = LIST_FIRST(&(*frag)->fr_queue); in pf_reassemble()
501 pf_free_fragment(*frag); in pf_reassemble()
502 *frag = NULL; in pf_reassemble()
524 ip->ip_src = (*frag)->fr_src; in pf_reassemble()
525 ip->ip_dst = (*frag)->fr_dst; in pf_reassemble()
528 pf_remove_fragment(*frag); in pf_reassemble()
529 *frag = NULL; in pf_reassemble()
560 pf_fragcache(struct mbuf **m0, struct ip *h, struct pf_fragment **frag, int mff, in pf_fragcache() argument
570 KASSERT(*frag == NULL || !BUFFER_FRAGMENTS(*frag)); in pf_fragcache()
573 if (*frag == NULL) { in pf_fragcache()
574 *frag = pool_get(&pf_cache_pl, PR_NOWAIT); in pf_fragcache()
575 if (*frag == NULL) { in pf_fragcache()
577 *frag = pool_get(&pf_cache_pl, PR_NOWAIT); in pf_fragcache()
578 if (*frag == NULL) in pf_fragcache()
585 pool_put(&pf_cache_pl, *frag); in pf_fragcache()
586 *frag = NULL; in pf_fragcache()
591 (*frag)->fr_flags = PFFRAG_NOBUFFER; in pf_fragcache()
592 (*frag)->fr_max = 0; in pf_fragcache()
593 (*frag)->fr_src = h->ip_src; in pf_fragcache()
594 (*frag)->fr_dst = h->ip_dst; in pf_fragcache()
595 (*frag)->fr_p = h->ip_p; in pf_fragcache()
596 (*frag)->fr_id = h->ip_id; in pf_fragcache()
597 (*frag)->fr_timeout = time_second; in pf_fragcache()
601 LIST_INIT(&(*frag)->fr_cache); in pf_fragcache()
602 LIST_INSERT_HEAD(&(*frag)->fr_cache, cur, fr_next); in pf_fragcache()
604 RB_INSERT(pf_frag_tree, &pf_cache_tree, *frag); in pf_fragcache()
605 TAILQ_INSERT_HEAD(&pf_cachequeue, *frag, frag_next); in pf_fragcache()
617 LIST_FOREACH(fra, &(*frag)->fr_cache, fr_next) { in pf_fragcache()
807 if ((*frag)->fr_max < frmax) in pf_fragcache()
808 (*frag)->fr_max = frmax; in pf_fragcache()
812 (*frag)->fr_flags |= PFFRAG_SEENLAST; in pf_fragcache()
815 if (((*frag)->fr_flags & PFFRAG_SEENLAST) && in pf_fragcache()
816 LIST_FIRST(&(*frag)->fr_cache)->fr_off == 0 && in pf_fragcache()
817 LIST_FIRST(&(*frag)->fr_cache)->fr_end == (*frag)->fr_max) { in pf_fragcache()
820 (*frag)->fr_max)); in pf_fragcache()
821 pf_free_fragment(*frag); in pf_fragcache()
822 *frag = NULL; in pf_fragcache()
831 if (!mff && *frag != NULL) in pf_fragcache()
832 (*frag)->fr_flags |= PFFRAG_SEENLAST; in pf_fragcache()
840 if (!mff && *frag != NULL) in pf_fragcache()
841 (*frag)->fr_flags |= PFFRAG_SEENLAST; in pf_fragcache()
845 if (((*frag)->fr_flags & PFFRAG_DROP) == 0) in pf_fragcache()
848 (*frag)->fr_flags |= PFFRAG_DROP; in pf_fragcache()
862 struct pf_fragment *frag = NULL; local
946 frag = pf_find_fragment(h, &pf_frag_tree);
949 if (frag != NULL && (frag->fr_flags & PFFRAG_SEENLAST) &&
950 frmax > frag->fr_max)
965 *m0 = m = pf_reassemble(m0, &frag, frent, mff);
970 if (frag != NULL && (frag->fr_flags & PFFRAG_DROP))
994 frag = pf_find_fragment(h, &pf_cache_tree);
997 if (frag != NULL && (frag->fr_flags & PFFRAG_SEENLAST) &&
998 frmax > frag->fr_max) {
1000 frag->fr_flags |= PFFRAG_DROP;
1004 *m0 = m = pf_fragcache(m0, h, &frag, mff,
1024 if (frag != NULL && (frag->fr_flags & PFFRAG_DROP))
1085 if (frag != NULL)
1086 pf_free_fragment(frag);
1107 struct ip6_frag frag; local
1244 if (!pf_pull_hdr(m, off, &frag, sizeof(frag), NULL, NULL, AF_INET6))
1246 fragoff = ntohs(frag.ip6f_offlg & IP6F_OFF_MASK);
1247 if (fragoff + (plen - off - sizeof(frag)) > IPV6_MAXPACKET)