tech-net archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

RFC 4638



Could somebody review the following patches to add support for RFC 4638.

The change to if_spppsubr.c just moves the code to work out whether
lcp should request an mru change until after the pppoe device has
picked up the mtu of the underlying ethernet device.

To use this change:

 pick an ethernet card that supports jumbo frames.
 set the mtu on the ethernet card to 1508.
 start the pppoe device as normal. 

This is working for me connected to a BT VDSL modem.

There probably needs to be an extra test for the server refusing the
max payload request.

Robert Swindells

Index: if_spppsubr.c
===================================================================
RCS file: /cvsroot/src/sys/net/if_spppsubr.c,v
retrieving revision 1.121
diff -u -r1.121 if_spppsubr.c
--- if_spppsubr.c       17 Jul 2011 20:54:52 -0000      1.121
+++ if_spppsubr.c       1 Sep 2011 21:28:39 -0000
@@ -2000,12 +2000,6 @@
        sp->pp_seq[IDX_LCP] = 0;
        sp->pp_rseq[IDX_LCP] = 0;
        sp->lcp.protos = 0;
-       if (sp->pp_if.if_mtu < PP_MTU) {
-               sp->lcp.mru = sp->pp_if.if_mtu;
-               sp->lcp.opts |= (1 << LCP_OPT_MRU);
-       } else
-               sp->lcp.mru = PP_MTU;
-       sp->lcp.their_mru = PP_MTU;
 
        /*
         * Initialize counters and timeout values.  Note that we don't
@@ -2090,6 +2084,13 @@
 static void
 sppp_lcp_open(struct sppp *sp)
 {
+       if (sp->pp_if.if_mtu < PP_MTU) {
+               sp->lcp.mru = sp->pp_if.if_mtu;
+               sp->lcp.opts |= (1 << LCP_OPT_MRU);
+       } else
+               sp->lcp.mru = PP_MTU;
+       sp->lcp.their_mru = PP_MTU;
+
        /*
         * If we are authenticator, negotiate LCP_AUTH
         */
Index: if_pppoe.c
===================================================================
RCS file: /cvsroot/src/sys/net/if_pppoe.c,v
retrieving revision 1.97
diff -u -r1.97 if_pppoe.c
--- if_pppoe.c  30 Aug 2011 22:23:06 -0000      1.97
+++ if_pppoe.c  1 Sep 2011 21:28:39 -0000
@@ -85,6 +85,7 @@
 #define        PPPOE_TAG_ACCOOKIE      0x0104          /* AC cookie */
 #define        PPPOE_TAG_VENDOR        0x0105          /* vendor specific */
 #define        PPPOE_TAG_RELAYSID      0x0110          /* relay session id */
+#define        PPPOE_TAG_MAX_PAYLOAD   0x0120          /* max payload */
 #define        PPPOE_TAG_SNAME_ERR     0x0201          /* service name error */
 #define        PPPOE_TAG_ACSYS_ERR     0x0202          /* AC system error */
 #define        PPPOE_TAG_GENERIC_ERR   0x0203          /* generic error */
@@ -895,7 +896,7 @@
                                return ENXIO;
                        }
 
-                       if (sc->sc_sppp.pp_if.if_mtu >
+                       if (sc->sc_sppp.pp_if.if_mtu !=
                            eth_if->if_mtu - PPPOE_OVERHEAD) {
                                sc->sc_sppp.pp_if.if_mtu = eth_if->if_mtu -
                                    PPPOE_OVERHEAD;
@@ -1041,6 +1042,9 @@
                l2 = strlen(sc->sc_concentrator_name);
                len += 2 + 2 + l2;
        }
+       if (sc->sc_sppp.pp_if.if_mtu > PPPOE_MAXMTU) {
+               len += 2 + 2 + 2;
+       }
 
        /* allocate a buffer */
        m0 = pppoe_get_mbuf(len + PPPOE_HEADERLEN);     /* header len + payload 
len */
@@ -1067,6 +1071,13 @@
        PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE);
        PPPOE_ADD_16(p, sizeof(sc));
        memcpy(p, &sc, sizeof sc);
+       p += sizeof(sc);
+
+       if (sc->sc_sppp.pp_if.if_mtu > PPPOE_MAXMTU) {
+               PPPOE_ADD_16(p, PPPOE_TAG_MAX_PAYLOAD);
+               PPPOE_ADD_16(p, 2);
+               PPPOE_ADD_16(p, (uint16_t)sc->sc_sppp.pp_if.if_mtu);
+       }
 
 #ifdef PPPOE_DEBUG
        p += sizeof sc;
@@ -1283,6 +1294,9 @@
                len += 2 + 2 + sc->sc_ac_cookie_len;    /* AC cookie */
        if (sc->sc_relay_sid_len > 0)
                len += 2 + 2 + sc->sc_relay_sid_len;    /* Relay SID */
+       if (sc->sc_sppp.pp_if.if_mtu > PPPOE_MAXMTU) {
+               len += 2 + 2 + 2;
+       }
        m0 = pppoe_get_mbuf(len + PPPOE_HEADERLEN);
        if (!m0)
                return ENOBUFS;
@@ -1311,6 +1325,13 @@
        PPPOE_ADD_16(p, PPPOE_TAG_HUNIQUE);
        PPPOE_ADD_16(p, sizeof(sc));
        memcpy(p, &sc, sizeof sc);
+       p += sizeof(sc);
+
+       if (sc->sc_sppp.pp_if.if_mtu > PPPOE_MAXMTU) {
+               PPPOE_ADD_16(p, PPPOE_TAG_MAX_PAYLOAD);
+               PPPOE_ADD_16(p, 2);
+               PPPOE_ADD_16(p, (uint16_t)sc->sc_sppp.pp_if.if_mtu);
+       }
 
 #ifdef PPPOE_DEBUG
        p += sizeof sc;


Home | Main Index | Thread Index | Old Index