Index: src/iface.h =================================================================== --- src/iface.h (revision 2246) +++ src/iface.h (working copy) @@ -107,6 +107,7 @@ u_char traffic[IFACE_IDLE_SPLIT]; /* Mark any traffic */ u_short mtu; /* Interface MTU */ u_short max_mtu; /* Configured maximum MTU */ + u_short mtu_override; /* Configured MTU override */ struct optinfo options; /* Configuration options */ u_int idle_timeout; /* Idle timeout */ u_int session_timeout; /* Session timeout */ Index: src/iface.c =================================================================== --- src/iface.c (revision 2246) +++ src/iface.c (working copy) @@ -162,7 +162,7 @@ IfaceSetCommand, NULL, 2, (void *) SET_ADDRS }, { "route {dest}[/{width}]", "Add IP route", IfaceSetCommand, NULL, 2, (void *) SET_ROUTE }, - { "mtu {size}", "Set max allowed interface MTU", + { "mtu {size} [override]", "Set max allowed or override interface MTU", IfaceSetCommand, NULL, 2, (void *) SET_MTU }, { "name [{name}]", "Set interface name", IfaceSetCommand, NULL, 2, (void *) SET_NAME }, @@ -289,6 +289,7 @@ IfaceInit(Bund b) /* Default configuration */ iface->mtu = NG_IFACE_MTU_DEFAULT; iface->max_mtu = NG_IFACE_MTU_DEFAULT; + iface->mtu_override = 0; #ifdef SIOCSIFDESCR iface->ifdescr = NULL; iface->conf.ifdescr = NULL; @@ -1606,15 +1607,30 @@ IfaceSetCommand(Context ctx, int ac, cha case SET_MTU: { int max_mtu; + int override; /* Check */ - if (ac != 1) + if (ac < 1 || ac > 2) return(-1); max_mtu = atoi(av[0]); + override = 0; + + if (ac == 2 && av[1][0]) { + if (strcmp(av[1], "override") == 0) + override = 1; + else + Error("Invalid keyword %s", av[1]); + } + if (max_mtu < IFACE_MIN_MTU || max_mtu > IFACE_MAX_MTU) - Error("Invalid interface mtu %d", max_mtu); - iface->max_mtu = max_mtu; + if (!override || max_mtu != 0) + Error("Invalid interface mtu %d", max_mtu); + + if (max_mtu != 0) + iface->max_mtu = max_mtu; + if (override) + iface->mtu_override = max_mtu; } break; @@ -1743,6 +1759,7 @@ IfaceStat(Context ctx, int ac, char *av[ Printf("\tGroup : %s\r\n", iface->conf.ifgroup); #endif Printf("\tMaximum MTU : %d bytes\r\n", iface->max_mtu); + Printf("\tMTU override : %d bytes\r\n", iface->mtu_override); Printf("\tIdle timeout : %d seconds\r\n", iface->idle_timeout); Printf("\tSession timeout : %d seconds\r\n", iface->session_timeout); if (!u_rangeempty(&iface->conf.self_addr)) { @@ -1873,14 +1890,18 @@ IfaceSetMTU(Bund b, int mtu) return; } - if ((b->params.mtu > 0) && (mtu > b->params.mtu)) { + if (!iface->mtu_override && (b->params.mtu > 0) && (mtu > b->params.mtu)) { mtu = b->params.mtu; Log(LG_IFACE2, ("[%s] IFACE: forcing MTU of auth backend: %d bytes", b->name, mtu)); } - /* Limit MTU to configured maximum */ - if (mtu > iface->max_mtu) + /* Limit MTU to configured maximum/override */ + if (iface->mtu_override) { + mtu = iface->mtu_override; + Log(LG_IFACE2, ("[%s] IFACE: forcing MTU override: %d bytes", + b->name, mtu)); + } else if (mtu > iface->max_mtu) mtu = iface->max_mtu; /* Set MTU on interface */ @@ -3061,6 +3082,9 @@ IfaceSetupMSS(Bund b, uint16_t maxMSS) memset(&tcpmsscfg, 0, sizeof(tcpmsscfg)); tcpmsscfg.maxMSS = maxMSS; + Log(LG_IFACE2, ("[%s] IFACE: Configuring ng_tcpmss %s %u", + b->name, path, (unsigned)tcpmsscfg.maxMSS)); + snprintf(tcpmsscfg.inHook, sizeof(tcpmsscfg.inHook), "in"); snprintf(tcpmsscfg.outHook, sizeof(tcpmsscfg.outHook), "out"); if (NgSendMsg(gLinksCsock, path, NGM_TCPMSS_COOKIE, NGM_TCPMSS_CONFIG, Index: src/bund.c =================================================================== --- src/bund.c (revision 2253) +++ src/bund.c (revision 2254) @@ -328,7 +328,8 @@ BundJoin(Link l) /* Configure this link */ b->pppConfig.links[l->bundleIndex].enableLink = 1; - b->pppConfig.links[l->bundleIndex].mru = lcp->peer_mru; + b->pppConfig.links[l->bundleIndex].mru = b->iface.mtu_override ? + b->iface.mtu_override : lcp->peer_mru; b->pppConfig.links[l->bundleIndex].enableACFComp = lcp->peer_acfcomp; b->pppConfig.links[l->bundleIndex].enableProtoComp = lcp->peer_protocomp; b->pppConfig.links[l->bundleIndex].bandwidth =