diff options
author | Jonathan Liu <net147@gmail.com> | 2023-04-02 09:59:19 +1000 |
---|---|---|
committer | Daniel Wagner <wagi@monom.org> | 2023-04-11 09:37:34 +0200 |
commit | 64ba5d457c77ebb65b0a23910d26089973fb6ce7 (patch) | |
tree | edcfb021639dae35ee657cf5f74a81e2167691dc | |
parent | 219232eaa63aaf750843856c2895ff1fe9479473 (diff) | |
download | connman-64ba5d457c77ebb65b0a23910d26089973fb6ce7.tar.gz |
rtnl: Ignore adding/removing interface to/from bridge
Avoids wifi interface being removed and added again when tethering is
disabled.
-rw-r--r-- | src/rtnl.c | 17 |
1 files changed, 14 insertions, 3 deletions
@@ -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)); |