|
@@ -1317,6 +1317,19 @@ br_multicast_update_query_timer(struct net_bridge *br,
|
|
|
mod_timer(&query->timer, jiffies + br->multicast_querier_interval);
|
|
|
}
|
|
|
|
|
|
+static void br_port_mc_router_state_change(struct net_bridge_port *p,
|
|
|
+ bool is_mc_router)
|
|
|
+{
|
|
|
+ struct switchdev_attr attr = {
|
|
|
+ .orig_dev = p->dev,
|
|
|
+ .id = SWITCHDEV_ATTR_ID_PORT_MROUTER,
|
|
|
+ .flags = SWITCHDEV_F_DEFER,
|
|
|
+ .u.mrouter = is_mc_router,
|
|
|
+ };
|
|
|
+
|
|
|
+ switchdev_port_attr_set(p->dev, &attr);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Add port to router_list
|
|
|
* list is maintained ordered by pointer value
|
|
@@ -1342,6 +1355,7 @@ static void br_multicast_add_router(struct net_bridge *br,
|
|
|
else
|
|
|
hlist_add_head_rcu(&port->rlist, &br->router_list);
|
|
|
br_rtr_notify(br->dev, port, RTM_NEWMDB);
|
|
|
+ br_port_mc_router_state_change(port, true);
|
|
|
}
|
|
|
|
|
|
static void br_multicast_mark_router(struct net_bridge *br,
|
|
@@ -2049,6 +2063,7 @@ static void __del_port_router(struct net_bridge_port *p)
|
|
|
return;
|
|
|
hlist_del_init_rcu(&p->rlist);
|
|
|
br_rtr_notify(p->br->dev, p, RTM_DELMDB);
|
|
|
+ br_port_mc_router_state_change(p, false);
|
|
|
|
|
|
/* don't allow timer refresh */
|
|
|
if (p->multicast_router == MDB_RTR_TYPE_TEMP)
|