Separate out the setting of the interface MTU from the setting of
authorPaul Mackerras <paulus@samba.org>
Thu, 8 Mar 2001 05:14:26 +0000 (05:14 +0000)
committerPaul Mackerras <paulus@samba.org>
Thu, 8 Mar 2001 05:14:26 +0000 (05:14 +0000)
lower level things like the asyncmap and proto/AC compression.
Renamed ppp_send/recv_config to tty_send/recv_config.
At this point we have a structure of channel operations and a pointer
to the currently set (the_channel) which a plugin can override if
desired.

pppd/demand.c
pppd/multilink.c
pppd/sys-linux.c
pppd/sys-solaris.c

index 957b84a97d3d5c481c7af26015c48c88fe5d2f98..d46776692fa04f7158abcaac0fb4fd92af12fc22 100644 (file)
@@ -17,7 +17,7 @@
  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
  */
 
-#define RCSID  "$Id: demand.c,v 1.14 2000/12/27 23:27:29 paulus Exp $"
+#define RCSID  "$Id: demand.c,v 1.15 2001/03/08 05:14:26 paulus Exp $"
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -85,6 +85,7 @@ demand_conf()
     flush_flag = 0;
     fcs = PPP_INITFCS;
 
+    netif_set_mtu(0, MIN(lcp_allowoptions[0].mru, PPP_MRU));
     ppp_send_config(0, PPP_MRU, (u_int32_t) 0, 0, 0);
     ppp_recv_config(0, PPP_MRU, (u_int32_t) 0, 0, 0);
 
index cb6bd106d1061e72d081741cfc4c134a06200df6..c3a782f284662df0fce296d1e83518bd9a654f5f 100644 (file)
@@ -86,8 +86,9 @@ mp_join_bundle()
 {
        lcp_options *go = &lcp_gotoptions[0];
        lcp_options *ho = &lcp_hisoptions[0];
+       lcp_options *ao = &lcp_allowoptions[0];
        int unit, pppd_pid;
-       int l;
+       int l, mtu;
        char *p;
        TDB_DATA key, pid, rec;
 
@@ -95,12 +96,17 @@ mp_join_bundle()
                /* not doing multilink */
                if (go->neg_mrru)
                        notice("oops, multilink negotiated only for receive");
+               mtu = ho->neg_mru? ho->mru: PPP_MRU;
+               if (mtu > ao->mru)
+                       mtu = ao->mru;
                if (demand) {
                        /* already have a bundle */
                        cfg_bundle(0, 0, 0, 0);
+                       netif_set_mtu(0, mtu);
                        return 0;
                }
                make_new_bundle(0, 0, 0, 0);
+               netif_set_mtu(0, mtu);
                set_ifunit(1);
                return 0;
        }
@@ -134,8 +140,10 @@ mp_join_bundle()
         * For demand mode, we only need to configure the bundle
         * and attach the link.
         */
+       mtu = MIN(ho->mrru, ao->mru);
        if (demand) {
                cfg_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf);
+               netif_set_mtu(0, mtu);
                script_setenv("BUNDLE", bundle_id + 7, 1);
                return 0;
        }
@@ -178,6 +186,7 @@ mp_join_bundle()
 
        /* we have to make a new bundle */
        make_new_bundle(go->mrru, ho->mrru, go->neg_ssnhf, ho->neg_ssnhf);
+       netif_set_mtu(0, mtu);
        set_ifunit(1);
        script_setenv("BUNDLE", bundle_id + 7, 1);
        tdb_writeunlock(pppdb);
index 4d24a5c24c9b582e33b6f6d6a3f75d99b1c780a9..d5dbfafbc47107c8b86fea1d3a9abe0b471c9438 100644 (file)
@@ -73,7 +73,6 @@
 #include "pppd.h"
 #include "fsm.h"
 #include "ipcp.h"
-#include "patchlevel.h"
 
 #ifdef IPX_CHANGE
 #include "ipxcp.h"
