* Can return locked on failure, so that we can consistently * allocate and insert a new one. */
| 678 | * allocate and insert a new one. |
| 679 | */ |
| 680 | struct pf_ksrc_node * |
| 681 | pf_find_src_node(struct pf_addr *src, struct pf_krule *rule, sa_family_t af, |
| 682 | int returnlocked) |
| 683 | { |
| 684 | struct pf_srchash *sh; |
| 685 | struct pf_ksrc_node *n; |
| 686 | |
| 687 | counter_u64_add(V_pf_status.scounters[SCNT_SRC_NODE_SEARCH], 1); |
| 688 | |
| 689 | sh = &V_pf_srchash[pf_hashsrc(src, af)]; |
| 690 | PF_HASHROW_LOCK(sh); |
| 691 | LIST_FOREACH(n, &sh->nodes, entry) |
| 692 | if (n->rule.ptr == rule && n->af == af && |
| 693 | ((af == AF_INET && n->addr.v4.s_addr == src->v4.s_addr) || |
| 694 | (af == AF_INET6 && bcmp(&n->addr, src, sizeof(*src)) == 0))) |
| 695 | break; |
| 696 | if (n != NULL) { |
| 697 | n->states++; |
| 698 | PF_HASHROW_UNLOCK(sh); |
| 699 | } else if (returnlocked == 0) |
| 700 | PF_HASHROW_UNLOCK(sh); |
| 701 | |
| 702 | return (n); |
| 703 | } |
| 704 | |
| 705 | static void |
| 706 | pf_free_src_node(struct pf_ksrc_node *sn) |
no test coverage detected