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