When 3Com decided to build a PPPoE <-> ADSL modem - 3ComDualLink, they decided that conforming to the PPPoE RFC was entirely too plain. Instead of using boring ASSIGNED values for the PPPoE session and discovery protocols, they decided ones starting with 0x3c would be much more customer orientated! So, instead of 0x8863 and 0x8864 for Discovery and Session packets respectively, they decided to use 0x3c12 and 0x3c13... insanity!

User Mode

Luckily enough, rp-pppoe was kind enough to allow us to specifiy different frame headers. So if you're using rp-pppoe just add "-f 3c12:3c13" to the pppoe command line.

From the LinuxPPPoENotes page, heres how pppd would run pppoe now
/usr/sbin/pppoe -p /var/run/ -I eth0 -f 3c12:3c13 -U -m 1412 -T 80 -S ISP

Kernel Mode

Unfortunately, things are not so simple in kernel mode.

I've made a diff you can apply to the ppp-2.4.2 tarball, or put it in the debian/patches directory and re-build the deb. Here's the unified diff.

Man, if only thats where it ended. It seems that linux/if_ether.h has ..

  1. define ETH_P_PPP_SES 0x8864

and the kernel module uses that!

But we can get around this (hackishly for now, hopefully someone will add an IOCTL to do this), by using the following patch.

Now, you add the following lines to your /etc/ppp/peers/myisp file, and you should have kernel mode pppoe
rp_pppoe_disc 3c12 rp_pppoe_sess 3c13

Uncomment debug in that file, if you have any problems.

Good Luck


To use this modem with FreeBSD set

sysctl net.graph.nonstandard_pppoe=1

After you have the ng_pppoe moduled loaded. Put it in /etc/sysctl.conf to make it persistent. For more information about using PPPoE in FreeBSD see the handbook.