With the recent upgrade of OpenWrt's PPP to 2.4.6 it's now possible to configure many routers (those that support at least baby jumbo frames of 1508) to connect over PPPoE using RFC 4638.
Here's how i configured my TP-Link WDR4900:
First the underlying ethernet interface needs to have it's MTU set to 1508. Because the WDR4900 uses a switch and vlans instead of dedicated interfaces for WAN and LAN the whole interface needs to be bumped up.
Add a new section in /etc/config/network:
config interface 'eth0'
option ifname 'eth0'
option mtu '1508'
Because eth0.1 (lan) and eth0.2 (wan) both inherit eth0's MTU we will want to explicitly set the LAN back to 1500.
In /etc/config/network:
config interface 'lan'
option ifname 'eth0.1'
...
option mtu '1500'
We also need to modify the wan section that will be used for the PPPoE connection.
In /etc/config/network:
config interface 'wan'
option ifname 'eth0.2'
option proto 'pppoe'
...
option mtu '1508'
option pppd_options 'debug' # optional
The pppd_options 'debug' line is only needed if you want to log the negotiated MTU and make sure all is working.
Now run
/etc/init.d/network restart
You're up and running.
$ ping -D -s 1472 www.dslreports.com
PING www.dslreports.com (64.91.255.98): 1472 data bytes
1480 bytes from 64.91.255.98: icmp_seq=0 ttl=47 time=122.827 ms
1480 bytes from 64.91.255.98: icmp_seq=1 ttl=47 time=123.011 ms
1480 bytes from 64.91.255.98: icmp_seq=2 ttl=47 time=122.368 ms
1480 bytes from 64.91.255.98: icmp_seq=3 ttl=47 time=122.715 ms
1480 bytes from 64.91.255.98: icmp_seq=4 ttl=47 time=122.640 ms
where previously
$ ping -D -s 1472 www.dslreports.com
PING www.dslreports.com (64.91.255.98): 1472 data bytes
556 bytes from router.lan.example.com (172.20.0.1): frag needed and DF set (MTU 1492)
Vr HL TOS Len ID Flg off TTL Pro cks Src Dst
4 5 00 dc05 0c69 0 0000 40 01 3cb3 172.20.0.51 64.91.255.98
From the debug log:
daemon.debug pppd[14889]: Send PPPOE Discovery V1T1 PADI session 0x0 length 18
daemon.debug pppd[14889]: dst ff:ff:ff:ff:ff:ff src a0:f3:c1:fa:c3:67
daemon.debug pppd[14889]: [service-name] [host-uniq 00 00 3a 29] [PPP-max-payload 05 dc]
daemon.debug pppd[14889]: Recv PPPOE Discovery V1T1 PADO session 0x0 length 51
daemon.debug pppd[14889]: dst a0:f3:c1:fa:c3:67 src 00:30:88:00:00:0b
daemon.debug pppd[14889]: [host-uniq 00 00 3a 29] [PPP-max-payload 05 dc] [AC-name bras-red6.gi-b-B2014010600398] [service-name]
daemon.debug pppd[14889]: Send PPPOE Discovery V1T1 PADR session 0x0 length 18
daemon.debug pppd[14889]: dst 00:30:88:00:00:0b src a0:f3:c1:fa:c3:67
daemon.debug pppd[14889]: [service-name] [host-uniq 00 00 3a 29] [PPP-max-payload 05 dc]
daemon.debug pppd[14889]: Recv PPPOE Discovery V1T1 PADS session 0x484 length 51
daemon.debug pppd[14889]: dst a0:f3:c1:fa:c3:67 src 00:30:88:00:00:0b
daemon.debug pppd[14889]: [service-name] [host-uniq 00 00 3a 29] [PPP-max-payload 05 dc] [AC-name bras-red6.gi-b-B2014010600398]
daemon.debug pppd[14889]: PADS: Service-Name: ''
daemon.info pppd[14889]: PPP session is 1156
daemon.warn pppd[14889]: Connected to 00:30:88:00:00:0b via interface eth0.2
daemon.debug pppd[14889]: using channel 3
daemon.info pppd[14889]: Using interface pppoe-wan
daemon.notice pppd[14889]: Connect: pppoe-wan <--> eth0.2
daemon.debug pppd[14889]: sent [LCP ConfReq id=0x1 <magic 0x470e5573>]
daemon.debug pppd[14889]: rcvd [LCP ConfReq id=0xb8 <mru 1500> <auth chap MD5> <magic 0x5187bac0>]
daemon.debug pppd[14889]: sent [LCP ConfAck id=0xb8 <mru 1500> <auth chap MD5> <magic 0x5187bac0>]
daemon.debug pppd[14889]: rcvd [LCP ConfAck id=0x1 <magic 0x470e5573>]
daemon.debug pppd[14889]: sent [LCP EchoReq id=0x0 magic=0x470e5573]
daemon.debug pppd[14889]: rcvd [CHAP Challenge id=0x1 <25e39f2218874fd3dba9df44f9095c9a>, name = "bras-red6.gi-b"]
daemon.debug pppd[14889]: sent [CHAP Response id=0x1 <efba3c4200b06e50b65363057df7d37e>, name = "05555555555-vivaciti@surfdsluk"]
daemon.debug pppd[14889]: rcvd [LCP EchoRep id=0x0 magic=0x5187bac0]
daemon.debug pppd[14889]: rcvd [CHAP Success id=0x1 ""]
You can see the PPP-max-payload tag being sent and received and a 1500 MTU being correctly negotiated.
Hopefully this will eventually get some logic built into OpenWRT so that it's unnecessary for this to be manually configured but, for now, UK (and European) FTTC/FTTP users rejoice; we've now got support for RFC 4638 without having to patch!
For any devs reading, bug #14528 can be closed.