History

net: bridge: vlan: add support for mcast router global option

Add support to change and retrieve global vlan multicast router state which is used for the bridge itself. We just need to pass multicast context to br_multicast_set_router instead of bridge device and the rest of the logic remains the same.

Nikolay Aleksandrov committed 5 years ago

Commit a97df081 parent 62938186 files · +25 −10Browse files

Unified · Split

6 files
  1. include/uapi/linux/if_bridge.h +1 −0
  2. net/bridge/br_multicast.c +5 −6
  3. net/bridge/br_netlink.c +2 −1
  4. net/bridge/br_private.h +2 −1
  5. net/bridge/br_sysfs_br.c +1 −1
  6. net/bridge/br_vlan_options.c +14 −1
include/uapi/linux/if_bridge.h+1−0
@@ -561,6 +561,7 @@ enum { · 560 unmodified lines
561561 BRIDGE_VLANDB_GOPTS_MCAST_QUERY_RESPONSE_INTVL,
562562 BRIDGE_VLANDB_GOPTS_MCAST_STARTUP_QUERY_INTVL,
563563 BRIDGE_VLANDB_GOPTS_MCAST_QUERIER,
564+ BRIDGE_VLANDB_GOPTS_MCAST_ROUTER,
564565 __BRIDGE_VLANDB_GOPTS_MAX
565566 };
566567 #define BRIDGE_VLANDB_GOPTS_MAX (__BRIDGE_VLANDB_GOPTS_MAX - 1)
net/bridge/br_multicast.c+5−6
@@ -4053,17 +4053,16 @@ void br_multicast_dev_del(struct net_bridge *br) · 4052 unmodified lines
40534053 rcu_barrier();
40544054 }
40554055
4056−int br_multicast_set_router(struct net_bridge *br, unsigned long val)
4056+int br_multicast_set_router(struct net_bridge_mcast *brmctx, unsigned long val)
40574057 {
4058− struct net_bridge_mcast *brmctx = &br->multicast_ctx;
40594058 int err = -EINVAL;
40604059
4061− spin_lock_bh(&br->multicast_lock);
4060+ spin_lock_bh(&brmctx->br->multicast_lock);
40624061
40634062 switch (val) {
40644063 case MDB_RTR_TYPE_DISABLED:
40654064 case MDB_RTR_TYPE_PERM:
4066− br_mc_router_state_change(br, val == MDB_RTR_TYPE_PERM);
4065+ br_mc_router_state_change(brmctx->br, val == MDB_RTR_TYPE_PERM);
40674066 del_timer(&brmctx->ip4_mc_router_timer);
40684067 #if IS_ENABLED(CONFIG_IPV6)
40694068 del_timer(&brmctx->ip6_mc_router_timer);
@@ -4073,13 +4072,13 @@ int br_multicast_set_router(struct net_bridge *br, unsigned long val) · 3 unmodified lines
40734072 break;
40744073 case MDB_RTR_TYPE_TEMP_QUERY:
40754074 if (brmctx->multicast_router != MDB_RTR_TYPE_TEMP_QUERY)
4076− br_mc_router_state_change(br, false);
4075+ br_mc_router_state_change(brmctx->br, false);
40774076 brmctx->multicast_router = val;
40784077 err = 0;
40794078 break;
40804079 }
40814080
4082− spin_unlock_bh(&br->multicast_lock);
4081+ spin_unlock_bh(&brmctx->br->multicast_lock);
40834082
40844083 return err;
40854084 }
net/bridge/br_netlink.c+2−1
@@ -1286,7 +1286,8 @@ static int br_changelink(struct net_device *brdev, struct nlattr *tb[], · 1285 unmodified lines
12861286 if (data[IFLA_BR_MCAST_ROUTER]) {
12871287 u8 multicast_router = nla_get_u8(data[IFLA_BR_MCAST_ROUTER]);
12881288
1289− err = br_multicast_set_router(br, multicast_router);
1289+ err = br_multicast_set_router(&br->multicast_ctx,
1290+ multicast_router);
12901291 if (err)
12911292 return err;
12921293 }
net/bridge/br_private.h+2−1
@@ -877,7 +877,7 @@ void br_multicast_dev_del(struct net_bridge *br); · 876 unmodified lines
877877 void br_multicast_flood(struct net_bridge_mdb_entry *mdst, struct sk_buff *skb,
878878 struct net_bridge_mcast *brmctx,
879879 bool local_rcv, bool local_orig);
880−int br_multicast_set_router(struct net_bridge *br, unsigned long val);
880+int br_multicast_set_router(struct net_bridge_mcast *brmctx, unsigned long val);
881881 int br_multicast_set_port_router(struct net_bridge_port *p, unsigned long val);
882882 int br_multicast_toggle(struct net_bridge *br, unsigned long val,
883883 struct netlink_ext_ack *extack);
@@ -1191,6 +1191,7 @@ br_multicast_ctx_options_equal(const struct net_bridge_mcast *brmctx1, · 307 unmodified lines
11911191 brmctx1->multicast_startup_query_interval ==
11921192 brmctx2->multicast_startup_query_interval &&
11931193 brmctx1->multicast_querier == brmctx2->multicast_querier &&
1194+ brmctx1->multicast_router == brmctx2->multicast_router &&
11941195 #if IS_ENABLED(CONFIG_IPV6)
11951196 brmctx1->multicast_mld_version ==
11961197 brmctx2->multicast_mld_version &&
net/bridge/br_sysfs_br.c+1−1
@@ -390,7 +390,7 @@ static ssize_t multicast_router_show(struct device *d, · 389 unmodified lines
390390 static int set_multicast_router(struct net_bridge *br, unsigned long val,
391391 struct netlink_ext_ack *extack)
392392 {
393− return br_multicast_set_router(br, val);
393+ return br_multicast_set_router(&br->multicast_ctx, val);
394394 }
395395
396396 static ssize_t multicast_router_store(struct device *d,
net/bridge/br_vlan_options.c+14−1
@@ -296,7 +296,9 @@ bool br_vlan_global_opts_fill(struct sk_buff *skb, u16 vid, u16 vid_range, · 295 unmodified lines
296296 nla_put_u32(skb, BRIDGE_VLANDB_GOPTS_MCAST_STARTUP_QUERY_CNT,
297297 v_opts->br_mcast_ctx.multicast_startup_query_count) ||
298298 nla_put_u8(skb, BRIDGE_VLANDB_GOPTS_MCAST_QUERIER,
299− v_opts->br_mcast_ctx.multicast_querier))
299+ v_opts->br_mcast_ctx.multicast_querier) ||
300+ nla_put_u8(skb, BRIDGE_VLANDB_GOPTS_MCAST_ROUTER,
301+ v_opts->br_mcast_ctx.multicast_router))
300302 goto out_err;
301303
302304 clockval = jiffies_to_clock_t(v_opts->br_mcast_ctx.multicast_last_member_interval);
@@ -358,6 +360,7 @@ static size_t rtnl_vlan_global_opts_nlmsg_size(void) · 55 unmodified lines
358360 + nla_total_size(sizeof(u64)) /* BRIDGE_VLANDB_GOPTS_MCAST_QUERY_RESPONSE_INTVL */
359361 + nla_total_size(sizeof(u64)) /* BRIDGE_VLANDB_GOPTS_MCAST_STARTUP_QUERY_INTVL */
360362 + nla_total_size(sizeof(u8)) /* BRIDGE_VLANDB_GOPTS_MCAST_QUERIER */
363+ + nla_total_size(sizeof(u8)) /* BRIDGE_VLANDB_GOPTS_MCAST_ROUTER */
361364 #endif
362365 + nla_total_size(sizeof(u16)); /* BRIDGE_VLANDB_GOPTS_RANGE */
363366 }
@@ -497,6 +500,15 @@ static int br_vlan_process_global_one_opts(const struct net_bridge *br, · 133 unmodified lines
497500 return err;
498501 *changed = true;
499502 }
503+ if (tb[BRIDGE_VLANDB_GOPTS_MCAST_ROUTER]) {
504+ u8 val;
505+
506+ val = nla_get_u8(tb[BRIDGE_VLANDB_GOPTS_MCAST_ROUTER]);
507+ err = br_multicast_set_router(&v->br_mcast_ctx, val);
508+ if (err)
509+ return err;
510+ *changed = true;
511+ }
500512 #if IS_ENABLED(CONFIG_IPV6)
501513 if (tb[BRIDGE_VLANDB_GOPTS_MCAST_MLD_VERSION]) {
502514 u8 ver;
@@ -520,6 +532,7 @@ static const struct nla_policy br_vlan_db_gpol[BRIDGE_VLANDB_GOPTS_MAX + 1] = { · 17 unmodified lines
520532 [BRIDGE_VLANDB_GOPTS_MCAST_MLD_VERSION] = { .type = NLA_U8 },
521533 [BRIDGE_VLANDB_GOPTS_MCAST_QUERY_INTVL] = { .type = NLA_U64 },
522534 [BRIDGE_VLANDB_GOPTS_MCAST_QUERIER] = { .type = NLA_U8 },
535+ [BRIDGE_VLANDB_GOPTS_MCAST_ROUTER] = { .type = NLA_U8 },
523536 [BRIDGE_VLANDB_GOPTS_MCAST_IGMP_VERSION] = { .type = NLA_U8 },
524537 [BRIDGE_VLANDB_GOPTS_MCAST_LAST_MEMBER_CNT] = { .type = NLA_U32 },
525538 [BRIDGE_VLANDB_GOPTS_MCAST_STARTUP_QUERY_CNT] = { .type = NLA_U32 },