Hello Yasuok, On Thu, Jul 23, 2020 at 08:01:18PM +0900, YASUOKA Masahiko wrote: > Hi, > > Last month, I fixed the problem "route-to least-state" in an anchor > didn't work. > > https://marc.info/?t=159117457800002&r=1&w=2 > > I noticed the same problem happens on "random" and "srchash" as well. > > ok?
change looks good. I have just one nit-pick comment. I leave decision whether it's worth to adjust your diff or commit as-is up to you. see in-line further below. OK sashan@ > > Use the table on root always if current table is not active. > > Index: sys/net/pf_lb.c > =================================================================== > RCS file: /disk/cvs/openbsd/src/sys/net/pf_lb.c,v > retrieving revision 1.64 > diff -u -p -r1.64 pf_lb.c > --- sys/net/pf_lb.c 2 Jul 2019 09:04:53 -0000 1.64 > +++ sys/net/pf_lb.c 23 Jul 2020 10:45:48 -0000 > @@ -345,6 +345,7 @@ pf_map_addr(sa_family_t af, struct pf_ru > struct pf_addr faddr; > struct pf_addr *raddr = &rpool->addr.v.a.addr; > struct pf_addr *rmask = &rpool->addr.v.a.mask; > + struct pfr_ktable *kt; > u_int64_t states; > u_int16_t weight; > u_int64_t load; > @@ -396,18 +397,17 @@ pf_map_addr(sa_family_t af, struct pf_ru > pf_poolmask(naddr, raddr, rmask, saddr, af); > break; > case PF_POOL_RANDOM: > - if (rpool->addr.type == PF_ADDR_TABLE) { > - cnt = rpool->addr.p.tbl->pfrkt_cnt; > - if (cnt == 0) > - rpool->tblidx = 0; > + if (rpool->addr.type == PF_ADDR_TABLE || > + rpool->addr.type == PF_ADDR_DYNIFTL) { > + if (rpool->addr.type == PF_ADDR_TABLE) > + kt = rpool->addr.p.tbl; > else > - rpool->tblidx = (int)arc4random_uniform(cnt); > - memset(&rpool->counter, 0, sizeof(rpool->counter)); > - if (pfr_pool_get(rpool, &raddr, &rmask, af)) > + kt = rpool->addr.p.dyn->pfid_kt; > + kt = pfr_ktable_select_active(kt); > + if (!kt) ^^^^^^^^ I would prefer to use 'kt == NULL', so it becomes clear we deal with pointer. </snip> > @@ -453,18 +453,18 @@ pf_map_addr(sa_family_t af, struct pf_ru > case PF_POOL_SRCHASH: > hashidx = > pf_hash(saddr, (struct pf_addr *)&hash, &rpool->key, af); > - if (rpool->addr.type == PF_ADDR_TABLE) { > - cnt = rpool->addr.p.tbl->pfrkt_cnt; > - if (cnt == 0) > - rpool->tblidx = 0; > + > + if (rpool->addr.type == PF_ADDR_TABLE || > + rpool->addr.type == PF_ADDR_DYNIFTL) { > + if (rpool->addr.type == PF_ADDR_TABLE) > + kt = rpool->addr.p.tbl; > else > - rpool->tblidx = (int)(hashidx % cnt); > - memset(&rpool->counter, 0, sizeof(rpool->counter)); > - if (pfr_pool_get(rpool, &raddr, &rmask, af)) > + kt = rpool->addr.p.dyn->pfid_kt; > + kt = pfr_ktable_select_active(kt); > + if (!kt) ^^^^^^^^ same here. </snip> > =================================================================== > RCS file: /disk/cvs/openbsd/src/sys/net/pf_table.c,v > retrieving revision 1.133 > diff -u -p -r1.133 pf_table.c > --- sys/net/pf_table.c 24 Jun 2020 22:03:43 -0000 1.133 > +++ sys/net/pf_table.c 23 Jul 2020 10:45:48 -0000 > @@ -2108,9 +2108,8 @@ pfr_kentry_byaddr(struct pfr_ktable *kt, > struct sockaddr_in6 tmp6; > #endif /* INET6 */ > > - if (!(kt->pfrkt_flags & PFR_TFLAG_ACTIVE) && kt->pfrkt_root != NULL) > - kt = kt->pfrkt_root; > - if (!(kt->pfrkt_flags & PFR_TFLAG_ACTIVE)) > + kt = pfr_ktable_select_active(kt); > + if (!kt) ^^^^^^^ and here too. </snip> > @@ -2308,9 +2306,8 @@ pfr_pool_get(struct pf_pool *rpool, stru > kt = rpool->addr.p.dyn->pfid_kt; > else > return (-1); > - if (!(kt->pfrkt_flags & PFR_TFLAG_ACTIVE) && kt->pfrkt_root != NULL) > - kt = kt->pfrkt_root; > - if (!(kt->pfrkt_flags & PFR_TFLAG_ACTIVE)) > + kt = pfr_ktable_select_active(kt); > + if (!kt) ^^^^^^^^ here as well I like the introduction of pfr_ktable_select_active(), it reads far better than current code in tree. thanks and regards sashan