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