Lines Matching full:cfg
721 static int br_mdb_replace_group_sg(const struct br_mdb_config *cfg, in br_mdb_replace_group_sg() argument
730 pg->rt_protocol = cfg->rt_protocol; in br_mdb_replace_group_sg()
731 if (!(flags & MDB_PG_FLAGS_PERMANENT) && !cfg->src_entry) in br_mdb_replace_group_sg()
737 br_mdb_notify(cfg->br->dev, mp, pg, RTM_NEWMDB); in br_mdb_replace_group_sg()
742 static int br_mdb_add_group_sg(const struct br_mdb_config *cfg, in br_mdb_add_group_sg() argument
753 (p = mlock_dereference(*pp, cfg->br)) != NULL; in br_mdb_add_group_sg()
755 if (p->key.port == cfg->p) { in br_mdb_add_group_sg()
756 if (!(cfg->nlflags & NLM_F_REPLACE)) { in br_mdb_add_group_sg()
760 return br_mdb_replace_group_sg(cfg, mp, p, brmctx, in br_mdb_add_group_sg()
763 if ((unsigned long)p->key.port < (unsigned long)cfg->p) in br_mdb_add_group_sg()
767 p = br_multicast_new_port_group(cfg->p, &cfg->group, *pp, flags, NULL, in br_mdb_add_group_sg()
768 MCAST_INCLUDE, cfg->rt_protocol, extack); in br_mdb_add_group_sg()
773 if (!(flags & MDB_PG_FLAGS_PERMANENT) && !cfg->src_entry) in br_mdb_add_group_sg()
776 br_mdb_notify(cfg->br->dev, mp, p, RTM_NEWMDB); in br_mdb_add_group_sg()
781 if (br_multicast_should_handle_mode(brmctx, cfg->group.proto)) { in br_mdb_add_group_sg()
787 star_mp = br_mdb_ip_get(cfg->br, &star_group); in br_mdb_add_group_sg()
795 static int br_mdb_add_group_src_fwd(const struct br_mdb_config *cfg, in br_mdb_add_group_src_fwd() argument
805 sg_ip = cfg->group; in br_mdb_add_group_src_fwd()
807 sgmp = br_multicast_new_group(cfg->br, &sg_ip); in br_mdb_add_group_src_fwd()
813 if (cfg->entry->state == MDB_PERMANENT) in br_mdb_add_group_src_fwd()
815 if (cfg->filter_mode == MCAST_EXCLUDE) in br_mdb_add_group_src_fwd()
819 sg_cfg.br = cfg->br; in br_mdb_add_group_src_fwd()
820 sg_cfg.p = cfg->p; in br_mdb_add_group_src_fwd()
821 sg_cfg.entry = cfg->entry; in br_mdb_add_group_src_fwd()
825 sg_cfg.rt_protocol = cfg->rt_protocol; in br_mdb_add_group_src_fwd()
826 sg_cfg.nlflags = cfg->nlflags; in br_mdb_add_group_src_fwd()
830 static int br_mdb_add_group_src(const struct br_mdb_config *cfg, in br_mdb_add_group_src() argument
847 } else if (!(cfg->nlflags & NLM_F_REPLACE)) { in br_mdb_add_group_src()
852 if (cfg->filter_mode == MCAST_INCLUDE && in br_mdb_add_group_src()
853 cfg->entry->state == MDB_TEMPORARY) in br_mdb_add_group_src()
859 err = br_mdb_add_group_src_fwd(cfg, &src->addr, brmctx, extack); in br_mdb_add_group_src()
883 static int br_mdb_add_group_srcs(const struct br_mdb_config *cfg, in br_mdb_add_group_srcs() argument
890 for (i = 0; i < cfg->num_src_entries; i++) { in br_mdb_add_group_srcs()
891 err = br_mdb_add_group_src(cfg, pg, brmctx, in br_mdb_add_group_srcs()
892 &cfg->src_entries[i], extack); in br_mdb_add_group_srcs()
901 br_mdb_del_group_src(pg, &cfg->src_entries[i]); in br_mdb_add_group_srcs()
905 static int br_mdb_replace_group_srcs(const struct br_mdb_config *cfg, in br_mdb_replace_group_srcs() argument
917 err = br_mdb_add_group_srcs(cfg, pg, brmctx, extack); in br_mdb_replace_group_srcs()
934 static int br_mdb_replace_group_star_g(const struct br_mdb_config *cfg, in br_mdb_replace_group_star_g() argument
944 err = br_mdb_replace_group_srcs(cfg, pg, brmctx, extack); in br_mdb_replace_group_star_g()
949 pg->filter_mode = cfg->filter_mode; in br_mdb_replace_group_star_g()
950 pg->rt_protocol = cfg->rt_protocol; in br_mdb_replace_group_star_g()
952 cfg->filter_mode == MCAST_EXCLUDE) in br_mdb_replace_group_star_g()
958 br_mdb_notify(cfg->br->dev, mp, pg, RTM_NEWMDB); in br_mdb_replace_group_star_g()
960 if (br_multicast_should_handle_mode(brmctx, cfg->group.proto)) in br_mdb_replace_group_star_g()
961 br_multicast_star_g_handle_mode(pg, cfg->filter_mode); in br_mdb_replace_group_star_g()
966 static int br_mdb_add_group_star_g(const struct br_mdb_config *cfg, in br_mdb_add_group_star_g() argument
978 (p = mlock_dereference(*pp, cfg->br)) != NULL; in br_mdb_add_group_star_g()
980 if (p->key.port == cfg->p) { in br_mdb_add_group_star_g()
981 if (!(cfg->nlflags & NLM_F_REPLACE)) { in br_mdb_add_group_star_g()
985 return br_mdb_replace_group_star_g(cfg, mp, p, brmctx, in br_mdb_add_group_star_g()
988 if ((unsigned long)p->key.port < (unsigned long)cfg->p) in br_mdb_add_group_star_g()
992 p = br_multicast_new_port_group(cfg->p, &cfg->group, *pp, flags, NULL, in br_mdb_add_group_star_g()
993 cfg->filter_mode, cfg->rt_protocol, in br_mdb_add_group_star_g()
998 err = br_mdb_add_group_srcs(cfg, p, brmctx, extack); in br_mdb_add_group_star_g()
1004 cfg->filter_mode == MCAST_EXCLUDE) in br_mdb_add_group_star_g()
1007 br_mdb_notify(cfg->br->dev, mp, p, RTM_NEWMDB); in br_mdb_add_group_star_g()
1011 if (br_multicast_should_handle_mode(brmctx, cfg->group.proto) && in br_mdb_add_group_star_g()
1012 cfg->filter_mode == MCAST_EXCLUDE) in br_mdb_add_group_star_g()
1022 static int br_mdb_add_group(const struct br_mdb_config *cfg, in br_mdb_add_group() argument
1025 struct br_mdb_entry *entry = cfg->entry; in br_mdb_add_group()
1026 struct net_bridge_port *port = cfg->p; in br_mdb_add_group()
1028 struct net_bridge *br = cfg->br; in br_mdb_add_group()
1030 struct br_ip group = cfg->group; in br_mdb_add_group()
1058 return br_mdb_add_group_star_g(cfg, mp, brmctx, flags, extack); in br_mdb_add_group()
1060 return br_mdb_add_group_sg(cfg, mp, brmctx, flags, extack); in br_mdb_add_group()
1063 static int __br_mdb_add(const struct br_mdb_config *cfg, in __br_mdb_add() argument
1068 spin_lock_bh(&cfg->br->multicast_lock); in __br_mdb_add()
1069 ret = br_mdb_add_group(cfg, extack); in __br_mdb_add()
1070 spin_unlock_bh(&cfg->br->multicast_lock); in __br_mdb_add()
1102 struct br_mdb_config *cfg, in br_mdb_config_src_list_init() argument
1110 cfg->num_src_entries++; in br_mdb_config_src_list_init()
1112 if (cfg->num_src_entries >= PG_SRC_ENT_LIMIT) { in br_mdb_config_src_list_init()
1118 cfg->src_entries = kcalloc(cfg->num_src_entries, in br_mdb_config_src_list_init()
1120 if (!cfg->src_entries) in br_mdb_config_src_list_init()
1125 &cfg->src_entries[i], in br_mdb_config_src_list_init()
1126 cfg->entry->addr.proto, in br_mdb_config_src_list_init()
1136 kfree(cfg->src_entries); in br_mdb_config_src_list_init()
1140 static void br_mdb_config_src_list_fini(struct br_mdb_config *cfg) in br_mdb_config_src_list_fini() argument
1142 kfree(cfg->src_entries); in br_mdb_config_src_list_fini()
1146 struct br_mdb_config *cfg, in br_mdb_config_attrs_init() argument
1159 cfg->entry->addr.proto, extack)) in br_mdb_config_attrs_init()
1162 __mdb_entry_to_br_ip(cfg->entry, &cfg->group, mdb_attrs); in br_mdb_config_attrs_init()
1165 if (!cfg->p) { in br_mdb_config_attrs_init()
1169 if (!br_multicast_is_star_g(&cfg->group)) { in br_mdb_config_attrs_init()
1173 cfg->filter_mode = nla_get_u8(mdb_attrs[MDBE_ATTR_GROUP_MODE]); in br_mdb_config_attrs_init()
1175 cfg->filter_mode = MCAST_EXCLUDE; in br_mdb_config_attrs_init()
1179 if (!cfg->p) { in br_mdb_config_attrs_init()
1183 if (!br_multicast_is_star_g(&cfg->group)) { in br_mdb_config_attrs_init()
1192 cfg, extack); in br_mdb_config_attrs_init()
1197 if (!cfg->num_src_entries && cfg->filter_mode == MCAST_INCLUDE) { in br_mdb_config_attrs_init()
1203 if (!cfg->p) { in br_mdb_config_attrs_init()
1207 cfg->rt_protocol = nla_get_u8(mdb_attrs[MDBE_ATTR_RTPROT]); in br_mdb_config_attrs_init()
1213 static int br_mdb_config_init(struct br_mdb_config *cfg, struct net_device *dev, in br_mdb_config_init() argument
1219 memset(cfg, 0, sizeof(*cfg)); in br_mdb_config_init()
1220 cfg->filter_mode = MCAST_EXCLUDE; in br_mdb_config_init()
1221 cfg->rt_protocol = RTPROT_STATIC; in br_mdb_config_init()
1222 cfg->nlflags = nlmsg_flags; in br_mdb_config_init()
1224 cfg->br = netdev_priv(dev); in br_mdb_config_init()
1226 if (!netif_running(cfg->br->dev)) { in br_mdb_config_init()
1231 if (!br_opt_get(cfg->br, BROPT_MULTICAST_ENABLED)) { in br_mdb_config_init()
1236 cfg->entry = nla_data(tb[MDBA_SET_ENTRY]); in br_mdb_config_init()
1238 if (cfg->entry->ifindex != cfg->br->dev->ifindex) { in br_mdb_config_init()
1241 pdev = __dev_get_by_index(net, cfg->entry->ifindex); in br_mdb_config_init()
1247 cfg->p = br_port_get_rtnl(pdev); in br_mdb_config_init()
1248 if (!cfg->p) { in br_mdb_config_init()
1253 if (cfg->p->br != cfg->br) { in br_mdb_config_init()
1259 if (cfg->entry->addr.proto == htons(ETH_P_IP) && in br_mdb_config_init()
1260 ipv4_is_zeronet(cfg->entry->addr.u.ip4)) { in br_mdb_config_init()
1266 return br_mdb_config_attrs_init(tb[MDBA_SET_ENTRY_ATTRS], cfg, in br_mdb_config_init()
1269 __mdb_entry_to_br_ip(cfg->entry, &cfg->group, NULL); in br_mdb_config_init()
1274 static void br_mdb_config_fini(struct br_mdb_config *cfg) in br_mdb_config_fini() argument
1276 br_mdb_config_src_list_fini(cfg); in br_mdb_config_fini()
1284 struct br_mdb_config cfg; in br_mdb_add() local
1287 err = br_mdb_config_init(&cfg, dev, tb, nlmsg_flags, extack); in br_mdb_add()
1293 if (!cfg.p && !br_group_is_l2(&cfg.group)) { in br_mdb_add()
1295 if (cfg.entry->state) { in br_mdb_add()
1299 if (!br_multicast_is_star_g(&cfg.group)) { in br_mdb_add()
1305 if (br_group_is_l2(&cfg.group) && cfg.entry->state != MDB_PERMANENT) { in br_mdb_add()
1310 if (cfg.p) { in br_mdb_add()
1311 if (cfg.p->state == BR_STATE_DISABLED && cfg.entry->state != MDB_PERMANENT) { in br_mdb_add()
1315 vg = nbp_vlan_group(cfg.p); in br_mdb_add()
1317 vg = br_vlan_group(cfg.br); in br_mdb_add()
1323 if (br_vlan_enabled(cfg.br->dev) && vg && cfg.entry->vid == 0) { in br_mdb_add()
1325 cfg.entry->vid = v->vid; in br_mdb_add()
1326 cfg.group.vid = v->vid; in br_mdb_add()
1327 err = __br_mdb_add(&cfg, extack); in br_mdb_add()
1332 err = __br_mdb_add(&cfg, extack); in br_mdb_add()
1336 br_mdb_config_fini(&cfg); in br_mdb_add()
1340 static int __br_mdb_del(const struct br_mdb_config *cfg) in __br_mdb_del() argument
1342 struct br_mdb_entry *entry = cfg->entry; in __br_mdb_del()
1343 struct net_bridge *br = cfg->br; in __br_mdb_del()
1347 struct br_ip ip = cfg->group; in __br_mdb_del()
1386 struct br_mdb_config cfg; in br_mdb_del() local
1389 err = br_mdb_config_init(&cfg, dev, tb, 0, extack); in br_mdb_del()
1393 if (cfg.p) in br_mdb_del()
1394 vg = nbp_vlan_group(cfg.p); in br_mdb_del()
1396 vg = br_vlan_group(cfg.br); in br_mdb_del()
1401 if (br_vlan_enabled(cfg.br->dev) && vg && cfg.entry->vid == 0) { in br_mdb_del()
1403 cfg.entry->vid = v->vid; in br_mdb_del()
1404 cfg.group.vid = v->vid; in br_mdb_del()
1405 err = __br_mdb_del(&cfg); in br_mdb_del()
1408 err = __br_mdb_del(&cfg); in br_mdb_del()
1411 br_mdb_config_fini(&cfg); in br_mdb_del()