Lines Matching refs:idev
78 static void mld_ifc_event(struct inet6_dev *idev);
79 static void mld_add_delrec(struct inet6_dev *idev, struct ifmcaddr6 *pmc);
80 static void mld_del_delrec(struct inet6_dev *idev, struct ifmcaddr6 *pmc);
81 static void mld_clear_delrec(struct inet6_dev *idev);
82 static bool mld_in_v1_mode(const struct inet6_dev *idev);
86 static int ip6_mc_del_src(struct inet6_dev *idev, const struct in6_addr *pmca,
89 static int ip6_mc_add_src(struct inet6_dev *idev, const struct in6_addr *pmca,
93 struct inet6_dev *idev);
121 static int unsolicited_report_interval(struct inet6_dev *idev) in unsolicited_report_interval() argument
125 if (mld_in_v1_mode(idev)) in unsolicited_report_interval()
126 iv = idev->cnf.mldv1_unsolicited_report_interval; in unsolicited_report_interval()
128 iv = idev->cnf.mldv2_unsolicited_report_interval; in unsolicited_report_interval()
240 struct inet6_dev *idev = __in6_dev_get(dev); in ipv6_sock_mc_drop() local
242 (void) ip6_mc_leave_src(sk, mc_lst, idev); in ipv6_sock_mc_drop()
243 if (idev) in ipv6_sock_mc_drop()
244 __ipv6_dev_mc_dec(idev, &mc_lst->addr); in ipv6_sock_mc_drop()
264 struct inet6_dev *idev = NULL; in ip6_mc_find_dev_rcu() local
278 idev = __in6_dev_get(dev); in ip6_mc_find_dev_rcu()
279 if (!idev) in ip6_mc_find_dev_rcu()
281 read_lock_bh(&idev->lock); in ip6_mc_find_dev_rcu()
282 if (idev->dead) { in ip6_mc_find_dev_rcu()
283 read_unlock_bh(&idev->lock); in ip6_mc_find_dev_rcu()
286 return idev; in ip6_mc_find_dev_rcu()
304 struct inet6_dev *idev = __in6_dev_get(dev); in __ipv6_sock_mc_close() local
306 (void) ip6_mc_leave_src(sk, mc_lst, idev); in __ipv6_sock_mc_close()
307 if (idev) in __ipv6_sock_mc_close()
308 __ipv6_dev_mc_dec(idev, &mc_lst->addr); in __ipv6_sock_mc_close()
333 struct inet6_dev *idev; in ip6_mc_source() local
349 idev = ip6_mc_find_dev_rcu(net, group, pgsr->gsr_interface); in ip6_mc_source()
350 if (!idev) { in ip6_mc_source()
375 ip6_mc_add_src(idev, group, omode, 0, NULL, 0); in ip6_mc_source()
376 ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0); in ip6_mc_source()
403 ip6_mc_del_src(idev, group, omode, 1, source, 1); in ip6_mc_source()
449 ip6_mc_add_src(idev, group, omode, 1, source, 1); in ip6_mc_source()
453 read_unlock_bh(&idev->lock); in ip6_mc_source()
464 struct inet6_dev *idev; in ip6_mc_msfilter() local
480 idev = ip6_mc_find_dev_rcu(net, group, gsf->gf_interface); in ip6_mc_msfilter()
482 if (!idev) { in ip6_mc_msfilter()
518 err = ip6_mc_add_src(idev, group, gsf->gf_fmode, in ip6_mc_msfilter()
526 (void) ip6_mc_add_src(idev, group, gsf->gf_fmode, 0, NULL, 0); in ip6_mc_msfilter()
532 (void) ip6_mc_del_src(idev, group, pmc->sfmode, in ip6_mc_msfilter()
536 (void) ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0); in ip6_mc_msfilter()
542 read_unlock_bh(&idev->lock); in ip6_mc_msfilter()
555 struct inet6_dev *idev; in ip6_mc_msfget() local
566 idev = ip6_mc_find_dev_rcu(net, group, gsf->gf_interface); in ip6_mc_msfget()
568 if (!idev) { in ip6_mc_msfget()
590 read_unlock_bh(&idev->lock); in ip6_mc_msfget()
615 read_unlock_bh(&idev->lock); in ip6_mc_msfget()
661 struct net_device *dev = mc->idev->dev; in igmp6_group_added()
679 if (mld_in_v1_mode(mc->idev)) { in igmp6_group_added()
690 mc->mca_crcount = mc->idev->mc_qrv; in igmp6_group_added()
692 mld_ifc_event(mc->idev); in igmp6_group_added()
697 struct net_device *dev = mc->idev->dev; in igmp6_group_dropped()
715 if (!mc->idev->dead) in igmp6_group_dropped()
727 static void mld_add_delrec(struct inet6_dev *idev, struct ifmcaddr6 *im) in mld_add_delrec() argument
743 pmc->idev = im->idev; in mld_add_delrec()
744 in6_dev_hold(idev); in mld_add_delrec()
746 pmc->mca_crcount = idev->mc_qrv; in mld_add_delrec()
759 spin_lock_bh(&idev->mc_lock); in mld_add_delrec()
760 pmc->next = idev->mc_tomb; in mld_add_delrec()
761 idev->mc_tomb = pmc; in mld_add_delrec()
762 spin_unlock_bh(&idev->mc_lock); in mld_add_delrec()
765 static void mld_del_delrec(struct inet6_dev *idev, struct ifmcaddr6 *im) in mld_del_delrec() argument
771 spin_lock_bh(&idev->mc_lock); in mld_del_delrec()
773 for (pmc = idev->mc_tomb; pmc; pmc = pmc->next) { in mld_del_delrec()
782 idev->mc_tomb = pmc->next; in mld_del_delrec()
784 spin_unlock_bh(&idev->mc_lock); in mld_del_delrec()
788 im->idev = pmc->idev; in mld_del_delrec()
793 psf->sf_crcount = idev->mc_qrv; in mld_del_delrec()
795 im->mca_crcount = idev->mc_qrv; in mld_del_delrec()
797 in6_dev_put(pmc->idev); in mld_del_delrec()
804 static void mld_clear_delrec(struct inet6_dev *idev) in mld_clear_delrec() argument
808 spin_lock_bh(&idev->mc_lock); in mld_clear_delrec()
809 pmc = idev->mc_tomb; in mld_clear_delrec()
810 idev->mc_tomb = NULL; in mld_clear_delrec()
811 spin_unlock_bh(&idev->mc_lock); in mld_clear_delrec()
816 in6_dev_put(pmc->idev); in mld_clear_delrec()
821 read_lock_bh(&idev->lock); in mld_clear_delrec()
822 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_clear_delrec()
834 read_unlock_bh(&idev->lock); in mld_clear_delrec()
845 in6_dev_put(mc->idev); in ma_put()
850 static struct ifmcaddr6 *mca_alloc(struct inet6_dev *idev, in mca_alloc() argument
863 mc->idev = idev; /* reference taken by caller */ in mca_alloc()
887 struct inet6_dev *idev; in __ipv6_dev_mc_inc() local
892 idev = in6_dev_get(dev); in __ipv6_dev_mc_inc()
894 if (!idev) in __ipv6_dev_mc_inc()
897 write_lock_bh(&idev->lock); in __ipv6_dev_mc_inc()
898 if (idev->dead) { in __ipv6_dev_mc_inc()
899 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_inc()
900 in6_dev_put(idev); in __ipv6_dev_mc_inc()
904 for (mc = idev->mc_list; mc; mc = mc->next) { in __ipv6_dev_mc_inc()
907 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_inc()
908 ip6_mc_add_src(idev, &mc->mca_addr, mode, 0, NULL, 0); in __ipv6_dev_mc_inc()
909 in6_dev_put(idev); in __ipv6_dev_mc_inc()
914 mc = mca_alloc(idev, addr, mode); in __ipv6_dev_mc_inc()
916 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_inc()
917 in6_dev_put(idev); in __ipv6_dev_mc_inc()
921 mc->next = idev->mc_list; in __ipv6_dev_mc_inc()
922 idev->mc_list = mc; in __ipv6_dev_mc_inc()
928 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_inc()
930 mld_del_delrec(idev, mc); in __ipv6_dev_mc_inc()
945 int __ipv6_dev_mc_dec(struct inet6_dev *idev, const struct in6_addr *addr) in __ipv6_dev_mc_dec() argument
951 write_lock_bh(&idev->lock); in __ipv6_dev_mc_dec()
952 for (map = &idev->mc_list; (ma = *map) != NULL; map = &ma->next) { in __ipv6_dev_mc_dec()
956 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_dec()
964 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_dec()
968 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_dec()
975 struct inet6_dev *idev; in ipv6_dev_mc_dec() local
980 idev = __in6_dev_get(dev); in ipv6_dev_mc_dec()
981 if (!idev) in ipv6_dev_mc_dec()
984 err = __ipv6_dev_mc_dec(idev, addr); in ipv6_dev_mc_dec()
996 struct inet6_dev *idev; in ipv6_chk_mcast_addr() local
1001 idev = __in6_dev_get(dev); in ipv6_chk_mcast_addr()
1002 if (idev) { in ipv6_chk_mcast_addr()
1003 read_lock_bh(&idev->lock); in ipv6_chk_mcast_addr()
1004 for (mc = idev->mc_list; mc; mc = mc->next) { in ipv6_chk_mcast_addr()
1027 read_unlock_bh(&idev->lock); in ipv6_chk_mcast_addr()
1033 static void mld_gq_start_timer(struct inet6_dev *idev) in mld_gq_start_timer() argument
1035 unsigned long tv = prandom_u32() % idev->mc_maxdelay; in mld_gq_start_timer()
1037 idev->mc_gq_running = 1; in mld_gq_start_timer()
1038 if (!mod_timer(&idev->mc_gq_timer, jiffies+tv+2)) in mld_gq_start_timer()
1039 in6_dev_hold(idev); in mld_gq_start_timer()
1042 static void mld_gq_stop_timer(struct inet6_dev *idev) in mld_gq_stop_timer() argument
1044 idev->mc_gq_running = 0; in mld_gq_stop_timer()
1045 if (del_timer(&idev->mc_gq_timer)) in mld_gq_stop_timer()
1046 __in6_dev_put(idev); in mld_gq_stop_timer()
1049 static void mld_ifc_start_timer(struct inet6_dev *idev, unsigned long delay) in mld_ifc_start_timer() argument
1053 if (!mod_timer(&idev->mc_ifc_timer, jiffies+tv+2)) in mld_ifc_start_timer()
1054 in6_dev_hold(idev); in mld_ifc_start_timer()
1057 static void mld_ifc_stop_timer(struct inet6_dev *idev) in mld_ifc_stop_timer() argument
1059 idev->mc_ifc_count = 0; in mld_ifc_stop_timer()
1060 if (del_timer(&idev->mc_ifc_timer)) in mld_ifc_stop_timer()
1061 __in6_dev_put(idev); in mld_ifc_stop_timer()
1064 static void mld_dad_start_timer(struct inet6_dev *idev, unsigned long delay) in mld_dad_start_timer() argument
1068 if (!mod_timer(&idev->mc_dad_timer, jiffies+tv+2)) in mld_dad_start_timer()
1069 in6_dev_hold(idev); in mld_dad_start_timer()
1072 static void mld_dad_stop_timer(struct inet6_dev *idev) in mld_dad_stop_timer() argument
1074 if (del_timer(&idev->mc_dad_timer)) in mld_dad_stop_timer()
1075 __in6_dev_put(idev); in mld_dad_stop_timer()
1165 static int mld_force_mld_version(const struct inet6_dev *idev) in mld_force_mld_version() argument
1172 if (dev_net(idev->dev)->ipv6.devconf_all->force_mld_version != 0) in mld_force_mld_version()
1173 return dev_net(idev->dev)->ipv6.devconf_all->force_mld_version; in mld_force_mld_version()
1175 return idev->cnf.force_mld_version; in mld_force_mld_version()
1178 static bool mld_in_v2_mode_only(const struct inet6_dev *idev) in mld_in_v2_mode_only() argument
1180 return mld_force_mld_version(idev) == 2; in mld_in_v2_mode_only()
1183 static bool mld_in_v1_mode_only(const struct inet6_dev *idev) in mld_in_v1_mode_only() argument
1185 return mld_force_mld_version(idev) == 1; in mld_in_v1_mode_only()
1188 static bool mld_in_v1_mode(const struct inet6_dev *idev) in mld_in_v1_mode() argument
1190 if (mld_in_v2_mode_only(idev)) in mld_in_v1_mode()
1192 if (mld_in_v1_mode_only(idev)) in mld_in_v1_mode()
1194 if (idev->mc_v1_seen && time_before(jiffies, idev->mc_v1_seen)) in mld_in_v1_mode()
1200 static void mld_set_v1_mode(struct inet6_dev *idev) in mld_set_v1_mode() argument
1210 switchback = (idev->mc_qrv * idev->mc_qi) + idev->mc_qri; in mld_set_v1_mode()
1212 idev->mc_v1_seen = jiffies + switchback; in mld_set_v1_mode()
1215 static void mld_update_qrv(struct inet6_dev *idev, in mld_update_qrv() argument
1228 WARN_ON(idev->mc_qrv == 0); in mld_update_qrv()
1231 idev->mc_qrv = mlh2->mld2q_qrv; in mld_update_qrv()
1233 if (unlikely(idev->mc_qrv < min_qrv)) { in mld_update_qrv()
1235 idev->mc_qrv, min_qrv); in mld_update_qrv()
1236 idev->mc_qrv = min_qrv; in mld_update_qrv()
1240 static void mld_update_qi(struct inet6_dev *idev, in mld_update_qi() argument
1262 idev->mc_qi = mc_qqi * HZ; in mld_update_qi()
1265 static void mld_update_qri(struct inet6_dev *idev, in mld_update_qri() argument
1272 idev->mc_qri = msecs_to_jiffies(mldv2_mrc(mlh2)); in mld_update_qri()
1275 static int mld_process_v1(struct inet6_dev *idev, struct mld_msg *mld, in mld_process_v1() argument
1281 if (mld_in_v2_mode_only(idev)) in mld_process_v1()
1309 mld_set_v1_mode(idev); in mld_process_v1()
1312 mld_gq_stop_timer(idev); in mld_process_v1()
1314 mld_ifc_stop_timer(idev); in mld_process_v1()
1316 mld_clear_delrec(idev); in mld_process_v1()
1321 static int mld_process_v2(struct inet6_dev *idev, struct mld2_query *mld, in mld_process_v2() argument
1326 mld_update_qrv(idev, mld); in mld_process_v2()
1327 mld_update_qi(idev, mld); in mld_process_v2()
1328 mld_update_qri(idev, mld); in mld_process_v2()
1330 idev->mc_maxdelay = *max_delay; in mld_process_v2()
1342 struct inet6_dev *idev; in igmp6_event_query() local
1368 idev = __in6_dev_get(skb->dev); in igmp6_event_query()
1369 if (!idev) in igmp6_event_query()
1382 } else if (len == MLD_V1_QUERY_LEN || mld_in_v1_mode(idev)) { in igmp6_event_query()
1383 err = mld_process_v1(idev, mld, &max_delay, in igmp6_event_query()
1396 err = mld_process_v2(idev, mlh2, &max_delay); in igmp6_event_query()
1404 mld_gq_start_timer(idev); in igmp6_event_query()
1420 read_lock_bh(&idev->lock); in igmp6_event_query()
1422 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_query()
1428 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_query()
1450 read_unlock_bh(&idev->lock); in igmp6_event_query()
1459 struct inet6_dev *idev; in igmp6_event_report() local
1483 idev = __in6_dev_get(skb->dev); in igmp6_event_report()
1484 if (!idev) in igmp6_event_report()
1491 read_lock_bh(&idev->lock); in igmp6_event_report()
1492 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_report()
1502 read_unlock_bh(&idev->lock); in igmp6_event_report()
1589 static struct sk_buff *mld_newpack(struct inet6_dev *idev, unsigned int mtu) in mld_newpack() argument
1591 struct net_device *dev = idev->dev; in mld_newpack()
1618 if (__ipv6_get_lladdr(idev, &addr_buf, IFA_F_TENTATIVE)) { in mld_newpack()
1648 struct inet6_dev *idev; in mld_sendpack() local
1655 idev = __in6_dev_get(skb->dev); in mld_sendpack()
1656 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); in mld_sendpack()
1687 ICMP6MSGOUT_INC_STATS(net, idev, ICMPV6_MLD2_REPORT); in mld_sendpack()
1688 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS); in mld_sendpack()
1690 IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); in mld_sendpack()
1713 skb = mld_newpack(pmc->idev, mtu); in add_grhead()
1733 struct inet6_dev *idev = pmc->idev; in add_grec() local
1734 struct net_device *dev = idev->dev; in add_grec()
1768 skb = mld_newpack(idev, mtu); in add_grec()
1804 skb = mld_newpack(idev, mtu); in add_grec()
1855 static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc) in mld_send_report() argument
1860 read_lock_bh(&idev->lock); in mld_send_report()
1862 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_report()
1882 read_unlock_bh(&idev->lock); in mld_send_report()
1908 static void mld_send_cr(struct inet6_dev *idev) in mld_send_cr() argument
1914 read_lock_bh(&idev->lock); in mld_send_cr()
1915 spin_lock(&idev->mc_lock); in mld_send_cr()
1919 for (pmc = idev->mc_tomb; pmc; pmc = pmc_next) { in mld_send_cr()
1943 idev->mc_tomb = pmc_next; in mld_send_cr()
1944 in6_dev_put(pmc->idev); in mld_send_cr()
1949 spin_unlock(&idev->mc_lock); in mld_send_cr()
1952 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_cr()
1975 read_unlock_bh(&idev->lock); in mld_send_cr()
1985 struct inet6_dev *idev; in igmp6_send() local
2047 idev = __in6_dev_get(skb->dev); in igmp6_send()
2064 ICMP6MSGOUT_INC_STATS(net, idev, type); in igmp6_send()
2065 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS); in igmp6_send()
2067 IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); in igmp6_send()
2077 static void mld_send_initial_cr(struct inet6_dev *idev) in mld_send_initial_cr() argument
2083 if (mld_in_v1_mode(idev)) in mld_send_initial_cr()
2087 read_lock_bh(&idev->lock); in mld_send_initial_cr()
2088 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_initial_cr()
2097 read_unlock_bh(&idev->lock); in mld_send_initial_cr()
2102 void ipv6_mc_dad_complete(struct inet6_dev *idev) in ipv6_mc_dad_complete() argument
2104 idev->mc_dad_count = idev->mc_qrv; in ipv6_mc_dad_complete()
2105 if (idev->mc_dad_count) { in ipv6_mc_dad_complete()
2106 mld_send_initial_cr(idev); in ipv6_mc_dad_complete()
2107 idev->mc_dad_count--; in ipv6_mc_dad_complete()
2108 if (idev->mc_dad_count) in ipv6_mc_dad_complete()
2109 mld_dad_start_timer(idev, in ipv6_mc_dad_complete()
2110 unsolicited_report_interval(idev)); in ipv6_mc_dad_complete()
2116 struct inet6_dev *idev = from_timer(idev, t, mc_dad_timer); in mld_dad_timer_expire() local
2118 mld_send_initial_cr(idev); in mld_dad_timer_expire()
2119 if (idev->mc_dad_count) { in mld_dad_timer_expire()
2120 idev->mc_dad_count--; in mld_dad_timer_expire()
2121 if (idev->mc_dad_count) in mld_dad_timer_expire()
2122 mld_dad_start_timer(idev, in mld_dad_timer_expire()
2123 unsolicited_report_interval(idev)); in mld_dad_timer_expire()
2125 in6_dev_put(idev); in mld_dad_timer_expire()
2146 struct inet6_dev *idev = pmc->idev; in ip6_mc_del1_src() local
2154 !mld_in_v1_mode(idev)) { in ip6_mc_del1_src()
2155 psf->sf_crcount = idev->mc_qrv; in ip6_mc_del1_src()
2165 static int ip6_mc_del_src(struct inet6_dev *idev, const struct in6_addr *pmca, in ip6_mc_del_src() argument
2173 if (!idev) in ip6_mc_del_src()
2175 read_lock_bh(&idev->lock); in ip6_mc_del_src()
2176 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in ip6_mc_del_src()
2182 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2190 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2210 pmc->mca_crcount = idev->mc_qrv; in ip6_mc_del_src()
2211 idev->mc_ifc_count = pmc->mca_crcount; in ip6_mc_del_src()
2214 mld_ifc_event(pmc->idev); in ip6_mc_del_src()
2216 mld_ifc_event(pmc->idev); in ip6_mc_del_src()
2218 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2269 int qrv = pmc->idev->mc_qrv; in sf_setstate()
2329 static int ip6_mc_add_src(struct inet6_dev *idev, const struct in6_addr *pmca, in ip6_mc_add_src() argument
2337 if (!idev) in ip6_mc_add_src()
2339 read_lock_bh(&idev->lock); in ip6_mc_add_src()
2340 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in ip6_mc_add_src()
2346 read_unlock_bh(&idev->lock); in ip6_mc_add_src()
2378 pmc->mca_crcount = idev->mc_qrv; in ip6_mc_add_src()
2379 idev->mc_ifc_count = pmc->mca_crcount; in ip6_mc_add_src()
2382 mld_ifc_event(idev); in ip6_mc_add_src()
2384 mld_ifc_event(idev); in ip6_mc_add_src()
2386 read_unlock_bh(&idev->lock); in ip6_mc_add_src()
2417 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); in igmp6_join_group()
2419 delay = prandom_u32() % unsolicited_report_interval(ma->idev); in igmp6_join_group()
2434 struct inet6_dev *idev) in ip6_mc_leave_src() argument
2441 err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode, 0, NULL, 0); in ip6_mc_leave_src()
2443 err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode, in ip6_mc_leave_src()
2454 if (mld_in_v1_mode(ma->idev)) { in igmp6_leave_group()
2456 igmp6_send(&ma->mca_addr, ma->idev->dev, in igmp6_leave_group()
2459 mld_add_delrec(ma->idev, ma); in igmp6_leave_group()
2460 mld_ifc_event(ma->idev); in igmp6_leave_group()
2466 struct inet6_dev *idev = from_timer(idev, t, mc_gq_timer); in mld_gq_timer_expire() local
2468 idev->mc_gq_running = 0; in mld_gq_timer_expire()
2469 mld_send_report(idev, NULL); in mld_gq_timer_expire()
2470 in6_dev_put(idev); in mld_gq_timer_expire()
2475 struct inet6_dev *idev = from_timer(idev, t, mc_ifc_timer); in mld_ifc_timer_expire() local
2477 mld_send_cr(idev); in mld_ifc_timer_expire()
2478 if (idev->mc_ifc_count) { in mld_ifc_timer_expire()
2479 idev->mc_ifc_count--; in mld_ifc_timer_expire()
2480 if (idev->mc_ifc_count) in mld_ifc_timer_expire()
2481 mld_ifc_start_timer(idev, in mld_ifc_timer_expire()
2482 unsolicited_report_interval(idev)); in mld_ifc_timer_expire()
2484 in6_dev_put(idev); in mld_ifc_timer_expire()
2487 static void mld_ifc_event(struct inet6_dev *idev) in mld_ifc_event() argument
2489 if (mld_in_v1_mode(idev)) in mld_ifc_event()
2491 idev->mc_ifc_count = idev->mc_qrv; in mld_ifc_event()
2492 mld_ifc_start_timer(idev, 1); in mld_ifc_event()
2499 if (mld_in_v1_mode(ma->idev)) in igmp6_timer_handler()
2500 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); in igmp6_timer_handler()
2502 mld_send_report(ma->idev, ma); in igmp6_timer_handler()
2513 void ipv6_mc_unmap(struct inet6_dev *idev) in ipv6_mc_unmap() argument
2519 read_lock_bh(&idev->lock); in ipv6_mc_unmap()
2520 for (i = idev->mc_list; i; i = i->next) in ipv6_mc_unmap()
2522 read_unlock_bh(&idev->lock); in ipv6_mc_unmap()
2525 void ipv6_mc_remap(struct inet6_dev *idev) in ipv6_mc_remap() argument
2527 ipv6_mc_up(idev); in ipv6_mc_remap()
2532 void ipv6_mc_down(struct inet6_dev *idev) in ipv6_mc_down() argument
2538 read_lock_bh(&idev->lock); in ipv6_mc_down()
2540 for (i = idev->mc_list; i; i = i->next) in ipv6_mc_down()
2546 mld_ifc_stop_timer(idev); in ipv6_mc_down()
2547 mld_gq_stop_timer(idev); in ipv6_mc_down()
2548 mld_dad_stop_timer(idev); in ipv6_mc_down()
2549 read_unlock_bh(&idev->lock); in ipv6_mc_down()
2552 static void ipv6_mc_reset(struct inet6_dev *idev) in ipv6_mc_reset() argument
2554 idev->mc_qrv = sysctl_mld_qrv; in ipv6_mc_reset()
2555 idev->mc_qi = MLD_QI_DEFAULT; in ipv6_mc_reset()
2556 idev->mc_qri = MLD_QRI_DEFAULT; in ipv6_mc_reset()
2557 idev->mc_v1_seen = 0; in ipv6_mc_reset()
2558 idev->mc_maxdelay = unsolicited_report_interval(idev); in ipv6_mc_reset()
2563 void ipv6_mc_up(struct inet6_dev *idev) in ipv6_mc_up() argument
2569 read_lock_bh(&idev->lock); in ipv6_mc_up()
2570 ipv6_mc_reset(idev); in ipv6_mc_up()
2571 for (i = idev->mc_list; i; i = i->next) { in ipv6_mc_up()
2572 mld_del_delrec(idev, i); in ipv6_mc_up()
2575 read_unlock_bh(&idev->lock); in ipv6_mc_up()
2580 void ipv6_mc_init_dev(struct inet6_dev *idev) in ipv6_mc_init_dev() argument
2582 write_lock_bh(&idev->lock); in ipv6_mc_init_dev()
2583 spin_lock_init(&idev->mc_lock); in ipv6_mc_init_dev()
2584 idev->mc_gq_running = 0; in ipv6_mc_init_dev()
2585 timer_setup(&idev->mc_gq_timer, mld_gq_timer_expire, 0); in ipv6_mc_init_dev()
2586 idev->mc_tomb = NULL; in ipv6_mc_init_dev()
2587 idev->mc_ifc_count = 0; in ipv6_mc_init_dev()
2588 timer_setup(&idev->mc_ifc_timer, mld_ifc_timer_expire, 0); in ipv6_mc_init_dev()
2589 timer_setup(&idev->mc_dad_timer, mld_dad_timer_expire, 0); in ipv6_mc_init_dev()
2590 ipv6_mc_reset(idev); in ipv6_mc_init_dev()
2591 write_unlock_bh(&idev->lock); in ipv6_mc_init_dev()
2598 void ipv6_mc_destroy_dev(struct inet6_dev *idev) in ipv6_mc_destroy_dev() argument
2603 ipv6_mc_down(idev); in ipv6_mc_destroy_dev()
2604 mld_clear_delrec(idev); in ipv6_mc_destroy_dev()
2611 __ipv6_dev_mc_dec(idev, &in6addr_linklocal_allnodes); in ipv6_mc_destroy_dev()
2613 if (idev->cnf.forwarding) in ipv6_mc_destroy_dev()
2614 __ipv6_dev_mc_dec(idev, &in6addr_linklocal_allrouters); in ipv6_mc_destroy_dev()
2616 write_lock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2617 while ((i = idev->mc_list) != NULL) { in ipv6_mc_destroy_dev()
2618 idev->mc_list = i->next; in ipv6_mc_destroy_dev()
2620 write_unlock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2622 write_lock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2624 write_unlock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2627 static void ipv6_mc_rejoin_groups(struct inet6_dev *idev) in ipv6_mc_rejoin_groups() argument
2633 if (mld_in_v1_mode(idev)) { in ipv6_mc_rejoin_groups()
2634 read_lock_bh(&idev->lock); in ipv6_mc_rejoin_groups()
2635 for (pmc = idev->mc_list; pmc; pmc = pmc->next) in ipv6_mc_rejoin_groups()
2637 read_unlock_bh(&idev->lock); in ipv6_mc_rejoin_groups()
2639 mld_send_report(idev, NULL); in ipv6_mc_rejoin_groups()
2647 struct inet6_dev *idev = __in6_dev_get(dev); in ipv6_mc_netdev_event() local
2651 if (idev) in ipv6_mc_netdev_event()
2652 ipv6_mc_rejoin_groups(idev); in ipv6_mc_netdev_event()
2669 struct inet6_dev *idev; member
2680 state->idev = NULL; in igmp6_mc_get_first()
2682 struct inet6_dev *idev; in igmp6_mc_get_first() local
2683 idev = __in6_dev_get(state->dev); in igmp6_mc_get_first()
2684 if (!idev) in igmp6_mc_get_first()
2686 read_lock_bh(&idev->lock); in igmp6_mc_get_first()
2687 im = idev->mc_list; in igmp6_mc_get_first()
2689 state->idev = idev; in igmp6_mc_get_first()
2692 read_unlock_bh(&idev->lock); in igmp6_mc_get_first()
2703 if (likely(state->idev)) in igmp6_mc_get_next()
2704 read_unlock_bh(&state->idev->lock); in igmp6_mc_get_next()
2708 state->idev = NULL; in igmp6_mc_get_next()
2711 state->idev = __in6_dev_get(state->dev); in igmp6_mc_get_next()
2712 if (!state->idev) in igmp6_mc_get_next()
2714 read_lock_bh(&state->idev->lock); in igmp6_mc_get_next()
2715 im = state->idev->mc_list; in igmp6_mc_get_next()
2749 if (likely(state->idev)) { in igmp6_mc_seq_stop()
2750 read_unlock_bh(&state->idev->lock); in igmp6_mc_seq_stop()
2751 state->idev = NULL; in igmp6_mc_seq_stop()
2782 struct inet6_dev *idev; member
2795 state->idev = NULL; in igmp6_mcf_get_first()
2798 struct inet6_dev *idev; in igmp6_mcf_get_first() local
2799 idev = __in6_dev_get(state->dev); in igmp6_mcf_get_first()
2800 if (unlikely(idev == NULL)) in igmp6_mcf_get_first()
2802 read_lock_bh(&idev->lock); in igmp6_mcf_get_first()
2803 im = idev->mc_list; in igmp6_mcf_get_first()
2809 state->idev = idev; in igmp6_mcf_get_first()
2814 read_unlock_bh(&idev->lock); in igmp6_mcf_get_first()
2828 if (likely(state->idev)) in igmp6_mcf_get_next()
2829 read_unlock_bh(&state->idev->lock); in igmp6_mcf_get_next()
2833 state->idev = NULL; in igmp6_mcf_get_next()
2836 state->idev = __in6_dev_get(state->dev); in igmp6_mcf_get_next()
2837 if (!state->idev) in igmp6_mcf_get_next()
2839 read_lock_bh(&state->idev->lock); in igmp6_mcf_get_next()
2840 state->im = state->idev->mc_list; in igmp6_mcf_get_next()
2886 if (likely(state->idev)) { in igmp6_mcf_seq_stop()
2887 read_unlock_bh(&state->idev->lock); in igmp6_mcf_seq_stop()
2888 state->idev = NULL; in igmp6_mcf_seq_stop()