1
0
Fork 0
mirror of https://github.com/Ysurac/openmptcprouter-feeds.git synced 2025-03-09 15:40:03 +00:00
openmptcprouter-feeds/netifd/patches/015-linux-system-Set-MTU-while-adding-interfaces-to-brid.patch
2022-04-06 20:55:49 +08:00

109 lines
2.9 KiB
Diff

diff -Nur a/system-dummy.c netifd-2019-08-05-5e02f944/system-dummy.c
--- a/system-dummy.c 2020-05-01 17:03:24.807952410 -0700
+++ netifd-2019-08-05-5e02f944/system-dummy.c 2020-05-01 17:03:52.615805779 -0700
@@ -310,6 +310,11 @@
return 0;
}
+int system_update_ipv4_mtu(struct device *dev, int mtu)
+{
+ return 0;
+}
+
int system_update_ipv6_mtu(struct device *dev, int mtu)
{
return 0;
diff -Nur a/system.h netifd-2019-08-05-5e02f944/system.h
--- a/system.h 2020-05-01 17:03:24.807952410 -0700
+++ netifd-2019-08-05-5e02f944/system.h 2020-05-01 17:07:07.894774469 -0700
@@ -253,6 +253,8 @@
void system_fd_set_cloexec(int fd);
+int system_update_ipv4_mtu(struct device *device, int mtu);
+
int system_update_ipv6_mtu(struct device *dev, int mtu);
#endif
diff -Nur a/system-linux.c netifd-2019-08-05-5e02f944/system-linux.c
--- a/system-linux.c 2020-05-01 17:03:24.807952410 -0700
+++ netifd-2019-08-05-5e02f944/system-linux.c 2020-05-01 17:06:12.795065718 -0700
@@ -852,6 +852,12 @@
char *oldbr;
int ret = 0;
+ if (bridge->settings.flags & DEV_OPT_MTU) {
+ system_update_ipv4_mtu(dev, bridge->settings.mtu);
+ }
+ if (bridge->settings.flags & DEV_OPT_MTU6) {
+ system_update_ipv6_mtu(dev, bridge->settings.mtu6);
+ }
oldbr = system_get_bridge(dev->ifname, dev_buf, sizeof(dev_buf));
if (!oldbr || strcmp(oldbr, bridge->ifname) != 0)
ret = system_bridge_if(bridge->ifname, dev, SIOCBRADDIF, NULL);
@@ -1526,10 +1532,9 @@
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name) - 1);
- if (ioctl(sock_ioctl, SIOCGIFMTU, &ifr) == 0) {
- s->mtu = ifr.ifr_mtu;
+ s->mtu = system_update_ipv4_mtu(dev, 0);
+ if (s->mtu > 0)
s->flags |= DEV_OPT_MTU;
- }
s->mtu6 = system_update_ipv6_mtu(dev, 0);
if (s->mtu6 > 0)
@@ -1623,8 +1628,7 @@
memset(&ifr, 0, sizeof(ifr));
strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name) - 1);
if (s->flags & DEV_OPT_MTU & apply_mask) {
- ifr.ifr_mtu = s->mtu;
- if (ioctl(sock_ioctl, SIOCSIFMTU, &ifr) < 0)
+ if (system_update_ipv4_mtu(dev, s->mtu) < 0)
s->flags &= ~DEV_OPT_MTU;
}
if (s->flags & DEV_OPT_MTU6 & apply_mask) {
@@ -3360,12 +3364,42 @@
return __system_del_ip_tunnel(name, tb);
}
+int system_update_ipv4_mtu(struct device *dev, int mtu)
+{
+ int ret = -1;
+ struct ifreq ifr;
+
+ if(!dev)
+ return ret;
+
+ memset(&ifr, 0, sizeof(ifr));
+ ifr.ifr_addr.sa_family = AF_INET;
+ strncpy(ifr.ifr_name, dev->ifname, sizeof(ifr.ifr_name));
+
+ if (!mtu) {
+ ret = ioctl(sock_ioctl, SIOCGIFMTU, &ifr);
+ if (ret == 0)
+ ret = ifr.ifr_mtu;
+ } else {
+ struct device * parent = system_if_get_parent(dev);
+ if (parent)
+ system_update_ipv4_mtu(parent, mtu);
+
+ ifr.ifr_mtu = mtu;
+ ret = ioctl(sock_ioctl, SIOCSIFMTU, &ifr);
+ }
+ return (ret == 0)?mtu:ret;
+}
+
int system_update_ipv6_mtu(struct device *dev, int mtu)
{
int ret = -1;
char buf[64];
int fd;
+ if(!dev)
+ return ret;
+
snprintf(buf, sizeof(buf), "/proc/sys/net/ipv6/conf/%s/mtu",
dev->ifname);