| 4362 | } |
| 4363 | |
| 4364 | static void |
| 4365 | pf_kill_srcnodes(struct pfioc_src_node_kill *psnk) |
| 4366 | { |
| 4367 | struct pf_ksrc_node_list kill; |
| 4368 | |
| 4369 | LIST_INIT(&kill); |
| 4370 | for (int i = 0; i <= pf_srchashmask; i++) { |
| 4371 | struct pf_srchash *sh = &V_pf_srchash[i]; |
| 4372 | struct pf_ksrc_node *sn, *tmp; |
| 4373 | |
| 4374 | PF_HASHROW_LOCK(sh); |
| 4375 | LIST_FOREACH_SAFE(sn, &sh->nodes, entry, tmp) |
| 4376 | if (PF_MATCHA(psnk->psnk_src.neg, |
| 4377 | &psnk->psnk_src.addr.v.a.addr, |
| 4378 | &psnk->psnk_src.addr.v.a.mask, |
| 4379 | &sn->addr, sn->af) && |
| 4380 | PF_MATCHA(psnk->psnk_dst.neg, |
| 4381 | &psnk->psnk_dst.addr.v.a.addr, |
| 4382 | &psnk->psnk_dst.addr.v.a.mask, |
| 4383 | &sn->raddr, sn->af)) { |
| 4384 | pf_unlink_src_node(sn); |
| 4385 | LIST_INSERT_HEAD(&kill, sn, entry); |
| 4386 | sn->expire = 1; |
| 4387 | } |
| 4388 | PF_HASHROW_UNLOCK(sh); |
| 4389 | } |
| 4390 | |
| 4391 | for (int i = 0; i <= pf_hashmask; i++) { |
| 4392 | struct pf_idhash *ih = &V_pf_idhash[i]; |
| 4393 | struct pf_state *s; |
| 4394 | |
| 4395 | PF_HASHROW_LOCK(ih); |
| 4396 | LIST_FOREACH(s, &ih->states, entry) { |
| 4397 | if (s->src_node && s->src_node->expire == 1) |
| 4398 | s->src_node = NULL; |
| 4399 | if (s->nat_src_node && s->nat_src_node->expire == 1) |
| 4400 | s->nat_src_node = NULL; |
| 4401 | } |
| 4402 | PF_HASHROW_UNLOCK(ih); |
| 4403 | } |
| 4404 | |
| 4405 | psnk->psnk_killed = pf_free_src_nodes(&kill); |
| 4406 | } |
| 4407 | |
| 4408 | /* |
| 4409 | * XXX - Check for version missmatch!!! |
no test coverage detected