On Thu, Jul 28, 2011 at 08:51:41PM +0200, Claudio Jeker wrote:
> On Wed, Jul 27, 2011 at 10:37:30PM +0200, Christopher Zimmermann wrote:
> > Hi,
> > 
> > pppoe0 has 92.203.101.134.
> > this works fine:
> > 
> > match out log on egress inet from 192.168.23.0/24 nat-to pppoe0
> > 
> > tcpdump while pinging:
> > 92.203.101.134 > 74.125.39.147: icmp: echo request
> > 74.125.39.147 > 92.203.101.134: icmp: echo reply
> > 92.203.101.134 > 74.125.39.147: icmp: echo request
> > 74.125.39.147 > 92.203.101.134: icmp: echo reply
> > 
> > 
> > But this doesn't:
> > 
> > match out log on egress inet from 192.168.23.0/24 nat-to (pppoe0)
> > 
> > tcpdump while pinging:
> > 92.203.101.135 > 74.125.39.147: icmp: echo request
> > 92.203.101.135 > 74.125.39.147: icmp: echo request
> > 
> > in the (pppoe0) mode the IP address is always incremented by one.
> > This also happens to other ips, not just 92.203.101.134.
> > 
> > 
> > pppoe0: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> mtu 1492
> >         priority: 0
> >         dev: ep1 state: session
> >         sid: 0x166f PADI retries: 1 PADR retries: 0 time: 00:11:21
> >         sppp: phase network authproto pap
> >         groups: pppoe egress
> >         status: active
> >         inet6 fe80::211:25ff:feae:e0c%pppoe0 ->  prefixlen 64 scopeid 0x6
> >         inet 92.203.101.134 --> 213.148.133.4 netmask 0xffffffff
>  
> What kernel did you use? A few things happend lately in pf(4) that could
> affect nat-to. Please include a dmesg so we have an idea how old your
> kernel is.
> 
> I will play a bit tonight and see if I see the porblem as well.

Yup. The weighted round-robin stuff broke it. Here is a diff to fix the
problem. To be honest, I'm not even sure it makes sense to enter the
weight loop in the PF_ADDR_DYNIFTL case since there is no way to specify
a weight on a dynamic table. Ryan, Hennning, Jorg what is you're opinion?

Quick testing seems to indicate that least-state is not affected.

-- 
:wq Claudio

Index: pf_lb.c
===================================================================
RCS file: /cvs/src/sys/net/pf_lb.c,v
retrieving revision 1.16
diff -u -p -r1.16 pf_lb.c
--- pf_lb.c     27 Jul 2011 00:26:10 -0000      1.16
+++ pf_lb.c     28 Jul 2011 20:29:45 -0000
@@ -416,7 +416,10 @@ pf_map_addr(sa_family_t af, struct pf_ru
                        return (1);
 
                /* iterate over table if it contains entries which are weighted 
*/
-               if (rpool->addr.p.tbl->pfrkt_refcntcost > 0) {
+               if ((rpool->addr.type == PF_ADDR_TABLE &&
+                   rpool->addr.p.tbl->pfrkt_refcntcost > 0) ||
+                   (rpool->addr.type == PF_ADDR_DYNIFTL &&
+                   rpool->addr.p.dyn->pfid_kt->pfrkt_refcntcost > 0)) {
                        do {
                                if (rpool->addr.type == PF_ADDR_TABLE) {
                                        if (pfr_pool_get(rpool->addr.p.tbl,
@@ -434,11 +437,15 @@ pf_map_addr(sa_family_t af, struct pf_ru
                                            &rpool->curweight, af,
                                            pf_islinklocal))
                                                return (1);
-                               } else if (pf_match_addr(0, raddr, rmask,
-                                   &rpool->counter, af))
+                               } else {
+                                       log(LOG_ERR, "pf: pf_map_addr: "
+                                           "weighted RR failure");
                                        return (1);
+                               }
+                               if (rpool->weight >= rpool->curweight)
+                                       break;
                                PF_AINC(&rpool->counter, af);
-                       } while (rpool->weight < rpool->curweight);
+                       } while (1);
  
                        weight = rpool->weight;
                }

Reply via email to