mirror of
https://git.freebsd.org/ports.git
synced 2025-05-31 02:16:27 -04:00
mpd5-5.9_14 introduced regression for specific case when no mtu configured for PPPoE peer that does not advertize any MTU itself. mpd5 should default to 1492 then but revision 14 defaults to 1500. The problem may be worked around specifying 1492 for link or interface MTU until upgrade to this revision that restores compatibility. PR: 270687
161 lines
5 KiB
Text
161 lines
5 KiB
Text
Index: src/link.c
|
|
===================================================================
|
|
--- src/link.c (revision 2481)
|
|
+++ src/link.c (working copy)
|
|
@@ -435,7 +435,8 @@ LinkCreate(Context ctx, int ac, const char *const av[]
|
|
|
|
/* Initialize link configuration with defaults */
|
|
l->conf.mru = LCP_DEFAULT_MRU;
|
|
- l->conf.mtu = LCP_DEFAULT_MRU;
|
|
+ /* Do not assume any MTU value for this moment */
|
|
+ l->conf.mtu = 0;
|
|
l->conf.mrru = MP_DEFAULT_MRRU;
|
|
l->conf.accmap = 0x000a0000;
|
|
l->conf.max_redial = -1;
|
|
@@ -1549,9 +1562,9 @@ LinkSetCommand(Context ctx, int ac, const char *const
|
|
name = ((intptr_t)arg == SET_MTU) ? "MTU" : "MRU";
|
|
if (val < LCP_MIN_MRU)
|
|
Error("min %s is %d", name, LCP_MIN_MRU);
|
|
- else if (l->type && (val > l->type->mru)) {
|
|
+ else if (l->type && (val > l->type->mtu)) {
|
|
Error("max %s on type \"%s\" links is %d",
|
|
- name, l->type->name, l->type->mru);
|
|
+ name, l->type->name, l->type->mtu);
|
|
} else if ((intptr_t)arg == SET_MTU)
|
|
l->conf.mtu = val;
|
|
else
|
|
Index: src/phys.c
|
|
===================================================================
|
|
--- src/phys.c (revision 2481)
|
|
+++ src/phys.c (working copy)
|
|
@@ -483,7 +483,7 @@ PhysGetMtu(Link l, int conf)
|
|
else
|
|
return (0);
|
|
} else
|
|
- return (l->conf.mtu);
|
|
+ return (l->conf.mtu ? l->conf.mtu : LCP_DEFAULT_MRU);
|
|
} else
|
|
return (0);
|
|
}
|
|
Index: src/pppoe.c
|
|
===================================================================
|
|
--- src/pppoe.c (revision 2481)
|
|
+++ src/pppoe.c (working copy)
|
|
@@ -31,6 +31,7 @@
|
|
* DEFINITIONS
|
|
*/
|
|
|
|
+#define PPPOE_MTU_MAX (ETHER_MAX_LEN_JUMBO - 8)
|
|
#define PPPOE_MTU 1492 /* allow room for PPPoE overhead */
|
|
#define PPPOE_MRU 1492
|
|
|
|
@@ -181,7 +182,7 @@ static void PppoeDoClose(Link l);
|
|
const struct phystype gPppoePhysType = {
|
|
.name = "pppoe",
|
|
.descr = "PPP over Ethernet",
|
|
- .mtu = PPPOE_MTU,
|
|
+ .mtu = PPPOE_MTU_MAX,
|
|
.mru = PPPOE_MRU,
|
|
.tmpl = 1,
|
|
.init = PppoeInit,
|
|
@@ -886,7 +887,7 @@ PppoeGetMtu(Link l, int conf)
|
|
if (conf == 0)
|
|
return (l->type->mtu);
|
|
else
|
|
- return (l->conf.mtu);
|
|
+ return (l->conf.mtu ? l->conf.mtu : PPPOE_MTU);
|
|
}
|
|
|
|
static u_short
|
|
@@ -1712,6 +1718,7 @@ PppoeSetCommand(Context ctx, int ac, const char *const
|
|
unsigned i;
|
|
#ifdef NGM_PPPOE_SETMAXP_COOKIE
|
|
int ap;
|
|
+ uint16_t mtu;
|
|
#endif
|
|
switch ((intptr_t)arg) {
|
|
case SET_IFACE:
|
|
@@ -1732,6 +1739,20 @@ PppoeSetCommand(Context ctx, int ac, const char *const
|
|
}
|
|
}
|
|
strlcpy(pi->hook, hookname, sizeof(pi->hook));
|
|
+
|
|
+#ifdef NGM_PPPOE_SETMAXP_COOKIE
|
|
+ if (pi->max_payload > 0) {
|
|
+ mtu = GetSystemIfaceMTU(pi->iface);
|
|
+ if (mtu == 0)
|
|
+ mtu = ETHER_MAX_LEN;
|
|
+ if (pi->max_payload > mtu - 8) {
|
|
+ pi->max_payload = mtu - 8;
|
|
+ Perror("[%s] PPPoE: PPP-Max-Payload"
|
|
+ " value reduced to %hu",
|
|
+ pi->iface, pi->max_payload);
|
|
+ }
|
|
+ }
|
|
+#endif
|
|
break;
|
|
default:
|
|
return(-1);
|
|
@@ -1762,8 +1783,18 @@ PppoeSetCommand(Context ctx, int ac, const char *const
|
|
if (ac != 1)
|
|
return(-1);
|
|
ap = atoi(av[0]);
|
|
- if (ap < PPPOE_MRU || ap > ETHER_MAX_LEN - 8)
|
|
- Error("PPP-Max-Payload value \"%s\"", av[0]);
|
|
+ if (pi->iface[0] == '\0') {
|
|
+ if (ap < PPPOE_MRU) /* postpone check for MTU */
|
|
+ Error("PPP-Max-Payload value \"%s\" less than %d",
|
|
+ av[0], PPPOE_MRU);
|
|
+ } else {
|
|
+ mtu = GetSystemIfaceMTU(pi->iface);
|
|
+ if (mtu == 0)
|
|
+ mtu = ETHER_MAX_LEN;
|
|
+ if (ap < PPPOE_MRU || ap > mtu - 8)
|
|
+ Error("PPP-Max-Payload value \"%s\" not in a range of %d..%hu",
|
|
+ av[0], PPPOE_MRU, mtu);
|
|
+ }
|
|
pi->max_payload = ap;
|
|
break;
|
|
#endif
|
|
Index: src/util.c
|
|
===================================================================
|
|
--- src/util.c (revision 2481)
|
|
+++ src/util.c (revision 2483)
|
|
@@ -1597,3 +1597,25 @@ ssize_t GetDataAddrs(int sock, void *dbuf, size_t dbuf
|
|
|
|
return (size);
|
|
}
|
|
+
|
|
+uint16_t GetSystemIfaceMTU(const char *ifname)
|
|
+{
|
|
+ struct ifreq ifr;
|
|
+ static int sock = -1;
|
|
+
|
|
+ if (sock == -1 &&
|
|
+ (sock = socket(PF_INET, socktype(SOCK_DGRAM), 0)) == -1) {
|
|
+ Perror("[%s] %s: Socket creation error", ifname, __FUNCTION__);
|
|
+ return (0);
|
|
+ }
|
|
+
|
|
+ memset(&ifr, 0, sizeof(ifr));
|
|
+ strlcpy(ifr.ifr_name, ifname, sizeof(ifr.ifr_name));
|
|
+
|
|
+ if (ioctl(sock, SIOCGIFMTU, (caddr_t)&ifr) == -1) {
|
|
+ Perror("[%s] %s: SIOCGIFMTU failed", ifname, __FUNCTION__);
|
|
+ return (0);
|
|
+ }
|
|
+ /* Let _exit() close sock */
|
|
+ return (ifr.ifr_mtu);
|
|
+}
|
|
Index: src/util.h
|
|
===================================================================
|
|
--- src/util.h (revision 2481)
|
|
+++ src/util.h (revision 2483)
|
|
@@ -98,6 +98,7 @@ extern u_int32_t GenerateMagic(void);
|
|
extern int GetAnyIpAddress(struct u_addr *ipaddr, const char *ifname);
|
|
extern int GetEther(struct u_addr *addr, struct sockaddr_dl *hwaddr);
|
|
extern int GetPeerEther(struct u_addr *addr, struct sockaddr_dl *hwaddr);
|
|
+extern uint16_t GetSystemIfaceMTU(const char *ifname);
|
|
extern void ppp_util_ascify(char *buf, size_t max, const char *bytes, size_t len);
|
|
extern int IfaceSetFlag(const char *ifname, unsigned value);
|
|
|