@@ -759,13 +759,17 @@ static void br_multicast_router_expired(unsigned long data)
759
759
struct net_bridge * br = port -> br ;
760
760
761
761
spin_lock (& br -> multicast_lock );
762
- if (port -> multicast_router != MDB_RTR_TYPE_TEMP_QUERY ||
762
+ if (port -> multicast_router == MDB_RTR_TYPE_DISABLED ||
763
+ port -> multicast_router == MDB_RTR_TYPE_PERM ||
763
764
timer_pending (& port -> multicast_router_timer ) ||
764
765
hlist_unhashed (& port -> rlist ))
765
766
goto out ;
766
767
767
768
hlist_del_init_rcu (& port -> rlist );
768
769
br_rtr_notify (br -> dev , port , RTM_DELMDB );
770
+ /* Don't allow timer refresh if the router expired */
771
+ if (port -> multicast_router == MDB_RTR_TYPE_TEMP )
772
+ port -> multicast_router = MDB_RTR_TYPE_TEMP_QUERY ;
769
773
770
774
out :
771
775
spin_unlock (& br -> multicast_lock );
@@ -981,6 +985,9 @@ void br_multicast_disable_port(struct net_bridge_port *port)
981
985
if (!hlist_unhashed (& port -> rlist )) {
982
986
hlist_del_init_rcu (& port -> rlist );
983
987
br_rtr_notify (br -> dev , port , RTM_DELMDB );
988
+ /* Don't allow timer refresh if disabling */
989
+ if (port -> multicast_router == MDB_RTR_TYPE_TEMP )
990
+ port -> multicast_router = MDB_RTR_TYPE_TEMP_QUERY ;
984
991
}
985
992
del_timer (& port -> multicast_router_timer );
986
993
del_timer (& port -> ip4_own_query .timer );
@@ -1234,7 +1241,8 @@ static void br_multicast_mark_router(struct net_bridge *br,
1234
1241
return ;
1235
1242
}
1236
1243
1237
- if (port -> multicast_router != MDB_RTR_TYPE_TEMP_QUERY )
1244
+ if (port -> multicast_router == MDB_RTR_TYPE_DISABLED ||
1245
+ port -> multicast_router == MDB_RTR_TYPE_PERM )
1238
1246
return ;
1239
1247
1240
1248
br_multicast_add_router (br , port );
@@ -1850,10 +1858,15 @@ static void __del_port_router(struct net_bridge_port *p)
1850
1858
int br_multicast_set_port_router (struct net_bridge_port * p , unsigned long val )
1851
1859
{
1852
1860
struct net_bridge * br = p -> br ;
1861
+ unsigned long now = jiffies ;
1853
1862
int err = - EINVAL ;
1854
1863
1855
1864
spin_lock (& br -> multicast_lock );
1856
1865
if (p -> multicast_router == val ) {
1866
+ /* Refresh the temp router port timer */
1867
+ if (p -> multicast_router == MDB_RTR_TYPE_TEMP )
1868
+ mod_timer (& p -> multicast_router_timer ,
1869
+ now + br -> multicast_querier_interval );
1857
1870
err = 0 ;
1858
1871
goto unlock ;
1859
1872
}
@@ -1872,6 +1885,10 @@ int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val)
1872
1885
del_timer (& p -> multicast_router_timer );
1873
1886
br_multicast_add_router (br , p );
1874
1887
break ;
1888
+ case MDB_RTR_TYPE_TEMP :
1889
+ p -> multicast_router = MDB_RTR_TYPE_TEMP ;
1890
+ br_multicast_mark_router (br , p );
1891
+ break ;
1875
1892
default :
1876
1893
goto unlock ;
1877
1894
}
0 commit comments