Eu fiz o download do código-fonte ppp
digitando estes dois comandos:
sudo apt-get build-dep ppp
apt-get source ppp
No arquivo de cabeçalho pppd/plugins/rp-pppoe/pppoe.h
, encontrei isto:
/* Header size of a PPPoE packet */
#define PPPOE_OVERHEAD 6 /* type, code, session, length */
#define HDR_SIZE (sizeof(struct ethhdr) + PPPOE_OVERHEAD)
#define MAX_PPPOE_PAYLOAD (ETH_DATA_LEN - PPPOE_OVERHEAD)
#define MAX_PPPOE_MTU (MAX_PPPOE_PAYLOAD - 2)
ETH_DATA_LEN
é definido em /usr/include/linux/if_ether.h
#define ETH_DATA_LEN 1500 /* Max. octets in payload */
E em pppd/plugins/rp-pppoe/plugin.c
, encontrei isto:
if (lcp_allowoptions[0].mru > MAX_PPPOE_MTU)
lcp_allowoptions[0].mru = MAX_PPPOE_MTU;
if (lcp_wantoptions[0].mru > MAX_PPPOE_MTU)
lcp_wantoptions[0].mru = MAX_PPPOE_MTU;
O que tudo isso significa é que o plug-in rp-pppoe
tem um limite codificado de 1492 bytes. E a única maneira de aumentá-lo é modificando a origem e reconstruindo o plug-in com um limite maior.
Ao remover as quatro linhas acima de plugin.c
e reconstruir o módulo, consegui aumentar o MTU de 1492 para 1500. Isso só funciona enquanto a linha subjacente é conhecida por suportar o tamanho maior, o que acontece com ser o caso da minha conexão.
Para detectar a capacidade da linha subjacente, seria necessário usar uma versão mais recente do pppd com suporte a RFC 4638. O Ubuntu 16.04 tem uma versão mais recente do pppd e, portanto, deve ser capaz de usar tamanhos maiores de MTU para PPPoE sem precisar recompilar qualquer código.