blob: 6943e8324ae54be8580cce909ca01442c8ca3975 [file] [log] [blame]
developer66e89bc2024-04-23 14:50:01 +08001From 942808028d207776f1a4dbe678166282fb272b37 Mon Sep 17 00:00:00 2001
2From: Michael Lee <michael-cy.lee@mediatek.com>
3Date: Thu, 13 Jul 2023 13:14:26 +0800
4Subject: [PATCH 056/104] mtk: hostapd: Check the bridge after ioctl
5 SIOCBRADDIF failed
6
7If ioctl returns EBUSY on command SIOCBRADDIF, the interface might
8already be bridged by others, and linux_br_add_if should not indicate an
9error in the case.
10
11This patch checks whether the interface is correctly brigded when ioctl
12returns EBUSY.
13
14Signed-off-by: Michael Lee <michael-cy.lee@mediatek.com>
15---
16 src/drivers/linux_ioctl.c | 16 +++++++++++++++-
17 1 file changed, 15 insertions(+), 1 deletion(-)
18
19diff --git a/src/drivers/linux_ioctl.c b/src/drivers/linux_ioctl.c
20index 29abc0c59..73d27825d 100644
21--- a/src/drivers/linux_ioctl.c
22+++ b/src/drivers/linux_ioctl.c
23@@ -150,7 +150,8 @@ int linux_br_del(int sock, const char *brname)
24 int linux_br_add_if(int sock, const char *brname, const char *ifname)
25 {
26 struct ifreq ifr;
27- int ifindex;
28+ int ifindex, ret;
29+ char in_br[IFNAMSIZ];
30
31 ifindex = if_nametoindex(ifname);
32 if (ifindex == 0)
33@@ -165,6 +166,17 @@ int linux_br_add_if(int sock, const char *brname, const char *ifname)
34
35 wpa_printf(MSG_DEBUG, "Could not add interface %s into bridge "
36 "%s: %s", ifname, brname, strerror(errno));
37+
38+ /* If ioctl returns -EBUSY when adding interface into bridge,
39+ * the interface might already be added by netifd, so here we
40+ * check whether the interface is currently on the right
41+ * bridge. */
42+ if(errno == EBUSY && linux_br_get(in_br, ifname) == 0 &&
43+ os_strcmp(in_br, brname) == 0)
44+ ret = 0;
45+ else
46+ ret = -1;
47+
48 errno = saved_errno;
49
50 /* If ioctl() returns EBUSY when adding an interface into the
51@@ -175,6 +187,8 @@ int linux_br_add_if(int sock, const char *brname, const char *ifname)
52 if (errno != EBUSY || linux_br_get(in_br, ifname) != 0 ||
53 os_strcmp(in_br, brname) != 0)
54 return -1;
55+
56+ return ret;
57 }
58
59 return 0;
60--
612.39.2
62