diff options
| -rw-r--r-- | package/busybox/patches/802-brctl_linux24.patch | 74 | 
1 files changed, 74 insertions, 0 deletions
| diff --git a/package/busybox/patches/802-brctl_linux24.patch b/package/busybox/patches/802-brctl_linux24.patch new file mode 100644 index 000000000..6d6dbc702 --- /dev/null +++ b/package/busybox/patches/802-brctl_linux24.patch @@ -0,0 +1,74 @@ +--- a/networking/brctl.c ++++ b/networking/brctl.c +@@ -18,7 +18,7 @@ +  + /* Maximum number of ports supported per bridge interface.  */ + #ifndef MAX_PORTS +-#define MAX_PORTS 32 ++#define MAX_PORTS 1024 + #endif +  + /* Use internal number parsing and not the "exact" conversion.  */ +@@ -155,6 +155,7 @@ int brctl_main(int argc ATTRIBUTE_UNUSED + 				printf(bi.stp_enabled ? "\tyes" : "\tno"); +  + 				/* print interface list */ ++				memset(ifidx, 0, sizeof ifidx); + 				arm_ioctl(args, BRCTL_GET_PORT_LIST, + 							(unsigned long) ifidx, MAX_PORTS); + 				xioctl(fd, SIOCDEVPRIVATE, &ifr); +@@ -183,9 +184,19 @@ int brctl_main(int argc ATTRIBUTE_UNUSED + 		br = *argv++; +  + 		if (key == ARG_addbr || key == ARG_delbr) { /* addbr or delbr */ +-			ioctl_or_perror_and_die(fd, +-					key == ARG_addbr ? SIOCBRADDBR : SIOCBRDELBR, +-					br, "bridge %s", br); ++			int ret; ++			ret = ioctl(fd, ++				key == ARG_addbr ? SIOCBRADDBR : SIOCBRDELBR, ++				br); ++			if (ret < 0) { ++				arm_ioctl(args, ++					key == ARG_addbr ? BRCTL_ADD_BRIDGE : BRCTL_DEL_BRIDGE, ++					(unsigned long) br, 0);  ++				ret = ioctl(fd, SIOCSIFBR, args); ++			} ++			if (ret < 0) { ++				bb_perror_msg_and_die("bridge %s", br); ++			} + 			goto done; + 		} +  +@@ -194,14 +205,27 @@ int brctl_main(int argc ATTRIBUTE_UNUSED +  + 		strncpy(ifr.ifr_name, br, IFNAMSIZ); + 		if (key == ARG_addif || key == ARG_delif) { /* addif or delif */ ++			int ret; ++			int if_index; + 			brif = *argv; +-			ifr.ifr_ifindex = if_nametoindex(brif); +-			if (!ifr.ifr_ifindex) { ++			if_index = if_nametoindex(brif); ++			if (!if_index) { + 				bb_perror_msg_and_die("iface %s", brif); + 			} +-			ioctl_or_perror_and_die(fd, ++			ifr.ifr_ifindex = if_index; ++			ret = ioctl(fd, + 					key == ARG_addif ? SIOCBRADDIF : SIOCBRDELIF, +-					&ifr, "bridge %s", br); ++					&ifr); ++			if (ret < 0) { ++				arm_ioctl(args, ++					key == ARG_addif ? BRCTL_ADD_IF : BRCTL_DEL_IF, ++					if_index, 0);  ++				ifr.ifr_data = (char *) &args; ++				ret = ioctl(fd, SIOCDEVPRIVATE, &ifr); ++			} ++			if (ret < 0) { ++				bb_perror_msg_and_die("bridge %s", br); ++			} + 			goto done_next_argv; + 		} + #if ENABLE_FEATURE_BRCTL_FANCY | 
