Per-vnet data storage structures initialization. */
| 817 | |
| 818 | /* Per-vnet data storage structures initialization. */ |
| 819 | void |
| 820 | pf_initialize() |
| 821 | { |
| 822 | struct pf_keyhash *kh; |
| 823 | struct pf_idhash *ih; |
| 824 | struct pf_srchash *sh; |
| 825 | u_int i; |
| 826 | |
| 827 | if (pf_hashsize == 0 || !powerof2(pf_hashsize)) |
| 828 | pf_hashsize = PF_HASHSIZ; |
| 829 | if (pf_srchashsize == 0 || !powerof2(pf_srchashsize)) |
| 830 | pf_srchashsize = PF_SRCHASHSIZ; |
| 831 | |
| 832 | V_pf_hashseed = arc4random(); |
| 833 | |
| 834 | /* States and state keys storage. */ |
| 835 | V_pf_state_z = uma_zcreate("pf states", sizeof(struct pf_state), |
| 836 | NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0); |
| 837 | V_pf_limits[PF_LIMIT_STATES].zone = V_pf_state_z; |
| 838 | uma_zone_set_max(V_pf_state_z, PFSTATE_HIWAT); |
| 839 | uma_zone_set_warning(V_pf_state_z, "PF states limit reached"); |
| 840 | |
| 841 | V_pf_state_key_z = uma_zcreate("pf state keys", |
| 842 | sizeof(struct pf_state_key), pf_state_key_ctor, NULL, NULL, NULL, |
| 843 | UMA_ALIGN_PTR, 0); |
| 844 | |
| 845 | V_pf_keyhash = mallocarray(pf_hashsize, sizeof(struct pf_keyhash), |
| 846 | M_PFHASH, M_NOWAIT | M_ZERO); |
| 847 | V_pf_idhash = mallocarray(pf_hashsize, sizeof(struct pf_idhash), |
| 848 | M_PFHASH, M_NOWAIT | M_ZERO); |
| 849 | if (V_pf_keyhash == NULL || V_pf_idhash == NULL) { |
| 850 | printf("pf: Unable to allocate memory for " |
| 851 | "state_hashsize %lu.\n", pf_hashsize); |
| 852 | |
| 853 | free(V_pf_keyhash, M_PFHASH); |
| 854 | free(V_pf_idhash, M_PFHASH); |
| 855 | |
| 856 | pf_hashsize = PF_HASHSIZ; |
| 857 | V_pf_keyhash = mallocarray(pf_hashsize, |
| 858 | sizeof(struct pf_keyhash), M_PFHASH, M_WAITOK | M_ZERO); |
| 859 | V_pf_idhash = mallocarray(pf_hashsize, |
| 860 | sizeof(struct pf_idhash), M_PFHASH, M_WAITOK | M_ZERO); |
| 861 | } |
| 862 | |
| 863 | pf_hashmask = pf_hashsize - 1; |
| 864 | for (i = 0, kh = V_pf_keyhash, ih = V_pf_idhash; i <= pf_hashmask; |
| 865 | i++, kh++, ih++) { |
| 866 | mtx_init(&kh->lock, "pf_keyhash", NULL, MTX_DEF | MTX_DUPOK); |
| 867 | mtx_init(&ih->lock, "pf_idhash", NULL, MTX_DEF); |
| 868 | } |
| 869 | |
| 870 | /* Source nodes. */ |
| 871 | V_pf_sources_z = uma_zcreate("pf source nodes", |
| 872 | sizeof(struct pf_ksrc_node), NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, |
| 873 | 0); |
| 874 | V_pf_limits[PF_LIMIT_SRC_NODES].zone = V_pf_sources_z; |
| 875 | uma_zone_set_max(V_pf_sources_z, PFSNODE_HIWAT); |
| 876 | uma_zone_set_warning(V_pf_sources_z, "PF source nodes limit reached"); |
no test coverage detected