Lines Matching refs:idev

82 static void mld_ifc_event(struct inet6_dev *idev);
83 static void mld_add_delrec(struct inet6_dev *idev, struct ifmcaddr6 *pmc);
84 static void mld_del_delrec(struct inet6_dev *idev, struct ifmcaddr6 *pmc);
85 static void mld_clear_delrec(struct inet6_dev *idev);
86 static bool mld_in_v1_mode(const struct inet6_dev *idev);
90 static int ip6_mc_del_src(struct inet6_dev *idev, const struct in6_addr *pmca,
93 static int ip6_mc_add_src(struct inet6_dev *idev, const struct in6_addr *pmca,
97 struct inet6_dev *idev);
125 static int unsolicited_report_interval(struct inet6_dev *idev) in unsolicited_report_interval() argument
129 if (mld_in_v1_mode(idev)) in unsolicited_report_interval()
130 iv = idev->cnf.mldv1_unsolicited_report_interval; in unsolicited_report_interval()
132 iv = idev->cnf.mldv2_unsolicited_report_interval; in unsolicited_report_interval()
244 struct inet6_dev *idev = __in6_dev_get(dev); in ipv6_sock_mc_drop() local
246 (void) ip6_mc_leave_src(sk, mc_lst, idev); in ipv6_sock_mc_drop()
247 if (idev) in ipv6_sock_mc_drop()
248 __ipv6_dev_mc_dec(idev, &mc_lst->addr); in ipv6_sock_mc_drop()
268 struct inet6_dev *idev = NULL; in ip6_mc_find_dev_rcu() local
282 idev = __in6_dev_get(dev); in ip6_mc_find_dev_rcu()
283 if (!idev) in ip6_mc_find_dev_rcu()
285 read_lock_bh(&idev->lock); in ip6_mc_find_dev_rcu()
286 if (idev->dead) { in ip6_mc_find_dev_rcu()
287 read_unlock_bh(&idev->lock); in ip6_mc_find_dev_rcu()
290 return idev; in ip6_mc_find_dev_rcu()
308 struct inet6_dev *idev = __in6_dev_get(dev); in __ipv6_sock_mc_close() local
310 (void) ip6_mc_leave_src(sk, mc_lst, idev); in __ipv6_sock_mc_close()
311 if (idev) in __ipv6_sock_mc_close()
312 __ipv6_dev_mc_dec(idev, &mc_lst->addr); in __ipv6_sock_mc_close()
337 struct inet6_dev *idev; in ip6_mc_source() local
353 idev = ip6_mc_find_dev_rcu(net, group, pgsr->gsr_interface); in ip6_mc_source()
354 if (!idev) { in ip6_mc_source()
379 ip6_mc_add_src(idev, group, omode, 0, NULL, 0); in ip6_mc_source()
380 ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0); in ip6_mc_source()
407 ip6_mc_del_src(idev, group, omode, 1, source, 1); in ip6_mc_source()
453 ip6_mc_add_src(idev, group, omode, 1, source, 1); in ip6_mc_source()
457 read_unlock_bh(&idev->lock); in ip6_mc_source()
468 struct inet6_dev *idev; in ip6_mc_msfilter() local
484 idev = ip6_mc_find_dev_rcu(net, group, gsf->gf_interface); in ip6_mc_msfilter()
486 if (!idev) { in ip6_mc_msfilter()
522 err = ip6_mc_add_src(idev, group, gsf->gf_fmode, in ip6_mc_msfilter()
530 (void) ip6_mc_add_src(idev, group, gsf->gf_fmode, 0, NULL, 0); in ip6_mc_msfilter()
536 (void) ip6_mc_del_src(idev, group, pmc->sfmode, in ip6_mc_msfilter()
540 (void) ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0); in ip6_mc_msfilter()
546 read_unlock_bh(&idev->lock); in ip6_mc_msfilter()
559 struct inet6_dev *idev; in ip6_mc_msfget() local
570 idev = ip6_mc_find_dev_rcu(net, group, gsf->gf_interface); in ip6_mc_msfget()
572 if (!idev) { in ip6_mc_msfget()
594 read_unlock_bh(&idev->lock); in ip6_mc_msfget()
619 read_unlock_bh(&idev->lock); in ip6_mc_msfget()
665 struct net_device *dev = mc->idev->dev; in igmp6_group_added()
683 if (mld_in_v1_mode(mc->idev)) { in igmp6_group_added()
694 mc->mca_crcount = mc->idev->mc_qrv; in igmp6_group_added()
696 mld_ifc_event(mc->idev); in igmp6_group_added()
701 struct net_device *dev = mc->idev->dev; in igmp6_group_dropped()
719 if (!mc->idev->dead) in igmp6_group_dropped()
731 static void mld_add_delrec(struct inet6_dev *idev, struct ifmcaddr6 *im) in mld_add_delrec() argument
747 pmc->idev = im->idev; in mld_add_delrec()
748 in6_dev_hold(idev); in mld_add_delrec()
750 pmc->mca_crcount = idev->mc_qrv; in mld_add_delrec()
763 spin_lock_bh(&idev->mc_lock); in mld_add_delrec()
764 pmc->next = idev->mc_tomb; in mld_add_delrec()
765 idev->mc_tomb = pmc; in mld_add_delrec()
766 spin_unlock_bh(&idev->mc_lock); in mld_add_delrec()
769 static void mld_del_delrec(struct inet6_dev *idev, struct ifmcaddr6 *im) in mld_del_delrec() argument
775 spin_lock_bh(&idev->mc_lock); in mld_del_delrec()
777 for (pmc = idev->mc_tomb; pmc; pmc = pmc->next) { in mld_del_delrec()
786 idev->mc_tomb = pmc->next; in mld_del_delrec()
788 spin_unlock_bh(&idev->mc_lock); in mld_del_delrec()
792 im->idev = pmc->idev; in mld_del_delrec()
797 psf->sf_crcount = idev->mc_qrv; in mld_del_delrec()
799 im->mca_crcount = idev->mc_qrv; in mld_del_delrec()
801 in6_dev_put(pmc->idev); in mld_del_delrec()
807 static void mld_clear_delrec(struct inet6_dev *idev) in mld_clear_delrec() argument
811 spin_lock_bh(&idev->mc_lock); in mld_clear_delrec()
812 pmc = idev->mc_tomb; in mld_clear_delrec()
813 idev->mc_tomb = NULL; in mld_clear_delrec()
814 spin_unlock_bh(&idev->mc_lock); in mld_clear_delrec()
819 in6_dev_put(pmc->idev); in mld_clear_delrec()
824 read_lock_bh(&idev->lock); in mld_clear_delrec()
825 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_clear_delrec()
837 read_unlock_bh(&idev->lock); in mld_clear_delrec()
848 in6_dev_put(mc->idev); in ma_put()
853 static struct ifmcaddr6 *mca_alloc(struct inet6_dev *idev, in mca_alloc() argument
866 mc->idev = idev; /* reference taken by caller */ in mca_alloc()
890 struct inet6_dev *idev; in __ipv6_dev_mc_inc() local
895 idev = in6_dev_get(dev); in __ipv6_dev_mc_inc()
897 if (!idev) in __ipv6_dev_mc_inc()
900 write_lock_bh(&idev->lock); in __ipv6_dev_mc_inc()
901 if (idev->dead) { in __ipv6_dev_mc_inc()
902 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_inc()
903 in6_dev_put(idev); in __ipv6_dev_mc_inc()
907 for (mc = idev->mc_list; mc; mc = mc->next) { in __ipv6_dev_mc_inc()
910 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_inc()
911 ip6_mc_add_src(idev, &mc->mca_addr, mode, 0, NULL, 0); in __ipv6_dev_mc_inc()
912 in6_dev_put(idev); in __ipv6_dev_mc_inc()
917 mc = mca_alloc(idev, addr, mode); in __ipv6_dev_mc_inc()
919 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_inc()
920 in6_dev_put(idev); in __ipv6_dev_mc_inc()
924 mc->next = idev->mc_list; in __ipv6_dev_mc_inc()
925 idev->mc_list = mc; in __ipv6_dev_mc_inc()
931 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_inc()
933 mld_del_delrec(idev, mc); in __ipv6_dev_mc_inc()
947 int __ipv6_dev_mc_dec(struct inet6_dev *idev, const struct in6_addr *addr) in __ipv6_dev_mc_dec() argument
953 write_lock_bh(&idev->lock); in __ipv6_dev_mc_dec()
954 for (map = &idev->mc_list; (ma = *map) != NULL; map = &ma->next) { in __ipv6_dev_mc_dec()
958 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_dec()
966 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_dec()
970 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_dec()
977 struct inet6_dev *idev; in ipv6_dev_mc_dec() local
982 idev = __in6_dev_get(dev); in ipv6_dev_mc_dec()
983 if (!idev) in ipv6_dev_mc_dec()
986 err = __ipv6_dev_mc_dec(idev, addr); in ipv6_dev_mc_dec()
997 struct inet6_dev *idev; in ipv6_chk_mcast_addr() local
1002 idev = __in6_dev_get(dev); in ipv6_chk_mcast_addr()
1003 if (idev) { in ipv6_chk_mcast_addr()
1004 read_lock_bh(&idev->lock); in ipv6_chk_mcast_addr()
1005 for (mc = idev->mc_list; mc; mc = mc->next) { in ipv6_chk_mcast_addr()
1028 read_unlock_bh(&idev->lock); in ipv6_chk_mcast_addr()
1034 static void mld_gq_start_timer(struct inet6_dev *idev) in mld_gq_start_timer() argument
1036 unsigned long tv = prandom_u32() % idev->mc_maxdelay; in mld_gq_start_timer()
1038 idev->mc_gq_running = 1; in mld_gq_start_timer()
1039 if (!mod_timer(&idev->mc_gq_timer, jiffies+tv+2)) in mld_gq_start_timer()
1040 in6_dev_hold(idev); in mld_gq_start_timer()
1043 static void mld_gq_stop_timer(struct inet6_dev *idev) in mld_gq_stop_timer() argument
1045 idev->mc_gq_running = 0; in mld_gq_stop_timer()
1046 if (del_timer(&idev->mc_gq_timer)) in mld_gq_stop_timer()
1047 __in6_dev_put(idev); in mld_gq_stop_timer()
1050 static void mld_ifc_start_timer(struct inet6_dev *idev, unsigned long delay) in mld_ifc_start_timer() argument
1054 if (!mod_timer(&idev->mc_ifc_timer, jiffies+tv+2)) in mld_ifc_start_timer()
1055 in6_dev_hold(idev); in mld_ifc_start_timer()
1058 static void mld_ifc_stop_timer(struct inet6_dev *idev) in mld_ifc_stop_timer() argument
1060 idev->mc_ifc_count = 0; in mld_ifc_stop_timer()
1061 if (del_timer(&idev->mc_ifc_timer)) in mld_ifc_stop_timer()
1062 __in6_dev_put(idev); in mld_ifc_stop_timer()
1065 static void mld_dad_start_timer(struct inet6_dev *idev, unsigned long delay) in mld_dad_start_timer() argument
1069 if (!mod_timer(&idev->mc_dad_timer, jiffies+tv+2)) in mld_dad_start_timer()
1070 in6_dev_hold(idev); in mld_dad_start_timer()
1073 static void mld_dad_stop_timer(struct inet6_dev *idev) in mld_dad_stop_timer() argument
1075 if (del_timer(&idev->mc_dad_timer)) in mld_dad_stop_timer()
1076 __in6_dev_put(idev); in mld_dad_stop_timer()
1166 static int mld_force_mld_version(const struct inet6_dev *idev) in mld_force_mld_version() argument
1173 if (dev_net(idev->dev)->ipv6.devconf_all->force_mld_version != 0) in mld_force_mld_version()
1174 return dev_net(idev->dev)->ipv6.devconf_all->force_mld_version; in mld_force_mld_version()
1176 return idev->cnf.force_mld_version; in mld_force_mld_version()
1179 static bool mld_in_v2_mode_only(const struct inet6_dev *idev) in mld_in_v2_mode_only() argument
1181 return mld_force_mld_version(idev) == 2; in mld_in_v2_mode_only()
1184 static bool mld_in_v1_mode_only(const struct inet6_dev *idev) in mld_in_v1_mode_only() argument
1186 return mld_force_mld_version(idev) == 1; in mld_in_v1_mode_only()
1189 static bool mld_in_v1_mode(const struct inet6_dev *idev) in mld_in_v1_mode() argument
1191 if (mld_in_v2_mode_only(idev)) in mld_in_v1_mode()
1193 if (mld_in_v1_mode_only(idev)) in mld_in_v1_mode()
1195 if (idev->mc_v1_seen && time_before(jiffies, idev->mc_v1_seen)) in mld_in_v1_mode()
1201 static void mld_set_v1_mode(struct inet6_dev *idev) in mld_set_v1_mode() argument
1211 switchback = (idev->mc_qrv * idev->mc_qi) + idev->mc_qri; in mld_set_v1_mode()
1213 idev->mc_v1_seen = jiffies + switchback; in mld_set_v1_mode()
1216 static void mld_update_qrv(struct inet6_dev *idev, in mld_update_qrv() argument
1229 WARN_ON(idev->mc_qrv == 0); in mld_update_qrv()
1232 idev->mc_qrv = mlh2->mld2q_qrv; in mld_update_qrv()
1234 if (unlikely(idev->mc_qrv < min_qrv)) { in mld_update_qrv()
1236 idev->mc_qrv, min_qrv); in mld_update_qrv()
1237 idev->mc_qrv = min_qrv; in mld_update_qrv()
1241 static void mld_update_qi(struct inet6_dev *idev, in mld_update_qi() argument
1263 idev->mc_qi = mc_qqi * HZ; in mld_update_qi()
1266 static void mld_update_qri(struct inet6_dev *idev, in mld_update_qri() argument
1273 idev->mc_qri = msecs_to_jiffies(mldv2_mrc(mlh2)); in mld_update_qri()
1276 static int mld_process_v1(struct inet6_dev *idev, struct mld_msg *mld, in mld_process_v1() argument
1282 if (mld_in_v2_mode_only(idev)) in mld_process_v1()
1310 mld_set_v1_mode(idev); in mld_process_v1()
1313 mld_gq_stop_timer(idev); in mld_process_v1()
1315 mld_ifc_stop_timer(idev); in mld_process_v1()
1317 mld_clear_delrec(idev); in mld_process_v1()
1322 static int mld_process_v2(struct inet6_dev *idev, struct mld2_query *mld, in mld_process_v2() argument
1327 mld_update_qrv(idev, mld); in mld_process_v2()
1328 mld_update_qi(idev, mld); in mld_process_v2()
1329 mld_update_qri(idev, mld); in mld_process_v2()
1331 idev->mc_maxdelay = *max_delay; in mld_process_v2()
1343 struct inet6_dev *idev; in igmp6_event_query() local
1369 idev = __in6_dev_get(skb->dev); in igmp6_event_query()
1370 if (!idev) in igmp6_event_query()
1383 } else if (len == MLD_V1_QUERY_LEN || mld_in_v1_mode(idev)) { in igmp6_event_query()
1384 err = mld_process_v1(idev, mld, &max_delay, in igmp6_event_query()
1397 err = mld_process_v2(idev, mlh2, &max_delay); in igmp6_event_query()
1405 mld_gq_start_timer(idev); in igmp6_event_query()
1421 read_lock_bh(&idev->lock); in igmp6_event_query()
1423 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_query()
1429 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_query()
1451 read_unlock_bh(&idev->lock); in igmp6_event_query()
1460 struct inet6_dev *idev; in igmp6_event_report() local
1484 idev = __in6_dev_get(skb->dev); in igmp6_event_report()
1485 if (!idev) in igmp6_event_report()
1492 read_lock_bh(&idev->lock); in igmp6_event_report()
1493 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_report()
1503 read_unlock_bh(&idev->lock); in igmp6_event_report()
1590 static struct sk_buff *mld_newpack(struct inet6_dev *idev, unsigned int mtu) in mld_newpack() argument
1592 struct net_device *dev = idev->dev; in mld_newpack()
1619 if (__ipv6_get_lladdr(idev, &addr_buf, IFA_F_TENTATIVE)) { in mld_newpack()
1649 struct inet6_dev *idev; in mld_sendpack() local
1656 idev = __in6_dev_get(skb->dev); in mld_sendpack()
1657 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); in mld_sendpack()
1688 ICMP6MSGOUT_INC_STATS(net, idev, ICMPV6_MLD2_REPORT); in mld_sendpack()
1689 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS); in mld_sendpack()
1691 IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); in mld_sendpack()
1714 skb = mld_newpack(pmc->idev, mtu); in add_grhead()
1734 struct inet6_dev *idev = pmc->idev; in add_grec() local
1735 struct net_device *dev = idev->dev; in add_grec()
1769 skb = mld_newpack(idev, mtu); in add_grec()
1805 skb = mld_newpack(idev, mtu); in add_grec()
1856 static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc) in mld_send_report() argument
1861 read_lock_bh(&idev->lock); in mld_send_report()
1863 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_report()
1883 read_unlock_bh(&idev->lock); in mld_send_report()
1909 static void mld_send_cr(struct inet6_dev *idev) in mld_send_cr() argument
1915 read_lock_bh(&idev->lock); in mld_send_cr()
1916 spin_lock(&idev->mc_lock); in mld_send_cr()
1920 for (pmc = idev->mc_tomb; pmc; pmc = pmc_next) { in mld_send_cr()
1944 idev->mc_tomb = pmc_next; in mld_send_cr()
1945 in6_dev_put(pmc->idev); in mld_send_cr()
1950 spin_unlock(&idev->mc_lock); in mld_send_cr()
1953 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_cr()
1976 read_unlock_bh(&idev->lock); in mld_send_cr()
1986 struct inet6_dev *idev; in igmp6_send() local
2048 idev = __in6_dev_get(skb->dev); in igmp6_send()
2065 ICMP6MSGOUT_INC_STATS(net, idev, type); in igmp6_send()
2066 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS); in igmp6_send()
2068 IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); in igmp6_send()
2078 static void mld_send_initial_cr(struct inet6_dev *idev) in mld_send_initial_cr() argument
2084 if (mld_in_v1_mode(idev)) in mld_send_initial_cr()
2088 read_lock_bh(&idev->lock); in mld_send_initial_cr()
2089 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_initial_cr()
2098 read_unlock_bh(&idev->lock); in mld_send_initial_cr()
2103 void ipv6_mc_dad_complete(struct inet6_dev *idev) in ipv6_mc_dad_complete() argument
2105 idev->mc_dad_count = idev->mc_qrv; in ipv6_mc_dad_complete()
2106 if (idev->mc_dad_count) { in ipv6_mc_dad_complete()
2107 mld_send_initial_cr(idev); in ipv6_mc_dad_complete()
2108 idev->mc_dad_count--; in ipv6_mc_dad_complete()
2109 if (idev->mc_dad_count) in ipv6_mc_dad_complete()
2110 mld_dad_start_timer(idev, in ipv6_mc_dad_complete()
2111 unsolicited_report_interval(idev)); in ipv6_mc_dad_complete()
2117 struct inet6_dev *idev = from_timer(idev, t, mc_dad_timer); in mld_dad_timer_expire() local
2119 mld_send_initial_cr(idev); in mld_dad_timer_expire()
2120 if (idev->mc_dad_count) { in mld_dad_timer_expire()
2121 idev->mc_dad_count--; in mld_dad_timer_expire()
2122 if (idev->mc_dad_count) in mld_dad_timer_expire()
2123 mld_dad_start_timer(idev, in mld_dad_timer_expire()
2124 unsolicited_report_interval(idev)); in mld_dad_timer_expire()
2126 in6_dev_put(idev); in mld_dad_timer_expire()
2147 struct inet6_dev *idev = pmc->idev; in ip6_mc_del1_src() local
2155 !mld_in_v1_mode(idev)) { in ip6_mc_del1_src()
2156 psf->sf_crcount = idev->mc_qrv; in ip6_mc_del1_src()
2166 static int ip6_mc_del_src(struct inet6_dev *idev, const struct in6_addr *pmca, in ip6_mc_del_src() argument
2174 if (!idev) in ip6_mc_del_src()
2176 read_lock_bh(&idev->lock); in ip6_mc_del_src()
2177 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in ip6_mc_del_src()
2183 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2191 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2211 pmc->mca_crcount = idev->mc_qrv; in ip6_mc_del_src()
2212 idev->mc_ifc_count = pmc->mca_crcount; in ip6_mc_del_src()
2215 mld_ifc_event(pmc->idev); in ip6_mc_del_src()
2217 mld_ifc_event(pmc->idev); in ip6_mc_del_src()
2219 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2270 int qrv = pmc->idev->mc_qrv; in sf_setstate()
2330 static int ip6_mc_add_src(struct inet6_dev *idev, const struct in6_addr *pmca, in ip6_mc_add_src() argument
2338 if (!idev) in ip6_mc_add_src()
2340 read_lock_bh(&idev->lock); in ip6_mc_add_src()
2341 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in ip6_mc_add_src()
2347 read_unlock_bh(&idev->lock); in ip6_mc_add_src()
2379 pmc->mca_crcount = idev->mc_qrv; in ip6_mc_add_src()
2380 idev->mc_ifc_count = pmc->mca_crcount; in ip6_mc_add_src()
2383 mld_ifc_event(idev); in ip6_mc_add_src()
2385 mld_ifc_event(idev); in ip6_mc_add_src()
2387 read_unlock_bh(&idev->lock); in ip6_mc_add_src()
2418 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); in igmp6_join_group()
2420 delay = prandom_u32() % unsolicited_report_interval(ma->idev); in igmp6_join_group()
2435 struct inet6_dev *idev) in ip6_mc_leave_src() argument
2442 err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode, 0, NULL, 0); in ip6_mc_leave_src()
2444 err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode, in ip6_mc_leave_src()
2455 if (mld_in_v1_mode(ma->idev)) { in igmp6_leave_group()
2457 igmp6_send(&ma->mca_addr, ma->idev->dev, in igmp6_leave_group()
2460 mld_add_delrec(ma->idev, ma); in igmp6_leave_group()
2461 mld_ifc_event(ma->idev); in igmp6_leave_group()
2467 struct inet6_dev *idev = from_timer(idev, t, mc_gq_timer); in mld_gq_timer_expire() local
2469 idev->mc_gq_running = 0; in mld_gq_timer_expire()
2470 mld_send_report(idev, NULL); in mld_gq_timer_expire()
2471 in6_dev_put(idev); in mld_gq_timer_expire()
2476 struct inet6_dev *idev = from_timer(idev, t, mc_ifc_timer); in mld_ifc_timer_expire() local
2478 mld_send_cr(idev); in mld_ifc_timer_expire()
2479 if (idev->mc_ifc_count) { in mld_ifc_timer_expire()
2480 idev->mc_ifc_count--; in mld_ifc_timer_expire()
2481 if (idev->mc_ifc_count) in mld_ifc_timer_expire()
2482 mld_ifc_start_timer(idev, in mld_ifc_timer_expire()
2483 unsolicited_report_interval(idev)); in mld_ifc_timer_expire()
2485 in6_dev_put(idev); in mld_ifc_timer_expire()
2488 static void mld_ifc_event(struct inet6_dev *idev) in mld_ifc_event() argument
2490 if (mld_in_v1_mode(idev)) in mld_ifc_event()
2492 idev->mc_ifc_count = idev->mc_qrv; in mld_ifc_event()
2493 mld_ifc_start_timer(idev, 1); in mld_ifc_event()
2500 if (mld_in_v1_mode(ma->idev)) in igmp6_timer_handler()
2501 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); in igmp6_timer_handler()
2503 mld_send_report(ma->idev, ma); in igmp6_timer_handler()
2514 void ipv6_mc_unmap(struct inet6_dev *idev) in ipv6_mc_unmap() argument
2520 read_lock_bh(&idev->lock); in ipv6_mc_unmap()
2521 for (i = idev->mc_list; i; i = i->next) in ipv6_mc_unmap()
2523 read_unlock_bh(&idev->lock); in ipv6_mc_unmap()
2526 void ipv6_mc_remap(struct inet6_dev *idev) in ipv6_mc_remap() argument
2528 ipv6_mc_up(idev); in ipv6_mc_remap()
2533 void ipv6_mc_down(struct inet6_dev *idev) in ipv6_mc_down() argument
2539 read_lock_bh(&idev->lock); in ipv6_mc_down()
2541 for (i = idev->mc_list; i; i = i->next) in ipv6_mc_down()
2547 mld_ifc_stop_timer(idev); in ipv6_mc_down()
2548 mld_gq_stop_timer(idev); in ipv6_mc_down()
2549 mld_dad_stop_timer(idev); in ipv6_mc_down()
2550 read_unlock_bh(&idev->lock); in ipv6_mc_down()
2553 static void ipv6_mc_reset(struct inet6_dev *idev) in ipv6_mc_reset() argument
2555 idev->mc_qrv = sysctl_mld_qrv; in ipv6_mc_reset()
2556 idev->mc_qi = MLD_QI_DEFAULT; in ipv6_mc_reset()
2557 idev->mc_qri = MLD_QRI_DEFAULT; in ipv6_mc_reset()
2558 idev->mc_v1_seen = 0; in ipv6_mc_reset()
2559 idev->mc_maxdelay = unsolicited_report_interval(idev); in ipv6_mc_reset()
2564 void ipv6_mc_up(struct inet6_dev *idev) in ipv6_mc_up() argument
2570 read_lock_bh(&idev->lock); in ipv6_mc_up()
2571 ipv6_mc_reset(idev); in ipv6_mc_up()
2572 for (i = idev->mc_list; i; i = i->next) { in ipv6_mc_up()
2573 mld_del_delrec(idev, i); in ipv6_mc_up()
2576 read_unlock_bh(&idev->lock); in ipv6_mc_up()
2581 void ipv6_mc_init_dev(struct inet6_dev *idev) in ipv6_mc_init_dev() argument
2583 write_lock_bh(&idev->lock); in ipv6_mc_init_dev()
2584 spin_lock_init(&idev->mc_lock); in ipv6_mc_init_dev()
2585 idev->mc_gq_running = 0; in ipv6_mc_init_dev()
2586 timer_setup(&idev->mc_gq_timer, mld_gq_timer_expire, 0); in ipv6_mc_init_dev()
2587 idev->mc_tomb = NULL; in ipv6_mc_init_dev()
2588 idev->mc_ifc_count = 0; in ipv6_mc_init_dev()
2589 timer_setup(&idev->mc_ifc_timer, mld_ifc_timer_expire, 0); in ipv6_mc_init_dev()
2590 timer_setup(&idev->mc_dad_timer, mld_dad_timer_expire, 0); in ipv6_mc_init_dev()
2591 ipv6_mc_reset(idev); in ipv6_mc_init_dev()
2592 write_unlock_bh(&idev->lock); in ipv6_mc_init_dev()
2599 void ipv6_mc_destroy_dev(struct inet6_dev *idev) in ipv6_mc_destroy_dev() argument
2604 ipv6_mc_down(idev); in ipv6_mc_destroy_dev()
2605 mld_clear_delrec(idev); in ipv6_mc_destroy_dev()
2612 __ipv6_dev_mc_dec(idev, &in6addr_linklocal_allnodes); in ipv6_mc_destroy_dev()
2614 if (idev->cnf.forwarding) in ipv6_mc_destroy_dev()
2615 __ipv6_dev_mc_dec(idev, &in6addr_linklocal_allrouters); in ipv6_mc_destroy_dev()
2617 write_lock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2618 while ((i = idev->mc_list) != NULL) { in ipv6_mc_destroy_dev()
2619 idev->mc_list = i->next; in ipv6_mc_destroy_dev()
2621 write_unlock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2623 write_lock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2625 write_unlock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2628 static void ipv6_mc_rejoin_groups(struct inet6_dev *idev) in ipv6_mc_rejoin_groups() argument
2634 if (mld_in_v1_mode(idev)) { in ipv6_mc_rejoin_groups()
2635 read_lock_bh(&idev->lock); in ipv6_mc_rejoin_groups()
2636 for (pmc = idev->mc_list; pmc; pmc = pmc->next) in ipv6_mc_rejoin_groups()
2638 read_unlock_bh(&idev->lock); in ipv6_mc_rejoin_groups()
2640 mld_send_report(idev, NULL); in ipv6_mc_rejoin_groups()
2648 struct inet6_dev *idev = __in6_dev_get(dev); in ipv6_mc_netdev_event() local
2652 if (idev) in ipv6_mc_netdev_event()
2653 ipv6_mc_rejoin_groups(idev); in ipv6_mc_netdev_event()
2670 struct inet6_dev *idev; member
2681 state->idev = NULL; in igmp6_mc_get_first()
2683 struct inet6_dev *idev; in igmp6_mc_get_first() local
2684 idev = __in6_dev_get(state->dev); in igmp6_mc_get_first()
2685 if (!idev) in igmp6_mc_get_first()
2687 read_lock_bh(&idev->lock); in igmp6_mc_get_first()
2688 im = idev->mc_list; in igmp6_mc_get_first()
2690 state->idev = idev; in igmp6_mc_get_first()
2693 read_unlock_bh(&idev->lock); in igmp6_mc_get_first()
2704 if (likely(state->idev)) in igmp6_mc_get_next()
2705 read_unlock_bh(&state->idev->lock); in igmp6_mc_get_next()
2709 state->idev = NULL; in igmp6_mc_get_next()
2712 state->idev = __in6_dev_get(state->dev); in igmp6_mc_get_next()
2713 if (!state->idev) in igmp6_mc_get_next()
2715 read_lock_bh(&state->idev->lock); in igmp6_mc_get_next()
2716 im = state->idev->mc_list; in igmp6_mc_get_next()
2750 if (likely(state->idev)) { in igmp6_mc_seq_stop()
2751 read_unlock_bh(&state->idev->lock); in igmp6_mc_seq_stop()
2752 state->idev = NULL; in igmp6_mc_seq_stop()
2783 struct inet6_dev *idev; member
2796 state->idev = NULL; in igmp6_mcf_get_first()
2799 struct inet6_dev *idev; in igmp6_mcf_get_first() local
2800 idev = __in6_dev_get(state->dev); in igmp6_mcf_get_first()
2801 if (unlikely(idev == NULL)) in igmp6_mcf_get_first()
2803 read_lock_bh(&idev->lock); in igmp6_mcf_get_first()
2804 im = idev->mc_list; in igmp6_mcf_get_first()
2810 state->idev = idev; in igmp6_mcf_get_first()
2815 read_unlock_bh(&idev->lock); in igmp6_mcf_get_first()
2829 if (likely(state->idev)) in igmp6_mcf_get_next()
2830 read_unlock_bh(&state->idev->lock); in igmp6_mcf_get_next()
2834 state->idev = NULL; in igmp6_mcf_get_next()
2837 state->idev = __in6_dev_get(state->dev); in igmp6_mcf_get_next()
2838 if (!state->idev) in igmp6_mcf_get_next()
2840 read_lock_bh(&state->idev->lock); in igmp6_mcf_get_next()
2841 state->im = state->idev->mc_list; in igmp6_mcf_get_next()
2887 if (likely(state->idev)) { in igmp6_mcf_seq_stop()
2888 read_unlock_bh(&state->idev->lock); in igmp6_mcf_seq_stop()
2889 state->idev = NULL; in igmp6_mcf_seq_stop()