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()
1615 if (__ipv6_get_lladdr(idev, &addr_buf, IFA_F_TENTATIVE)) { in mld_newpack()
1645 struct inet6_dev *idev; in mld_sendpack() local
1652 idev = __in6_dev_get(skb->dev); in mld_sendpack()
1653 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); in mld_sendpack()
1684 ICMP6MSGOUT_INC_STATS(net, idev, ICMPV6_MLD2_REPORT); in mld_sendpack()
1685 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS); in mld_sendpack()
1687 IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); in mld_sendpack()
1710 skb = mld_newpack(pmc->idev, mtu); in add_grhead()
1730 struct inet6_dev *idev = pmc->idev; in add_grec() local
1731 struct net_device *dev = idev->dev; in add_grec()
1765 skb = mld_newpack(idev, mtu); in add_grec()
1801 skb = mld_newpack(idev, mtu); in add_grec()
1852 static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc) in mld_send_report() argument
1857 read_lock_bh(&idev->lock); in mld_send_report()
1859 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_report()
1879 read_unlock_bh(&idev->lock); in mld_send_report()
1905 static void mld_send_cr(struct inet6_dev *idev) in mld_send_cr() argument
1911 read_lock_bh(&idev->lock); in mld_send_cr()
1912 spin_lock(&idev->mc_lock); in mld_send_cr()
1916 for (pmc = idev->mc_tomb; pmc; pmc = pmc_next) { in mld_send_cr()
1940 idev->mc_tomb = pmc_next; in mld_send_cr()
1941 in6_dev_put(pmc->idev); in mld_send_cr()
1946 spin_unlock(&idev->mc_lock); in mld_send_cr()
1949 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_cr()
1972 read_unlock_bh(&idev->lock); in mld_send_cr()
1982 struct inet6_dev *idev; in igmp6_send() local
2044 idev = __in6_dev_get(skb->dev); in igmp6_send()
2061 ICMP6MSGOUT_INC_STATS(net, idev, type); in igmp6_send()
2062 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS); in igmp6_send()
2064 IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); in igmp6_send()
2074 static void mld_send_initial_cr(struct inet6_dev *idev) in mld_send_initial_cr() argument
2080 if (mld_in_v1_mode(idev)) in mld_send_initial_cr()
2084 read_lock_bh(&idev->lock); in mld_send_initial_cr()
2085 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_initial_cr()
2094 read_unlock_bh(&idev->lock); in mld_send_initial_cr()
2099 void ipv6_mc_dad_complete(struct inet6_dev *idev) in ipv6_mc_dad_complete() argument
2101 idev->mc_dad_count = idev->mc_qrv; in ipv6_mc_dad_complete()
2102 if (idev->mc_dad_count) { in ipv6_mc_dad_complete()
2103 mld_send_initial_cr(idev); in ipv6_mc_dad_complete()
2104 idev->mc_dad_count--; in ipv6_mc_dad_complete()
2105 if (idev->mc_dad_count) in ipv6_mc_dad_complete()
2106 mld_dad_start_timer(idev, in ipv6_mc_dad_complete()
2107 unsolicited_report_interval(idev)); in ipv6_mc_dad_complete()
2113 struct inet6_dev *idev = from_timer(idev, t, mc_dad_timer); in mld_dad_timer_expire() local
2115 mld_send_initial_cr(idev); in mld_dad_timer_expire()
2116 if (idev->mc_dad_count) { in mld_dad_timer_expire()
2117 idev->mc_dad_count--; in mld_dad_timer_expire()
2118 if (idev->mc_dad_count) in mld_dad_timer_expire()
2119 mld_dad_start_timer(idev, in mld_dad_timer_expire()
2120 unsolicited_report_interval(idev)); in mld_dad_timer_expire()
2122 in6_dev_put(idev); in mld_dad_timer_expire()
2143 struct inet6_dev *idev = pmc->idev; in ip6_mc_del1_src() local
2151 !mld_in_v1_mode(idev)) { in ip6_mc_del1_src()
2152 psf->sf_crcount = idev->mc_qrv; in ip6_mc_del1_src()
2162 static int ip6_mc_del_src(struct inet6_dev *idev, const struct in6_addr *pmca, in ip6_mc_del_src() argument
2170 if (!idev) in ip6_mc_del_src()
2172 read_lock_bh(&idev->lock); in ip6_mc_del_src()
2173 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in ip6_mc_del_src()
2179 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2187 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2207 pmc->mca_crcount = idev->mc_qrv; in ip6_mc_del_src()
2208 idev->mc_ifc_count = pmc->mca_crcount; in ip6_mc_del_src()
2211 mld_ifc_event(pmc->idev); in ip6_mc_del_src()
2213 mld_ifc_event(pmc->idev); in ip6_mc_del_src()
2215 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2266 int qrv = pmc->idev->mc_qrv; in sf_setstate()
2326 static int ip6_mc_add_src(struct inet6_dev *idev, const struct in6_addr *pmca, in ip6_mc_add_src() argument
2334 if (!idev) in ip6_mc_add_src()
2336 read_lock_bh(&idev->lock); in ip6_mc_add_src()
2337 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in ip6_mc_add_src()
2343 read_unlock_bh(&idev->lock); in ip6_mc_add_src()
2375 pmc->mca_crcount = idev->mc_qrv; in ip6_mc_add_src()
2376 idev->mc_ifc_count = pmc->mca_crcount; in ip6_mc_add_src()
2379 mld_ifc_event(idev); in ip6_mc_add_src()
2381 mld_ifc_event(idev); in ip6_mc_add_src()
2383 read_unlock_bh(&idev->lock); in ip6_mc_add_src()
2414 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); in igmp6_join_group()
2416 delay = prandom_u32() % unsolicited_report_interval(ma->idev); in igmp6_join_group()
2431 struct inet6_dev *idev) in ip6_mc_leave_src() argument
2438 err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode, 0, NULL, 0); in ip6_mc_leave_src()
2440 err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode, in ip6_mc_leave_src()
2451 if (mld_in_v1_mode(ma->idev)) { in igmp6_leave_group()
2453 igmp6_send(&ma->mca_addr, ma->idev->dev, in igmp6_leave_group()
2456 mld_add_delrec(ma->idev, ma); in igmp6_leave_group()
2457 mld_ifc_event(ma->idev); in igmp6_leave_group()
2463 struct inet6_dev *idev = from_timer(idev, t, mc_gq_timer); in mld_gq_timer_expire() local
2465 idev->mc_gq_running = 0; in mld_gq_timer_expire()
2466 mld_send_report(idev, NULL); in mld_gq_timer_expire()
2467 in6_dev_put(idev); in mld_gq_timer_expire()
2472 struct inet6_dev *idev = from_timer(idev, t, mc_ifc_timer); in mld_ifc_timer_expire() local
2474 mld_send_cr(idev); in mld_ifc_timer_expire()
2475 if (idev->mc_ifc_count) { in mld_ifc_timer_expire()
2476 idev->mc_ifc_count--; in mld_ifc_timer_expire()
2477 if (idev->mc_ifc_count) in mld_ifc_timer_expire()
2478 mld_ifc_start_timer(idev, in mld_ifc_timer_expire()
2479 unsolicited_report_interval(idev)); in mld_ifc_timer_expire()
2481 in6_dev_put(idev); in mld_ifc_timer_expire()
2484 static void mld_ifc_event(struct inet6_dev *idev) in mld_ifc_event() argument
2486 if (mld_in_v1_mode(idev)) in mld_ifc_event()
2488 idev->mc_ifc_count = idev->mc_qrv; in mld_ifc_event()
2489 mld_ifc_start_timer(idev, 1); in mld_ifc_event()
2496 if (mld_in_v1_mode(ma->idev)) in igmp6_timer_handler()
2497 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); in igmp6_timer_handler()
2499 mld_send_report(ma->idev, ma); in igmp6_timer_handler()
2510 void ipv6_mc_unmap(struct inet6_dev *idev) in ipv6_mc_unmap() argument
2516 read_lock_bh(&idev->lock); in ipv6_mc_unmap()
2517 for (i = idev->mc_list; i; i = i->next) in ipv6_mc_unmap()
2519 read_unlock_bh(&idev->lock); in ipv6_mc_unmap()
2522 void ipv6_mc_remap(struct inet6_dev *idev) in ipv6_mc_remap() argument
2524 ipv6_mc_up(idev); in ipv6_mc_remap()
2529 void ipv6_mc_down(struct inet6_dev *idev) in ipv6_mc_down() argument
2535 read_lock_bh(&idev->lock); in ipv6_mc_down()
2537 for (i = idev->mc_list; i; i = i->next) in ipv6_mc_down()
2543 mld_ifc_stop_timer(idev); in ipv6_mc_down()
2544 mld_gq_stop_timer(idev); in ipv6_mc_down()
2545 mld_dad_stop_timer(idev); in ipv6_mc_down()
2546 read_unlock_bh(&idev->lock); in ipv6_mc_down()
2549 static void ipv6_mc_reset(struct inet6_dev *idev) in ipv6_mc_reset() argument
2551 idev->mc_qrv = sysctl_mld_qrv; in ipv6_mc_reset()
2552 idev->mc_qi = MLD_QI_DEFAULT; in ipv6_mc_reset()
2553 idev->mc_qri = MLD_QRI_DEFAULT; in ipv6_mc_reset()
2554 idev->mc_v1_seen = 0; in ipv6_mc_reset()
2555 idev->mc_maxdelay = unsolicited_report_interval(idev); in ipv6_mc_reset()
2560 void ipv6_mc_up(struct inet6_dev *idev) in ipv6_mc_up() argument
2566 read_lock_bh(&idev->lock); in ipv6_mc_up()
2567 ipv6_mc_reset(idev); in ipv6_mc_up()
2568 for (i = idev->mc_list; i; i = i->next) { in ipv6_mc_up()
2569 mld_del_delrec(idev, i); in ipv6_mc_up()
2572 read_unlock_bh(&idev->lock); in ipv6_mc_up()
2577 void ipv6_mc_init_dev(struct inet6_dev *idev) in ipv6_mc_init_dev() argument
2579 write_lock_bh(&idev->lock); in ipv6_mc_init_dev()
2580 spin_lock_init(&idev->mc_lock); in ipv6_mc_init_dev()
2581 idev->mc_gq_running = 0; in ipv6_mc_init_dev()
2582 timer_setup(&idev->mc_gq_timer, mld_gq_timer_expire, 0); in ipv6_mc_init_dev()
2583 idev->mc_tomb = NULL; in ipv6_mc_init_dev()
2584 idev->mc_ifc_count = 0; in ipv6_mc_init_dev()
2585 timer_setup(&idev->mc_ifc_timer, mld_ifc_timer_expire, 0); in ipv6_mc_init_dev()
2586 timer_setup(&idev->mc_dad_timer, mld_dad_timer_expire, 0); in ipv6_mc_init_dev()
2587 ipv6_mc_reset(idev); in ipv6_mc_init_dev()
2588 write_unlock_bh(&idev->lock); in ipv6_mc_init_dev()
2595 void ipv6_mc_destroy_dev(struct inet6_dev *idev) in ipv6_mc_destroy_dev() argument
2600 ipv6_mc_down(idev); in ipv6_mc_destroy_dev()
2601 mld_clear_delrec(idev); in ipv6_mc_destroy_dev()
2608 __ipv6_dev_mc_dec(idev, &in6addr_linklocal_allnodes); in ipv6_mc_destroy_dev()
2610 if (idev->cnf.forwarding) in ipv6_mc_destroy_dev()
2611 __ipv6_dev_mc_dec(idev, &in6addr_linklocal_allrouters); in ipv6_mc_destroy_dev()
2613 write_lock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2614 while ((i = idev->mc_list) != NULL) { in ipv6_mc_destroy_dev()
2615 idev->mc_list = i->next; in ipv6_mc_destroy_dev()
2617 write_unlock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2620 write_lock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2622 write_unlock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2625 static void ipv6_mc_rejoin_groups(struct inet6_dev *idev) in ipv6_mc_rejoin_groups() argument
2631 if (mld_in_v1_mode(idev)) { in ipv6_mc_rejoin_groups()
2632 read_lock_bh(&idev->lock); in ipv6_mc_rejoin_groups()
2633 for (pmc = idev->mc_list; pmc; pmc = pmc->next) in ipv6_mc_rejoin_groups()
2635 read_unlock_bh(&idev->lock); in ipv6_mc_rejoin_groups()
2637 mld_send_report(idev, NULL); in ipv6_mc_rejoin_groups()
2645 struct inet6_dev *idev = __in6_dev_get(dev); in ipv6_mc_netdev_event() local
2649 if (idev) in ipv6_mc_netdev_event()
2650 ipv6_mc_rejoin_groups(idev); in ipv6_mc_netdev_event()
2667 struct inet6_dev *idev; member
2678 state->idev = NULL; in igmp6_mc_get_first()
2680 struct inet6_dev *idev; in igmp6_mc_get_first() local
2681 idev = __in6_dev_get(state->dev); in igmp6_mc_get_first()
2682 if (!idev) in igmp6_mc_get_first()
2684 read_lock_bh(&idev->lock); in igmp6_mc_get_first()
2685 im = idev->mc_list; in igmp6_mc_get_first()
2687 state->idev = idev; in igmp6_mc_get_first()
2690 read_unlock_bh(&idev->lock); in igmp6_mc_get_first()
2701 if (likely(state->idev)) in igmp6_mc_get_next()
2702 read_unlock_bh(&state->idev->lock); in igmp6_mc_get_next()
2706 state->idev = NULL; in igmp6_mc_get_next()
2709 state->idev = __in6_dev_get(state->dev); in igmp6_mc_get_next()
2710 if (!state->idev) in igmp6_mc_get_next()
2712 read_lock_bh(&state->idev->lock); in igmp6_mc_get_next()
2713 im = state->idev->mc_list; in igmp6_mc_get_next()
2747 if (likely(state->idev)) { in igmp6_mc_seq_stop()
2748 read_unlock_bh(&state->idev->lock); in igmp6_mc_seq_stop()
2749 state->idev = NULL; in igmp6_mc_seq_stop()
2780 struct inet6_dev *idev; member
2793 state->idev = NULL; in igmp6_mcf_get_first()
2796 struct inet6_dev *idev; in igmp6_mcf_get_first() local
2797 idev = __in6_dev_get(state->dev); in igmp6_mcf_get_first()
2798 if (unlikely(idev == NULL)) in igmp6_mcf_get_first()
2800 read_lock_bh(&idev->lock); in igmp6_mcf_get_first()
2801 im = idev->mc_list; in igmp6_mcf_get_first()
2807 state->idev = idev; in igmp6_mcf_get_first()
2812 read_unlock_bh(&idev->lock); in igmp6_mcf_get_first()
2826 if (likely(state->idev)) in igmp6_mcf_get_next()
2827 read_unlock_bh(&state->idev->lock); in igmp6_mcf_get_next()
2831 state->idev = NULL; in igmp6_mcf_get_next()
2834 state->idev = __in6_dev_get(state->dev); in igmp6_mcf_get_next()
2835 if (!state->idev) in igmp6_mcf_get_next()
2837 read_lock_bh(&state->idev->lock); in igmp6_mcf_get_next()
2838 state->im = state->idev->mc_list; in igmp6_mcf_get_next()
2884 if (likely(state->idev)) { in igmp6_mcf_seq_stop()
2885 read_unlock_bh(&state->idev->lock); in igmp6_mcf_seq_stop()
2886 state->idev = NULL; in igmp6_mcf_seq_stop()