&set_h->h_addr);
 }
 
-static void __eht_allow_incl(struct net_bridge_port_group *pg,
-                            union net_bridge_eht_addr *h_addr,
-                            void *srcs,
-                            u32 nsrcs,
-                            size_t addr_size)
+/* create new set entries from reports */
+static void __eht_create_set_entries(struct net_bridge_port_group *pg,
+                                    union net_bridge_eht_addr *h_addr,
+                                    void *srcs,
+                                    u32 nsrcs,
+                                    size_t addr_size,
+                                    int filter_mode)
 {
        union net_bridge_eht_addr eht_src_addr;
        u32 src_idx;
        for (src_idx = 0; src_idx < nsrcs; src_idx++) {
                memcpy(&eht_src_addr, srcs + (src_idx * addr_size), addr_size);
                br_multicast_create_eht_set_entry(pg, &eht_src_addr, h_addr,
-                                                 MCAST_INCLUDE,
+                                                 filter_mode,
                                                  false);
        }
 }
 
-static bool __eht_allow_excl(struct net_bridge_port_group *pg,
-                            union net_bridge_eht_addr *h_addr,
-                            void *srcs,
-                            u32 nsrcs,
-                            size_t addr_size)
+/* delete existing set entries and their (S,G) entries if they were the last */
+static bool __eht_del_set_entries(struct net_bridge_port_group *pg,
+                                 union net_bridge_eht_addr *h_addr,
+                                 void *srcs,
+                                 u32 nsrcs,
+                                 size_t addr_size)
 {
        union net_bridge_eht_addr eht_src_addr;
        struct net_bridge_group_src *src_ent;
        u32 src_idx;
 
        memset(&eht_src_addr, 0, sizeof(eht_src_addr));
+       memset(&src_ip, 0, sizeof(src_ip));
+       src_ip.proto = pg->key.addr.proto;
        for (src_idx = 0; src_idx < nsrcs; src_idx++) {
                memcpy(&eht_src_addr, srcs + (src_idx * addr_size), addr_size);
-               if (!br_multicast_del_eht_set_entry(pg, &eht_src_addr,
-                                                   h_addr))
+               if (!br_multicast_del_eht_set_entry(pg, &eht_src_addr, h_addr))
                        continue;
                memcpy(&src_ip, srcs + (src_idx * addr_size), addr_size);
                src_ent = br_multicast_find_group_src(pg, &src_ip);
 
        switch (br_multicast_eht_host_filter_mode(pg, h_addr)) {
        case MCAST_INCLUDE:
-               __eht_allow_incl(pg, h_addr, srcs, nsrcs, addr_size);
+               __eht_create_set_entries(pg, h_addr, srcs, nsrcs, addr_size,
+                                        MCAST_INCLUDE);
                break;
        case MCAST_EXCLUDE:
-               changed = __eht_allow_excl(pg, h_addr, srcs, nsrcs, addr_size);
+               changed = __eht_del_set_entries(pg, h_addr, srcs, nsrcs,
+                                               addr_size);
                break;
        }
 
        return changed;
 }
 
-static bool __eht_block_incl(struct net_bridge_port_group *pg,
-                            union net_bridge_eht_addr *h_addr,
-                            void *srcs,
-                            u32 nsrcs,
-                            size_t addr_size)
-{
-       union net_bridge_eht_addr eht_src_addr;
-       struct net_bridge_group_src *src_ent;
-       bool changed = false;
-       struct br_ip src_ip;
-       u32 src_idx;
-
-       memset(&eht_src_addr, 0, sizeof(eht_src_addr));
-       memset(&src_ip, 0, sizeof(src_ip));
-       src_ip.proto = pg->key.addr.proto;
-       for (src_idx = 0; src_idx < nsrcs; src_idx++) {
-               memcpy(&eht_src_addr, srcs + (src_idx * addr_size), addr_size);
-               if (!br_multicast_del_eht_set_entry(pg, &eht_src_addr, h_addr))
-                       continue;
-               memcpy(&src_ip, srcs + (src_idx * addr_size), addr_size);
-               src_ent = br_multicast_find_group_src(pg, &src_ip);
-               if (!src_ent)
-                       continue;
-               br_multicast_del_group_src(src_ent, true);
-               changed = true;
-       }
-
-       return changed;
-}
-
-static void __eht_block_excl(struct net_bridge_port_group *pg,
-                            union net_bridge_eht_addr *h_addr,
-                            void *srcs,
-                            u32 nsrcs,
-                            size_t addr_size)
-{
-       union net_bridge_eht_addr eht_src_addr;
-       u32 src_idx;
-
-       memset(&eht_src_addr, 0, sizeof(eht_src_addr));
-       for (src_idx = 0; src_idx < nsrcs; src_idx++) {
-               memcpy(&eht_src_addr, srcs + (src_idx * addr_size), addr_size);
-               br_multicast_create_eht_set_entry(pg, &eht_src_addr, h_addr,
-                                                 MCAST_EXCLUDE,
-                                                 false);
-       }
-}
-
 static bool br_multicast_eht_block(struct net_bridge_port_group *pg,
                                   union net_bridge_eht_addr *h_addr,
                                   void *srcs,
 
        switch (br_multicast_eht_host_filter_mode(pg, h_addr)) {
        case MCAST_INCLUDE:
-               changed = __eht_block_incl(pg, h_addr, srcs, nsrcs, addr_size);
+               changed = __eht_del_set_entries(pg, h_addr, srcs, nsrcs,
+                                               addr_size);
                break;
        case MCAST_EXCLUDE:
-               __eht_block_excl(pg, h_addr, srcs, nsrcs, addr_size);
+               __eht_create_set_entries(pg, h_addr, srcs, nsrcs, addr_size,
+                                        MCAST_EXCLUDE);
                break;
        }
 
 {
        bool changed = false, flush_entries = to_report;
        union net_bridge_eht_addr eht_src_addr;
-       u32 src_idx;
 
        if (br_multicast_eht_host_filter_mode(pg, h_addr) != filter_mode)
                flush_entries = true;
        /* if we're changing mode del host and its entries */
        if (flush_entries)
                br_multicast_del_eht_host(pg, h_addr);
-       for (src_idx = 0; src_idx < nsrcs; src_idx++) {
-               memcpy(&eht_src_addr, srcs + (src_idx * addr_size), addr_size);
-               br_multicast_create_eht_set_entry(pg, &eht_src_addr, h_addr,
-                                                 filter_mode, false);
-       }
+       __eht_create_set_entries(pg, h_addr, srcs, nsrcs, addr_size,
+                                filter_mode);
        /* we can be missing sets only if we've deleted some entries */
        if (flush_entries) {
                struct net_bridge *br = pg->key.port->br;