On Thu, May 18, 2017 at 11:15:53AM +0000, Steve wrote:
> Thanks,I was mostly checking if this was a known issue.If I rename 
> hostname.pppoe0 to hostname.pppoe1 and then rename hostname.pppoe2 to 
> hostname.pppoe0The original pppoe2 (now pppoe0) works fine but the other 
> interface stops working. If I swap them back the original behaviour is seen.
>  ifconfig pppoe2 debug shows no ouput.As shown below pppoe2 just stays in 
> state: initial.
> 
> vr2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
>         lladdr 00:00:24:d1:9d:6a
>         priority: 0
>         media: Ethernet autoselect (100baseTX full-duplex)
>         status: active
> 
> pppoe2: flags=8810<POINTOPOINT,SIMPLEX,MULTICAST> mtu 1492
>         priority: 0
>         dev: vr2 state: initial
>         sid: 0x0 PADI retries: 0 PADR retries: 0
>         groups: pppoe
>         status: no carrier
> 
> I have now "upgraded" to 6.1. The same is noted
> Any thoughts would be appreciated.

I believe this stopped working due to legitimate changes in how the
routing table works.

To reproduce the problem, start with a fresh routing table.
Before any interfaces (except loopback) are configured it looks like:

Destination        Gateway            Flags   Refs      Use   Mtu  Prio Iface   
127.0.0.1          127.0.0.1          UHl        0        0 32768     1 lo1    

Prepare configuration of two pppoe interfaces as per the pppoe(4) man page:

$ cat /etc/hostname.pppoe0
inet 0.0.0.0 255.255.255.255 NONE \
   pppoedev em0 authproto pap \
   authname 'testcaller' authkey 'donttell' up
dest 0.0.0.1
$ cat /etc/hostname.pppoe1
inet 0.0.0.0 255.255.255.255 NONE \
   pppoedev em1 authproto pap \
   authname 'testcaller2' authkey 'donttell2' up
dest 0.0.0.1

After 'sh /etc/netstart pppoe0' the routing table looks like:

Destination        Gateway            Flags   Refs      Use   Mtu  Prio Iface
0.0.0.1            default            H          0        0     -     8 pppoe0
127.0.0.1          127.0.0.1          UHl        0        0 32768     1 lo1  

And the pppoe interface is ready to get its addresses from the peer:

pppoe0: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> rdomain 1 mtu 1492
        index 15 priority 0 llprio 3
        dev: em0 state: PADI sent
        sid: 0x0 PADI retries: 18 PADR retries: 0
        sppp: phase establish authproto pap 
        groups: pppoe
        status: no carrier
        inet 0.0.0.0 --> 0.0.0.1 netmask 0xffffffff


But the second interface fails to set its dest address since the same
route already exists in the table:

# sh /etc/netstart pppoe1
ifconfig: SIOCAIFADDR: File exists 

So there's no address on pppoe1:

pppoe1: flags=8851<UP,POINTOPOINT,RUNNING,SIMPLEX,MULTICAST> rdomain 1 mtu 1492
        index 16 priority 0 llprio 3
        dev: cdce0 state: PADI sent
        sid: 0x0 PADI retries: 5 PADR retries: 0
        sppp: phase establish authproto pap 
        groups: pppoe
        status: no carrier

And as a result, this code in sys/net/if_spppsubr.c cannot work:

        if (myaddr == 0) {
                /*
                 * I don't have an assigned address, so i need to
                 * negotiate my address.
                 */
                sp->ipcp.flags |= IPCP_MYADDR_DYN;
                sp->ipcp.opts |= (1 << IPCP_OPT_ADDRESS);
        }
        if (hisaddr == 1) {
                /*
                 * XXX - remove this hack!
                 * remote has no valid address, we need to get one assigned.
                 */
                sp->ipcp.flags |= IPCP_HISADDR_DYN;
        }

It seems a correct fix would involve replacing the above code with a better
way of setting the IPCP_MYADDR_DYN and IPCP_HISADDR_DYN flags. And this
new way should not require any 'wildcard' addresses on pppoe interfaces.

One workaround is to run each pppoe interface in a separate routing domain
so that each interface gets its own routing table.
Offhand I'm not quite sure to combine this workaround with a failover setup.

Reply via email to