MCPcopy Create free account
hub / github.com/F-Stack/f-stack / pfr_commit_ktable

Function pfr_commit_ktable

freebsd/netpfil/pf/pf_table.c:1641–1704  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1639}
1640
1641static void
1642pfr_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) |

Callers 1

pfr_ina_commitFunction · 0.85

Calls 12

pfr_clstats_ktableFunction · 0.85
pfr_enqueue_addrsFunction · 0.85
pfr_mark_addrsFunction · 0.85
pfr_clean_node_maskFunction · 0.85
pfr_copyout_addrFunction · 0.85
pfr_lookup_addrFunction · 0.85
pfr_insert_kentriesFunction · 0.85
pfr_remove_kentriesFunction · 0.85
pfr_clstats_kentriesFunction · 0.85
pfr_destroy_kentriesFunction · 0.85
pfr_destroy_ktableFunction · 0.85
pfr_setflags_ktableFunction · 0.85

Tested by

no test coverage detected