From: Paul Mackerras Date: Thu, 8 Mar 2001 05:14:26 +0000 (+0000) Subject: Separate out the setting of the interface MTU from the setting of X-Git-Tag: ppp-2.4.7~505 X-Git-Url: https://git.ozlabs.org/?p=ppp.git;a=commitdiff_plain;h=cffe80dd87a8ba3fba8f56fda45d2c0cfd62ba4d Separate out the setting of the interface MTU from the setting of 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. --- diff --git a/pppd/demand.c b/pppd/demand.c index 957b84a..d467766 100644 --- a/pppd/demand.c +++ b/pppd/demand.c @@ -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 #include @@ -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); diff --git a/pppd/multilink.c b/pppd/multilink.c index cb6bd10..c3a782f 100644 --- a/pppd/multilink.c +++ b/pppd/multilink.c @@ -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); diff --git a/pppd/sys-linux.c b/pppd/sys-linux.c index 4d24a5c..d5dbfaf 100644 --- a/pppd/sys-linux.c +++ b/pppd/sys-linux.c @@ -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)); /* diff --git a/pppd/sys-solaris.c b/pppd/sys-solaris.c index af2ef18..859cd2a 100644 --- a/pppd/sys-solaris.c +++ b/pppd/sys-solaris.c @@ -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 #include @@ -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; {