• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /macosx-10.10/xnu-2782.1.97/bsd/net/

Lines Matching defs:frag

308 	struct pf_fragment *frag;
312 while ((frag = TAILQ_LAST(&pf_fragqueue, pf_fragqueue)) != NULL) {
313 VERIFY(BUFFER_FRAGMENTS(frag));
314 if (frag->fr_timeout > expire)
317 switch (frag->fr_af) {
320 ntohs(frag->fr_id),
321 (uint64_t)VM_KERNEL_ADDRPERM(frag)));
325 ntohl(frag->fr_id6),
326 (uint64_t)VM_KERNEL_ADDRPERM(frag)));
332 pf_free_fragment(frag);
335 while ((frag = TAILQ_LAST(&pf_cachequeue, pf_cachequeue)) != NULL) {
336 VERIFY(!BUFFER_FRAGMENTS(frag));
337 if (frag->fr_timeout > expire)
340 switch (frag->fr_af) {
343 ntohs(frag->fr_id),
344 (uint64_t)VM_KERNEL_ADDRPERM(frag)));
348 ntohl(frag->fr_id6),
349 (uint64_t)VM_KERNEL_ADDRPERM(frag)));
355 pf_free_fragment(frag);
357 TAILQ_LAST(&pf_cachequeue, pf_cachequeue) != frag);
368 struct pf_fragment *frag;
375 frag = TAILQ_LAST(&pf_fragqueue, pf_fragqueue);
376 if (frag == NULL)
378 pf_free_fragment(frag);
386 frag = TAILQ_LAST(&pf_cachequeue, pf_cachequeue);
387 if (frag == NULL)
389 pf_free_fragment(frag);
396 pf_free_fragment(struct pf_fragment *frag)
402 if (BUFFER_FRAGMENTS(frag)) {
403 for (frent = LIST_FIRST(&frag->fr_queue); frent;
404 frent = LIST_FIRST(&frag->fr_queue)) {
412 for (frcache = LIST_FIRST(&frag->fr_cache); frcache;
413 frcache = LIST_FIRST(&frag->fr_cache)) {
416 VERIFY(LIST_EMPTY(&frag->fr_cache) ||
417 LIST_FIRST(&frag->fr_cache)->fr_off >
425 pf_remove_fragment(frag);
452 struct pf_fragment *frag;
454 frag = RB_FIND(pf_frag_tree, tree, key);
455 if (frag != NULL) {
457 frag->fr_timeout = pf_time_second();
458 if (BUFFER_FRAGMENTS(frag)) {
459 TAILQ_REMOVE(&pf_fragqueue, frag, frag_next);
460 TAILQ_INSERT_HEAD(&pf_fragqueue, frag, frag_next);
462 TAILQ_REMOVE(&pf_cachequeue, frag, frag_next);
463 TAILQ_INSERT_HEAD(&pf_cachequeue, frag, frag_next);
467 return (frag);
490 pf_remove_fragment(struct pf_fragment *frag)
492 if (BUFFER_FRAGMENTS(frag)) {
493 RB_REMOVE(pf_frag_tree, &pf_frag_tree, frag);
494 TAILQ_REMOVE(&pf_fragqueue, frag, frag_next);
495 pool_put(&pf_frag_pl, frag);
497 RB_REMOVE(pf_frag_tree, &pf_cache_tree, frag);
498 TAILQ_REMOVE(&pf_cachequeue, frag, frag_next);
499 pool_put(&pf_cache_pl, frag);
505 pf_reassemble(struct mbuf **m0, struct pf_fragment **frag,
517 VERIFY(*frag == NULL || BUFFER_FRAGMENTS(*frag));
524 if (*frag == NULL) {
525 *frag = pool_get(&pf_frag_pl, PR_NOWAIT);
526 if (*frag == NULL) {
528 *frag = pool_get(&pf_frag_pl, PR_NOWAIT);
529 if (*frag == NULL)
533 (*frag)->fr_flags = 0;
534 (*frag)->fr_max = 0;
535 (*frag)->fr_af = AF_INET;
536 (*frag)->fr_srcx.v4 = frent->fr_ip->ip_src;
537 (*frag)->fr_dstx.v4 = frent->fr_ip->ip_dst;
538 (*frag)->fr_p = frent->fr_ip->ip_p;
539 (*frag)->fr_id = frent->fr_ip->ip_id;
540 (*frag)->fr_timeout = pf_time_second();
541 LIST_INIT(&(*frag)->fr_queue);
543 RB_INSERT(pf_frag_tree, &pf_frag_tree, *frag);
544 TAILQ_INSERT_HEAD(&pf_fragqueue, *frag, frag_next);
555 LIST_FOREACH(frea, &(*frag)->fr_queue, fr_next) {
607 if ((*frag)->fr_max < fr_max)
608 (*frag)->fr_max = fr_max;
611 (*frag)->fr_flags |= PFFRAG_SEENLAST;
614 LIST_INSERT_HEAD(&(*frag)->fr_queue, frent, fr_next);
619 if (!((*frag)->fr_flags & PFFRAG_SEENLAST))
624 for (frep = LIST_FIRST(&(*frag)->fr_queue); frep; frep = next) {
628 if (off < (*frag)->fr_max &&
632 (*frag)->fr_max));
636 DPFPRINTF(("%d < %d?\n", off, (*frag)->fr_max));
637 if (off < (*frag)->fr_max)
641 frent = LIST_FIRST(&(*frag)->fr_queue);
645 pf_free_fragment(*frag);
646 *frag = NULL;
668 ip->ip_src = (*frag)->fr_srcx.v4;
669 ip->ip_dst = (*frag)->fr_dstx.v4;
672 pf_remove_fragment(*frag);
673 *frag = NULL;
702 pf_fragcache(struct mbuf **m0, struct ip *h, struct pf_fragment **frag, int mff,
712 VERIFY(*frag == NULL || !BUFFER_FRAGMENTS(*frag));
715 if (*frag == NULL) {
716 *frag = pool_get(&pf_cache_pl, PR_NOWAIT);
717 if (*frag == NULL) {
719 *frag = pool_get(&pf_cache_pl, PR_NOWAIT);
720 if (*frag == NULL)
727 pool_put(&pf_cache_pl, *frag);
728 *frag = NULL;
733 (*frag)->fr_flags = PFFRAG_NOBUFFER;
734 (*frag)->fr_max = 0;
735 (*frag)->fr_af = AF_INET;
736 (*frag)->fr_srcx.v4 = h->ip_src;
737 (*frag)->fr_dstx.v4 = h->ip_dst;
738 (*frag)->fr_p = h->ip_p;
739 (*frag)->fr_id = h->ip_id;
740 (*frag)->fr_timeout = pf_time_second();
744 LIST_INIT(&(*frag)->fr_cache);
745 LIST_INSERT_HEAD(&(*frag)->fr_cache, cur, fr_next);
747 RB_INSERT(pf_frag_tree, &pf_cache_tree, *frag);
748 TAILQ_INSERT_HEAD(&pf_cachequeue, *frag, frag_next);
761 LIST_FOREACH(fra, &(*frag)->fr_cache, fr_next) {
799 /* Update the previous frag to encompass this one */
945 * free the overall descriptor. Thus we drop the frag late.
953 if ((*frag)->fr_max < fr_max)
954 (*frag)->fr_max = fr_max;
958 (*frag)->fr_flags |= PFFRAG_SEENLAST;
961 if (((*frag)->fr_flags & PFFRAG_SEENLAST) &&
962 LIST_FIRST(&(*frag)->fr_cache)->fr_off == 0 &&
963 LIST_FIRST(&(*frag)->fr_cache)->fr_end == (*frag)->fr_max) {
966 (*frag)->fr_max));
967 pf_free_fragment(*frag);
968 *frag = NULL;
977 if (!mff && *frag != NULL)
978 (*frag)->fr_flags |= PFFRAG_SEENLAST;
986 if (!mff && *frag != NULL)
987 (*frag)->fr_flags |= PFFRAG_SEENLAST;
991 if (((*frag)->fr_flags & PFFRAG_DROP) == 0)
994 (*frag)->fr_flags |= PFFRAG_DROP;
1005 pf_reassemble6(struct mbuf **m0, struct pf_fragment **frag,
1013 VERIFY(*frag == NULL || BUFFER_FRAGMENTS(*frag));
1021 DPFPRINTF(("0x%llx IPv6 frag plen %u off %u fr_ip6f_hlen %u "
1030 if (*frag == NULL) {
1031 *frag = pool_get(&pf_frag_pl, PR_NOWAIT);
1032 if (*frag == NULL) {
1034 *frag = pool_get(&pf_frag_pl, PR_NOWAIT);
1035 if (*frag == NULL)
1039 (*frag)->fr_flags = 0;
1040 (*frag)->fr_max = 0;
1041 (*frag)->fr_af = AF_INET6;
1042 (*frag)->fr_srcx.v6 = frent->fr_ip6->ip6_src;
1043 (*frag)->fr_dstx.v6 = frent->fr_ip6->ip6_dst;
1044 (*frag)->fr_p = frent->fr_ip6f_opt.ip6f_nxt;
1045 (*frag)->fr_id6 = frent->fr_ip6f_opt.ip6f_ident;
1046 (*frag)->fr_timeout = pf_time_second();
1047 LIST_INIT(&(*frag)->fr_queue);
1049 RB_INSERT(pf_frag_tree, &pf_frag_tree, *frag);
1050 TAILQ_INSERT_HEAD(&pf_fragqueue, *frag, frag_next);
1061 LIST_FOREACH(frea, &(*frag)->fr_queue, fr_next) {
1114 if ((*frag)->fr_max < fr_max)
1115 (*frag)->fr_max = fr_max;
1118 (*frag)->fr_flags |= PFFRAG_SEENLAST;
1121 LIST_INSERT_HEAD(&(*frag)->fr_queue, frent, fr_next);
1126 if (!((*frag)->fr_flags & PFFRAG_SEENLAST))
1131 for (frep = LIST_FIRST(&(*frag)->fr_queue); frep; frep = next) {
1136 (*frag)->fr_max));
1137 if (off < (*frag)->fr_max &&
1141 (*frag)->fr_max));
1145 DPFPRINTF(("%d < %d?\n", off, (*frag)->fr_max));
1146 if (off < (*frag)->fr_max)
1150 frent = LIST_FIRST(&(*frag)->fr_queue);
1154 pf_free_fragment(*frag);
1155 *frag = NULL;
1160 ip6->ip6_nxt = (*frag)->fr_p;
1162 ip6->ip6_src = (*frag)->fr_srcx.v6;
1163 ip6->ip6_dst = (*frag)->fr_dstx.v6;
1166 pf_remove_fragment(*frag);
1167 *frag = NULL;
1210 struct pf_fragment **frag, int hlen, int mff, int drop, int *nomem)
1217 VERIFY(*frag == NULL || !BUFFER_FRAGMENTS(*frag));
1245 if (*frag == NULL) {
1246 *frag = pool_get(&pf_cache_pl, PR_NOWAIT);
1247 if (*frag == NULL) {
1249 *frag = pool_get(&pf_cache_pl, PR_NOWAIT);
1250 if (*frag == NULL)
1257 pool_put(&pf_cache_pl, *frag);
1258 *frag = NULL;
1263 (*frag)->fr_flags = PFFRAG_NOBUFFER;
1264 (*frag)->fr_max = 0;
1265 (*frag)->fr_af = AF_INET6;
1266 (*frag)->fr_srcx.v6 = h->ip6_src;
1267 (*frag)->fr_dstx.v6 = h->ip6_dst;
1268 (*frag)->fr_p = fh->ip6f_nxt;
1269 (*frag)->fr_id6 = fh->ip6f_ident;
1270 (*frag)->fr_timeout = pf_time_second();
1274 LIST_INIT(&(*frag)->fr_cache);
1275 LIST_INSERT_HEAD(&(*frag)->fr_cache, cur, fr_next);
1277 RB_INSERT(pf_frag_tree, &pf_cache_tree, *frag);
1278 TAILQ_INSERT_HEAD(&pf_cachequeue, *frag, frag_next);
1291 LIST_FOREACH(fra, &(*frag)->fr_cache, fr_next) {
1330 /* Update the previous frag to encompass this one */
1477 * free the overall descriptor. Thus we drop the frag late.
1484 if ((*frag)->fr_max < fr_max)
1485 (*frag)->fr_max = fr_max;
1489 (*frag)->fr_flags |= PFFRAG_SEENLAST;
1492 if (((*frag)->fr_flags & PFFRAG_SEENLAST) &&
1493 LIST_FIRST(&(*frag)->fr_cache)->fr_off == 0 &&
1494 LIST_FIRST(&(*frag)->fr_cache)->fr_end == (*frag)->fr_max) {
1497 ntohl(fh->ip6f_ident), (*frag)->fr_max));
1498 pf_free_fragment(*frag);
1499 *frag = NULL;
1508 if (!mff && *frag != NULL)
1509 (*frag)->fr_flags |= PFFRAG_SEENLAST;
1517 if (!mff && *frag != NULL)
1518 (*frag)->fr_flags |= PFFRAG_SEENLAST;
1522 if (((*frag)->fr_flags & PFFRAG_DROP) == 0)
1525 (*frag)->fr_flags |= PFFRAG_DROP;
1539 struct pf_fragment *frag = NULL;
1636 frag = pf_find_fragment_by_ipv4_header(h, &pf_frag_tree);
1638 if (frag != NULL && (frag->fr_flags & PFFRAG_SEENLAST) &&
1639 fr_max > frag->fr_max)
1653 DPFPRINTF(("reass IPv4 frag %d @ %d-%d\n", ntohs(h->ip_id),
1655 *m0 = m = pf_reassemble(m0, &frag, frent, mff);
1674 if (frag != NULL && (frag->fr_flags & PFFRAG_DROP))
1691 frag = pf_find_fragment_by_ipv4_header(h, &pf_cache_tree);
1694 if (frag != NULL && (frag->fr_flags & PFFRAG_SEENLAST) &&
1695 fr_max > frag->fr_max) {
1697 frag->fr_flags |= PFFRAG_DROP;
1701 *m0 = m = pf_fragcache(m0, h, &frag, mff,
1726 if (frag != NULL && (frag->fr_flags & PFFRAG_DROP))
1788 if (frag != NULL)
1789 pf_free_fragment(frag);
1815 struct ip6_frag frag;
1982 if (!pf_pull_hdr(m, off, &frag, sizeof (frag), NULL, NULL, AF_INET6))
1984 fragoff = ntohs(frag.ip6f_offlg & IP6F_OFF_MASK);
1985 pd->proto = frag.ip6f_nxt;
1986 mff = ntohs(frag.ip6f_offlg & IP6F_MORE_FRAG);
1987 off += sizeof frag;
1992 DPFPRINTF(("0x%llx IPv6 frag plen %u mff %d off %u fragoff %u "
2000 pff = pf_find_fragment_by_ipv6_header(h, &frag,
2017 frent->fr_ip6f_opt = frag;
2021 DPFPRINTF(("reass IPv6 frag %d @ %d-%d\n",
2022 ntohl(frag.ip6f_ident), fragoff, fr_max));
2037 pff = pf_find_fragment_by_ipv6_header(h, &frag,
2048 *m0 = m = pf_frag6cache(m0, h, &frag, &pff, off, mff,