| 1639 | } |
| 1640 | |
| 1641 | static void |
| 1642 | pfr_commit_ktable(struct pfr_ktable *kt, long tzero) |
| 1643 | { |
| 1644 | counter_u64_t *pkc, *qkc; |
| 1645 | struct pfr_ktable *shadow = kt->pfrkt_shadow; |
| 1646 | int nflags; |
| 1647 | |
| 1648 | PF_RULES_WASSERT(); |
| 1649 | |
| 1650 | if (shadow->pfrkt_cnt == NO_ADDRESSES) { |
| 1651 | if (!(kt->pfrkt_flags & PFR_TFLAG_ACTIVE)) |
| 1652 | pfr_clstats_ktable(kt, tzero, 1); |
| 1653 | } else if (kt->pfrkt_flags & PFR_TFLAG_ACTIVE) { |
| 1654 | /* kt might contain addresses */ |
| 1655 | struct pfr_kentryworkq addrq, addq, changeq, delq, garbageq; |
| 1656 | struct pfr_kentry *p, *q, *next; |
| 1657 | struct pfr_addr ad; |
| 1658 | |
| 1659 | pfr_enqueue_addrs(shadow, &addrq, NULL, 0); |
| 1660 | pfr_mark_addrs(kt); |
| 1661 | SLIST_INIT(&addq); |
| 1662 | SLIST_INIT(&changeq); |
| 1663 | SLIST_INIT(&delq); |
| 1664 | SLIST_INIT(&garbageq); |
| 1665 | pfr_clean_node_mask(shadow, &addrq); |
| 1666 | SLIST_FOREACH_SAFE(p, &addrq, pfrke_workq, next) { |
| 1667 | pfr_copyout_addr(&ad, p); |
| 1668 | q = pfr_lookup_addr(kt, &ad, 1); |
| 1669 | if (q != NULL) { |
| 1670 | if (q->pfrke_not != p->pfrke_not) |
| 1671 | SLIST_INSERT_HEAD(&changeq, q, |
| 1672 | pfrke_workq); |
| 1673 | pkc = &p->pfrke_counters.pfrkc_counters; |
| 1674 | qkc = &q->pfrke_counters.pfrkc_counters; |
| 1675 | if ((*pkc == NULL) != (*qkc == NULL)) |
| 1676 | SWAP(counter_u64_t, *pkc, *qkc); |
| 1677 | q->pfrke_mark = 1; |
| 1678 | SLIST_INSERT_HEAD(&garbageq, p, pfrke_workq); |
| 1679 | } else { |
| 1680 | p->pfrke_counters.pfrkc_tzero = tzero; |
| 1681 | SLIST_INSERT_HEAD(&addq, p, pfrke_workq); |
| 1682 | } |
| 1683 | } |
| 1684 | pfr_enqueue_addrs(kt, &delq, NULL, ENQUEUE_UNMARKED_ONLY); |
| 1685 | pfr_insert_kentries(kt, &addq, tzero); |
| 1686 | pfr_remove_kentries(kt, &delq); |
| 1687 | pfr_clstats_kentries(kt, &changeq, tzero, INVERT_NEG_FLAG); |
| 1688 | pfr_destroy_kentries(&garbageq); |
| 1689 | } else { |
| 1690 | /* kt cannot contain addresses */ |
| 1691 | SWAP(struct radix_node_head *, kt->pfrkt_ip4, |
| 1692 | shadow->pfrkt_ip4); |
| 1693 | SWAP(struct radix_node_head *, kt->pfrkt_ip6, |
| 1694 | shadow->pfrkt_ip6); |
| 1695 | SWAP(int, kt->pfrkt_cnt, shadow->pfrkt_cnt); |
| 1696 | pfr_clstats_ktable(kt, tzero, 1); |
| 1697 | } |
| 1698 | nflags = ((shadow->pfrkt_flags & PFR_TFLAG_USRMASK) | |
no test coverage detected