@@ -563,7 +562,6 @@ static int make_ppp_unit()
 void cfg_bundle(int mrru, int mtru, int rssn, int tssn)
 {
        int flags;
-       struct ifreq ifr;
 
        if (!new_style_driver)
                return;
@@ -573,16 +571,8 @@ void cfg_bundle(int mrru, int mtru, int rssn, int tssn)
                error("Couldn't set MRRU: %m");
        flags = get_flags(ppp_dev_fd);
        flags &= ~(SC_MP_SHORTSEQ | SC_MP_XSHORTSEQ);
-       flags |= (rssn? SC_MP_SHORTSEQ: 0) | (tssn? SC_MP_XSHORTSEQ: 0);
-
-       if (mtru > 0 && mtru != link_mtu) {
-               memset(&ifr, 0, sizeof(ifr));
-               slprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "ppp%d", ifunit);
-               ifr.ifr_mtu = mtru;
-               if (ioctl(sock_fd, SIOCSIFMTU, &ifr) < 0)
-                       error("Couldn't set interface MTU: %m");
-               flags |= SC_MULTILINK;
-       }
+       flags |= (rssn? SC_MP_SHORTSEQ: 0) | (tssn? SC_MP_XSHORTSEQ: 0)
+               | (mrru? SC_MULTILINK: 0);
 
        set_flags(ppp_dev_fd, flags);
 
@@ -608,7 +598,7 @@ void make_new_bundle(int mrru, int mtru, int rssn, int tssn)
        if (make_ppp_unit() < 0)
                die(1);
 
-       /* set the mrru, mtu and flags */
+       /* set the mrru and flags */
        cfg_bundle(mrru, mtru, rssn, tssn);
 }
 
@@ -1044,31 +1034,40 @@ get_loop_output(void)
     return rv;
 }
 
-/********************************************************************
- *
- * ppp_send_config - configure the transmit characteristics of
- * the ppp interface.
+/*
+ * netif_set_mtu - set the MTU on the PPP network interface.
  */
-
-void ppp_send_config (int unit,int mtu,u_int32_t asyncmap,int pcomp,int accomp)
+void
+netif_set_mtu(int unit, int mtu)
 {
-    u_int x;
     struct ifreq ifr;
-  
-    SYSDEBUG ((LOG_DEBUG, "send_config: mtu = %d\n", mtu));
-/*
- * Set the MTU and other parameters for the ppp device
- */
+
+    SYSDEBUG ((LOG_DEBUG, "netif_set_mtu: mtu = %d\n", mtu));
+
     memset (&ifr, '\0', sizeof (ifr));
     strlcpy(ifr.ifr_name, ifname, sizeof (ifr.ifr_name));
     ifr.ifr_mtu = mtu;
        
     if (ifunit >= 0 && ioctl(sock_fd, SIOCSIFMTU, (caddr_t) &ifr) < 0)
        fatal("ioctl(SIOCSIFMTU): %m(%d)", errno);
-    link_mtu = mtu;
+}
+
+/********************************************************************
+ *
+ * tty_send_config - configure the transmit characteristics of
+ * the ppp interface.
+ */
 
