aboutsummaryrefslogtreecommitdiffstats
path: root/package/busybox/patches/802-brctl_linux24.patch
blob: 84321e0c72d56ab56dfb8c94f8812861a1b89e6f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
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 UNUSED_PARAM, ch
 				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 UNUSED_PARAM, ch
 		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 UNUSED_PARAM, ch
 
 		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