Bladeren bron

fix brctl on linux 2.4

SVN-Revision: 13194
Nicolas Thill 17 jaren geleden
bovenliggende
commit
1af7fe6e24
1 gewijzigde bestanden met toevoegingen van 74 en 0 verwijderingen
  1. 74 0
      package/busybox/patches/802-brctl_linux24.patch

+ 74 - 0
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