Source-Changes-HG archive

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

[src/trunk]: src/sys/net Adjust mtu at LCP instead at IPCP



details:   https://anonhg.NetBSD.org/src/rev/109ab6b050e9
branches:  trunk
changeset: 378682:109ab6b050e9
user:      yamaguchi <yamaguchi%NetBSD.org@localhost>
date:      Fri Apr 23 03:36:13 2021 +0000

description:
Adjust mtu at LCP instead at IPCP

The adjustment must be done at LCP when a PPPoE connection
does not use IPCP.

diffstat:

 sys/net/if_spppsubr.c |  93 +++++++++++++++++++++++++++++++++++---------------
 1 files changed, 65 insertions(+), 28 deletions(-)

diffs (189 lines):

diff -r 4095ec6d03cf -r 109ab6b050e9 sys/net/if_spppsubr.c
--- a/sys/net/if_spppsubr.c     Fri Apr 23 03:31:33 2021 +0000
+++ b/sys/net/if_spppsubr.c     Fri Apr 23 03:36:13 2021 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: if_spppsubr.c,v 1.219 2021/04/23 03:31:33 yamaguchi Exp $       */
+/*     $NetBSD: if_spppsubr.c,v 1.220 2021/04/23 03:36:13 yamaguchi Exp $       */
 
 /*
  * Synchronous PPP/Cisco link level subroutines.
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.219 2021/04/23 03:31:33 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_spppsubr.c,v 1.220 2021/04/23 03:36:13 yamaguchi Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_inet.h"
@@ -1166,6 +1166,7 @@ sppp_ioctl(struct ifnet *ifp, u_long cmd
        struct sppp *sp = (struct sppp *) ifp;
        int s, error=0, going_up, going_down;
        u_short newmode;
+       u_long lcp_mru;
 
        s = splnet();
        switch (cmd) {
@@ -1221,17 +1222,31 @@ sppp_ioctl(struct ifnet *ifp, u_long cmd
                if (error == ENETRESET)
                        error = 0;
 
-               if (sp->lcp.their_mru > 0 &&
+               SPPP_LOCK(sp, RW_WRITER);
+               lcp_mru = sp->lcp.mru;
+               if (ifp->if_mtu < PP_MTU) {
+                       sp->lcp.mru = ifp->if_mtu;
+               } else {
+                       sp->lcp.mru = PP_MTU;
+               }
+               if (lcp_mru != sp->lcp.mru)
+                       SET(sp->lcp.opts, SPPP_LCP_OPT_MRU);
+
+               if (sp->scp[IDX_LCP].state == STATE_OPENED &&
                    ifp->if_mtu > sp->lcp.their_mru) {
                        sp->pp_saved_mtu = ifp->if_mtu;
                        ifp->if_mtu = sp->lcp.their_mru;
+
                        if (ifp->if_flags & IFF_DEBUG) {
                                log(LOG_DEBUG,
-                                   "%s: setting MTU to "
-                                   "%"PRIu64" bytes\n",
-                                   ifp->if_xname, ifp->if_mtu);
+                                   "%s: setting MTU "
+                                   "from %"PRIu64" bytes "
+                                   "to %"PRIu64" bytes\n",
+                                   ifp->if_xname, sp->pp_saved_mtu,
+                                   ifp->if_mtu);
                        }
                }
+               SPPP_UNLOCK(sp);
                break;
 
        case SIOCGIFMTU:
@@ -2582,8 +2597,9 @@ sppp_lcp_open(struct sppp *sp, void *xcp
        if (sp->pp_if.if_mtu < PP_MTU) {
                sp->lcp.mru = sp->pp_if.if_mtu;
                SET(sp->lcp.opts, SPPP_LCP_OPT_MRU);
-       } else
+       } else {
                sp->lcp.mru = PP_MTU;
+       }
        sp->lcp.their_mru = PP_MTU;
 
        /*
@@ -2597,6 +2613,7 @@ sppp_lcp_open(struct sppp *sp, void *xcp
        sppp_open_event(sp, xcp);
 }
 
+
 /*
  * Analyze a configure request.  Return true if it was agreeable, and
  * caused action sca, false if it has been rejected or nak'ed, and
@@ -3115,20 +3132,38 @@ end:
 static void
 sppp_lcp_tlu(struct sppp *sp)
 {
-       struct ifnet *ifp = &sp->pp_if;
+       STDDCL;
        int i;
 
        KASSERT(SPPP_WLOCKED(sp));
 
+       /* unlock for IFNET_LOCK and if_up() */
+       SPPP_UNLOCK(sp);
+
        /* XXX ? */
        if (! (ifp->if_flags & IFF_UP) &&
            (ifp->if_flags & IFF_RUNNING)) {
                /* Coming out of loopback mode. */
-               SPPP_UNLOCK(sp);
                if_up(ifp);
-               SPPP_LOCK(sp, RW_WRITER);
        }
 
