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, const struct in6_addr *addr);
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);
123 static int unsolicited_report_interval(struct inet6_dev *idev) in unsolicited_report_interval() argument
127 if (mld_in_v1_mode(idev)) in unsolicited_report_interval()
128 iv = idev->cnf.mldv1_unsolicited_report_interval; in unsolicited_report_interval()
130 iv = idev->cnf.mldv2_unsolicited_report_interval; in unsolicited_report_interval()
230 struct inet6_dev *idev = __in6_dev_get(dev); in ipv6_sock_mc_drop() local
232 (void) ip6_mc_leave_src(sk, mc_lst, idev); in ipv6_sock_mc_drop()
233 if (idev) in ipv6_sock_mc_drop()
234 __ipv6_dev_mc_dec(idev, &mc_lst->addr); in ipv6_sock_mc_drop()
254 struct inet6_dev *idev = NULL; in ip6_mc_find_dev_rcu() local
268 idev = __in6_dev_get(dev); in ip6_mc_find_dev_rcu()
269 if (!idev) in ip6_mc_find_dev_rcu()
271 read_lock_bh(&idev->lock); in ip6_mc_find_dev_rcu()
272 if (idev->dead) { in ip6_mc_find_dev_rcu()
273 read_unlock_bh(&idev->lock); in ip6_mc_find_dev_rcu()
276 return idev; in ip6_mc_find_dev_rcu()
296 struct inet6_dev *idev = __in6_dev_get(dev); in ipv6_sock_mc_close() local
298 (void) ip6_mc_leave_src(sk, mc_lst, idev); in ipv6_sock_mc_close()
299 if (idev) in ipv6_sock_mc_close()
300 __ipv6_dev_mc_dec(idev, &mc_lst->addr); in ipv6_sock_mc_close()
316 struct inet6_dev *idev; in ip6_mc_source() local
332 idev = ip6_mc_find_dev_rcu(net, group, pgsr->gsr_interface); in ip6_mc_source()
333 if (!idev) { in ip6_mc_source()
358 ip6_mc_add_src(idev, group, omode, 0, NULL, 0); in ip6_mc_source()
359 ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0); in ip6_mc_source()
386 ip6_mc_del_src(idev, group, omode, 1, source, 1); in ip6_mc_source()
432 ip6_mc_add_src(idev, group, omode, 1, source, 1); in ip6_mc_source()
436 read_unlock_bh(&idev->lock); in ip6_mc_source()
447 struct inet6_dev *idev; in ip6_mc_msfilter() local
463 idev = ip6_mc_find_dev_rcu(net, group, gsf->gf_interface); in ip6_mc_msfilter()
465 if (!idev) { in ip6_mc_msfilter()
501 err = ip6_mc_add_src(idev, group, gsf->gf_fmode, in ip6_mc_msfilter()
509 (void) ip6_mc_add_src(idev, group, gsf->gf_fmode, 0, NULL, 0); in ip6_mc_msfilter()
515 (void) ip6_mc_del_src(idev, group, pmc->sfmode, in ip6_mc_msfilter()
519 (void) ip6_mc_del_src(idev, group, pmc->sfmode, 0, NULL, 0); in ip6_mc_msfilter()
525 read_unlock_bh(&idev->lock); in ip6_mc_msfilter()
538 struct inet6_dev *idev; in ip6_mc_msfget() local
549 idev = ip6_mc_find_dev_rcu(net, group, gsf->gf_interface); in ip6_mc_msfget()
551 if (!idev) { in ip6_mc_msfget()
573 read_unlock_bh(&idev->lock); in ip6_mc_msfget()
598 read_unlock_bh(&idev->lock); in ip6_mc_msfget()
644 struct net_device *dev = mc->idev->dev; in igmp6_group_added()
662 if (mld_in_v1_mode(mc->idev)) { in igmp6_group_added()
668 mc->mca_crcount = mc->idev->mc_qrv; in igmp6_group_added()
669 mld_ifc_event(mc->idev); in igmp6_group_added()
674 struct net_device *dev = mc->idev->dev; in igmp6_group_dropped()
692 if (!mc->idev->dead) in igmp6_group_dropped()
706 static void mld_add_delrec(struct inet6_dev *idev, struct ifmcaddr6 *im) in mld_add_delrec() argument
722 pmc->idev = im->idev; in mld_add_delrec()
723 in6_dev_hold(idev); in mld_add_delrec()
725 pmc->mca_crcount = idev->mc_qrv; in mld_add_delrec()
738 spin_lock_bh(&idev->mc_lock); in mld_add_delrec()
739 pmc->next = idev->mc_tomb; in mld_add_delrec()
740 idev->mc_tomb = pmc; in mld_add_delrec()
741 spin_unlock_bh(&idev->mc_lock); in mld_add_delrec()
744 static void mld_del_delrec(struct inet6_dev *idev, const struct in6_addr *pmca) in mld_del_delrec() argument
749 spin_lock_bh(&idev->mc_lock); in mld_del_delrec()
751 for (pmc = idev->mc_tomb; pmc; pmc = pmc->next) { in mld_del_delrec()
760 idev->mc_tomb = pmc->next; in mld_del_delrec()
762 spin_unlock_bh(&idev->mc_lock); in mld_del_delrec()
769 in6_dev_put(pmc->idev); in mld_del_delrec()
774 static void mld_clear_delrec(struct inet6_dev *idev) in mld_clear_delrec() argument
778 spin_lock_bh(&idev->mc_lock); in mld_clear_delrec()
779 pmc = idev->mc_tomb; in mld_clear_delrec()
780 idev->mc_tomb = NULL; in mld_clear_delrec()
781 spin_unlock_bh(&idev->mc_lock); in mld_clear_delrec()
786 in6_dev_put(pmc->idev); in mld_clear_delrec()
791 read_lock_bh(&idev->lock); in mld_clear_delrec()
792 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_clear_delrec()
804 read_unlock_bh(&idev->lock); in mld_clear_delrec()
815 in6_dev_put(mc->idev); in ma_put()
820 static struct ifmcaddr6 *mca_alloc(struct inet6_dev *idev, in mca_alloc() argument
832 mc->idev = idev; /* reference taken by caller */ in mca_alloc()
856 struct inet6_dev *idev; in ipv6_dev_mc_inc() local
861 idev = in6_dev_get(dev); in ipv6_dev_mc_inc()
863 if (!idev) in ipv6_dev_mc_inc()
866 write_lock_bh(&idev->lock); in ipv6_dev_mc_inc()
867 if (idev->dead) { in ipv6_dev_mc_inc()
868 write_unlock_bh(&idev->lock); in ipv6_dev_mc_inc()
869 in6_dev_put(idev); in ipv6_dev_mc_inc()
873 for (mc = idev->mc_list; mc; mc = mc->next) { in ipv6_dev_mc_inc()
876 write_unlock_bh(&idev->lock); in ipv6_dev_mc_inc()
877 ip6_mc_add_src(idev, &mc->mca_addr, MCAST_EXCLUDE, 0, in ipv6_dev_mc_inc()
879 in6_dev_put(idev); in ipv6_dev_mc_inc()
884 mc = mca_alloc(idev, addr); in ipv6_dev_mc_inc()
886 write_unlock_bh(&idev->lock); in ipv6_dev_mc_inc()
887 in6_dev_put(idev); in ipv6_dev_mc_inc()
891 mc->next = idev->mc_list; in ipv6_dev_mc_inc()
892 idev->mc_list = mc; in ipv6_dev_mc_inc()
898 write_unlock_bh(&idev->lock); in ipv6_dev_mc_inc()
900 mld_del_delrec(idev, &mc->mca_addr); in ipv6_dev_mc_inc()
909 int __ipv6_dev_mc_dec(struct inet6_dev *idev, const struct in6_addr *addr) in __ipv6_dev_mc_dec() argument
915 write_lock_bh(&idev->lock); in __ipv6_dev_mc_dec()
916 for (map = &idev->mc_list; (ma = *map) != NULL; map = &ma->next) { in __ipv6_dev_mc_dec()
920 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_dec()
927 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_dec()
931 write_unlock_bh(&idev->lock); in __ipv6_dev_mc_dec()
938 struct inet6_dev *idev; in ipv6_dev_mc_dec() local
943 idev = __in6_dev_get(dev); in ipv6_dev_mc_dec()
944 if (!idev) in ipv6_dev_mc_dec()
947 err = __ipv6_dev_mc_dec(idev, addr); in ipv6_dev_mc_dec()
958 struct inet6_dev *idev; in ipv6_chk_mcast_addr() local
963 idev = __in6_dev_get(dev); in ipv6_chk_mcast_addr()
964 if (idev) { in ipv6_chk_mcast_addr()
965 read_lock_bh(&idev->lock); in ipv6_chk_mcast_addr()
966 for (mc = idev->mc_list; mc; mc = mc->next) { in ipv6_chk_mcast_addr()
989 read_unlock_bh(&idev->lock); in ipv6_chk_mcast_addr()
995 static void mld_gq_start_timer(struct inet6_dev *idev) in mld_gq_start_timer() argument
997 unsigned long tv = prandom_u32() % idev->mc_maxdelay; in mld_gq_start_timer()
999 idev->mc_gq_running = 1; in mld_gq_start_timer()
1000 if (!mod_timer(&idev->mc_gq_timer, jiffies+tv+2)) in mld_gq_start_timer()
1001 in6_dev_hold(idev); in mld_gq_start_timer()
1004 static void mld_gq_stop_timer(struct inet6_dev *idev) in mld_gq_stop_timer() argument
1006 idev->mc_gq_running = 0; in mld_gq_stop_timer()
1007 if (del_timer(&idev->mc_gq_timer)) in mld_gq_stop_timer()
1008 __in6_dev_put(idev); in mld_gq_stop_timer()
1011 static void mld_ifc_start_timer(struct inet6_dev *idev, unsigned long delay) in mld_ifc_start_timer() argument
1015 if (!mod_timer(&idev->mc_ifc_timer, jiffies+tv+2)) in mld_ifc_start_timer()
1016 in6_dev_hold(idev); in mld_ifc_start_timer()
1019 static void mld_ifc_stop_timer(struct inet6_dev *idev) in mld_ifc_stop_timer() argument
1021 idev->mc_ifc_count = 0; in mld_ifc_stop_timer()
1022 if (del_timer(&idev->mc_ifc_timer)) in mld_ifc_stop_timer()
1023 __in6_dev_put(idev); in mld_ifc_stop_timer()
1026 static void mld_dad_start_timer(struct inet6_dev *idev, unsigned long delay) in mld_dad_start_timer() argument
1030 if (!mod_timer(&idev->mc_dad_timer, jiffies+tv+2)) in mld_dad_start_timer()
1031 in6_dev_hold(idev); in mld_dad_start_timer()
1034 static void mld_dad_stop_timer(struct inet6_dev *idev) in mld_dad_stop_timer() argument
1036 if (del_timer(&idev->mc_dad_timer)) in mld_dad_stop_timer()
1037 __in6_dev_put(idev); in mld_dad_stop_timer()
1127 static int mld_force_mld_version(const struct inet6_dev *idev) in mld_force_mld_version() argument
1134 if (dev_net(idev->dev)->ipv6.devconf_all->force_mld_version != 0) in mld_force_mld_version()
1135 return dev_net(idev->dev)->ipv6.devconf_all->force_mld_version; in mld_force_mld_version()
1137 return idev->cnf.force_mld_version; in mld_force_mld_version()
1140 static bool mld_in_v2_mode_only(const struct inet6_dev *idev) in mld_in_v2_mode_only() argument
1142 return mld_force_mld_version(idev) == 2; in mld_in_v2_mode_only()
1145 static bool mld_in_v1_mode_only(const struct inet6_dev *idev) in mld_in_v1_mode_only() argument
1147 return mld_force_mld_version(idev) == 1; in mld_in_v1_mode_only()
1150 static bool mld_in_v1_mode(const struct inet6_dev *idev) in mld_in_v1_mode() argument
1152 if (mld_in_v2_mode_only(idev)) in mld_in_v1_mode()
1154 if (mld_in_v1_mode_only(idev)) in mld_in_v1_mode()
1156 if (idev->mc_v1_seen && time_before(jiffies, idev->mc_v1_seen)) in mld_in_v1_mode()
1162 static void mld_set_v1_mode(struct inet6_dev *idev) in mld_set_v1_mode() argument
1172 switchback = (idev->mc_qrv * idev->mc_qi) + idev->mc_qri; in mld_set_v1_mode()
1174 idev->mc_v1_seen = jiffies + switchback; in mld_set_v1_mode()
1177 static void mld_update_qrv(struct inet6_dev *idev, in mld_update_qrv() argument
1190 WARN_ON(idev->mc_qrv == 0); in mld_update_qrv()
1193 idev->mc_qrv = mlh2->mld2q_qrv; in mld_update_qrv()
1195 if (unlikely(idev->mc_qrv < min_qrv)) { in mld_update_qrv()
1197 idev->mc_qrv, min_qrv); in mld_update_qrv()
1198 idev->mc_qrv = min_qrv; in mld_update_qrv()
1202 static void mld_update_qi(struct inet6_dev *idev, in mld_update_qi() argument
1224 idev->mc_qi = mc_qqi * HZ; in mld_update_qi()
1227 static void mld_update_qri(struct inet6_dev *idev, in mld_update_qri() argument
1234 idev->mc_qri = msecs_to_jiffies(mldv2_mrc(mlh2)); in mld_update_qri()
1237 static int mld_process_v1(struct inet6_dev *idev, struct mld_msg *mld, in mld_process_v1() argument
1243 if (mld_in_v2_mode_only(idev)) in mld_process_v1()
1271 mld_set_v1_mode(idev); in mld_process_v1()
1274 mld_gq_stop_timer(idev); in mld_process_v1()
1276 mld_ifc_stop_timer(idev); in mld_process_v1()
1278 mld_clear_delrec(idev); in mld_process_v1()
1283 static int mld_process_v2(struct inet6_dev *idev, struct mld2_query *mld, in mld_process_v2() argument
1288 mld_update_qrv(idev, mld); in mld_process_v2()
1289 mld_update_qi(idev, mld); in mld_process_v2()
1290 mld_update_qri(idev, mld); in mld_process_v2()
1292 idev->mc_maxdelay = *max_delay; in mld_process_v2()
1304 struct inet6_dev *idev; in igmp6_event_query() local
1330 idev = __in6_dev_get(skb->dev); in igmp6_event_query()
1331 if (!idev) in igmp6_event_query()
1344 } else if (len == MLD_V1_QUERY_LEN || mld_in_v1_mode(idev)) { in igmp6_event_query()
1345 err = mld_process_v1(idev, mld, &max_delay, in igmp6_event_query()
1358 err = mld_process_v2(idev, mlh2, &max_delay); in igmp6_event_query()
1366 mld_gq_start_timer(idev); in igmp6_event_query()
1382 read_lock_bh(&idev->lock); in igmp6_event_query()
1384 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_query()
1390 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_query()
1412 read_unlock_bh(&idev->lock); in igmp6_event_query()
1421 struct inet6_dev *idev; in igmp6_event_report() local
1445 idev = __in6_dev_get(skb->dev); in igmp6_event_report()
1446 if (!idev) in igmp6_event_report()
1453 read_lock_bh(&idev->lock); in igmp6_event_report()
1454 for (ma = idev->mc_list; ma; ma = ma->next) { in igmp6_event_report()
1464 read_unlock_bh(&idev->lock); in igmp6_event_report()
1551 static struct sk_buff *mld_newpack(struct inet6_dev *idev, unsigned int mtu) in mld_newpack() argument
1553 struct net_device *dev = idev->dev; in mld_newpack()
1581 if (__ipv6_get_lladdr(idev, &addr_buf, IFA_F_TENTATIVE)) { in mld_newpack()
1611 struct inet6_dev *idev; in mld_sendpack() local
1618 idev = __in6_dev_get(skb->dev); in mld_sendpack()
1619 IP6_UPD_PO_STATS(net, idev, IPSTATS_MIB_OUT, skb->len); in mld_sendpack()
1652 ICMP6MSGOUT_INC_STATS(net, idev, ICMPV6_MLD2_REPORT); in mld_sendpack()
1653 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS); in mld_sendpack()
1655 IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); in mld_sendpack()
1674 struct net_device *dev = pmc->idev->dev; in add_grhead()
1679 skb = mld_newpack(pmc->idev, dev->mtu); in add_grhead()
1698 struct inet6_dev *idev = pmc->idev; in add_grec() local
1699 struct net_device *dev = idev->dev; in add_grec()
1728 skb = mld_newpack(idev, dev->mtu); in add_grec()
1755 skb = mld_newpack(idev, dev->mtu); in add_grec()
1805 static void mld_send_report(struct inet6_dev *idev, struct ifmcaddr6 *pmc) in mld_send_report() argument
1810 read_lock_bh(&idev->lock); in mld_send_report()
1812 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_report()
1832 read_unlock_bh(&idev->lock); in mld_send_report()
1858 static void mld_send_cr(struct inet6_dev *idev) in mld_send_cr() argument
1864 read_lock_bh(&idev->lock); in mld_send_cr()
1865 spin_lock(&idev->mc_lock); in mld_send_cr()
1869 for (pmc = idev->mc_tomb; pmc; pmc = pmc_next) { in mld_send_cr()
1893 idev->mc_tomb = pmc_next; in mld_send_cr()
1894 in6_dev_put(pmc->idev); in mld_send_cr()
1899 spin_unlock(&idev->mc_lock); in mld_send_cr()
1902 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_cr()
1925 read_unlock_bh(&idev->lock); in mld_send_cr()
1935 struct inet6_dev *idev; in igmp6_send() local
1998 idev = __in6_dev_get(skb->dev); in igmp6_send()
2014 ICMP6MSGOUT_INC_STATS(net, idev, type); in igmp6_send()
2015 ICMP6_INC_STATS(net, idev, ICMP6_MIB_OUTMSGS); in igmp6_send()
2017 IP6_INC_STATS(net, idev, IPSTATS_MIB_OUTDISCARDS); in igmp6_send()
2027 static void mld_send_initial_cr(struct inet6_dev *idev) in mld_send_initial_cr() argument
2033 if (mld_in_v1_mode(idev)) in mld_send_initial_cr()
2037 read_lock_bh(&idev->lock); in mld_send_initial_cr()
2038 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in mld_send_initial_cr()
2047 read_unlock_bh(&idev->lock); in mld_send_initial_cr()
2052 void ipv6_mc_dad_complete(struct inet6_dev *idev) in ipv6_mc_dad_complete() argument
2054 idev->mc_dad_count = idev->mc_qrv; in ipv6_mc_dad_complete()
2055 if (idev->mc_dad_count) { in ipv6_mc_dad_complete()
2056 mld_send_initial_cr(idev); in ipv6_mc_dad_complete()
2057 idev->mc_dad_count--; in ipv6_mc_dad_complete()
2058 if (idev->mc_dad_count) in ipv6_mc_dad_complete()
2059 mld_dad_start_timer(idev, idev->mc_maxdelay); in ipv6_mc_dad_complete()
2065 struct inet6_dev *idev = (struct inet6_dev *)data; in mld_dad_timer_expire() local
2067 mld_send_initial_cr(idev); in mld_dad_timer_expire()
2068 if (idev->mc_dad_count) { in mld_dad_timer_expire()
2069 idev->mc_dad_count--; in mld_dad_timer_expire()
2070 if (idev->mc_dad_count) in mld_dad_timer_expire()
2071 mld_dad_start_timer(idev, idev->mc_maxdelay); in mld_dad_timer_expire()
2073 in6_dev_put(idev); in mld_dad_timer_expire()
2094 struct inet6_dev *idev = pmc->idev; in ip6_mc_del1_src() local
2102 !mld_in_v1_mode(idev)) { in ip6_mc_del1_src()
2103 psf->sf_crcount = idev->mc_qrv; in ip6_mc_del1_src()
2113 static int ip6_mc_del_src(struct inet6_dev *idev, const struct in6_addr *pmca, in ip6_mc_del_src() argument
2121 if (!idev) in ip6_mc_del_src()
2123 read_lock_bh(&idev->lock); in ip6_mc_del_src()
2124 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in ip6_mc_del_src()
2130 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2138 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2158 pmc->mca_crcount = idev->mc_qrv; in ip6_mc_del_src()
2159 idev->mc_ifc_count = pmc->mca_crcount; in ip6_mc_del_src()
2162 mld_ifc_event(pmc->idev); in ip6_mc_del_src()
2164 mld_ifc_event(pmc->idev); in ip6_mc_del_src()
2166 read_unlock_bh(&idev->lock); in ip6_mc_del_src()
2217 int qrv = pmc->idev->mc_qrv; in sf_setstate()
2277 static int ip6_mc_add_src(struct inet6_dev *idev, const struct in6_addr *pmca, in ip6_mc_add_src() argument
2285 if (!idev) in ip6_mc_add_src()
2287 read_lock_bh(&idev->lock); in ip6_mc_add_src()
2288 for (pmc = idev->mc_list; pmc; pmc = pmc->next) { in ip6_mc_add_src()
2294 read_unlock_bh(&idev->lock); in ip6_mc_add_src()
2326 pmc->mca_crcount = idev->mc_qrv; in ip6_mc_add_src()
2327 idev->mc_ifc_count = pmc->mca_crcount; in ip6_mc_add_src()
2330 mld_ifc_event(idev); in ip6_mc_add_src()
2332 mld_ifc_event(idev); in ip6_mc_add_src()
2334 read_unlock_bh(&idev->lock); in ip6_mc_add_src()
2365 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); in igmp6_join_group()
2367 delay = prandom_u32() % unsolicited_report_interval(ma->idev); in igmp6_join_group()
2382 struct inet6_dev *idev) in ip6_mc_leave_src() argument
2391 return ip6_mc_del_src(idev, &iml->addr, iml->sfmode, 0, NULL, 0); in ip6_mc_leave_src()
2393 err = ip6_mc_del_src(idev, &iml->addr, iml->sfmode, in ip6_mc_leave_src()
2402 if (mld_in_v1_mode(ma->idev)) { in igmp6_leave_group()
2404 igmp6_send(&ma->mca_addr, ma->idev->dev, in igmp6_leave_group()
2407 mld_add_delrec(ma->idev, ma); in igmp6_leave_group()
2408 mld_ifc_event(ma->idev); in igmp6_leave_group()
2414 struct inet6_dev *idev = (struct inet6_dev *)data; in mld_gq_timer_expire() local
2416 idev->mc_gq_running = 0; in mld_gq_timer_expire()
2417 mld_send_report(idev, NULL); in mld_gq_timer_expire()
2418 in6_dev_put(idev); in mld_gq_timer_expire()
2423 struct inet6_dev *idev = (struct inet6_dev *)data; in mld_ifc_timer_expire() local
2425 mld_send_cr(idev); in mld_ifc_timer_expire()
2426 if (idev->mc_ifc_count) { in mld_ifc_timer_expire()
2427 idev->mc_ifc_count--; in mld_ifc_timer_expire()
2428 if (idev->mc_ifc_count) in mld_ifc_timer_expire()
2429 mld_ifc_start_timer(idev, idev->mc_maxdelay); in mld_ifc_timer_expire()
2431 in6_dev_put(idev); in mld_ifc_timer_expire()
2434 static void mld_ifc_event(struct inet6_dev *idev) in mld_ifc_event() argument
2436 if (mld_in_v1_mode(idev)) in mld_ifc_event()
2438 idev->mc_ifc_count = idev->mc_qrv; in mld_ifc_event()
2439 mld_ifc_start_timer(idev, 1); in mld_ifc_event()
2447 if (mld_in_v1_mode(ma->idev)) in igmp6_timer_handler()
2448 igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT); in igmp6_timer_handler()
2450 mld_send_report(ma->idev, ma); in igmp6_timer_handler()
2461 void ipv6_mc_unmap(struct inet6_dev *idev) in ipv6_mc_unmap() argument
2467 read_lock_bh(&idev->lock); in ipv6_mc_unmap()
2468 for (i = idev->mc_list; i; i = i->next) in ipv6_mc_unmap()
2470 read_unlock_bh(&idev->lock); in ipv6_mc_unmap()
2473 void ipv6_mc_remap(struct inet6_dev *idev) in ipv6_mc_remap() argument
2475 ipv6_mc_up(idev); in ipv6_mc_remap()
2480 void ipv6_mc_down(struct inet6_dev *idev) in ipv6_mc_down() argument
2486 read_lock_bh(&idev->lock); in ipv6_mc_down()
2487 mld_ifc_stop_timer(idev); in ipv6_mc_down()
2488 mld_gq_stop_timer(idev); in ipv6_mc_down()
2489 mld_dad_stop_timer(idev); in ipv6_mc_down()
2491 for (i = idev->mc_list; i; i = i->next) in ipv6_mc_down()
2493 read_unlock_bh(&idev->lock); in ipv6_mc_down()
2495 mld_clear_delrec(idev); in ipv6_mc_down()
2498 static void ipv6_mc_reset(struct inet6_dev *idev) in ipv6_mc_reset() argument
2500 idev->mc_qrv = sysctl_mld_qrv; in ipv6_mc_reset()
2501 idev->mc_qi = MLD_QI_DEFAULT; in ipv6_mc_reset()
2502 idev->mc_qri = MLD_QRI_DEFAULT; in ipv6_mc_reset()
2503 idev->mc_v1_seen = 0; in ipv6_mc_reset()
2504 idev->mc_maxdelay = unsolicited_report_interval(idev); in ipv6_mc_reset()
2509 void ipv6_mc_up(struct inet6_dev *idev) in ipv6_mc_up() argument
2515 read_lock_bh(&idev->lock); in ipv6_mc_up()
2516 ipv6_mc_reset(idev); in ipv6_mc_up()
2517 for (i = idev->mc_list; i; i = i->next) in ipv6_mc_up()
2519 read_unlock_bh(&idev->lock); in ipv6_mc_up()
2524 void ipv6_mc_init_dev(struct inet6_dev *idev) in ipv6_mc_init_dev() argument
2526 write_lock_bh(&idev->lock); in ipv6_mc_init_dev()
2527 spin_lock_init(&idev->mc_lock); in ipv6_mc_init_dev()
2528 idev->mc_gq_running = 0; in ipv6_mc_init_dev()
2529 setup_timer(&idev->mc_gq_timer, mld_gq_timer_expire, in ipv6_mc_init_dev()
2530 (unsigned long)idev); in ipv6_mc_init_dev()
2531 idev->mc_tomb = NULL; in ipv6_mc_init_dev()
2532 idev->mc_ifc_count = 0; in ipv6_mc_init_dev()
2533 setup_timer(&idev->mc_ifc_timer, mld_ifc_timer_expire, in ipv6_mc_init_dev()
2534 (unsigned long)idev); in ipv6_mc_init_dev()
2535 setup_timer(&idev->mc_dad_timer, mld_dad_timer_expire, in ipv6_mc_init_dev()
2536 (unsigned long)idev); in ipv6_mc_init_dev()
2537 ipv6_mc_reset(idev); in ipv6_mc_init_dev()
2538 write_unlock_bh(&idev->lock); in ipv6_mc_init_dev()
2545 void ipv6_mc_destroy_dev(struct inet6_dev *idev) in ipv6_mc_destroy_dev() argument
2550 ipv6_mc_down(idev); in ipv6_mc_destroy_dev()
2557 __ipv6_dev_mc_dec(idev, &in6addr_linklocal_allnodes); in ipv6_mc_destroy_dev()
2559 if (idev->cnf.forwarding) in ipv6_mc_destroy_dev()
2560 __ipv6_dev_mc_dec(idev, &in6addr_linklocal_allrouters); in ipv6_mc_destroy_dev()
2562 write_lock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2563 while ((i = idev->mc_list) != NULL) { in ipv6_mc_destroy_dev()
2564 idev->mc_list = i->next; in ipv6_mc_destroy_dev()
2565 write_unlock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2570 write_lock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2572 write_unlock_bh(&idev->lock); in ipv6_mc_destroy_dev()
2579 struct inet6_dev *idev; member
2590 state->idev = NULL; in igmp6_mc_get_first()
2592 struct inet6_dev *idev; in igmp6_mc_get_first() local
2593 idev = __in6_dev_get(state->dev); in igmp6_mc_get_first()
2594 if (!idev) in igmp6_mc_get_first()
2596 read_lock_bh(&idev->lock); in igmp6_mc_get_first()
2597 im = idev->mc_list; in igmp6_mc_get_first()
2599 state->idev = idev; in igmp6_mc_get_first()
2602 read_unlock_bh(&idev->lock); in igmp6_mc_get_first()
2613 if (likely(state->idev)) in igmp6_mc_get_next()
2614 read_unlock_bh(&state->idev->lock); in igmp6_mc_get_next()
2618 state->idev = NULL; in igmp6_mc_get_next()
2621 state->idev = __in6_dev_get(state->dev); in igmp6_mc_get_next()
2622 if (!state->idev) in igmp6_mc_get_next()
2624 read_lock_bh(&state->idev->lock); in igmp6_mc_get_next()
2625 im = state->idev->mc_list; in igmp6_mc_get_next()
2659 if (likely(state->idev)) { in igmp6_mc_seq_stop()
2660 read_unlock_bh(&state->idev->lock); in igmp6_mc_seq_stop()
2661 state->idev = NULL; in igmp6_mc_seq_stop()
2706 struct inet6_dev *idev; member
2719 state->idev = NULL; in igmp6_mcf_get_first()
2722 struct inet6_dev *idev; in igmp6_mcf_get_first() local
2723 idev = __in6_dev_get(state->dev); in igmp6_mcf_get_first()
2724 if (unlikely(idev == NULL)) in igmp6_mcf_get_first()
2726 read_lock_bh(&idev->lock); in igmp6_mcf_get_first()
2727 im = idev->mc_list; in igmp6_mcf_get_first()
2733 state->idev = idev; in igmp6_mcf_get_first()
2738 read_unlock_bh(&idev->lock); in igmp6_mcf_get_first()
2752 if (likely(state->idev)) in igmp6_mcf_get_next()
2753 read_unlock_bh(&state->idev->lock); in igmp6_mcf_get_next()
2757 state->idev = NULL; in igmp6_mcf_get_next()
2760 state->idev = __in6_dev_get(state->dev); in igmp6_mcf_get_next()
2761 if (!state->idev) in igmp6_mcf_get_next()
2763 read_lock_bh(&state->idev->lock); in igmp6_mcf_get_next()
2764 state->im = state->idev->mc_list; in igmp6_mcf_get_next()
2810 if (likely(state->idev)) { in igmp6_mcf_seq_stop()
2811 read_unlock_bh(&state->idev->lock); in igmp6_mcf_seq_stop()
2812 state->idev = NULL; in igmp6_mcf_seq_stop()