Lines Matching refs:ifs

122 int fr_fraginit(ifs)
123 ipf_stack_t *ifs;
125 ifs->ifs_ipfr_tail = &ifs->ifs_ipfr_list;
126 ifs->ifs_ipfr_nattail = &ifs->ifs_ipfr_natlist;
127 ifs->ifs_ipfr_ipidtail = &ifs->ifs_ipfr_ipidlist;
132 KMALLOCS(ifs->ifs_ipfr_heads, ipfr_t **,
133 ifs->ifs_ipfr_size * sizeof(ipfr_t *));
134 if (ifs->ifs_ipfr_heads == NULL)
136 bzero((char *)ifs->ifs_ipfr_heads,
137 ifs->ifs_ipfr_size * sizeof(ipfr_t *));
139 KMALLOCS(ifs->ifs_ipfr_nattab, ipfr_t **,
140 ifs->ifs_ipfr_size * sizeof(ipfr_t *));
141 if (ifs->ifs_ipfr_nattab == NULL)
143 bzero((char *)ifs->ifs_ipfr_nattab,
144 ifs->ifs_ipfr_size * sizeof(ipfr_t *));
146 KMALLOCS(ifs->ifs_ipfr_ipidtab, ipfr_t **,
147 ifs->ifs_ipfr_size * sizeof(ipfr_t *));
148 if (ifs->ifs_ipfr_ipidtab == NULL)
150 bzero((char *)ifs->ifs_ipfr_ipidtab,
151 ifs->ifs_ipfr_size * sizeof(ipfr_t *));
153 RWLOCK_INIT(&ifs->ifs_ipf_frag, "ipf fragment rwlock");
156 bzero((char *)&ifs->ifs_frblock, sizeof(ifs->ifs_frblock));
157 ifs->ifs_frblock.fr_flags = FR_BLOCK|FR_INQUE; /* block in */
158 ifs->ifs_frblock.fr_ref = 1;
160 ifs->ifs_fr_frag_init = 1;
173 void fr_fragunload(ifs)
174 ipf_stack_t *ifs;
176 if (ifs->ifs_fr_frag_init == 1) {
177 fr_fragclear(ifs);
179 RW_DESTROY(&ifs->ifs_ipf_frag);
180 ifs->ifs_fr_frag_init = 0;
183 if (ifs->ifs_ipfr_heads != NULL) {
184 KFREES(ifs->ifs_ipfr_heads,
185 ifs->ifs_ipfr_size * sizeof(ipfr_t *));
187 ifs->ifs_ipfr_heads = NULL;
189 if (ifs->ifs_ipfr_nattab != NULL) {
190 KFREES(ifs->ifs_ipfr_nattab,
191 ifs->ifs_ipfr_size * sizeof(ipfr_t *));
193 ifs->ifs_ipfr_nattab = NULL;
195 if (ifs->ifs_ipfr_ipidtab != NULL) {
196 KFREES(ifs->ifs_ipfr_ipidtab,
197 ifs->ifs_ipfr_size * sizeof(ipfr_t *));
199 ifs->ifs_ipfr_ipidtab = NULL;
210 ipfrstat_t *fr_fragstats(ifs)
211 ipf_stack_t *ifs;
213 ifs->ifs_ipfr_stats.ifs_table = ifs->ifs_ipfr_heads;
214 ifs->ifs_ipfr_stats.ifs_nattab = ifs->ifs_ipfr_nattab;
215 ifs->ifs_ipfr_stats.ifs_inuse = ifs->ifs_ipfr_inuse;
216 return &ifs->ifs_ipfr_stats;
306 ipf_stack_t *ifs = fin->fin_ifs;
308 if (ifs->ifs_ipfr_inuse >= ifs->ifs_ipfr_size)
326 ifs->ifs_ipfr_stats.ifs_exists++;
336 ifs->ifs_ipfr_stats.ifs_nomem++;
362 fra->ipfr_ttl = ifs->ifs_fr_ticks + ifs->ifs_fr_ipfrttl;
376 ifs->ifs_ipfr_stats.ifs_new++;
377 ifs->ifs_ipfr_inuse++;
394 ipf_stack_t *ifs = fin->fin_ifs;
396 if (ifs->ifs_fr_frag_lock != 0)
399 WRITE_ENTER(&ifs->ifs_ipf_frag);
400 fra = ipfr_newfrag(fin, pass, ifs->ifs_ipfr_heads);
402 *ifs->ifs_ipfr_tail = fra;
403 fra->ipfr_prev = ifs->ifs_ipfr_tail;
404 ifs->ifs_ipfr_tail = &fra->ipfr_next;
405 if (ifs->ifs_ipfr_list == NULL)
406 ifs->ifs_ipfr_list = fra;
409 RWLOCK_EXIT(&ifs->ifs_ipf_frag);
429 ipf_stack_t *ifs = fin->fin_ifs;
431 if (ifs->ifs_fr_frag_lock != 0)
434 WRITE_ENTER(&ifs->ifs_ipf_natfrag);
435 fra = ipfr_newfrag(fin, pass, ifs->ifs_ipfr_nattab);
439 *ifs->ifs_ipfr_nattail = fra;
440 fra->ipfr_prev = ifs->ifs_ipfr_nattail;
441 ifs->ifs_ipfr_nattail = &fra->ipfr_next;
444 RWLOCK_EXIT(&ifs->ifs_ipf_natfrag);
463 ipf_stack_t *ifs = fin->fin_ifs;
465 if (ifs->ifs_fr_frag_lock)
468 WRITE_ENTER(&ifs->ifs_ipf_ipidfrag);
469 fra = ipfr_newfrag(fin, 0, ifs->ifs_ipfr_ipidtab);
472 *ifs->ifs_ipfr_ipidtail = fra;
473 fra->ipfr_prev = ifs->ifs_ipfr_ipidtail;
474 ifs->ifs_ipfr_ipidtail = &fra->ipfr_next;
477 RWLOCK_EXIT(&ifs->ifs_ipf_ipidfrag);
498 ipf_stack_t *ifs = fin->fin_ifs;
530 ATOMIC_INCL(ifs->ifs_ipfr_stats.ifs_short);
543 ATOMIC_INCL(ifs->ifs_ipfr_stats.ifs_retrans0);
576 f->ipfr_ttl = ifs->ifs_fr_ticks + 1;
580 ATOMIC_INCL(ifs->ifs_ipfr_stats.ifs_hits);
600 ipf_stack_t *ifs = fin->fin_ifs;
602 if (ifs->ifs_fr_frag_lock || !ifs->ifs_ipfr_natlist)
604 READ_ENTER(&ifs->ifs_ipf_natfrag);
605 ipf = fr_fraglookup(fin, ifs->ifs_ipfr_nattab);
611 if ((ipf->ipfr_ttl == ifs->ifs_fr_ticks + 1) && (nat != NULL)) {
617 RWLOCK_EXIT(&ifs->ifs_ipf_natfrag);
635 ipf_stack_t *ifs = fin->fin_ifs;
637 if (ifs->ifs_fr_frag_lock || !ifs->ifs_ipfr_ipidlist)
640 READ_ENTER(&ifs->ifs_ipf_ipidfrag);
641 ipf = fr_fraglookup(fin, ifs->ifs_ipfr_ipidtab);
646 RWLOCK_EXIT(&ifs->ifs_ipf_ipidfrag);
669 ipf_stack_t *ifs = fin->fin_ifs;
671 if (ifs->ifs_fr_frag_lock || (ifs->ifs_ipfr_list == NULL))
674 READ_ENTER(&ifs->ifs_ipf_frag);
676 fra = fr_fraglookup(fin, ifs->ifs_ipfr_heads);
690 fr = &ifs->ifs_frblock;
692 RWLOCK_EXIT(&ifs->ifs_ipf_frag);
705 void fr_forget(ptr, ifs)
707 ipf_stack_t *ifs;
711 WRITE_ENTER(&ifs->ifs_ipf_frag);
712 for (fr = ifs->ifs_ipfr_list; fr; fr = fr->ipfr_next)
715 RWLOCK_EXIT(&ifs->ifs_ipf_frag);
727 void fr_forgetnat(ptr, ifs)
729 ipf_stack_t *ifs;
733 WRITE_ENTER(&ifs->ifs_ipf_natfrag);
734 for (fr = ifs->ifs_ipfr_natlist; fr; fr = fr->ipfr_next)
737 RWLOCK_EXIT(&ifs->ifs_ipf_natfrag);
752 static void fr_fragdelete(fra, tail, ifs)
754 ipf_stack_t *ifs;
760 (void)fr_derefrule(&fr, ifs);
785 void fr_fragclear(ifs)
786 ipf_stack_t *ifs;
791 WRITE_ENTER(&ifs->ifs_ipf_frag);
792 while ((fra = ifs->ifs_ipfr_list) != NULL) {
794 fr_fragdelete(fra, &ifs->ifs_ipfr_tail, ifs);
796 ifs->ifs_ipfr_tail = &ifs->ifs_ipfr_list;
797 RWLOCK_EXIT(&ifs->ifs_ipf_frag);
799 WRITE_ENTER(&ifs->ifs_ipf_nat);
800 WRITE_ENTER(&ifs->ifs_ipf_natfrag);
801 while ((fra = ifs->ifs_ipfr_natlist) != NULL) {
808 fr_fragdelete(fra, &ifs->ifs_ipfr_nattail, ifs);
810 ifs->ifs_ipfr_nattail = &ifs->ifs_ipfr_natlist;
811 RWLOCK_EXIT(&ifs->ifs_ipf_natfrag);
812 RWLOCK_EXIT(&ifs->ifs_ipf_nat);
823 void fr_fragexpire(ifs)
824 ipf_stack_t *ifs;
830 if (ifs->ifs_fr_frag_lock)
834 WRITE_ENTER(&ifs->ifs_ipf_frag);
840 for (fp = &ifs->ifs_ipfr_list; ((fra = *fp) != NULL); ) {
841 if (fra->ipfr_ttl > ifs->ifs_fr_ticks)
844 fr_fragdelete(fra, &ifs->ifs_ipfr_tail, ifs);
845 ifs->ifs_ipfr_stats.ifs_expire++;
846 ifs->ifs_ipfr_inuse--;
848 RWLOCK_EXIT(&ifs->ifs_ipf_frag);
850 WRITE_ENTER(&ifs->ifs_ipf_ipidfrag);
851 for (fp = &ifs->ifs_ipfr_ipidlist; ((fra = *fp) != NULL); ) {
852 if (fra->ipfr_ttl > ifs->ifs_fr_ticks)
855 fr_fragdelete(fra, &ifs->ifs_ipfr_ipidtail, ifs);
856 ifs->ifs_ipfr_stats.ifs_expire++;
857 ifs->ifs_ipfr_inuse--;
859 RWLOCK_EXIT(&ifs->ifs_ipf_ipidfrag);
868 WRITE_ENTER(&ifs->ifs_ipf_nat);
869 WRITE_ENTER(&ifs->ifs_ipf_natfrag);
870 for (fp = &ifs->ifs_ipfr_natlist; ((fra = *fp) != NULL); ) {
871 if (fra->ipfr_ttl > ifs->ifs_fr_ticks)
879 fr_fragdelete(fra, &ifs->ifs_ipfr_nattail, ifs);
880 ifs->ifs_ipfr_stats.ifs_expire++;
881 ifs->ifs_ipfr_inuse--;
883 RWLOCK_EXIT(&ifs->ifs_ipf_natfrag);
884 RWLOCK_EXIT(&ifs->ifs_ipf_nat);
905 ipf_stack_t *ifs = arg;
907 READ_ENTER(&ifs->ifs_ipf_global);
909 fr_fragexpire(ifs);
910 fr_timeoutstate(ifs);
911 fr_natexpire(ifs);
912 fr_authexpire(ifs);
913 ifs->ifs_fr_ticks++;
914 if (ifs->ifs_fr_running <= 0)
936 RWLOCK_EXIT(&ifs->ifs_ipf_global);
944 int fr_nextfrag(token, itp, top, tail, lock, ifs)
949 ipf_stack_t *ifs;
990 ipf_freetoken(token, ifs);
993 fr_fragderef(&frag, lock, ifs);
995 ipf_freetoken(token, ifs);
1001 void fr_fragderef(frp, lock, ifs)
1004 ipf_stack_t *ifs;
1015 ifs->ifs_ipfr_stats.ifs_expire++;
1016 ifs->ifs_ipfr_inuse--;