| 112 | MTX_DEF); |
| 113 | |
| 114 | void |
| 115 | pfi_initialize_vnet(void) |
| 116 | { |
| 117 | struct pfi_list kifs = LIST_HEAD_INITIALIZER(); |
| 118 | struct epoch_tracker et; |
| 119 | struct pfi_kkif *kif; |
| 120 | struct ifg_group *ifg; |
| 121 | struct ifnet *ifp; |
| 122 | int nkifs; |
| 123 | |
| 124 | V_pfi_buffer_max = 64; |
| 125 | V_pfi_buffer = malloc(V_pfi_buffer_max * sizeof(*V_pfi_buffer), |
| 126 | PFI_MTYPE, M_WAITOK); |
| 127 | |
| 128 | nkifs = 1; /* one for V_pfi_all */ |
| 129 | IFNET_RLOCK(); |
| 130 | CK_STAILQ_FOREACH(ifg, &V_ifg_head, ifg_next) |
| 131 | nkifs++; |
| 132 | CK_STAILQ_FOREACH(ifp, &V_ifnet, if_link) |
| 133 | nkifs++; |
| 134 | |
| 135 | for (int n = 0; n < nkifs; n++) { |
| 136 | kif = pf_kkif_create(M_WAITOK); |
| 137 | LIST_INSERT_HEAD(&kifs, kif, pfik_list); |
| 138 | } |
| 139 | |
| 140 | NET_EPOCH_ENTER(et); |
| 141 | PF_RULES_WLOCK(); |
| 142 | kif = LIST_FIRST(&kifs); |
| 143 | LIST_REMOVE(kif, pfik_list); |
| 144 | V_pfi_all = pfi_kkif_attach(kif, IFG_ALL); |
| 145 | CK_STAILQ_FOREACH(ifg, &V_ifg_head, ifg_next) { |
| 146 | kif = LIST_FIRST(&kifs); |
| 147 | LIST_REMOVE(kif, pfik_list); |
| 148 | pfi_attach_ifgroup(ifg, kif); |
| 149 | } |
| 150 | CK_STAILQ_FOREACH(ifp, &V_ifnet, if_link) { |
| 151 | kif = LIST_FIRST(&kifs); |
| 152 | LIST_REMOVE(kif, pfik_list); |
| 153 | pfi_attach_ifnet(ifp, kif); |
| 154 | } |
| 155 | PF_RULES_WUNLOCK(); |
| 156 | NET_EPOCH_EXIT(et); |
| 157 | IFNET_RUNLOCK(); |
| 158 | |
| 159 | MPASS(LIST_EMPTY(&kifs)); |
| 160 | } |
| 161 | |
| 162 | void |
| 163 | pfi_initialize(void) |
no test coverage detected