Lines Matching full:cfg
739 static int br_mdb_replace_group_sg(const struct br_mdb_config *cfg,
748 pg->rt_protocol = cfg->rt_protocol;
749 if (!(flags & MDB_PG_FLAGS_PERMANENT) && !cfg->src_entry)
755 br_mdb_notify(cfg->br->dev, mp, pg, RTM_NEWMDB);
760 static int br_mdb_add_group_sg(const struct br_mdb_config *cfg,
771 (p = mlock_dereference(*pp, cfg->br)) != NULL;
773 if (p->key.port == cfg->p) {
774 if (!(cfg->nlflags & NLM_F_REPLACE)) {
778 return br_mdb_replace_group_sg(cfg, mp, p, brmctx,
781 if ((unsigned long)p->key.port < (unsigned long)cfg->p)
785 p = br_multicast_new_port_group(cfg->p, &cfg->group, *pp, flags, NULL,
786 MCAST_INCLUDE, cfg->rt_protocol, extack);
791 if (!(flags & MDB_PG_FLAGS_PERMANENT) && !cfg->src_entry)
794 br_mdb_notify(cfg->br->dev, mp, p, RTM_NEWMDB);
799 if (br_multicast_should_handle_mode(brmctx, cfg->group.proto)) {
805 star_mp = br_mdb_ip_get(cfg->br, &star_group);
813 static int br_mdb_add_group_src_fwd(const struct br_mdb_config *cfg,
823 sg_ip = cfg->group;
825 sgmp = br_multicast_new_group(cfg->br, &sg_ip);
831 if (cfg->entry->state == MDB_PERMANENT)
833 if (cfg->filter_mode == MCAST_EXCLUDE)
837 sg_cfg.br = cfg->br;
838 sg_cfg.p = cfg->p;
839 sg_cfg.entry = cfg->entry;
843 sg_cfg.rt_protocol = cfg->rt_protocol;
844 sg_cfg.nlflags = cfg->nlflags;
848 static int br_mdb_add_group_src(const struct br_mdb_config *cfg,
865 } else if (!(cfg->nlflags & NLM_F_REPLACE)) {
870 if (cfg->filter_mode == MCAST_INCLUDE &&
871 cfg->entry->state == MDB_TEMPORARY)
877 err = br_mdb_add_group_src_fwd(cfg, &src->addr, brmctx, extack);
901 static int br_mdb_add_group_srcs(const struct br_mdb_config *cfg,
908 for (i = 0; i < cfg->num_src_entries; i++) {
909 err = br_mdb_add_group_src(cfg, pg, brmctx,
910 &cfg->src_entries[i], extack);
919 br_mdb_del_group_src(pg, &cfg->src_entries[i]);
923 static int br_mdb_replace_group_srcs(const struct br_mdb_config *cfg,
935 err = br_mdb_add_group_srcs(cfg, pg, brmctx, extack);
952 static int br_mdb_replace_group_star_g(const struct br_mdb_config *cfg,
962 err = br_mdb_replace_group_srcs(cfg, pg, brmctx, extack);
967 pg->filter_mode = cfg->filter_mode;
968 pg->rt_protocol = cfg->rt_protocol;
970 cfg->filter_mode == MCAST_EXCLUDE)
976 br_mdb_notify(cfg->br->dev, mp, pg, RTM_NEWMDB);
978 if (br_multicast_should_handle_mode(brmctx, cfg->group.proto))
979 br_multicast_star_g_handle_mode(pg, cfg->filter_mode);
984 static int br_mdb_add_group_star_g(const struct br_mdb_config *cfg,
996 (p = mlock_dereference(*pp, cfg->br)) != NULL;
998 if (p->key.port == cfg->p) {
999 if (!(cfg->nlflags & NLM_F_REPLACE)) {
1003 return br_mdb_replace_group_star_g(cfg, mp, p, brmctx,
1006 if ((unsigned long)p->key.port < (unsigned long)cfg->p)
1010 p = br_multicast_new_port_group(cfg->p, &cfg->group, *pp, flags, NULL,
1011 cfg->filter_mode, cfg->rt_protocol,
1016 err = br_mdb_add_group_srcs(cfg, p, brmctx, extack);
1022 cfg->filter_mode == MCAST_EXCLUDE)
1025 br_mdb_notify(cfg->br->dev, mp, p, RTM_NEWMDB);
1029 if (br_multicast_should_handle_mode(brmctx, cfg->group.proto) &&
1030 cfg->filter_mode == MCAST_EXCLUDE)
1040 static int br_mdb_add_group(const struct br_mdb_config *cfg,
1043 struct br_mdb_entry *entry = cfg->entry;
1044 struct net_bridge_port *port = cfg->p;
1046 struct net_bridge *br = cfg->br;
1048 struct br_ip group = cfg->group;
1061 if (mp->host_joined && !(cfg->nlflags & NLM_F_REPLACE)) {
1076 return br_mdb_add_group_star_g(cfg, mp, brmctx, flags, extack);
1078 return br_mdb_add_group_sg(cfg, mp, brmctx, flags, extack);
1081 static int __br_mdb_add(const struct br_mdb_config *cfg,
1086 spin_lock_bh(&cfg->br->multicast_lock);
1087 ret = br_mdb_add_group(cfg, extack);
1088 spin_unlock_bh(&cfg->br->multicast_lock);
1120 struct br_mdb_config *cfg,
1128 cfg->num_src_entries++;
1130 if (cfg->num_src_entries >= PG_SRC_ENT_LIMIT) {
1136 cfg->src_entries = kcalloc(cfg->num_src_entries,
1138 if (!cfg->src_entries)
1143 &cfg->src_entries[i],
1144 cfg->entry->addr.proto,
1154 kfree(cfg->src_entries);
1158 static void br_mdb_config_src_list_fini(struct br_mdb_config *cfg)
1160 kfree(cfg->src_entries);
1164 struct br_mdb_config *cfg,
1177 cfg->entry->addr.proto, extack))
1180 __mdb_entry_to_br_ip(cfg->entry, &cfg->group, mdb_attrs);
1183 if (!cfg->p) {
1187 if (!br_multicast_is_star_g(&cfg->group)) {
1191 cfg->filter_mode = nla_get_u8(mdb_attrs[MDBE_ATTR_GROUP_MODE]);
1193 cfg->filter_mode = MCAST_EXCLUDE;
1197 if (!cfg->p) {
1201 if (!br_multicast_is_star_g(&cfg->group)) {
1210 cfg, extack);
1215 if (!cfg->num_src_entries && cfg->filter_mode == MCAST_INCLUDE) {
1221 if (!cfg->p) {
1225 cfg->rt_protocol = nla_get_u8(mdb_attrs[MDBE_ATTR_RTPROT]);
1231 static int br_mdb_config_init(struct br_mdb_config *cfg, struct net_device *dev,
1237 memset(cfg, 0, sizeof(*cfg));
1238 cfg->filter_mode = MCAST_EXCLUDE;
1239 cfg->rt_protocol = RTPROT_STATIC;
1240 cfg->nlflags = nlmsg_flags;
1242 cfg->br = netdev_priv(dev);
1244 if (!netif_running(cfg->br->dev)) {
1249 if (!br_opt_get(cfg->br, BROPT_MULTICAST_ENABLED)) {
1254 cfg->entry = nla_data(tb[MDBA_SET_ENTRY]);
1256 if (cfg->entry->ifindex != cfg->br->dev->ifindex) {
1259 pdev = __dev_get_by_index(net, cfg->entry->ifindex);
1265 cfg->p = br_port_get_rtnl(pdev);
1266 if (!cfg->p) {
1271 if (cfg->p->br != cfg->br) {
1277 if (cfg->entry->addr.proto == htons(ETH_P_IP) &&
1278 ipv4_is_zeronet(cfg->entry->addr.u.ip4)) {
1284 return br_mdb_config_attrs_init(tb[MDBA_SET_ENTRY_ATTRS], cfg,
1287 __mdb_entry_to_br_ip(cfg->entry, &cfg->group, NULL);
1292 static void br_mdb_config_fini(struct br_mdb_config *cfg)
1294 br_mdb_config_src_list_fini(cfg);
1302 struct br_mdb_config cfg;
1305 err = br_mdb_config_init(&cfg, dev, tb, nlmsg_flags, extack);
1311 if (!cfg.p && !br_group_is_l2(&cfg.group)) {
1313 if (cfg.entry->state) {
1317 if (!br_multicast_is_star_g(&cfg.group)) {
1323 if (br_group_is_l2(&cfg.group) && cfg.entry->state != MDB_PERMANENT) {
1328 if (cfg.p) {
1329 if (cfg.p->state == BR_STATE_DISABLED && cfg.entry->state != MDB_PERMANENT) {
1333 vg = nbp_vlan_group(cfg.p);
1335 vg = br_vlan_group(cfg.br);
1341 if (br_vlan_enabled(cfg.br->dev) && vg && cfg.entry->vid == 0) {
1343 cfg.entry->vid = v->vid;
1344 cfg.group.vid = v->vid;
1345 err = __br_mdb_add(&cfg, extack);
1350 err = __br_mdb_add(&cfg, extack);
1354 br_mdb_config_fini(&cfg);
1358 static int __br_mdb_del(const struct br_mdb_config *cfg)
1360 struct br_mdb_entry *entry = cfg->entry;
1361 struct net_bridge *br = cfg->br;
1365 struct br_ip ip = cfg->group;
1404 struct br_mdb_config cfg;
1407 err = br_mdb_config_init(&cfg, dev, tb, 0, extack);
1411 if (cfg.p)
1412 vg = nbp_vlan_group(cfg.p);
1414 vg = br_vlan_group(cfg.br);
1419 if (br_vlan_enabled(cfg.br->dev) && vg && cfg.entry->vid == 0) {
1421 cfg.entry->vid = v->vid;
1422 cfg.group.vid = v->vid;
1423 err = __br_mdb_del(&cfg);
1426 err = __br_mdb_del(&cfg);
1429 br_mdb_config_fini(&cfg);