+       IFNET_LOCK(ifp);
+       SPPP_LOCK(sp, RW_WRITER);
+
+       if (ifp->if_mtu > sp->lcp.their_mru) {
+               sp->pp_saved_mtu = ifp->if_mtu;
+               ifp->if_mtu = sp->lcp.their_mru;
+               if (debug) {
+                       log(LOG_DEBUG,
+                           "%s: setting MTU "
+                           "from %"PRIu64" bytes "
+                           "to %"PRIu64" bytes\n",
+                           ifp->if_xname, sp->pp_saved_mtu,
+                           ifp->if_mtu);
+               }
+       }
+       IFNET_UNLOCK(ifp);
+
        if (ISSET(sp->lcp.opts, SPPP_LCP_OPT_AUTH_PROTO) ||
            (sp->pp_flags & PP_NEEDAUTH) != 0)
                sppp_change_phase(sp, SPPP_PHASE_AUTHENTICATE);
@@ -3164,6 +3199,7 @@ sppp_lcp_tlu(struct sppp *sp)
 static void
 sppp_lcp_tld(struct sppp *sp)
 {
+       STDDCL;
        int i, pi, phase;
 
        KASSERT(SPPP_WLOCKED(sp));
@@ -3172,6 +3208,25 @@ sppp_lcp_tld(struct sppp *sp)
 
        sppp_change_phase(sp, SPPP_PHASE_TERMINATE);
 
+       if (sp->pp_saved_mtu > 0) {
+               SPPP_UNLOCK(sp);
+               IFNET_LOCK(ifp);
+               SPPP_LOCK(sp, RW_WRITER);
+
+               if (debug) {
+                       log(LOG_DEBUG,
+                           "%s: setting MTU "
+                           "from %"PRIu64" bytes "
+                           "to %"PRIu64" bytes\n",
+                           ifp->if_xname, ifp->if_mtu,
+                           sp->pp_saved_mtu);
+               }
+
+               ifp->if_mtu = sp->pp_saved_mtu;
+               sp->pp_saved_mtu = 0;
+               IFNET_UNLOCK(ifp);
+       }
+
        /*
         * Take upper layers down.  We send the Down event first and
         * the Close second to prevent the upper layers from sending
@@ -5543,15 +5598,6 @@ sppp_set_ip_addrs(struct sppp *sp)
                }
        }
 
-       if (ifp->if_mtu > sp->lcp.their_mru) {
-               sp->pp_saved_mtu = ifp->if_mtu;
-               ifp->if_mtu = sp->lcp.their_mru;
-               if (debug)
-                       log(LOG_DEBUG,
-                           "%s: setting MTU to %" PRIu64 " bytes\n",
-                           ifp->if_xname, ifp->if_mtu);
-       }
-
        IFNET_UNLOCK(ifp);
 
        sppp_notify_con(sp);
@@ -5611,15 +5657,6 @@ sppp_clear_ip_addrs(struct sppp *sp)
                }
        }
 
-       if (sp->pp_saved_mtu > 0) {
-               ifp->if_mtu = sp->pp_saved_mtu;
-               sp->pp_saved_mtu = 0;
-               if (debug)
-                       log(LOG_DEBUG,
-                           "%s: resetting MTU to %" PRIu64 " bytes\n",
-                           ifp->if_xname, ifp->if_mtu);
-       }
-
        IFNET_UNLOCK(ifp);
 }
 #endif



Home | Main Index | Thread Index | Old Index