+void tty_send_config (int mtu,u_int32_t asyncmap,int pcomp,int accomp)
+{
+    u_int x;
+
+/*
+ * Set the asyncmap and other parameters for the ppp device
+ */
     if (!still_ppp())
        return;
+    link_mtu = mtu;
     SYSDEBUG ((LOG_DEBUG, "send_config: asyncmap = %lx\n", asyncmap));
     if (ioctl(ppp_fd, PPPIOCSASYNCMAP, (caddr_t) &asyncmap) < 0) {
        if (!ok_error(errno))
@@ -1085,10 +1084,10 @@ void ppp_send_config (int unit,int mtu,u_int32_t asyncmap,int pcomp,int accomp)
 
 /********************************************************************
  *
- * ppp_set_xaccm - set the extended transmit ACCM for the interface.
+ * tty_set_xaccm - set the extended transmit ACCM for the interface.
  */
 
-void ppp_set_xaccm (int unit, ext_accm accm)
+void tty_set_xaccm (ext_accm accm)
 {
     SYSDEBUG ((LOG_DEBUG, "set_xaccm: %08lx %08lx %08lx %08lx\n",
                accm[0], accm[1], accm[2], accm[3]));
@@ -1103,11 +1102,11 @@ void ppp_set_xaccm (int unit, ext_accm accm)
 
 /********************************************************************
  *
- * ppp_recv_config - configure the receive-side characteristics of
+ * tty_recv_config - configure the receive-side characteristics of
  * the ppp interface.
  */
 
-void ppp_recv_config (int unit,int mru,u_int32_t asyncmap,int pcomp,int accomp)
+void tty_recv_config (int mru,u_int32_t asyncmap,int pcomp,int accomp)
 {
     SYSDEBUG ((LOG_DEBUG, "recv_config: mru = %d\n", mru));
 /*
index af2ef18b77bb789f628a357ea54badf7163e46d1..859cd2a1a3caa8665f5968137b5c9060ffe71539 100644 (file)
@@ -42,7 +42,7 @@
  * OR MODIFICATIONS.
  */
 
-#define RCSID  "$Id: sys-solaris.c,v 1.2 2000/04/21 01:27:57 masputra Exp $"
+#define RCSID  "$Id: sys-solaris.c,v 1.3 2001/03/08 05:14:26 paulus Exp $"
 
 #include <limits.h>
 #include <stdio.h>
@@ -1460,43 +1460,18 @@ get_loop_output()
 }
 
 /*
- * ppp_send_config - configure the transmit characteristics of
- * the ppp interface.
+ * netif_set_mtu - set the MTU on the PPP network interface.
  */
 void
-ppp_send_config(unit, mtu, asyncmap, pcomp, accomp)
+netif_set_mtu(unit, mtu)
     int unit, mtu;
-    u_int32_t asyncmap;
-    int pcomp, accomp;
 {
-    int cf[2];
     struct ifreq ifr;
 #if defined(INET6) && defined(SOL2)
     struct lifreq lifr;
     int        fd;
 #endif /* defined(INET6) && defined(SOL2) */
 
-    link_mtu = mtu;
-    if (strioctl(pppfd, PPPIO_MTU, &mtu, sizeof(mtu), 0) < 0) {
-       if (hungup && errno == ENXIO)
-           return;
-       error("Couldn't set MTU: %m");
-    }
-    if (fdmuxid >= 0) {
-       if (!sync_serial) {
-           if (strioctl(pppfd, PPPIO_XACCM, &asyncmap, sizeof(asyncmap), 0) < 0) {
-               error("Couldn't set transmit ACCM: %m");
-           }
-       }
-       cf[0] = (pcomp? COMP_PROT: 0) + (accomp? COMP_AC: 0);
-       cf[1] = COMP_PROT | COMP_AC;
-       if (any_compressions() &&
-           strioctl(pppfd, PPPIO_CFLAGS, cf, sizeof(cf), sizeof(int)) < 0) {
-           error("Couldn't set prot/AC compression: %m");
-       }
-    }
-
-    /* set the MTU for IP as well */
     memset(&ifr, 0, sizeof(ifr));
     strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
     ifr.ifr_metric = link_mtu;
@@ -1520,12 +1495,44 @@ ppp_send_config(unit, mtu, asyncmap, pcomp, accomp)
 #endif /* defined(INET6) && defined(SOL2) */
 }
 
+/*
+ * tty_send_config - configure the transmit characteristics of
+ * the ppp interface.
+ */
+void
+tty_send_config(mtu, asyncmap, pcomp, accomp)
+    int mtu;
+    u_int32_t asyncmap;
+    int pcomp, accomp;
+{
+    int cf[2];
+
+    link_mtu = mtu;
+    if (strioctl(pppfd, PPPIO_MTU, &mtu, sizeof(mtu), 0) < 0) {
+       if (hungup && errno == ENXIO)
+           return;
+       error("Couldn't set MTU: %m");
+    }
+    if (fdmuxid >= 0) {
+       if (!sync_serial) {
+           if (strioctl(pppfd, PPPIO_XACCM, &asyncmap, sizeof(asyncmap), 0) < 0) {
+               error("Couldn't set transmit ACCM: %m");
+           }
+       }
+       cf[0] = (pcomp? COMP_PROT: 0) + (accomp? COMP_AC: 0);
+       cf[1] = COMP_PROT | COMP_AC;
+       if (any_compressions() &&
+           strioctl(pppfd, PPPIO_CFLAGS, cf, sizeof(cf), sizeof(int)) < 0) {
+           error("Couldn't set prot/AC compression: %m");
+       }
+    }
+}
+
 /*
  * ppp_set_xaccm - set the extended transmit ACCM for the interface.
  */
 void
-ppp_set_xaccm(unit, accm)
-    int unit;
+tty_set_xaccm(accm)
     ext_accm accm;
 {
     if (sync_serial)
@@ -1543,8 +1550,8 @@ ppp_set_xaccm(unit, accm)
  * the ppp interface.
  */
 void
-ppp_recv_config(unit, mru, asyncmap, pcomp, accomp)
-    int unit, mru;
+tty_recv_config(mru, asyncmap, pcomp, accomp)
+    int mru;
     u_int32_t asyncmap;
     int pcomp, accomp;
 {