-
Notifications
You must be signed in to change notification settings - Fork 761
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
net/mpd5: revert previous LCP MRU negotiation change
and add new way to deal with same problem following upstream changes r22478, r2249: - reverse r2246 as it used wrong way to deal with the problem; - make it possible to override results of LCP negotiation and set interface MTU to specified value with a command: set iface mtu NNN override New option "override" is not documented yet. This is dangerous option as it can violate RFC 1661 and should be used with caution and at your own risk. It is useful when you deal with broken PPP peer negotiating too low value while higher MTU is known to work.
- Loading branch information
eugen
authored and
eugen
committed
Aug 4, 2018
1 parent
5ce8f3f
commit 67bbe63
Showing
3 changed files
with
108 additions
and
65 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,107 @@ | ||
| 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, |