From 64ba5d457c77ebb65b0a23910d26089973fb6ce7 Mon Sep 17 00:00:00 2001 From: Jonathan Liu Date: Sun, 2 Apr 2023 09:59:19 +1000 Subject: rtnl: Ignore adding/removing interface to/from bridge Avoids wifi interface being removed and added again when tethering is disabled. --- src/rtnl.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/rtnl.c b/src/rtnl.c index a87296ff..e8a8325e 100644 --- a/src/rtnl.c +++ b/src/rtnl.c @@ -886,7 +886,7 @@ static inline void print_attr(struct rtattr *attr, const char *name) print(" attr %d (len %d)\n", attr->rta_type, len); } -static void rtnl_link(struct nlmsghdr *hdr) +static void rtnl_link(struct nlmsghdr *hdr, bool *has_master) { struct ifinfomsg *msg; struct rtattr *attr; @@ -928,6 +928,7 @@ static void rtnl_link(struct nlmsghdr *hdr) print_attr(attr, "priority"); break; case IFLA_MASTER: + *has_master = true; print_attr(attr, "master"); break; case IFLA_WIRELESS: @@ -960,22 +961,32 @@ static void rtnl_link(struct nlmsghdr *hdr) static void rtnl_newlink(struct nlmsghdr *hdr) { + bool has_master = false; struct ifinfomsg *msg = (struct ifinfomsg *) NLMSG_DATA(hdr); - rtnl_link(hdr); + rtnl_link(hdr, &has_master); if (hdr->nlmsg_type == IFLA_WIRELESS) connman_warn_once("Obsolete WEXT WiFi driver detected"); + /* ignore RTM_NEWLINK when adding interface to bridge */ + if (has_master) + return; + process_newlink(msg->ifi_type, msg->ifi_index, msg->ifi_flags, msg->ifi_change, msg, IFA_PAYLOAD(hdr)); } static void rtnl_dellink(struct nlmsghdr *hdr) { + bool has_master = false; struct ifinfomsg *msg = (struct ifinfomsg *) NLMSG_DATA(hdr); - rtnl_link(hdr); + rtnl_link(hdr, &has_master); + + /* ignore RTM_DELLINK when removing interface from bridge */ + if (has_master) + return; process_dellink(msg->ifi_type, msg->ifi_index, msg->ifi_flags, msg->ifi_change, msg, IFA_PAYLOAD(hdr)); -- cgit v1.2.1