summaryrefslogtreecommitdiff
path: root/net/mpd5/files/patch-mtu-override
blob: 2bd957df1bfa689637cc71ca511c7dfcf4e9f5fc (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
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 =