@@ -40,22 +40,38 @@ static bool __vlan_tun_can_enter_range(const struct net_bridge_vlan *v_curr,
40
40
bool br_vlan_opts_eq_range (const struct net_bridge_vlan * v_curr ,
41
41
const struct net_bridge_vlan * range_end )
42
42
{
43
+ u8 range_mc_rtr = br_vlan_multicast_router (range_end );
44
+ u8 curr_mc_rtr = br_vlan_multicast_router (v_curr );
45
+
43
46
return v_curr -> state == range_end -> state &&
44
- __vlan_tun_can_enter_range (v_curr , range_end );
47
+ __vlan_tun_can_enter_range (v_curr , range_end ) &&
48
+ curr_mc_rtr == range_mc_rtr ;
45
49
}
46
50
47
51
bool br_vlan_opts_fill (struct sk_buff * skb , const struct net_bridge_vlan * v )
48
52
{
49
- return !nla_put_u8 (skb , BRIDGE_VLANDB_ENTRY_STATE ,
50
- br_vlan_get_state (v )) &&
51
- __vlan_tun_put (skb , v );
53
+ if (nla_put_u8 (skb , BRIDGE_VLANDB_ENTRY_STATE , br_vlan_get_state (v )) ||
54
+ !__vlan_tun_put (skb , v ))
55
+ return false;
56
+
57
+ #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
58
+ if (nla_put_u8 (skb , BRIDGE_VLANDB_ENTRY_MCAST_ROUTER ,
59
+ br_vlan_multicast_router (v )))
60
+ return false;
61
+ #endif
62
+
63
+ return true;
52
64
}
53
65
54
66
size_t br_vlan_opts_nl_size (void )
55
67
{
56
68
return nla_total_size (sizeof (u8 )) /* BRIDGE_VLANDB_ENTRY_STATE */
57
69
+ nla_total_size (0 ) /* BRIDGE_VLANDB_ENTRY_TUNNEL_INFO */
58
- + nla_total_size (sizeof (u32 )); /* BRIDGE_VLANDB_TINFO_ID */
70
+ + nla_total_size (sizeof (u32 )) /* BRIDGE_VLANDB_TINFO_ID */
71
+ #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
72
+ + nla_total_size (sizeof (u8 )) /* BRIDGE_VLANDB_ENTRY_MCAST_ROUTER */
73
+ #endif
74
+ + 0 ;
59
75
}
60
76
61
77
static int br_vlan_modify_state (struct net_bridge_vlan_group * vg ,
@@ -181,6 +197,18 @@ static int br_vlan_process_one_opts(const struct net_bridge *br,
181
197
return err ;
182
198
}
183
199
200
+ #ifdef CONFIG_BRIDGE_IGMP_SNOOPING
201
+ if (tb [BRIDGE_VLANDB_ENTRY_MCAST_ROUTER ]) {
202
+ u8 val ;
203
+
204
+ val = nla_get_u8 (tb [BRIDGE_VLANDB_ENTRY_MCAST_ROUTER ]);
205
+ err = br_multicast_set_vlan_router (v , val );
206
+ if (err )
207
+ return err ;
208
+ * changed = true;
209
+ }
210
+ #endif
211
+
184
212
return 0 ;
185
213
}
186
214
@@ -298,8 +326,6 @@ bool br_vlan_global_opts_fill(struct sk_buff *skb, u16 vid, u16 vid_range,
298
326
v_opts -> br_mcast_ctx .multicast_startup_query_count ) ||
299
327
nla_put_u8 (skb , BRIDGE_VLANDB_GOPTS_MCAST_QUERIER ,
300
328
v_opts -> br_mcast_ctx .multicast_querier ) ||
301
- nla_put_u8 (skb , BRIDGE_VLANDB_GOPTS_MCAST_ROUTER ,
302
- v_opts -> br_mcast_ctx .multicast_router ) ||
303
329
br_multicast_dump_querier_state (skb , & v_opts -> br_mcast_ctx ,
304
330
BRIDGE_VLANDB_GOPTS_MCAST_QUERIER_STATE ))
305
331
goto out_err ;
@@ -380,7 +406,6 @@ static size_t rtnl_vlan_global_opts_nlmsg_size(const struct net_bridge_vlan *v)
380
406
+ nla_total_size (sizeof (u64 )) /* BRIDGE_VLANDB_GOPTS_MCAST_QUERY_RESPONSE_INTVL */
381
407
+ nla_total_size (sizeof (u64 )) /* BRIDGE_VLANDB_GOPTS_MCAST_STARTUP_QUERY_INTVL */
382
408
+ nla_total_size (sizeof (u8 )) /* BRIDGE_VLANDB_GOPTS_MCAST_QUERIER */
383
- + nla_total_size (sizeof (u8 )) /* BRIDGE_VLANDB_GOPTS_MCAST_ROUTER */
384
409
+ br_multicast_querier_state_size () /* BRIDGE_VLANDB_GOPTS_MCAST_QUERIER_STATE */
385
410
+ nla_total_size (0 ) /* BRIDGE_VLANDB_GOPTS_MCAST_ROUTER_PORTS */
386
411
+ br_rports_size (& v -> br_mcast_ctx ) /* BRIDGE_VLANDB_GOPTS_MCAST_ROUTER_PORTS */
@@ -522,15 +547,6 @@ static int br_vlan_process_global_one_opts(const struct net_bridge *br,
522
547
return err ;
523
548
* changed = true;
524
549
}
525
- if (tb [BRIDGE_VLANDB_GOPTS_MCAST_ROUTER ]) {
526
- u8 val ;
527
-
528
- val = nla_get_u8 (tb [BRIDGE_VLANDB_GOPTS_MCAST_ROUTER ]);
529
- err = br_multicast_set_router (& v -> br_mcast_ctx , val );
530
- if (err )
531
- return err ;
532
- * changed = true;
533
- }
534
550
#if IS_ENABLED (CONFIG_IPV6 )
535
551
if (tb [BRIDGE_VLANDB_GOPTS_MCAST_MLD_VERSION ]) {
536
552
u8 ver ;
@@ -554,7 +570,6 @@ static const struct nla_policy br_vlan_db_gpol[BRIDGE_VLANDB_GOPTS_MAX + 1] = {
554
570
[BRIDGE_VLANDB_GOPTS_MCAST_MLD_VERSION ] = { .type = NLA_U8 },
555
571
[BRIDGE_VLANDB_GOPTS_MCAST_QUERY_INTVL ] = { .type = NLA_U64 },
556
572
[BRIDGE_VLANDB_GOPTS_MCAST_QUERIER ] = { .type = NLA_U8 },
557
- [BRIDGE_VLANDB_GOPTS_MCAST_ROUTER ] = { .type = NLA_U8 },
558
573
[BRIDGE_VLANDB_GOPTS_MCAST_IGMP_VERSION ] = { .type = NLA_U8 },
559
574
[BRIDGE_VLANDB_GOPTS_MCAST_LAST_MEMBER_CNT ] = { .type = NLA_U32 },
560
575
[BRIDGE_VLANDB_GOPTS_MCAST_STARTUP_QUERY_CNT ] = { .type = NLA_U32 },
0 commit comments