1
0
mirror of git://projects.qi-hardware.com/openwrt-xburst.git synced 2024-11-27 18:23:09 +02:00

fix brctl on linux 2.4

git-svn-id: svn://svn.openwrt.org/openwrt/trunk@13194 3c298f89-4303-0410-b956-a3cf2f4a3e73
This commit is contained in:
nico 2008-11-13 04:22:05 +00:00
parent 14df5f021d
commit 405ff62784

View File

@ -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