802-brctl_linux24.patch 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. --- a/networking/brctl.c
  2. +++ b/networking/brctl.c
  3. @@ -18,7 +18,7 @@
  4. /* Maximum number of ports supported per bridge interface. */
  5. #ifndef MAX_PORTS
  6. -#define MAX_PORTS 32
  7. +#define MAX_PORTS 1024
  8. #endif
  9. /* Use internal number parsing and not the "exact" conversion. */
  10. @@ -155,6 +155,7 @@ int brctl_main(int argc ATTRIBUTE_UNUSED
  11. printf(bi.stp_enabled ? "\tyes" : "\tno");
  12. /* print interface list */
  13. + memset(ifidx, 0, sizeof ifidx);
  14. arm_ioctl(args, BRCTL_GET_PORT_LIST,
  15. (unsigned long) ifidx, MAX_PORTS);
  16. xioctl(fd, SIOCDEVPRIVATE, &ifr);
  17. @@ -183,9 +184,19 @@ int brctl_main(int argc ATTRIBUTE_UNUSED
  18. br = *argv++;
  19. if (key == ARG_addbr || key == ARG_delbr) { /* addbr or delbr */
  20. - ioctl_or_perror_and_die(fd,
  21. - key == ARG_addbr ? SIOCBRADDBR : SIOCBRDELBR,
  22. - br, "bridge %s", br);
  23. + int ret;
  24. + ret = ioctl(fd,
  25. + key == ARG_addbr ? SIOCBRADDBR : SIOCBRDELBR,
  26. + br);
  27. + if (ret < 0) {
  28. + arm_ioctl(args,
  29. + key == ARG_addbr ? BRCTL_ADD_BRIDGE : BRCTL_DEL_BRIDGE,
  30. + (unsigned long) br, 0);
  31. + ret = ioctl(fd, SIOCSIFBR, args);
  32. + }
  33. + if (ret < 0) {
  34. + bb_perror_msg_and_die("bridge %s", br);
  35. + }
  36. goto done;
  37. }
  38. @@ -194,14 +205,27 @@ int brctl_main(int argc ATTRIBUTE_UNUSED
  39. strncpy(ifr.ifr_name, br, IFNAMSIZ);
  40. if (key == ARG_addif || key == ARG_delif) { /* addif or delif */
  41. + int ret;
  42. + int if_index;
  43. brif = *argv;
  44. - ifr.ifr_ifindex = if_nametoindex(brif);
  45. - if (!ifr.ifr_ifindex) {
  46. + if_index = if_nametoindex(brif);
  47. + if (!if_index) {
  48. bb_perror_msg_and_die("iface %s", brif);
  49. }
  50. - ioctl_or_perror_and_die(fd,
  51. + ifr.ifr_ifindex = if_index;
  52. + ret = ioctl(fd,
  53. key == ARG_addif ? SIOCBRADDIF : SIOCBRDELIF,
  54. - &ifr, "bridge %s", br);
  55. + &ifr);
  56. + if (ret < 0) {
  57. + arm_ioctl(args,
  58. + key == ARG_addif ? BRCTL_ADD_IF : BRCTL_DEL_IF,
  59. + if_index, 0);
  60. + ifr.ifr_data = (char *) &args;
  61. + ret = ioctl(fd, SIOCDEVPRIVATE, &ifr);
  62. + }
  63. + if (ret < 0) {
  64. + bb_perror_msg_and_die("bridge %s", br);
  65. + }
  66. goto done_next_argv;
  67. }
  68. #if ENABLE_FEATURE_BRCTL_FANCY