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()
465 struct inet6_dev *idev; in ip6_mc_msfilter() local
481 idev = ip6_mc_find_dev_rcu(net, group, gsf->gf_interface); in ip6_mc_msfilter()
483 if (!idev) { in ip6_mc_msfilter()
519 err = ip6_mc_add_src(idev, group, gsf->gf_fmode, in ip6_mc_msfilter()
527 (void) ip6_mc_add_src(idev, group, gsf->gf_fmode, 0, NULL, 0); in ip6_mc_msfilter()
533 (void) ip6_mc_del_src(idev, group, pmc->sfmode, in ip6_mc_msfilter()
537 (void) ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0); in ip6_mc_msfilter()
543 read_unlock_bh(&idev->lock); in ip6_mc_msfilter()
556 struct inet6_dev *idev; in ip6_mc_msfget() local
567 idev = ip6_mc_find_dev_rcu(net, group, gsf->gf_interface); in ip6_mc_msfget()
569 if (!idev) { in ip6_mc_msfget()
591 read_unlock_bh(&idev->lock); in ip6_mc_msfget()
612 read_unlock_bh(&idev->lock); in ip6_mc_msfget()
658 struct net_device *dev = mc->idev->dev; in igmp6_group_added()
676 if (mld_in_v1_mode(mc->idev)) { in igmp6_group_added()
687 mc->mca_crcount = mc->idev->mc_qrv; in igmp6_group_added()
689 mld_ifc_event(mc->idev); in igmp6_group_added()
694 struct net_device *dev = mc->idev->dev; in igmp6_group_dropped()
712 if (!mc->idev->dead) in igmp6_group_dropped()
724 static void mld_add_delrec(struct inet6_dev *idev, struct ifmcaddr6 *im) in mld_add_delrec() argument
740 pmc->idev = im->idev; in mld_add_delrec()
741 in6_dev_hold(idev); in mld_add_delrec()
743 pmc->mca_crcount = idev->mc_qrv; in mld_add_delrec()
756 spin_lock_bh(&idev->mc_lock); in mld_add_delrec()
757 pmc->next = idev->mc_tomb; in mld_add_delrec()
758 idev->mc_tomb = pmc; in mld_add_delrec()
759 spin_unlock_bh(&idev->mc_lock); in mld_add_delrec()
762 static void mld_del_delrec(struct inet6_dev *idev, struct ifmcaddr6 *im) in mld_del_delrec() argument
768 spin_lock_bh(&idev->mc_lock); in mld_del_delrec()
770 for (pmc = idev->mc_tomb; pmc; pmc = pmc->next) { in mld_del_delrec()
779 idev->mc_tomb = pmc->next; in mld_del_delrec()
781 spin_unlock_bh(&idev->mc_lock); in mld_del_delrec()
785 im->idev = pmc->idev; in mld_del_delrec()
790 psf->sf_crcount = idev->mc_qrv; in mld_del_delrec()
792 im->mca_crcount = idev->mc_qrv; in mld_del_delrec()
794 in6_dev_put(pmc->idev); in mld_del_delrec()
801 static void mld_clear_delrec(struct inet6_dev *idev) in mld_clear_delrec() argument
805 spin_lock_bh(&idev->mc_lock); in mld_clear_delrec()
806 pmc = idev->mc_tomb; in mld_clear_delrec()
807 idev->mc_tomb = NULL; in mld_clear_delrec()
808 spin_unlock_bh(&idev->mc_lock); in mld_clear_delrec()
813 in6_dev_put(pmc->idev); in mld_clear_delrec()
818 read_lock_bh(&idev->lock); in mld_clear_delrec()
819 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_clear_delrec()
831 read_unlock_bh(&idev->lock); in mld_clear_delrec()
842 in6_dev_put(mc->idev); in ma_put()
847 static struct ifmcaddr6 *mca_alloc(struct inet6_dev *idev, in mca_alloc() argument
860 mc->idev = idev; /* reference taken by caller */ in mca_alloc()
884 struct inet6_dev *idev; in __ipv6_dev_mc_inc() local
889 idev = in6_dev_get(dev); in __ipv6_dev_mc_inc()
891 if (!idev) in __ipv6_dev_mc_inc()
894 write_lock_bh(&idev->lock); in __ipv6_dev_mc_inc()
895 if (idev->dead) { in __ipv6_dev_mc_inc()
896 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_inc()
897 in6_dev_put(idev); in __ipv6_dev_mc_inc()
901 for (mc = idev->mc_list; mc; mc = mc->next) { in __ipv6_dev_mc_inc()
904 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_inc()
905 ip6_mc_add_src(idev, &mc->mca_addr, mode, 0, NULL, 0); in __ipv6_dev_mc_inc()
906 in6_dev_put(idev); in __ipv6_dev_mc_inc()
911 mc = mca_alloc(idev, addr, mode); in __ipv6_dev_mc_inc()
913 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_inc()
914 in6_dev_put(idev); in __ipv6_dev_mc_inc()
918 mc->next = idev->mc_list; in __ipv6_dev_mc_inc()
919 idev->mc_list = mc; in __ipv6_dev_mc_inc()
925 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_inc()
927 mld_del_delrec(idev, mc); in __ipv6_dev_mc_inc()
942 int __ipv6_dev_mc_dec(struct inet6_dev *idev, const struct in6_addr *addr) in __ipv6_dev_mc_dec() argument
948 write_lock_bh(&idev->lock); in __ipv6_dev_mc_dec()
949 for (map = &idev->mc_list; (ma = *map) != NULL; map = &ma->next) { in __ipv6_dev_mc_dec()
953 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_dec()
961 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_dec()
965 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_dec()
972 struct inet6_dev *idev; in ipv6_dev_mc_dec() local
977 idev = __in6_dev_get(dev); in ipv6_dev_mc_dec()
978 if (!idev) in ipv6_dev_mc_dec()
981 err = __ipv6_dev_mc_dec(idev, addr); in ipv6_dev_mc_dec()
993 struct inet6_dev *idev; in ipv6_chk_mcast_addr() local
998 idev = __in6_dev_get(dev); in ipv6_chk_mcast_addr()
999 if (idev) { in ipv6_chk_mcast_addr()
1000 read_lock_bh(&idev->lock); in ipv6_chk_mcast_addr()
1001 for (mc = idev->mc_list; mc; mc = mc->next) { in ipv6_chk_mcast_addr()
1024 read_unlock_bh(&idev->lock); in ipv6_chk_mcast_addr()
1030 static void mld_gq_start_timer(struct inet6_dev *idev) in mld_gq_start_timer() argument
1032 unsigned long tv = prandom_u32() % idev->mc_maxdelay; in mld_gq_start_timer()
1034 idev->mc_gq_running = 1; in mld_gq_start_timer()
1035 if (!mod_timer(&idev->mc_gq_timer, jiffies+tv+2)) in mld_gq_start_timer()
1036 in6_dev_hold(idev); in mld_gq_start_timer()
1039 static void mld_gq_stop_timer(struct inet6_dev *idev) in mld_gq_stop_timer() argument
1041 idev->mc_gq_running = 0; in mld_gq_stop_timer()
1042 if (del_timer(&idev->mc_gq_timer)) in mld_gq_stop_timer()
1043 __in6_dev_put(idev); in mld_gq_stop_timer()
1046 static void mld_ifc_start_timer(struct inet6_dev *idev, unsigned long delay) in mld_ifc_start_timer() argument
1050 if (!mod_timer(&idev->mc_ifc_timer, jiffies+tv+2)) in mld_ifc_start_timer()
1051 in6_dev_hold(idev); in mld_ifc_start_timer()
1054 static void mld_ifc_stop_timer(struct inet6_dev *idev) in mld_ifc_stop_timer() argument
1056 idev->mc_ifc_count = 0; in mld_ifc_stop_timer()
1057 if (del_timer(&idev->mc_ifc_timer)) in mld_ifc_stop_timer()
1058 __in6_dev_put(idev); in mld_ifc_stop_timer()
1061 static void mld_dad_start_timer(struct inet6_dev *idev, unsigned long delay) in mld_dad_start_timer() argument
1065 if (!mod_timer(&idev->mc_dad_timer, jiffies+tv+2)) in mld_dad_start_timer()
1066 in6_dev_hold(idev); in mld_dad_start_timer()
1069 static void mld_dad_stop_timer(struct inet6_dev *idev) in mld_dad_stop_timer() argument
1071 if (del_timer(&idev->mc_dad_timer)) in mld_dad_stop_timer()
1072 __in6_dev_put(idev); in mld_dad_stop_timer()
1162 static int mld_force_mld_version(const struct inet6_dev *idev) in mld_force_mld_version() argument
1169 if (dev_net(idev->dev)->ipv6.devconf_all->force_mld_version != 0) in mld_force_mld_version()
1170 return dev_net(idev->dev)->ipv6.devconf_all->force_mld_version; in mld_force_mld_version()
1172 return idev->cnf.force_mld_version; in mld_force_mld_version()
1175 static bool mld_in_v2_mode_only(const struct inet6_dev *idev) in mld_in_v2_mode_only() argument
1177 return mld_force_mld_version(idev) == 2; in mld_in_v2_mode_only()
1180 static bool mld_in_v1_mode_only(const struct inet6_dev *idev) in mld_in_v1_mode_only() argument
1182 return mld_force_mld_version(idev) == 1; in mld_in_v1_mode_only()
1185 static bool mld_in_v1_mode(const struct inet6_dev *idev) in mld_in_v1_mode() argument
1187 if (mld_in_v2_mode_only(idev)) in mld_in_v1_mode()
1189 if (mld_in_v1_mode_only(idev)) in mld_in_v1_mode()
1191 if (idev->mc_v1_seen && time_before(jiffies, idev->mc_v1_seen)) in mld_in_v1_mode()
1197 static void mld_set_v1_mode(struct inet6_dev *idev) in mld_set_v1_mode() argument
1207 switchback = (idev->mc_qrv * idev->mc_qi) + idev->mc_qri; in mld_set_v1_mode()
1209 idev->mc_v1_seen = jiffies + switchback; in mld_set_v1_mode()
1212 static void mld_update_qrv(struct inet6_dev *idev, in mld_update_qrv() argument
1225 WARN_ON(idev->mc_qrv == 0); in mld_update_qrv()
1228 idev->mc_qrv = mlh2->mld2q_qrv; in mld_update_qrv()
1230 if (unlikely(idev->mc_qrv < min_qrv)) { in mld_update_qrv()
1232 idev->mc_qrv, min_qrv); in mld_update_qrv()
1233 idev->mc_qrv = min_qrv; in mld_update_qrv()
1237 static void mld_update_qi(struct inet6_dev *idev, in mld_update_qi() argument
1259 idev->mc_qi = mc_qqi * HZ; in mld_update_qi()
1262 static void mld_update_qri(struct inet6_dev *idev, in mld_update_qri() argument
1269 idev->mc_qri = msecs_to_jiffies(mldv2_mrc(mlh2)); in mld_update_qri()
1272 static int mld_process_v1(struct inet6_dev *idev, struct mld_msg *mld, in mld_process_v1() argument
1278 if (mld_in_v2_mode_only(idev)) in mld_process_v1()
1306 mld_set_v1_mode(idev); in mld_process_v1()
1309 mld_gq_stop_timer(idev); in mld_process_v1()
1311 mld_ifc_stop_timer(idev); in mld_process_v1()
1313 mld_clear_delrec(idev); in mld_process_v1()
1318 static int mld_process_v2(struct inet6_dev *idev, struct mld2_query *mld, in mld_process_v2() argument
1323 mld_update_qrv(idev, mld); in mld_process_v2()
1324 mld_update_qi(idev, mld); in mld_process_v2()
1325 mld_update_qri(idev, mld); in mld_process_v2()
1327 idev->mc_maxdelay = *max_delay; in mld_process_v2()
1339 struct inet6_dev *idev; in igmp6_event_query() local
1365 idev = __in6_dev_get(skb->dev); in igmp6_event_query()
1366 if (!idev) in igmp6_event_query()
1379 } else if (len == MLD_V1_QUERY_LEN || mld_in_v1_mode(idev)) { in igmp6_event_query()
1380 err = mld_process_v1(idev, mld, &max_delay, in igmp6_event_query()
1393 err = mld_process_v2(idev, mlh2, &max_delay); in igmp6_event_query()
1401 mld_gq_start_timer(idev); in igmp6_event_query()
1417 read_lock_bh(&idev->lock); in igmp6_event_query()
1419 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_query()
1425 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_query()
1447 read_unlock_bh(&idev->lock); in igmp6_event_query()
1456 struct inet6_dev *idev; in igmp6_event_report() local
1480 idev = __in6_dev_get(skb->dev); in igmp6_event_report()
1481 if (!idev) in igmp6_event_report()
1488 read_lock_bh(&idev->lock); in igmp6_event_report()
1489 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_report()
1499 read_unlock_bh(&idev->lock); in igmp6_event_report()
1586 static struct sk_buff *mld_newpack(struct inet6_dev *idev, unsigned int mtu) in mld_newpack() argument
1588 struct net_device *dev = idev->dev; in mld_newpack()
1612 if (__ipv6_get_lladdr(idev, &addr_buf, IFA_F_TENTATIVE)) { in mld_newpack()
1642 struct inet6_dev *idev; in mld_sendpack() local
1649 idev = __in6_dev_get(skb->dev); in mld_sendpack()
1650 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); in mld_sendpack()
1681 ICMP6MSGOUT_INC_STATS(net, idev, ICMPV6_MLD2_REPORT); in mld_sendpack()
1682 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS); in mld_sendpack()
1684 IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); in mld_sendpack()
1707 skb = mld_newpack(pmc->idev, mtu); in add_grhead()
1727 struct inet6_dev *idev = pmc->idev; in add_grec() local
1728 struct net_device *dev = idev->dev; in add_grec()
1762 skb = mld_newpack(idev, mtu); in add_grec()
1798 skb = mld_newpack(idev, mtu); in add_grec()
1849 static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc) in mld_send_report() argument
1854 read_lock_bh(&idev->lock); in mld_send_report()
1856 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_report()
1876 read_unlock_bh(&idev->lock); in mld_send_report()
1902 static void mld_send_cr(struct inet6_dev *idev) in mld_send_cr() argument
1908 read_lock_bh(&idev->lock); in mld_send_cr()
1909 spin_lock(&idev->mc_lock); in mld_send_cr()
1913 for (pmc = idev->mc_tomb; pmc; pmc = pmc_next) { in mld_send_cr()
1937 idev->mc_tomb = pmc_next; in mld_send_cr()
1938 in6_dev_put(pmc->idev); in mld_send_cr()
1943 spin_unlock(&idev->mc_lock); in mld_send_cr()
1946 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_cr()
1969 read_unlock_bh(&idev->lock); in mld_send_cr()
1979 struct inet6_dev *idev; in igmp6_send() local
2041 idev = __in6_dev_get(skb->dev); in igmp6_send()
2058 ICMP6MSGOUT_INC_STATS(net, idev, type); in igmp6_send()
2059 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS); in igmp6_send()
2061 IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); in igmp6_send()
2071 static void mld_send_initial_cr(struct inet6_dev *idev) in mld_send_initial_cr() argument
2077 if (mld_in_v1_mode(idev)) in mld_send_initial_cr()
2081 read_lock_bh(&idev->lock); in mld_send_initial_cr()
2082 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_initial_cr()
2091 read_unlock_bh(&idev->lock); in mld_send_initial_cr()
2096 void ipv6_mc_dad_complete(struct inet6_dev *idev) in ipv6_mc_dad_complete() argument
2098 idev->mc_dad_count = idev->mc_qrv; in ipv6_mc_dad_complete()
2099 if (idev->mc_dad_count) { in ipv6_mc_dad_complete()
2100 mld_send_initial_cr(idev); in ipv6_mc_dad_complete()
2101 idev->mc_dad_count--; in ipv6_mc_dad_complete()
2102 if (idev->mc_dad_count) in ipv6_mc_dad_complete()
2103 mld_dad_start_timer(idev, in ipv6_mc_dad_complete()
2104 unsolicited_report_interval(idev)); in ipv6_mc_dad_complete()
2110 struct inet6_dev *idev = from_timer(idev, t, mc_dad_timer); in mld_dad_timer_expire() local
2112 mld_send_initial_cr(idev); in mld_dad_timer_expire()
2113 if (idev->mc_dad_count) { in mld_dad_timer_expire()
2114 idev->mc_dad_count--; in mld_dad_timer_expire()
2115 if (idev->mc_dad_count) in mld_dad_timer_expire()
2116 mld_dad_start_timer(idev, in mld_dad_timer_expire()
2117 unsolicited_report_interval(idev)); in mld_dad_timer_expire()
2119 in6_dev_put(idev); in mld_dad_timer_expire()
2140 struct inet6_dev *idev = pmc->idev; in ip6_mc_del1_src() local
2148 !mld_in_v1_mode(idev)) { in ip6_mc_del1_src()
2149 psf->sf_crcount = idev->mc_qrv; in ip6_mc_del1_src()
2159 static int ip6_mc_del_src(struct inet6_dev *idev, const struct in6_addr *pmca, in ip6_mc_del_src() argument
2167 if (!idev) in ip6_mc_del_src()
2169 read_lock_bh(&idev->lock); in ip6_mc_del_src()
2170 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in ip6_mc_del_src()
2176 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2184 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2204 pmc->mca_crcount = idev->mc_qrv; in ip6_mc_del_src()
2205 idev->mc_ifc_count = pmc->mca_crcount; in ip6_mc_del_src()
2208 mld_ifc_event(pmc->idev); in ip6_mc_del_src()
2210 mld_ifc_event(pmc->idev); in ip6_mc_del_src()
2212 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2263 int qrv = pmc->idev->mc_qrv; in sf_setstate()
2323 static int ip6_mc_add_src(struct inet6_dev *idev, const struct in6_addr *pmca, in ip6_mc_add_src() argument
2331 if (!idev) in ip6_mc_add_src()
2333 read_lock_bh(&idev->lock); in ip6_mc_add_src()
2334 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in ip6_mc_add_src()
2340 read_unlock_bh(&idev->lock); in ip6_mc_add_src()
2372 pmc->mca_crcount = idev->mc_qrv; in ip6_mc_add_src()
2373 idev->mc_ifc_count = pmc->mca_crcount; in ip6_mc_add_src()
2376 mld_ifc_event(idev); in ip6_mc_add_src()
2378 mld_ifc_event(idev); in ip6_mc_add_src()
2380 read_unlock_bh(&idev->lock); in ip6_mc_add_src()
2411 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); in igmp6_join_group()
2413 delay = prandom_u32() % unsolicited_report_interval(ma->idev); in igmp6_join_group()
2428 struct inet6_dev *idev) in ip6_mc_leave_src() argument
2435 err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode, 0, NULL, 0); in ip6_mc_leave_src()
2437 err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode, in ip6_mc_leave_src()
2448 if (mld_in_v1_mode(ma->idev)) { in igmp6_leave_group()
2450 igmp6_send(&ma->mca_addr, ma->idev->dev, in igmp6_leave_group()
2453 mld_add_delrec(ma->idev, ma); in igmp6_leave_group()
2454 mld_ifc_event(ma->idev); in igmp6_leave_group()
2460 struct inet6_dev *idev = from_timer(idev, t, mc_gq_timer); in mld_gq_timer_expire() local
2462 idev->mc_gq_running = 0; in mld_gq_timer_expire()
2463 mld_send_report(idev, NULL); in mld_gq_timer_expire()
2464 in6_dev_put(idev); in mld_gq_timer_expire()
2469 struct inet6_dev *idev = from_timer(idev, t, mc_ifc_timer); in mld_ifc_timer_expire() local
2471 mld_send_cr(idev); in mld_ifc_timer_expire()
2472 if (idev->mc_ifc_count) { in mld_ifc_timer_expire()
2473 idev->mc_ifc_count--; in mld_ifc_timer_expire()
2474 if (idev->mc_ifc_count) in mld_ifc_timer_expire()
2475 mld_ifc_start_timer(idev, in mld_ifc_timer_expire()
2476 unsolicited_report_interval(idev)); in mld_ifc_timer_expire()
2478 in6_dev_put(idev); in mld_ifc_timer_expire()
2481 static void mld_ifc_event(struct inet6_dev *idev) in mld_ifc_event() argument
2483 if (mld_in_v1_mode(idev)) in mld_ifc_event()
2485 idev->mc_ifc_count = idev->mc_qrv; in mld_ifc_event()
2486 mld_ifc_start_timer(idev, 1); in mld_ifc_event()
2493 if (mld_in_v1_mode(ma->idev)) in igmp6_timer_handler()
2494 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); in igmp6_timer_handler()
2496 mld_send_report(ma->idev, ma); in igmp6_timer_handler()
2507 void ipv6_mc_unmap(struct inet6_dev *idev) in ipv6_mc_unmap() argument
2513 read_lock_bh(&idev->lock); in ipv6_mc_unmap()
2514 for (i = idev->mc_list; i; i = i->next) in ipv6_mc_unmap()
2516 read_unlock_bh(&idev->lock); in ipv6_mc_unmap()
2519 void ipv6_mc_remap(struct inet6_dev *idev) in ipv6_mc_remap() argument
2521 ipv6_mc_up(idev); in ipv6_mc_remap()
2526 void ipv6_mc_down(struct inet6_dev *idev) in ipv6_mc_down() argument
2532 read_lock_bh(&idev->lock); in ipv6_mc_down()
2534 for (i = idev->mc_list; i; i = i->next) in ipv6_mc_down()
2540 mld_ifc_stop_timer(idev); in ipv6_mc_down()
2541 mld_gq_stop_timer(idev); in ipv6_mc_down()
2542 mld_dad_stop_timer(idev); in ipv6_mc_down()
2543 read_unlock_bh(&idev->lock); in ipv6_mc_down()
2546 static void ipv6_mc_reset(struct inet6_dev *idev) in ipv6_mc_reset() argument
2548 idev->mc_qrv = sysctl_mld_qrv; in ipv6_mc_reset()
2549 idev->mc_qi = MLD_QI_DEFAULT; in ipv6_mc_reset()
2550 idev->mc_qri = MLD_QRI_DEFAULT; in ipv6_mc_reset()
2551 idev->mc_v1_seen = 0; in ipv6_mc_reset()
2552 idev->mc_maxdelay = unsolicited_report_interval(idev); in ipv6_mc_reset()
2557 void ipv6_mc_up(struct inet6_dev *idev) in ipv6_mc_up() argument
2563 read_lock_bh(&idev->lock); in ipv6_mc_up()
2564 ipv6_mc_reset(idev); in ipv6_mc_up()
2565 for (i = idev->mc_list; i; i = i->next) { in ipv6_mc_up()
2566 mld_del_delrec(idev, i); in ipv6_mc_up()
2569 read_unlock_bh(&idev->lock); in ipv6_mc_up()
2574 void ipv6_mc_init_dev(struct inet6_dev *idev) in ipv6_mc_init_dev() argument
2576 write_lock_bh(&idev->lock); in ipv6_mc_init_dev()
2577 spin_lock_init(&idev->mc_lock); in ipv6_mc_init_dev()
2578 idev->mc_gq_running = 0; in ipv6_mc_init_dev()
2579 timer_setup(&idev->mc_gq_timer, mld_gq_timer_expire, 0); in ipv6_mc_init_dev()
2580 idev->mc_tomb = NULL; in ipv6_mc_init_dev()
2581 idev->mc_ifc_count = 0; in ipv6_mc_init_dev()
2582 timer_setup(&idev->mc_ifc_timer, mld_ifc_timer_expire, 0); in ipv6_mc_init_dev()
2583 timer_setup(&idev->mc_dad_timer, mld_dad_timer_expire, 0); in ipv6_mc_init_dev()
2584 ipv6_mc_reset(idev); in ipv6_mc_init_dev()
2585 write_unlock_bh(&idev->lock); in ipv6_mc_init_dev()
2592 void ipv6_mc_destroy_dev(struct inet6_dev *idev) in ipv6_mc_destroy_dev() argument
2597 ipv6_mc_down(idev); in ipv6_mc_destroy_dev()
2598 mld_clear_delrec(idev); in ipv6_mc_destroy_dev()
2605 __ipv6_dev_mc_dec(idev, &in6addr_linklocal_allnodes); in ipv6_mc_destroy_dev()
2607 if (idev->cnf.forwarding) in ipv6_mc_destroy_dev()
2608 __ipv6_dev_mc_dec(idev, &in6addr_linklocal_allrouters); in ipv6_mc_destroy_dev()
2610 write_lock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2611 while ((i = idev->mc_list) != NULL) { in ipv6_mc_destroy_dev()
2612 idev->mc_list = i->next; in ipv6_mc_destroy_dev()
2614 write_unlock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2617 write_lock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2619 write_unlock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2622 static void ipv6_mc_rejoin_groups(struct inet6_dev *idev) in ipv6_mc_rejoin_groups() argument
2628 if (mld_in_v1_mode(idev)) { in ipv6_mc_rejoin_groups()
2629 read_lock_bh(&idev->lock); in ipv6_mc_rejoin_groups()
2630 for (pmc = idev->mc_list; pmc; pmc = pmc->next) in ipv6_mc_rejoin_groups()
2632 read_unlock_bh(&idev->lock); in ipv6_mc_rejoin_groups()
2634 mld_send_report(idev, NULL); in ipv6_mc_rejoin_groups()
2642 struct inet6_dev *idev = __in6_dev_get(dev); in ipv6_mc_netdev_event() local
2646 if (idev) in ipv6_mc_netdev_event()
2647 ipv6_mc_rejoin_groups(idev); in ipv6_mc_netdev_event()
2664 struct inet6_dev *idev; member
2675 state->idev = NULL; in igmp6_mc_get_first()
2677 struct inet6_dev *idev; in igmp6_mc_get_first() local
2678 idev = __in6_dev_get(state->dev); in igmp6_mc_get_first()
2679 if (!idev) in igmp6_mc_get_first()
2681 read_lock_bh(&idev->lock); in igmp6_mc_get_first()
2682 im = idev->mc_list; in igmp6_mc_get_first()
2684 state->idev = idev; in igmp6_mc_get_first()
2687 read_unlock_bh(&idev->lock); in igmp6_mc_get_first()
2698 if (likely(state->idev)) in igmp6_mc_get_next()
2699 read_unlock_bh(&state->idev->lock); in igmp6_mc_get_next()
2703 state->idev = NULL; in igmp6_mc_get_next()
2706 state->idev = __in6_dev_get(state->dev); in igmp6_mc_get_next()
2707 if (!state->idev) in igmp6_mc_get_next()
2709 read_lock_bh(&state->idev->lock); in igmp6_mc_get_next()
2710 im = state->idev->mc_list; in igmp6_mc_get_next()
2744 if (likely(state->idev)) { in igmp6_mc_seq_stop()
2745 read_unlock_bh(&state->idev->lock); in igmp6_mc_seq_stop()
2746 state->idev = NULL; in igmp6_mc_seq_stop()
2777 struct inet6_dev *idev; member
2790 state->idev = NULL; in igmp6_mcf_get_first()
2793 struct inet6_dev *idev; in igmp6_mcf_get_first() local
2794 idev = __in6_dev_get(state->dev); in igmp6_mcf_get_first()
2795 if (unlikely(idev == NULL)) in igmp6_mcf_get_first()
2797 read_lock_bh(&idev->lock); in igmp6_mcf_get_first()
2798 im = idev->mc_list; in igmp6_mcf_get_first()
2804 state->idev = idev; in igmp6_mcf_get_first()
2809 read_unlock_bh(&idev->lock); in igmp6_mcf_get_first()
2823 if (likely(state->idev)) in igmp6_mcf_get_next()
2824 read_unlock_bh(&state->idev->lock); in igmp6_mcf_get_next()
2828 state->idev = NULL; in igmp6_mcf_get_next()
2831 state->idev = __in6_dev_get(state->dev); in igmp6_mcf_get_next()
2832 if (!state->idev) in igmp6_mcf_get_next()
2834 read_lock_bh(&state->idev->lock); in igmp6_mcf_get_next()
2835 state->im = state->idev->mc_list; in igmp6_mcf_get_next()
2881 if (likely(state->idev)) { in igmp6_mcf_seq_stop()
2882 read_unlock_bh(&state->idev->lock); in igmp6_mcf_seq_stop()
2883 state->idev = NULL; in igmp6_mcf_seq_stop()