Lines Matching refs:mc
607 struct ipv6_mc_socklist *mc; in inet6_mc_check() local
612 for_each_pmc_rcu(np, mc) { in inet6_mc_check()
613 if (ipv6_addr_equal(&mc->addr, mc_addr)) in inet6_mc_check()
616 if (!mc) { in inet6_mc_check()
620 read_lock(&mc->sflock); in inet6_mc_check()
621 psl = mc->sflist; in inet6_mc_check()
623 rv = mc->sfmode == MCAST_EXCLUDE; in inet6_mc_check()
631 if (mc->sfmode == MCAST_INCLUDE && i >= psl->sl_count) in inet6_mc_check()
633 if (mc->sfmode == MCAST_EXCLUDE && i < psl->sl_count) in inet6_mc_check()
636 read_unlock(&mc->sflock); in inet6_mc_check()
642 static void igmp6_group_added(struct ifmcaddr6 *mc) in igmp6_group_added() argument
644 struct net_device *dev = mc->idev->dev; in igmp6_group_added()
647 if (IPV6_ADDR_MC_SCOPE(&mc->mca_addr) < in igmp6_group_added()
651 spin_lock_bh(&mc->mca_lock); in igmp6_group_added()
652 if (!(mc->mca_flags&MAF_LOADED)) { in igmp6_group_added()
653 mc->mca_flags |= MAF_LOADED; in igmp6_group_added()
654 if (ndisc_mc_map(&mc->mca_addr, buf, dev, 0) == 0) in igmp6_group_added()
657 spin_unlock_bh(&mc->mca_lock); in igmp6_group_added()
659 if (!(dev->flags & IFF_UP) || (mc->mca_flags & MAF_NOREPORT)) in igmp6_group_added()
662 if (mld_in_v1_mode(mc->idev)) { in igmp6_group_added()
663 igmp6_join_group(mc); in igmp6_group_added()
668 mc->mca_crcount = mc->idev->mc_qrv; in igmp6_group_added()
669 mld_ifc_event(mc->idev); in igmp6_group_added()
672 static void igmp6_group_dropped(struct ifmcaddr6 *mc) in igmp6_group_dropped() argument
674 struct net_device *dev = mc->idev->dev; in igmp6_group_dropped()
677 if (IPV6_ADDR_MC_SCOPE(&mc->mca_addr) < in igmp6_group_dropped()
681 spin_lock_bh(&mc->mca_lock); in igmp6_group_dropped()
682 if (mc->mca_flags&MAF_LOADED) { in igmp6_group_dropped()
683 mc->mca_flags &= ~MAF_LOADED; in igmp6_group_dropped()
684 if (ndisc_mc_map(&mc->mca_addr, buf, dev, 0) == 0) in igmp6_group_dropped()
688 if (mc->mca_flags & MAF_NOREPORT) in igmp6_group_dropped()
690 spin_unlock_bh(&mc->mca_lock); in igmp6_group_dropped()
692 if (!mc->idev->dead) in igmp6_group_dropped()
693 igmp6_leave_group(mc); in igmp6_group_dropped()
695 spin_lock_bh(&mc->mca_lock); in igmp6_group_dropped()
696 if (del_timer(&mc->mca_timer)) in igmp6_group_dropped()
697 atomic_dec(&mc->mca_refcnt); in igmp6_group_dropped()
699 ip6_mc_clear_src(mc); in igmp6_group_dropped()
700 spin_unlock_bh(&mc->mca_lock); in igmp6_group_dropped()
807 static void mca_get(struct ifmcaddr6 *mc) in mca_get() argument
809 atomic_inc(&mc->mca_refcnt); in mca_get()
812 static void ma_put(struct ifmcaddr6 *mc) in ma_put() argument
814 if (atomic_dec_and_test(&mc->mca_refcnt)) { in ma_put()
815 in6_dev_put(mc->idev); in ma_put()
816 kfree(mc); in ma_put()
823 struct ifmcaddr6 *mc; in mca_alloc() local
825 mc = kzalloc(sizeof(*mc), GFP_ATOMIC); in mca_alloc()
826 if (!mc) in mca_alloc()
829 setup_timer(&mc->mca_timer, igmp6_timer_handler, (unsigned long)mc); in mca_alloc()
831 mc->mca_addr = *addr; in mca_alloc()
832 mc->idev = idev; /* reference taken by caller */ in mca_alloc()
833 mc->mca_users = 1; in mca_alloc()
835 mc->mca_cstamp = mc->mca_tstamp = jiffies; in mca_alloc()
836 atomic_set(&mc->mca_refcnt, 1); in mca_alloc()
837 spin_lock_init(&mc->mca_lock); in mca_alloc()
840 mc->mca_sfmode = MCAST_EXCLUDE; in mca_alloc()
841 mc->mca_sfcount[MCAST_EXCLUDE] = 1; in mca_alloc()
843 if (ipv6_addr_is_ll_all_nodes(&mc->mca_addr) || in mca_alloc()
844 IPV6_ADDR_MC_SCOPE(&mc->mca_addr) < IPV6_ADDR_SCOPE_LINKLOCAL) in mca_alloc()
845 mc->mca_flags |= MAF_NOREPORT; in mca_alloc()
847 return mc; in mca_alloc()
855 struct ifmcaddr6 *mc; in ipv6_dev_mc_inc() local
873 for (mc = idev->mc_list; mc; mc = mc->next) { in ipv6_dev_mc_inc()
874 if (ipv6_addr_equal(&mc->mca_addr, addr)) { in ipv6_dev_mc_inc()
875 mc->mca_users++; in ipv6_dev_mc_inc()
877 ip6_mc_add_src(idev, &mc->mca_addr, MCAST_EXCLUDE, 0, in ipv6_dev_mc_inc()
884 mc = mca_alloc(idev, addr); in ipv6_dev_mc_inc()
885 if (!mc) { in ipv6_dev_mc_inc()
891 mc->next = idev->mc_list; in ipv6_dev_mc_inc()
892 idev->mc_list = mc; in ipv6_dev_mc_inc()
897 mca_get(mc); in ipv6_dev_mc_inc()
900 mld_del_delrec(idev, &mc->mca_addr); in ipv6_dev_mc_inc()
901 igmp6_group_added(mc); in ipv6_dev_mc_inc()
902 ma_put(mc); in ipv6_dev_mc_inc()
959 struct ifmcaddr6 *mc; in ipv6_chk_mcast_addr() local
966 for (mc = idev->mc_list; mc; mc = mc->next) { in ipv6_chk_mcast_addr()
967 if (ipv6_addr_equal(&mc->mca_addr, group)) in ipv6_chk_mcast_addr()
970 if (mc) { in ipv6_chk_mcast_addr()
974 spin_lock_bh(&mc->mca_lock); in ipv6_chk_mcast_addr()
975 for (psf = mc->mca_sources; psf; psf = psf->sf_next) { in ipv6_chk_mcast_addr()
982 mc->mca_sfcount[MCAST_EXCLUDE]; in ipv6_chk_mcast_addr()
984 rv = mc->mca_sfcount[MCAST_EXCLUDE] != 0; in ipv6_chk_mcast_addr()
985 spin_unlock_bh(&mc->mca_lock); in ipv6_chk_mcast_addr()